make other_title and genre list[str] and compatible with legacy data

This commit is contained in:
Your Name 2023-04-17 21:43:20 -04:00 committed by Henri Dickson
parent d6c0cfad56
commit fa960a2c7a
16 changed files with 2354 additions and 27 deletions

View file

@ -236,7 +236,9 @@ class ArrayField(JSONFieldMixin, DJANGO_ArrayField):
kwargs["help_text"] = _("多项之间以英文逗号分隔")
super().__init__(*args, **kwargs)
pass
def from_json(self, value): # backward compatible with dirty legacy data
if value or value == []:
return value if isinstance(value, list) else [value]
class JSONField(JSONFieldMixin, DJANGO_JSONField):

View file

@ -39,7 +39,7 @@ class Game(Item):
other_title = jsondata.ArrayField(
base_field=models.CharField(blank=True, default="", max_length=500),
verbose_name=_("标题"),
verbose_name=_("标题"),
null=True,
blank=True,
default=list,

View file

@ -25,6 +25,9 @@ class IGDBTestCase(TestCase):
self.assertEqual(site.resource.metadata["title"], "Portal 2")
self.assertIsInstance(site.resource.item, Game)
self.assertEqual(site.resource.item.steam, "620")
self.assertEqual(
site.resource.item.genre, ["Shooter", "Platform", "Puzzle", "Adventure"]
)
@use_local_response
def test_scrape_non_steam(self):
@ -38,6 +41,7 @@ class IGDBTestCase(TestCase):
)
self.assertIsInstance(site.resource.item, Game)
self.assertEqual(site.resource.item.primary_lookup_id_type, IdType.IGDB)
self.assertEqual(site.resource.item.genre, ["Role-playing (RPG)", "Adventure"])
self.assertEqual(
site.resource.item.primary_lookup_id_value,
"the-legend-of-zelda-breath-of-the-wild",
@ -70,6 +74,9 @@ class SteamTestCase(TestCase):
)
self.assertIsInstance(site.resource.item, Game)
self.assertEqual(site.resource.item.steam, "620")
self.assertEqual(
site.resource.item.genre, ["Shooter", "Platform", "Puzzle", "Adventure"]
)
class DoubanGameTestCase(TestCase):
@ -94,6 +101,8 @@ class DoubanGameTestCase(TestCase):
self.assertEqual(site.resource.metadata["title"], "传送门2 Portal 2")
self.assertIsInstance(site.resource.item, Game)
self.assertEqual(site.resource.item.douban_game, "10734307")
self.assertEqual(site.resource.item.genre, ["第一人称射击", "益智", "射击", "动作"])
self.assertEqual(site.resource.item.other_title, [])
class BangumiGameTestCase(TestCase):

View file

@ -5,7 +5,7 @@ from django.db import models
class MovieInSchema(ItemInSchema):
orig_title: str | None = None
other_title: str | None = None
other_title: list[str]
director: list[str]
playwright: list[str]
actor: list[str]
@ -52,8 +52,12 @@ class Movie(Item):
orig_title = jsondata.CharField(
verbose_name=_("原始标题"), blank=True, default="", max_length=500
)
other_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=True,
blank=True,
default=list,
)
director = jsondata.ArrayField(
verbose_name=_("导演"),

View file

@ -5,7 +5,7 @@ from django.db import models
class AlbumInSchema(ItemInSchema):
other_title: str | None = None
other_title: list[str]
genre: list[str]
artist: list[str]
company: list[str]
@ -48,7 +48,13 @@ class Album(Item):
verbose_name=_("艺术家"),
default=list,
)
genre = jsondata.CharField(_("流派"), blank=True, default="", max_length=100)
genre = jsondata.ArrayField(
verbose_name=_("流派"),
base_field=models.CharField(blank=True, default="", max_length=50),
null=True,
blank=True,
default=list,
)
company = jsondata.ArrayField(
models.CharField(blank=True, default="", max_length=500),
verbose_name=_("发行方"),
@ -57,7 +63,13 @@ class Album(Item):
default=list,
)
track_list = jsondata.TextField(_("曲目"), blank=True, default="")
other_title = jsondata.CharField(_("其它标题"), blank=True, default="", max_length=500)
other_title = jsondata.ArrayField(
verbose_name=_("其它标题"),
base_field=models.CharField(blank=True, default="", max_length=200),
null=True,
blank=True,
default=list,
)
album_type = jsondata.CharField(_("专辑类型"), blank=True, default="", max_length=500)
media = jsondata.CharField(_("介质"), blank=True, default="", max_length=500)
bandcamp_album_id = jsondata.CharField(blank=True, default="", max_length=500)

