271 lines
11 KiB
Python
271 lines
11 KiB
Python
"""
|
|
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 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)
|
|
|