import uuid from django.db import models from django.conf import settings class GenerationRecord(models.Model): """Video generation call record.""" MODE_CHOICES = [ ('universal', '全能参考'), ('keyframe', '首尾帧'), ] MODEL_CHOICES = [ ('seedance_2.0', 'Seedance 2.0'), ('seedance_2.0_fast', 'Seedance 2.0 Fast'), ] STATUS_CHOICES = [ ('queued', '排队中'), ('processing', '生成中'), ('completed', '已完成'), ('failed', '失败'), ] user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='generation_records', verbose_name='用户', ) task_id = models.UUIDField(default=uuid.uuid4, unique=True, verbose_name='任务ID') ark_task_id = models.CharField(max_length=100, blank=True, default='', verbose_name='火山ARK任务ID') prompt = models.TextField(blank=True, verbose_name='提示词') mode = models.CharField(max_length=20, choices=MODE_CHOICES, verbose_name='创作模式') model = models.CharField(max_length=30, choices=MODEL_CHOICES, verbose_name='模型') aspect_ratio = models.CharField(max_length=10, verbose_name='宽高比') duration = models.IntegerField(verbose_name='视频时长(秒)') seconds_consumed = models.FloatField(default=0, verbose_name='消费秒数') status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='queued', verbose_name='状态') result_url = models.CharField(max_length=1000, blank=True, default='', verbose_name='生成结果URL') error_message = models.TextField(blank=True, default='', verbose_name='错误信息') reference_urls = models.JSONField(default=list, blank=True, verbose_name='参考素材信息') created_at = models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='创建时间') class Meta: verbose_name = '生成记录' verbose_name_plural = '生成记录' ordering = ['-created_at'] indexes = [ models.Index(fields=['user', 'created_at']), ] def __str__(self): return f'{self.user.username} - {self.task_id}' class QuotaConfig(models.Model): """Global quota configuration (singleton) — Phase 3: seconds + announcement.""" default_daily_seconds_limit = models.IntegerField(default=600, verbose_name='默认每日秒数上限') default_monthly_seconds_limit = models.IntegerField(default=6000, verbose_name='默认每月秒数上限') announcement = models.TextField(blank=True, default='', verbose_name='系统公告') announcement_enabled = models.BooleanField(default=False, verbose_name='启用公告') updated_at = models.DateTimeField(auto_now=True) class Meta: verbose_name = '系统配置' verbose_name_plural = '系统配置' def save(self, *args, **kwargs): self.pk = 1 super().save(*args, **kwargs) def __str__(self): return f'全局配额: {self.default_daily_seconds_limit}s/日, {self.default_monthly_seconds_limit}s/月'