2022-12-07 19:09:05 -05:00
|
|
|
from catalog.common import *
|
|
|
|
from django.utils.translation import gettext_lazy as _
|
2023-01-05 03:06:13 -05:00
|
|
|
from django.db import models
|
2023-06-05 02:04:52 -04:00
|
|
|
from catalog.common.utils import DEFAULT_ITEM_COVER
|
2023-06-05 03:39:37 -04:00
|
|
|
from functools import cached_property
|
2022-12-07 19:09:05 -05:00
|
|
|
|
|
|
|
|
|
|
|
class Performance(Item):
|
2023-06-05 02:04:52 -04:00
|
|
|
type = ItemType.Performance
|
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-04-17 21:43:20 -04:00
|
|
|
base_field=models.CharField(blank=True, 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=_("类型"),
|
|
|
|
base_field=models.CharField(blank=True, 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=_("语言"),
|
|
|
|
base_field=models.CharField(blank=True, 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 11:45:57 -04:00
|
|
|
base_field=models.CharField(blank=True, 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 11:45:57 -04:00
|
|
|
base_field=models.CharField(blank=True, 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=_("原作者"),
|
|
|
|
base_field=models.CharField(blank=True, default="", max_length=500),
|
|
|
|
null=False,
|
|
|
|
blank=True,
|
|
|
|
default=list,
|
|
|
|
)
|
2023-02-15 23:45:12 -05:00
|
|
|
composer = jsondata.ArrayField(
|
|
|
|
verbose_name=_("作曲"),
|
2023-06-05 11:45:57 -04:00
|
|
|
base_field=models.CharField(blank=True, 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 11:45:57 -04:00
|
|
|
base_field=models.CharField(blank=True, 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,
|
|
|
|
)
|
|
|
|
performer = jsondata.ArrayField(
|
|
|
|
verbose_name=_("演员"),
|
|
|
|
base_field=models.CharField(blank=True, default="", max_length=500),
|
|
|
|
null=False,
|
|
|
|
blank=True,
|
2023-02-15 23:45:12 -05:00
|
|
|
default=list,
|
|
|
|
)
|
|
|
|
troupe = jsondata.ArrayField(
|
|
|
|
verbose_name=_("剧团"),
|
2023-06-05 11:45:57 -04:00
|
|
|
base_field=models.CharField(blank=True, 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 02:04:52 -04:00
|
|
|
crew = jsondata.ArrayField(
|
|
|
|
verbose_name=_("其他演职人员和团体"),
|
2023-06-05 11:45:57 -04:00
|
|
|
base_field=models.CharField(blank=True, 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,
|
|
|
|
)
|
|
|
|
location = jsondata.ArrayField(
|
|
|
|
verbose_name=_("剧场空间"),
|
2023-06-05 11:45:57 -04:00
|
|
|
base_field=models.CharField(blank=True, 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 11:45:57 -04:00
|
|
|
verbose_name=_("首演日期"), max_length=100, null=True, blank=True
|
|
|
|
)
|
|
|
|
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",
|
2023-06-05 13:42:32 -04:00
|
|
|
"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 13:42:32 -04:00
|
|
|
"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()
|
2023-06-05 13:42:32 -04:00
|
|
|
.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 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=_("其它标题"),
|
|
|
|
base_field=models.CharField(blank=True, default="", max_length=200),
|
|
|
|
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=_("语言"),
|
|
|
|
base_field=models.CharField(blank=True, default="", max_length=200),
|
|
|
|
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 11:45:57 -04:00
|
|
|
base_field=models.CharField(blank=True, 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 11:45:57 -04:00
|
|
|
base_field=models.CharField(blank=True, 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=_("原作者"),
|
|
|
|
base_field=models.CharField(blank=True, default="", max_length=500),
|
|
|
|
null=False,
|
|
|
|
blank=True,
|
|
|
|
default=list,
|
|
|
|
)
|
2023-06-05 02:04:52 -04:00
|
|
|
composer = jsondata.ArrayField(
|
|
|
|
verbose_name=_("作曲"),
|
2023-06-05 11:45:57 -04:00
|
|
|
base_field=models.CharField(blank=True, 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 11:45:57 -04:00
|
|
|
base_field=models.CharField(blank=True, 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,
|
|
|
|
)
|
|
|
|
performer = jsondata.ArrayField(
|
|
|
|
verbose_name=_("演员"),
|
|
|
|
base_field=models.CharField(blank=True, default="", max_length=500),
|
|
|
|
null=False,
|
|
|
|
blank=True,
|
2023-06-05 02:04:52 -04:00
|
|
|
default=list,
|
|
|
|
)
|
|
|
|
troupe = jsondata.ArrayField(
|
|
|
|
verbose_name=_("剧团"),
|
2023-06-05 11:45:57 -04:00
|
|
|
base_field=models.CharField(blank=True, 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,
|
|
|
|
)
|
|
|
|
crew = jsondata.ArrayField(
|
|
|
|
verbose_name=_("其他演职人员和团体"),
|
2023-06-05 11:45:57 -04:00
|
|
|
base_field=models.CharField(blank=True, 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,
|
|
|
|
)
|
|
|
|
location = jsondata.ArrayField(
|
|
|
|
verbose_name=_("剧场空间"),
|
2023-06-05 11:45:57 -04:00
|
|
|
base_field=models.CharField(blank=True, 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",
|
2023-06-05 13:42:32 -04:00
|
|
|
"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 13:42:32 -04:00
|
|
|
"performer",
|
2023-06-05 02:04:52 -04:00
|
|
|
"crew",
|
2023-02-15 23:45:12 -05:00
|
|
|
"official_site",
|
|
|
|
]
|
2022-12-07 19:09:05 -05:00
|
|
|
|
2023-06-05 02:04:52 -04:00
|
|
|
@property
|
|
|
|
def parent_item(self):
|
|
|
|
return self.show
|
|
|
|
|
|
|
|
@property
|
2023-06-05 02:46:26 -04:00
|
|
|
def display_title(self):
|
2023-06-05 02:04:52 -04:00
|
|
|
return f"{self.show.title} {self.title}"
|
|
|
|
|
|
|
|
@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
|
|
|
|
)
|
|
|
|
|
|
|
|
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
|