lib.itmens/catalog/performance/models.py

388 lines
11 KiB
Python
Raw Normal View History

2023-06-05 17:22:34 -04:00
from functools import cached_property
from django.utils.translation import gettext_lazy as _
2023-01-05 03:06:13 -05:00
from django.db import models
2023-06-05 17:22:34 -04:00
from catalog.common import *
2023-06-06 13:21:27 -04:00
from catalog.common.models import ItemSchema
2023-06-05 02:04:52 -04:00
from catalog.common.utils import DEFAULT_ITEM_COVER
2023-06-06 13:21:27 -04:00
from ninja import Schema
class CrewMemberSchema(Schema):
name: str
role: str | None
class PerformanceSchema(ItemSchema):
orig_title: str | None = None
other_title: list[str]
genre: list[str]
language: list[str]
opening_date: str | None = None
closing_date: str | None = None
director: list[str]
playwright: list[str]
orig_creator: list[str]
composer: list[str]
choreographer: list[str]
performer: list[str]
actor: list[CrewMemberSchema]
crew: list[CrewMemberSchema]
official_site: str | None = None
class PerformanceProductionSchema(ItemSchema):
orig_title: str | None = None
other_title: list[str]
language: list[str]
opening_date: str | None = None
closing_date: str | None = None
director: list[str]
playwright: list[str]
orig_creator: list[str]
composer: list[str]
choreographer: list[str]
performer: list[str]
actor: list[CrewMemberSchema]
crew: list[CrewMemberSchema]
official_site: str | None = None
2023-06-05 17:22:34 -04:00
_CREW_SCHEMA = {
"type": "list",
"items": {
"type": "dict",
"keys": {
"name": {"type": "string", "title": _("名字")},
"role": {"type": "string", "title": _("职能")},
},
"required": ["role", "name"],
},
"uniqueItems": True,
}
_ACTOR_SCHEMA = {
"type": "list",
"items": {
"type": "dict",
"keys": {
"name": {"type": "string", "title": _("名字"), "placeholder": _("演员名字,必填")},
"role": {"type": "string", "title": _("角色"), "placeholder": _("也可不填写")},
},
"required": ["name"],
},
"uniqueItems": True,
}
2023-06-05 20:20:20 -04:00
def _crew_by_role(crew):
roles = set([c["role"] for c in crew if c.get("role")])
r = {key: [] for key in roles}
for c in crew:
r[c["role"]].append(c["name"])
return r
class Performance(Item):
2023-06-05 02:04:52 -04:00
type = ItemType.Performance
2023-06-05 18:57:52 -04:00
child_class = "PerformanceProduction"
2022-12-11 23:20:28 +00:00
category = ItemCategory.Performance
2022-12-29 23:57:02 -05:00
url_path = "performance"
2023-06-05 02:04:52 -04:00
demonstrative = _("这部剧作")
orig_title = jsondata.CharField(
verbose_name=_("原名"), blank=True, default="", max_length=500
)
2023-02-15 23:45:12 -05:00
other_title = jsondata.ArrayField(
verbose_name=_("其它标题"),
2023-06-05 17:55:39 -04:00
base_field=models.CharField(blank=False, default="", max_length=200),
2023-02-15 23:45:12 -05:00
null=False,
2023-06-05 11:45:57 -04:00
blank=True,
2023-02-15 23:45:12 -05:00
default=list,
)
genre = jsondata.ArrayField(
verbose_name=_("类型"),
2023-06-05 17:55:39 -04:00
base_field=models.CharField(blank=False, default="", max_length=200),
2023-06-05 11:45:57 -04:00
null=False,
blank=False,
2023-02-15 23:45:12 -05:00
default=list,
)
2023-06-05 02:04:52 -04:00
language = jsondata.ArrayField(
verbose_name=_("语言"),
2023-06-05 17:55:39 -04:00
base_field=models.CharField(blank=False, default="", max_length=200),
2023-01-05 03:06:13 -05:00
null=False,
2023-06-05 11:45:57 -04:00
blank=True,
2023-01-05 03:06:13 -05:00
default=list,
)
2023-02-15 23:45:12 -05:00
director = jsondata.ArrayField(
2023-01-05 03:06:13 -05:00
verbose_name=_("导演"),
2023-06-05 17:55:39 -04:00
base_field=models.CharField(blank=False, default="", max_length=500),
2023-01-05 03:06:13 -05:00
null=False,
2023-06-05 11:45:57 -04:00
blank=True,
2023-01-05 03:06:13 -05:00
default=list,
)
2023-02-15 23:45:12 -05:00
playwright = jsondata.ArrayField(
2023-01-05 03:06:13 -05:00
verbose_name=_("编剧"),
2023-06-05 17:55:39 -04:00
base_field=models.CharField(blank=False, default="", max_length=500),
2023-01-05 03:06:13 -05:00
null=False,
2023-06-05 11:45:57 -04:00
blank=True,
2023-01-05 03:06:13 -05:00
default=list,
)
2023-06-05 14:00:09 -04:00
orig_creator = jsondata.ArrayField(
verbose_name=_("原作者"),
2023-06-05 17:55:39 -04:00
base_field=models.CharField(blank=False, default="", max_length=500),
2023-06-05 14:00:09 -04:00
null=False,
blank=True,
default=list,
)
2023-02-15 23:45:12 -05:00
composer = jsondata.ArrayField(
verbose_name=_("作曲"),
2023-06-05 17:55:39 -04:00
base_field=models.CharField(blank=False, default="", max_length=500),
2023-02-15 23:45:12 -05:00
null=False,
2023-06-05 11:45:57 -04:00
blank=True,
2023-02-15 23:45:12 -05:00
default=list,
)
choreographer = jsondata.ArrayField(
verbose_name=_("编舞"),
2023-06-05 17:55:39 -04:00
base_field=models.CharField(blank=False, default="", max_length=500),
2023-02-15 23:45:12 -05:00
null=False,
2023-06-05 11:45:57 -04:00
blank=True,
default=list,
)
2023-06-05 17:22:34 -04:00
actor = jsondata.JSONField(
2023-06-05 11:45:57 -04:00
verbose_name=_("演员"),
2023-06-05 17:22:34 -04:00
null=False,
blank=True,
default=list,
schema=_ACTOR_SCHEMA,
)
performer = jsondata.ArrayField(
verbose_name=_("表演者"),
2023-06-05 17:55:39 -04:00
base_field=models.CharField(blank=False, default="", max_length=500),
2023-06-05 11:45:57 -04:00
null=False,
blank=True,
2023-02-15 23:45:12 -05:00
default=list,
)
troupe = jsondata.ArrayField(
verbose_name=_("剧团"),
2023-06-05 17:55:39 -04:00
base_field=models.CharField(blank=False, default="", max_length=500),
2023-02-15 23:45:12 -05:00
null=False,
2023-06-05 11:45:57 -04:00
blank=True,
2023-02-15 23:45:12 -05:00
default=list,
)
2023-06-05 17:22:34 -04:00
crew = jsondata.JSONField(
2023-06-05 02:04:52 -04:00
verbose_name=_("其他演职人员和团体"),
null=False,
2023-06-05 11:45:57 -04:00
blank=True,
2023-06-05 02:04:52 -04:00
default=list,
2023-06-05 17:22:34 -04:00
schema=_CREW_SCHEMA,
2023-06-05 02:04:52 -04:00
)
location = jsondata.ArrayField(
verbose_name=_("剧场空间"),
2023-06-05 17:55:39 -04:00
base_field=models.CharField(blank=False, default="", max_length=500),
2023-02-15 23:45:12 -05:00
null=False,
2023-06-05 11:45:57 -04:00
blank=True,
2023-02-15 23:45:12 -05:00
default=list,
)
opening_date = jsondata.CharField(
2023-06-05 17:55:39 -04:00
verbose_name=_("首演日期"), max_length=100, null=True, blank=True
2023-06-05 11:45:57 -04:00
)
closing_date = jsondata.CharField(
verbose_name=_("结束日期"), max_length=100, null=True, blank=True
2023-02-15 23:45:12 -05:00
)
official_site = jsondata.CharField(
verbose_name=_("官方网站"), max_length=1000, null=True, blank=True
)
METADATA_COPY_LIST = [
"title",
"brief",
2023-06-05 02:04:52 -04:00
"orig_title",
2023-02-15 23:45:12 -05:00
"other_title",
"genre",
2023-06-05 02:04:52 -04:00
"language",
"opening_date",
"closing_date",
"troupe",
"location",
2023-06-05 02:04:52 -04:00
"director",
"playwright",
2023-06-05 14:00:09 -04:00
"orig_creator",
2023-06-05 02:04:52 -04:00
"composer",
"choreographer",
2023-06-05 17:22:34 -04:00
"actor",
"performer",
2023-06-05 02:04:52 -04:00
"crew",
"official_site",
]
2023-06-05 03:39:37 -04:00
@cached_property
def all_productions(self):
return (
self.productions.all()
.order_by("metadata__opening_date", "title")
2023-06-05 03:39:37 -04:00
.filter(is_deleted=False, merged_to_item=None)
)
2023-06-05 20:20:20 -04:00
@cached_property
def crew_by_role(self):
return _crew_by_role(self.crew)
2023-06-05 02:04:52 -04:00
class PerformanceProduction(Item):
type = ItemType.PerformanceProduction
category = ItemCategory.Performance
url_path = "performance/production"
demonstrative = _("这次上演")
show = models.ForeignKey(
Performance, null=True, on_delete=models.SET_NULL, related_name="productions"
)
orig_title = jsondata.CharField(
verbose_name=_("原名"), blank=True, default="", max_length=500
)
other_title = jsondata.ArrayField(
verbose_name=_("其它标题"),
2023-06-05 17:55:39 -04:00
base_field=models.CharField(blank=False, default="", max_length=200),
2023-06-05 02:04:52 -04:00
null=False,
2023-06-05 11:45:57 -04:00
blank=True,
2023-06-05 02:04:52 -04:00
default=list,
)
language = jsondata.ArrayField(
verbose_name=_("语言"),
2023-06-05 17:55:39 -04:00
base_field=models.CharField(blank=False, default="", max_length=200),
2023-06-05 02:04:52 -04:00
null=False,
2023-06-05 11:45:57 -04:00
blank=True,
2023-06-05 02:04:52 -04:00
default=list,
)
director = jsondata.ArrayField(
verbose_name=_("导演"),
2023-06-05 17:55:39 -04:00
base_field=models.CharField(blank=False, default="", max_length=500),
2023-06-05 02:04:52 -04:00
null=False,
2023-06-05 11:45:57 -04:00
blank=True,
2023-06-05 02:04:52 -04:00
default=list,
)
playwright = jsondata.ArrayField(
verbose_name=_("编剧"),
2023-06-05 17:55:39 -04:00
base_field=models.CharField(blank=False, default="", max_length=500),
2023-06-05 02:04:52 -04:00
null=False,
2023-06-05 11:45:57 -04:00
blank=True,
2023-06-05 02:04:52 -04:00
default=list,
)
2023-06-05 14:00:09 -04:00
orig_creator = jsondata.ArrayField(
verbose_name=_("原作者"),
2023-06-05 17:55:39 -04:00
base_field=models.CharField(blank=False, default="", max_length=500),
2023-06-05 14:00:09 -04:00
null=False,
blank=True,
default=list,
)
2023-06-05 02:04:52 -04:00
composer = jsondata.ArrayField(
verbose_name=_("作曲"),
2023-06-05 17:55:39 -04:00
base_field=models.CharField(blank=False, default="", max_length=500),
2023-06-05 02:04:52 -04:00
null=False,
2023-06-05 11:45:57 -04:00
blank=True,
2023-06-05 02:04:52 -04:00
default=list,
)
choreographer = jsondata.ArrayField(
verbose_name=_("编舞"),
2023-06-05 17:55:39 -04:00
base_field=models.CharField(blank=False, default="", max_length=500),
2023-06-05 02:04:52 -04:00
null=False,
2023-06-05 11:45:57 -04:00
blank=True,
default=list,
)
2023-06-05 17:22:34 -04:00
actor = jsondata.JSONField(
2023-06-05 11:45:57 -04:00
verbose_name=_("演员"),
2023-06-05 17:22:34 -04:00
null=False,
blank=True,
default=list,
schema=_ACTOR_SCHEMA,
)
performer = jsondata.ArrayField(
verbose_name=_("表演者"),
2023-06-05 17:55:39 -04:00
base_field=models.CharField(blank=False, default="", max_length=500),
2023-06-05 11:45:57 -04:00
null=False,
blank=True,
2023-06-05 02:04:52 -04:00
default=list,
)
troupe = jsondata.ArrayField(
verbose_name=_("剧团"),
2023-06-05 17:55:39 -04:00
base_field=models.CharField(blank=False, default="", max_length=500),
2023-06-05 02:04:52 -04:00
null=False,
2023-06-05 11:45:57 -04:00
blank=True,
2023-06-05 02:04:52 -04:00
default=list,
)
2023-06-05 17:22:34 -04:00
crew = jsondata.JSONField(
2023-06-05 02:04:52 -04:00
verbose_name=_("其他演职人员和团体"),
null=False,
2023-06-05 11:45:57 -04:00
blank=True,
2023-06-05 02:04:52 -04:00
default=list,
2023-06-05 17:22:34 -04:00
schema=_CREW_SCHEMA,
2023-06-05 02:04:52 -04:00
)
location = jsondata.ArrayField(
verbose_name=_("剧场空间"),
2023-06-05 17:55:39 -04:00
base_field=models.CharField(blank=False, default="", max_length=500),
2023-06-05 02:04:52 -04:00
null=False,
2023-06-05 11:45:57 -04:00
blank=True,
2023-06-05 02:04:52 -04:00
default=list,
)
opening_date = jsondata.CharField(
2023-06-05 11:45:57 -04:00
verbose_name=_("首演日期"), max_length=100, null=True, blank=False
)
closing_date = jsondata.CharField(
verbose_name=_("结束日期"), max_length=100, null=True, blank=True
2023-06-05 02:04:52 -04:00
)
official_site = jsondata.CharField(
verbose_name=_("官方网站"), max_length=1000, null=True, blank=True
)
METADATA_COPY_LIST = [
"title",
"brief",
"orig_title",
"other_title",
"language",
"opening_date",
"closing_date",
"troupe",
"location",
2023-02-15 23:45:12 -05:00
"director",
"playwright",
2023-06-05 14:00:09 -04:00
"orig_creator",
2023-02-15 23:45:12 -05:00
"composer",
"choreographer",
2023-06-05 17:22:34 -04:00
"actor",
"performer",
2023-06-05 02:04:52 -04:00
"crew",
2023-02-15 23:45:12 -05:00
"official_site",
]
2023-06-05 02:04:52 -04:00
@property
def parent_item(self):
return self.show
2023-06-05 18:57:52 -04:00
def set_parent_item(self, value):
print("set", value)
self.show = value
2023-06-05 02:04:52 -04:00
@property
2023-06-05 02:46:26 -04:00
def display_title(self):
2023-06-05 18:57:52 -04:00
return f"{self.show.title if self.show else ''} {self.title}"
2023-06-05 02:04:52 -04:00
@property
def cover_image_url(self):
return (
2023-06-05 03:39:37 -04:00
self.cover.url
2023-06-05 02:04:52 -04:00
if self.cover and self.cover != DEFAULT_ITEM_COVER
else self.show.cover_image_url
2023-06-05 18:57:52 -04:00
if self.show
else None
2023-06-05 02:04:52 -04:00
)
def update_linked_items_from_external_resource(self, resource):
for r in resource.required_resources:
if r["model"] == "Performance":
resource = ExternalResource.objects.filter(
id_type=r["id_type"], id_value=r["id_value"]
).first()
if resource and resource.item:
self.show = resource.item
2023-06-05 20:20:20 -04:00
@cached_property
def crew_by_role(self):
return _crew_by_role(self.crew)