完善二期清单
This commit is contained in:
@@ -100,6 +100,43 @@ class ScriptSegment(TimeStampedModel):
|
||||
ordering = ["sort_order", "created_at"]
|
||||
|
||||
|
||||
class ScriptTemplate(TeamOwnedModel):
|
||||
"""「套路模板」:把一版脚本里可复用的部分抽出来存团队库,换个商品重开项目时套用。
|
||||
|
||||
只存**套路**不存**文案**:outline 里每镜只留作用/时长/商品露出/说话方式,
|
||||
旧商品的口播词一律不进模板,避免换商品重跑时把上一个品牌漏出去。
|
||||
"""
|
||||
|
||||
name = models.CharField(max_length=128)
|
||||
presentation_format = models.CharField(max_length=32, blank=True) # oral|drama|vlog
|
||||
video_structure = models.CharField(max_length=32, blank=True) # pain|contrast|review|scene
|
||||
persona = models.CharField(max_length=32, blank=True) # 人物设定 key(对齐向导 WIZ_PERSONAS)
|
||||
total_duration = models.PositiveIntegerField(default=0)
|
||||
# [{index, role, duration, product_exposure, delivery}] · 镜头节奏 + 脚本结构
|
||||
outline = models.JSONField(default=list, blank=True)
|
||||
# 结尾转化方式的**写法参考**(可能带旧品牌词,套用时提示模型换成新商品)
|
||||
cta = models.TextField(blank=True)
|
||||
# 场景风格名(人物场景风格的场景侧;人物侧由 persona 承载)
|
||||
scenes = models.JSONField(default=list, blank=True)
|
||||
source_project = models.ForeignKey(
|
||||
Project, on_delete=models.SET_NULL, null=True, blank=True, related_name="script_templates"
|
||||
)
|
||||
source_script = models.ForeignKey(
|
||||
"ScriptVersion", on_delete=models.SET_NULL, null=True, blank=True, related_name="templates"
|
||||
)
|
||||
usage_count = models.PositiveIntegerField(default=0)
|
||||
|
||||
class Meta:
|
||||
ordering = ["-created_at"]
|
||||
constraints = [
|
||||
models.UniqueConstraint(fields=["team", "name"], name="uniq_script_template_name_per_team"),
|
||||
]
|
||||
indexes = [models.Index(fields=["team", "-created_at"])]
|
||||
|
||||
def __str__(self) -> str:
|
||||
return self.name
|
||||
|
||||
|
||||
class BaseAssetGroup(TimeStampedModel):
|
||||
class Kind(models.TextChoices):
|
||||
PRODUCT = "product", "Product"
|
||||
|
||||
Reference in New Issue
Block a user