diff --git a/etpgrf_site/typograph/migrations/0001_initial.py b/etpgrf_site/typograph/migrations/0001_initial.py new file mode 100644 index 0000000..525a585 --- /dev/null +++ b/etpgrf_site/typograph/migrations/0001_initial.py @@ -0,0 +1,33 @@ +# Generated by Django 6.0.1 on 2026-01-20 16:23 + +import django.utils.timezone +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='DailyStat', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date', models.DateField(default=django.utils.timezone.now, unique=True, verbose_name='Дата')), + ('index_views', models.PositiveIntegerField(default=0, verbose_name='Просмотры главной')), + ('process_requests', models.PositiveIntegerField(default=0, verbose_name='Запросы на обработку')), + ('chars_in', models.BigIntegerField(default=0, verbose_name='Символов на входе')), + ('chars_out', models.BigIntegerField(default=0, verbose_name='Символов на выходе')), + ('total_processing_time_ms', models.FloatField(default=0.0, verbose_name='Суммарное время обработки (мс)')), + ('settings_stats', models.JSONField(default=dict, verbose_name='Статистика настроек')), + ], + options={ + 'verbose_name': 'Дневная статистика', + 'verbose_name_plural': 'Дневная статистика', + 'ordering': ['-date'], + }, + ), + ] diff --git a/etpgrf_site/typograph/migrations/0002_dailystat_copy_count.py b/etpgrf_site/typograph/migrations/0002_dailystat_copy_count.py new file mode 100644 index 0000000..e1d4298 --- /dev/null +++ b/etpgrf_site/typograph/migrations/0002_dailystat_copy_count.py @@ -0,0 +1,18 @@ +# Generated by Django 6.0.1 on 2026-01-20 19:15 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('typograph', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='dailystat', + name='copy_count', + field=models.PositiveIntegerField(default=0, verbose_name='Копирований в буфер'), + ), + ] diff --git a/etpgrf_site/typograph/migrations/0003_dailystat_chars_copied.py b/etpgrf_site/typograph/migrations/0003_dailystat_chars_copied.py new file mode 100644 index 0000000..bce75e2 --- /dev/null +++ b/etpgrf_site/typograph/migrations/0003_dailystat_chars_copied.py @@ -0,0 +1,18 @@ +# Generated by Django 6.0.1 on 2026-01-20 20:47 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('typograph', '0002_dailystat_copy_count'), + ] + + operations = [ + migrations.AddField( + model_name='dailystat', + name='chars_copied', + field=models.BigIntegerField(default=0, verbose_name='Символов скопировано'), + ), + ] diff --git a/etpgrf_site/typograph/migrations/__init__.py b/etpgrf_site/typograph/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/etpgrf_site/typograph/models.py b/etpgrf_site/typograph/models.py index 71a8362..7f08cc7 100644 --- a/etpgrf_site/typograph/models.py +++ b/etpgrf_site/typograph/models.py @@ -1,3 +1,67 @@ from django.db import models +from django.utils import timezone -# Create your models here. +class DailyStat(models.Model): + """ + Модель для хранения агрегированной статистики использования за день. + """ + date = models.DateField( + verbose_name="Дата", + unique=True, + default=timezone.now + ) + + # Основные метрики + index_views = models.PositiveIntegerField( + verbose_name="Просмотры главной", + default=0 + ) + process_requests = models.PositiveIntegerField( + verbose_name="Запросы на обработку", + default=0 + ) + copy_count = models.PositiveIntegerField( + verbose_name="Копирований в буфер", + default=0 + ) + + # Объемы + chars_in = models.BigIntegerField( + verbose_name="Символов на входе", + default=0 + ) + chars_out = models.BigIntegerField( + verbose_name="Символов на выходе", + default=0 + ) + chars_copied = models.BigIntegerField( + verbose_name="Символов скопировано", + default=0 + ) + + # Производительность + total_processing_time_ms = models.FloatField( + verbose_name="Суммарное время обработки (мс)", + default=0.0 + ) + + # Статистика по использованным настройкам + settings_stats = models.JSONField( + verbose_name="Статистика настроек", + default=dict + ) + + class Meta: + verbose_name = "Дневная статистика" + verbose_name_plural = "Дневная статистика" + ordering = ['-date'] + + def __str__(self): + return f"Статистика за {self.date.strftime('%Y-%m-%d')}" + + @property + def avg_processing_time_ms(self): + """Среднее время обработки одного запроса.""" + if self.process_requests == 0: + return 0.0 + return self.total_processing_time_ms / self.process_requests