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 %}