# Generated by Django 6.0.4 on 2026-04-19 14:42 import datetime import django.core.validators import django.db.models.deletion from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='Camera', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=120, verbose_name='Наименование')), ('slug', models.SlugField(max_length=80, unique=True, verbose_name='Код камеры')), ('storage_path', models.CharField(help_text='Относительный путь внутри /app/storage, например: Camera3', max_length=255, verbose_name='Путь в storage')), ('rtsp_url', models.URLField(blank=True, verbose_name='RTSP URL (опционально)')), ('expected_width', models.PositiveIntegerField(blank=True, null=True, verbose_name='Ожидаемая ширина')), ('expected_height', models.PositiveIntegerField(blank=True, null=True, verbose_name='Ожидаемая высота')), ('is_active', models.BooleanField(default=True, verbose_name='Активна')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ], options={ 'verbose_name': 'Камера', 'verbose_name_plural': 'Камеры', 'ordering': ['name'], }, ), migrations.CreateModel( name='TimelapseJob', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('date_from', models.DateField(verbose_name='Дата начала выборки')), ('date_to', models.DateField(verbose_name='Дата окончания выборки')), ('sampling_preset', models.PositiveSmallIntegerField(choices=[(0, '1 кадр / 15 минут'), (1, '1 кадр / 30 минут'), (2, '1 кадр / 45 минут'), (3, '1 кадр / час'), (4, '1 кадр / 1.5 часа'), (5, '1 кадр / 2 часа'), (6, '1 кадр / 3 часа'), (7, '1 кадр / 4 часа'), (8, '1 кадр / 6 часов'), (9, '1 кадр / 12 часов'), (10, '1 кадр / сутки')], default=3, verbose_name='Частота выборки')), ('fps', models.PositiveSmallIntegerField(default=25, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(120)], verbose_name='FPS итогового видео')), ('include_night', models.BooleanField(default=True, verbose_name='Включать ночные кадры')), ('day_start_time', models.TimeField(default=datetime.time(6, 0), verbose_name='Начало дня')), ('day_end_time', models.TimeField(default=datetime.time(22, 0), verbose_name='Конец дня')), ('status', models.CharField(choices=[('planned', 'Запланировано'), ('running', 'В работе'), ('success', 'Успешно'), ('error', 'Ошибка')], db_index=True, default='planned', max_length=16)), ('progress_percent', models.PositiveSmallIntegerField(default=0, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(100)], verbose_name='Прогресс, %')), ('frames_total', models.PositiveIntegerField(blank=True, null=True, verbose_name='Всего кадров')), ('frames_processed', models.PositiveIntegerField(default=0, verbose_name='Обработано кадров')), ('output_rel_path', models.CharField(blank=True, max_length=255, verbose_name='Путь к видео в storage')), ('error_message', models.TextField(blank=True, verbose_name='Текст ошибки')), ('created_at', models.DateTimeField(auto_now_add=True)), ('started_at', models.DateTimeField(blank=True, null=True)), ('finished_at', models.DateTimeField(blank=True, null=True)), ('camera', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='jobs', to='camlaps.camera', verbose_name='Камера')), ], options={ 'verbose_name': 'Задание таймлапса', 'verbose_name_plural': 'Задания таймлапса', 'ordering': ['-created_at'], }, ), ]