""" Django ORM Models - GENERATED FILE Do not edit directly. Regenerate using modelgen. """ import uuid from django.db import models class AssetStatus(models.TextChoices): PENDING = "pending", "Pending" READY = "ready", "Ready" ERROR = "error", "Error" class JobStatus(models.TextChoices): PENDING = "pending", "Pending" PROCESSING = "processing", "Processing" COMPLETED = "completed", "Completed" FAILED = "failed", "Failed" CANCELLED = "cancelled", "Cancelled" class ChunkJobStatus(models.TextChoices): PENDING = "pending", "Pending" CHUNKING = "chunking", "Chunking" PROCESSING = "processing", "Processing" COLLECTING = "collecting", "Collecting" COMPLETED = "completed", "Completed" FAILED = "failed", "Failed" CANCELLED = "cancelled", "Cancelled" class DetectJobStatus(models.TextChoices): PENDING = "pending", "Pending" RUNNING = "running", "Running" PAUSED = "paused", "Paused" COMPLETED = "completed", "Completed" FAILED = "failed", "Failed" CANCELLED = "cancelled", "Cancelled" class RunType(models.TextChoices): INITIAL = "initial", "Initial" REPLAY = "replay", "Replay" RETRY = "retry", "Retry" class BrandSource(models.TextChoices): OCR = "ocr", "Ocr" VLM = "local_vlm", "Vlm" CLOUD = "cloud_llm", "Cloud" MANUAL = "manual", "Manual" class SourceType(models.TextChoices): CHUNK_JOB = "chunk_job", "Chunk Job" UPLOAD = "upload", "Upload" DEVICE = "device", "Device" STREAM = "stream", "Stream" class MediaAsset(models.Model): """A video/audio file registered in the system.""" id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) filename = models.CharField(max_length=500) file_path = models.CharField(max_length=1000) status = models.CharField(max_length=20, choices=AssetStatus.choices, default=AssetStatus.PENDING) error_message = models.TextField(blank=True, default='') file_size = models.BigIntegerField(null=True, blank=True) duration = models.FloatField(null=True, blank=True, default=None) video_codec = models.CharField(max_length=255, null=True, blank=True) audio_codec = models.CharField(max_length=255, null=True, blank=True) width = models.IntegerField(null=True, blank=True, default=None) height = models.IntegerField(null=True, blank=True, default=None) framerate = models.FloatField(null=True, blank=True, default=None) bitrate = models.BigIntegerField(null=True, blank=True) properties = models.JSONField(default=dict, blank=True) comments = models.TextField(blank=True, default='') tags = models.JSONField(default=list, blank=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: ordering = ["-created_at"] def __str__(self): return self.filename class TranscodePreset(models.Model): """A reusable transcoding configuration (like Handbrake presets).""" id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) name = models.CharField(max_length=255) description = models.TextField(blank=True, default='') is_builtin = models.BooleanField(default=False) container = models.CharField(max_length=255) video_codec = models.CharField(max_length=255) video_bitrate = models.CharField(max_length=255, null=True, blank=True) video_crf = models.IntegerField(null=True, blank=True, default=None) video_preset = models.CharField(max_length=255, null=True, blank=True) resolution = models.CharField(max_length=255, null=True, blank=True) framerate = models.FloatField(null=True, blank=True, default=None) audio_codec = models.CharField(max_length=255) audio_bitrate = models.CharField(max_length=255, null=True, blank=True) audio_channels = models.IntegerField(null=True, blank=True, default=None) audio_samplerate = models.IntegerField(null=True, blank=True, default=None) extra_args = models.JSONField(default=list, blank=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: ordering = ["-created_at"] def __str__(self): return self.name class TranscodeJob(models.Model): """A transcoding or trimming job in the queue.""" id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) source_asset_id = models.UUIDField() preset_id = models.UUIDField(null=True, blank=True) preset_snapshot = models.JSONField(default=dict, blank=True) trim_start = models.FloatField(null=True, blank=True, default=None) trim_end = models.FloatField(null=True, blank=True, default=None) output_filename = models.CharField(max_length=500) output_path = models.CharField(max_length=1000, null=True, blank=True) output_asset_id = models.UUIDField(null=True, blank=True) status = models.CharField(max_length=20, choices=JobStatus.choices, default=JobStatus.PENDING) progress = models.FloatField(default=0.0) current_frame = models.IntegerField(null=True, blank=True, default=None) current_time = models.FloatField(null=True, blank=True, default=None) speed = models.CharField(max_length=255, null=True, blank=True) error_message = models.TextField(blank=True, default='') celery_task_id = models.CharField(max_length=255, null=True, blank=True) execution_arn = models.CharField(max_length=255, null=True, blank=True) priority = models.IntegerField(default=0) created_at = models.DateTimeField(auto_now_add=True) started_at = models.DateTimeField(null=True, blank=True) completed_at = models.DateTimeField(null=True, blank=True) class Meta: ordering = ["-created_at"] def __str__(self): return str(self.id) class ChunkJob(models.Model): """A chunk pipeline job — splits a media file into chunks and processes them""" id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) source_asset_id = models.UUIDField() chunk_duration = models.FloatField(default=10.0) num_workers = models.IntegerField(default=4) max_retries = models.IntegerField(default=3) processor_type = models.CharField(max_length=255) status = models.CharField(max_length=20, choices=ChunkJobStatus.choices, default=ChunkJobStatus.PENDING) progress = models.FloatField(default=0.0) total_chunks = models.IntegerField(default=0) processed_chunks = models.IntegerField(default=0) failed_chunks = models.IntegerField(default=0) retry_count = models.IntegerField(default=0) error_message = models.TextField(blank=True, default='') throughput_mbps = models.FloatField(null=True, blank=True, default=None) elapsed_seconds = models.FloatField(null=True, blank=True, default=None) celery_task_id = models.CharField(max_length=255, null=True, blank=True) priority = models.IntegerField(default=0) created_at = models.DateTimeField(auto_now_add=True) started_at = models.DateTimeField(null=True, blank=True) completed_at = models.DateTimeField(null=True, blank=True) class Meta: ordering = ["-created_at"] def __str__(self): return str(self.id) class DetectJob(models.Model): """A detection pipeline job.""" id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) source_asset_id = models.UUIDField() video_path = models.CharField(max_length=1000) profile_name = models.CharField(max_length=255) parent_job_id = models.UUIDField(null=True, blank=True) run_type = models.CharField(max_length=20, choices=RunType.choices, default=RunType.INITIAL) replay_from_stage = models.CharField(max_length=255, null=True, blank=True) config_overrides = models.JSONField(default=dict, blank=True) status = models.CharField(max_length=20, choices=DetectJobStatus.choices, default=DetectJobStatus.PENDING) current_stage = models.CharField(max_length=255, null=True, blank=True) progress = models.FloatField(default=0.0) error_message = models.TextField(blank=True, default='') total_detections = models.IntegerField(default=0) brands_found = models.IntegerField(default=0) cloud_llm_calls = models.IntegerField(default=0) estimated_cost_usd = models.FloatField(default=0.0) celery_task_id = models.CharField(max_length=255, null=True, blank=True) priority = models.IntegerField(default=0) created_at = models.DateTimeField(auto_now_add=True) started_at = models.DateTimeField(null=True, blank=True) completed_at = models.DateTimeField(null=True, blank=True) class Meta: ordering = ["-created_at"] def __str__(self): return str(self.id) class StageCheckpoint(models.Model): """A checkpoint saved after a pipeline stage completes.""" id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) job_id = models.UUIDField() stage = models.CharField(max_length=255) stage_index = models.IntegerField() frames_prefix = models.CharField(max_length=255) frames_manifest = models.JSONField(default=dict, blank=True) frames_meta = models.JSONField(default=list, blank=True) filtered_frame_sequences = models.JSONField(default=list, blank=True) boxes_by_frame = models.JSONField(default=dict, blank=True) text_candidates = models.JSONField(default=list, blank=True) unresolved_candidates = models.JSONField(default=list, blank=True) detections = models.JSONField(default=list, blank=True) stats = models.JSONField(default=dict, blank=True) config_snapshot = models.JSONField(default=dict, blank=True) config_overrides = models.JSONField(default=dict, blank=True) video_path = models.CharField(max_length=1000) profile_name = models.CharField(max_length=255) created_at = models.DateTimeField(auto_now_add=True) class Meta: ordering = ["-created_at"] def __str__(self): return str(self.id) class KnownBrand(models.Model): """A brand discovered or registered in the system.""" id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) canonical_name = models.CharField(max_length=255) aliases = models.JSONField(default=list, blank=True) first_source = models.CharField(max_length=20, choices=BrandSource.choices, default=BrandSource.OCR) total_occurrences = models.IntegerField(default=0) confirmed = models.BooleanField(default=False) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: ordering = ["-created_at"] def __str__(self): return str(self.id) class SourceBrandSighting(models.Model): """A brand seen in a specific source (video/asset).""" id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) source_asset_id = models.UUIDField() brand_id = models.UUIDField() brand_name = models.CharField(max_length=255) first_seen_timestamp = models.FloatField(default=0.0) last_seen_timestamp = models.FloatField(default=0.0) occurrences = models.IntegerField(default=0) detection_source = models.CharField(max_length=20, choices=BrandSource.choices, default=BrandSource.OCR) avg_confidence = models.FloatField(default=0.0) created_at = models.DateTimeField(auto_now_add=True) class Meta: ordering = ["-created_at"] def __str__(self): return str(self.id)