View file

@ -35,6 +35,8 @@ class SpotifyTestCase(TestCase):
self.assertEqual(site.resource.metadata["title"], "The Race For Space")
self.assertIsInstance(site.resource.item, Album)
self.assertEqual(site.resource.item.barcode, "3610159662676")
self.assertEqual(site.resource.item.genre, [])
self.assertEqual(site.resource.item.other_title, [])
class DoubanMusicTestCase(TestCase):
@ -51,14 +53,16 @@ class DoubanMusicTestCase(TestCase):
@use_local_response
def test_scrape(self):
t_url = "https://music.douban.com/subject/33551231/"
t_url = "https://music.douban.com/subject/1401362/"
site = SiteManager.get_site_by_url(t_url)
self.assertEqual(site.ready, False)
site.get_resource_ready()
self.assertEqual(site.ready, True)
self.assertEqual(site.resource.metadata["title"], "The Race For Space")
self.assertEqual(site.resource.metadata["title"], "Rubber Soul")
self.assertIsInstance(site.resource.item, Album)
self.assertEqual(site.resource.item.barcode, "3610159662676")
self.assertEqual(site.resource.item.barcode, "0077774644020")
self.assertEqual(site.resource.item.genre, ["摇滚"])
self.assertEqual(site.resource.item.other_title, ["橡胶灵魂"])
class MultiMusicSitesTestCase(TestCase):
@ -102,6 +106,8 @@ class BandcampTestCase(TestCase):
self.assertEqual(site.resource.metadata["title"], "In These Times")
self.assertEqual(site.resource.metadata["artist"], ["Makaya McCraven"])
self.assertIsInstance(site.resource.item, Album)
self.assertEqual(site.resource.item.genre, [])
self.assertEqual(site.resource.item.other_title, [])
class DiscogsReleaseTestCase(TestCase):
@ -130,6 +136,8 @@ class DiscogsReleaseTestCase(TestCase):
self.assertEqual(site.resource.metadata["artist"], ["J.I.D"])
self.assertIsInstance(site.resource.item, Album)
self.assertEqual(site.resource.item.barcode, "0602445804689")
self.assertEqual(site.resource.item.genre, ["Hip Hop"])
self.assertEqual(site.resource.item.other_title, [])
class DiscogsMasterTestCase(TestCase):
@ -155,3 +163,5 @@ class DiscogsMasterTestCase(TestCase):
self.assertEqual(site.resource.metadata["title"], "Coexist")
self.assertEqual(site.resource.metadata["artist"], ["The XX"])
self.assertIsInstance(site.resource.item, Album)
self.assertEqual(site.resource.item.genre, ["Electronic", "Rock", "Pop"])
self.assertEqual(site.resource.item.other_title, [])

View file

