66 lines
4.7 KiB
Python
66 lines
4.7 KiB
Python
# 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'],
|
||
},
|
||
),
|
||
]
|