diff --git a/catalog/performance/models.py b/catalog/performance/models.py index ca2e7103..9f375520 100644 --- a/catalog/performance/models.py +++ b/catalog/performance/models.py @@ -17,81 +17,84 @@ class Performance(Item): verbose_name=_("其它标题"), base_field=models.CharField(blank=True, default="", max_length=200), null=False, - blank=False, + blank=True, default=list, ) genre = jsondata.ArrayField( verbose_name=_("类型"), base_field=models.CharField(blank=True, default="", max_length=200), - null=True, - blank=True, + null=False, + blank=False, default=list, ) language = jsondata.ArrayField( verbose_name=_("语言"), base_field=models.CharField(blank=True, default="", max_length=200), null=False, - blank=False, + blank=True, default=list, ) director = jsondata.ArrayField( verbose_name=_("导演"), - base_field=models.CharField(), + base_field=models.CharField(blank=True, default="", max_length=500), null=False, - blank=False, + blank=True, default=list, ) playwright = jsondata.ArrayField( verbose_name=_("编剧"), - base_field=models.CharField(), + base_field=models.CharField(blank=True, default="", max_length=500), null=False, - blank=False, - default=list, - ) - performer = jsondata.ArrayField( - verbose_name=_("演员"), - base_field=models.CharField(), - null=False, - blank=False, + blank=True, default=list, ) composer = jsondata.ArrayField( verbose_name=_("作曲"), - base_field=models.CharField(), + base_field=models.CharField(blank=True, default="", max_length=500), null=False, - blank=False, + blank=True, default=list, ) choreographer = jsondata.ArrayField( verbose_name=_("编舞"), - base_field=models.CharField(), + base_field=models.CharField(blank=True, default="", max_length=500), null=False, - blank=False, + blank=True, + default=list, + ) + performer = jsondata.ArrayField( + verbose_name=_("演员"), + base_field=models.CharField(blank=True, default="", max_length=500), + null=False, + blank=True, default=list, ) troupe = jsondata.ArrayField( verbose_name=_("剧团"), - base_field=models.CharField(), + base_field=models.CharField(blank=True, default="", max_length=500), null=False, - blank=False, + blank=True, default=list, ) crew = jsondata.ArrayField( verbose_name=_("其他演职人员和团体"), - base_field=models.CharField(), + base_field=models.CharField(blank=True, default="", max_length=500), null=False, - blank=False, + blank=True, default=list, ) location = jsondata.ArrayField( verbose_name=_("剧场空间"), - base_field=models.CharField(), + base_field=models.CharField(blank=True, default="", max_length=500), null=False, - blank=False, + blank=True, default=list, ) opening_date = jsondata.CharField( - verbose_name=_("演出日期"), max_length=100, null=True, blank=True + verbose_name=_("首演日期"), max_length=100, null=True, blank=True + ) + closing_date = jsondata.CharField( + verbose_name=_("结束日期"), max_length=100, null=True, blank=True ) official_site = jsondata.CharField( verbose_name=_("官方网站"), max_length=1000, null=True, blank=True @@ -112,6 +115,7 @@ class Performance(Item): "troupe", "location", "opening_date", + "closing_date", "official_site", ] @@ -119,7 +123,7 @@ class Performance(Item): def all_productions(self): return ( self.productions.all() - .order_by("title") + .order_by("metadata__opening_date") .filter(is_deleted=False, merged_to_item=None) ) @@ -139,74 +143,77 @@ class PerformanceProduction(Item): verbose_name=_("其它标题"), base_field=models.CharField(blank=True, default="", max_length=200), null=False, - blank=False, + blank=True, default=list, ) language = jsondata.ArrayField( verbose_name=_("语言"), base_field=models.CharField(blank=True, default="", max_length=200), null=False, - blank=False, + blank=True, default=list, ) director = jsondata.ArrayField( verbose_name=_("导演"), - base_field=models.CharField(), + base_field=models.CharField(blank=True, default="", max_length=500), null=False, - blank=False, + blank=True, default=list, ) playwright = jsondata.ArrayField( verbose_name=_("编剧"), - base_field=models.CharField(), + base_field=models.CharField(blank=True, default="", max_length=500), null=False, - blank=False, - default=list, - ) - performer = jsondata.ArrayField( - verbose_name=_("演员"), - base_field=models.CharField(), - null=False, - blank=False, + blank=True, default=list, ) composer = jsondata.ArrayField( verbose_name=_("作曲"), - base_field=models.CharField(), + base_field=models.CharField(blank=True, default="", max_length=500), null=False, - blank=False, + blank=True, default=list, ) choreographer = jsondata.ArrayField( verbose_name=_("编舞"), - base_field=models.CharField(), + base_field=models.CharField(blank=True, default="", max_length=500), null=False, - blank=False, + blank=True, + default=list, + ) + performer = jsondata.ArrayField( + verbose_name=_("演员"), + base_field=models.CharField(blank=True, default="", max_length=500), + null=False, + blank=True, default=list, ) troupe = jsondata.ArrayField( verbose_name=_("剧团"), - base_field=models.CharField(), + base_field=models.CharField(blank=True, default="", max_length=500), null=False, - blank=False, + blank=True, default=list, ) crew = jsondata.ArrayField( verbose_name=_("其他演职人员和团体"), - base_field=models.CharField(), + base_field=models.CharField(blank=True, default="", max_length=500), null=False, - blank=False, + blank=True, default=list, ) location = jsondata.ArrayField( verbose_name=_("剧场空间"), - base_field=models.CharField(), + base_field=models.CharField(blank=True, default="", max_length=500), null=False, - blank=False, + blank=True, default=list, ) opening_date = jsondata.CharField( - verbose_name=_("演出日期"), max_length=100, null=True, blank=True + verbose_name=_("首演日期"), max_length=100, null=True, blank=False + ) + closing_date = jsondata.CharField( + verbose_name=_("结束日期"), max_length=100, null=True, blank=True ) official_site = jsondata.CharField( verbose_name=_("官方网站"), max_length=1000, null=True, blank=True @@ -226,6 +233,7 @@ class PerformanceProduction(Item): "troupe", "location", "opening_date", + "closing_date", "official_site", ] diff --git a/catalog/performance/tests.py b/catalog/performance/tests.py index a78ad5d5..a4795278 100644 --- a/catalog/performance/tests.py +++ b/catalog/performance/tests.py @@ -75,6 +75,12 @@ class DoubanDramaTestCase(TestCase): crawl_related_resources_task(resource.id) # force the async job to run now productions = list(item.productions.all()) self.assertEqual(len(productions), 4) + self.assertEqual(productions[0].opening_date, "2008-06-20") + self.assertEqual(productions[0].closing_date, "2008-08-04") + self.assertEqual(productions[2].opening_date, "2017-03-10") + self.assertEqual(productions[2].closing_date, "2017-03-17") + self.assertEqual(productions[3].opening_date, "2017-11-13") + self.assertEqual(productions[3].closing_date, None) self.assertEqual(productions[3].title, "ミュージカル(2017年)版") self.assertEqual(len(productions[3].performer), 6) self.assertEqual(productions[3].language, ["日语"]) diff --git a/catalog/sites/douban_drama.py b/catalog/sites/douban_drama.py index bb472b6f..56d7b782 100644 --- a/catalog/sites/douban_drama.py +++ b/catalog/sites/douban_drama.py @@ -70,6 +70,12 @@ class DoubanDramaVersion(AbstractSite): "troupe": [x.strip() for x in h.xpath(q.format("演出团体"))], "location": [x.strip() for x in h.xpath(q.format("演出剧院"))], } + if data["opening_date"]: + d = data["opening_date"].split("-") + l = len(d) if len(d) < 6 else 6 + if l > 3: + data["opening_date"] = "-".join(d[:3]) + data["closing_date"] = "-".join(d[0 : 6 - l] + d[3:l]) img_url_elem = h.xpath("//img[@itemprop='image']/@src") data["cover_image_url"] = img_url_elem[0].strip() if img_url_elem else None pd = ResourceContent(metadata=data) @@ -135,7 +141,7 @@ class DoubanDrama(AbstractSite): data["genre"] = [ s.strip() for s in h.xpath( - "//dl//dt[text()='类型:']/following-sibling::dd[@itemprop='genre']/text()" + "//div[@class='meta']//dl//dt[text()='类型:']/following-sibling::dd[@itemprop='genre']/text()" ) ] # data["version"] = [ @@ -181,8 +187,16 @@ class DoubanDrama(AbstractSite): ) ] - date_elem = h.xpath("//dl//dt[text()='演出日期:']/following::dd/text()") + date_elem = h.xpath( + "//div[@class='meta']//dl//dt[text()='演出日期:']/following::dd/text()" + ) data["opening_date"] = date_elem[0] if date_elem else None + if data["opening_date"]: + d = data["opening_date"].split("-") + l = len(d) if len(d) < 6 else 6 + if l > 3: + data["opening_date"] = "-".join(d[:3]) + data["closing_date"] = "-".join(d[0 : 6 - l] + d[3:l]) data["location"] = [ s.strip() diff --git a/catalog/templates/performance.html b/catalog/templates/performance.html index d6d8c17e..722f6e37 100644 --- a/catalog/templates/performance.html +++ b/catalog/templates/performance.html @@ -12,13 +12,16 @@ {% block details %}
{% include '_people.html' with people=item.other_title _role='其他标题' max=5 %}
+
+ {% if item.opening_date %} + {{ item.opening_date }} + {% if item.closing_date %}~ {{ item.closing_date }}{% endif %} + {% endif %} +
{% include '_people.html' with people=item.genre role='类型' max=5 %}
{% include '_people.html' with people=item.troupe role='剧团' max=5 %}
{% include '_people.html' with people=item.location role='剧院' max=5 %}
{% include '_people.html' with people=item.language role='语言' max=5 %}
-
- {% if item.opening_date %}日期: {{ item.opening_date }}{% endif %} -
{% include '_people.html' with people=item.director role='导演' max=5 %}
{% include '_people.html' with people=item.playwright role='编剧' max=5 %}
{% include '_people.html' with people=item.performer role='演员' max=10 %}
@@ -42,10 +45,11 @@ {{ prod.title }}
+ {% if prod.opening_date %} + {{ prod.opening_date }} + {% if prod.closing_date %}~ {{ prod.closing_date }}{% endif %} + {% endif %} {% include '_people.html' with people=prod.troupe _role='剧团' max=2 %} -
- {% if prod.opening_date %}上演日期:{{ prod.opening_date }}{% endif %} -
{% include '_people.html' with people=prod.location _role='上演剧院' max=2 %} {% include '_people.html' with people=prod.language _role='语言' max=5 %}
diff --git a/catalog/templates/performanceproduction.html b/catalog/templates/performanceproduction.html index b454f78b..45980d1f 100644 --- a/catalog/templates/performanceproduction.html +++ b/catalog/templates/performanceproduction.html @@ -11,6 +11,12 @@ {% load thumb %} {% block details %} +
+ {% if item.opening_date %} + {{ item.opening_date }} + {% if item.closing_date %}~ {{ item.closing_date }}{% endif %} + {% endif %} +
{% if item.show %} {% trans '所属剧目' %}: {{ item.show.title }} @@ -21,9 +27,6 @@
{% include '_people.html' with people=item.troupe role='剧团' max=5 %}
{% include '_people.html' with people=item.location role='剧院' max=5 %}
{% include '_people.html' with people=item.language role='语言' max=5 %}
-
- {% if item.opening_date %}日期: {{ item.opening_date }}{% endif %} -
{% include '_people.html' with people=item.director role='导演' max=5 %}
{% include '_people.html' with people=item.playwright role='编剧' max=5 %}
{% include '_people.html' with people=item.performer role='演员' max=10 %}