All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 2m17s
73 lines
3.0 KiB
Python
73 lines
3.0 KiB
Python
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/月'
|