@ -10,7 +10,7 @@ class Performance(Item):
douban_drama = LookupIdDescriptor(IdType.DoubanDrama)
other_title = jsondata.ArrayField(
verbose_name=_("其它标题"),
base_field=models.CharField(),
base_field=models.CharField(blank=True, default="", max_length=200),
null=False,
blank=False,
default=list,

View file

@ -30,7 +30,7 @@ class DiscogsRelease(AbstractSite):
release = get_discogs_data("releases", self.id_value)
title = release.get("title")
artist = [artist.get("name") for artist in release.get("artists")]
genre = release.get("genres")
genre = release.get("genres", [])
track_list = [track.get("title") for track in release.get("tracklist")]
company = list(
set([company.get("name") for company in release.get("companies")])
@ -96,7 +96,7 @@ class DiscogsMaster(AbstractSite):
master_release = get_discogs_data("masters", self.id_value)
title = master_release.get("title")
artist = [artist.get("name") for artist in master_release.get("artists")]
genre = master_release.get("genres")
genre = master_release.get("genres", [])
track_list = [track.get("title") for track in master_release.get("tracklist")]
image_url = None

View file

@ -42,7 +42,7 @@ class DoubanMusic(AbstractSite):
genre_elem = content.xpath(
"//div[@id='info']//span[text()='流派:']/following::text()[1]"
)
genre = genre_elem[0].strip() if genre_elem else None
genre = genre_elem[0].strip().split(" / ") if genre_elem else []
date_elem = content.xpath(
"//div[@id='info']//span[text()='发行时间:']/following::text()[1]"
@ -95,7 +95,7 @@ class DoubanMusic(AbstractSite):
"//div[@id='info']//span[text()='又名:']/following-sibling::text()[1]"
)
if other_elem:
data["other_title"] = other_elem[0].strip()
data["other_title"] = other_elem[0].strip().split(" / ")
other_elem = content.xpath(
"//div[@id='info']//span[text()='专辑类型:']/following-sibling::text()[1]"
)

View file

@ -42,7 +42,7 @@ class Spotify(AbstractSite):
title = res_data["name"]
genre = ", ".join(res_data["genres"])
genre = res_data.get("genres", [])
company = []
for com in res_data["copyrights"]:

View file

@ -131,7 +131,7 @@ class TMDB_Movie(AbstractSite):
metadata={
"title": title,
"orig_title": orig_title,
"other_title": None,
"other_title": [],
"imdb_code": imdb_code,
"director": director,
"playwright": playwright,
@ -278,7 +278,7 @@ class TMDB_TV(AbstractSite):
metadata={
"title": title,
"orig_title": orig_title,
"other_title": None,
"other_title": [],
"imdb_code": imdb_code,
"director": director,
"playwright": playwright,

View file

@ -80,7 +80,7 @@
{% if related_books.count > 0 %}
<div class="aside-section-wrapper">
<div class="action-panel">
<div class="action-panel__label">{% trans '其版本' %}</div>
<div class="action-panel__label">{% trans '其版本' %}</div>
<div >
{% for b in related_books %}
<p>

View file

@ -33,7 +33,7 @@ from django.utils.translation import gettext_lazy as _
class TVShowInSchema(ItemInSchema):
season_count: int | None = None
orig_title: str | None = None
other_title: str | None = None
other_title: list[str]
director: list[str]
playwright: list[str]
actor: list[str]
@ -54,7 +54,7 @@ class TVShowSchema(TVShowInSchema, BaseSchema):
class TVSeasonInSchema(ItemInSchema):
season_number: int | None = None
orig_title: str | None = None
other_title: str | None = None
other_title: list[str]
director: list[str]
playwright: list[str]
actor: list[str]
@ -105,8 +105,12 @@ class TVShow(Item):
orig_title = jsondata.CharField(
verbose_name=_("原始标题"), blank=True, default="", max_length=500
)
other_title = jsondata.CharField(
verbose_name=_("其他标题"), blank=True, default="", max_length=500
other_title = jsondata.ArrayField(
base_field=models.CharField(blank=True, default="", max_length=500),
verbose_name=_("其它标题"),
null=True,
blank=True,
default=list,
)
director = jsondata.ArrayField(
verbose_name=_("导演"),
@ -229,7 +233,7 @@ class TVSeason(Item):
verbose_name=_("原始标题"), blank=True, default="", max_length=500
)
other_title = jsondata.ArrayField(
verbose_name=_("标题"),
verbose_name=_("标题"),
base_field=models.CharField(blank=True, default="", max_length=500),
null=True,
blank=True,

View file

@ -3,6 +3,18 @@ from catalog.common import *
from catalog.tv.models import *
class JSONFieldTestCase(TestCase):
def test_legacy_data(self):
o = TVShow()
self.assertEqual(o.other_title, [])
o.other_title = "test"
self.assertEqual(o.other_title, ["test"])
o.other_title = ["a", "b"]
self.assertEqual(o.other_title, ["a", "b"])
o.other_title = None
self.assertEqual(o.other_title, None)
class TMDBTVTestCase(TestCase):
def test_parse(self):
t_id = "57243"

File diff suppressed because it is too large Load diff

View file

@ -23,7 +23,7 @@
{{ site_name }}还在不断完善中,丰富的内容需要大家共同创造。
试图添加垃圾数据(如添加信息混乱或缺失的书籍、以推广为主要目的的评论)将会受到严肃处理。
{{ site_name }}继承了联邦宇宙的用户关系比如您在联邦宇宙屏蔽了某人那您将不会在书影音的公共区域看到TA的痕迹。
本站为非盈利站点cookie和其数据保管使用原则请参阅<a href="/announcement/data-policy/">站内公告</a>
本站为非盈利站点cookie和其数据保管使用原则请参阅<a href="/announcement/data-policy/">站内公告</a>
</p>
<p>
此外,{{ site_name }}现处于测试阶段,疏漏在所难免,请妥善备份您的数据。
@ -38,4 +38,4 @@
</body>
</html>
</html>