diff --git a/catalog/book/models.py b/catalog/book/models.py index e96eda58..916e8881 100644 --- a/catalog/book/models.py +++ b/catalog/book/models.py @@ -38,6 +38,7 @@ from catalog.common import ( jsondata, ) from catalog.common.models import ( + LIST_OF_ONE_PLUS_STR_SCHEMA, LOCALE_CHOICES_JSONFORM, SCRIPT_CHOICES, LanguageListField, @@ -81,7 +82,7 @@ EDITION_LOCALIZED_TITLE_SCHEMA = { }, "text": {"type": "string", "title": _("text content")}, }, - "required": ["lang", "s"], + "required": ["lang", "text"], }, "minItems": 1, "maxItems": 1, @@ -100,7 +101,7 @@ EDITION_LOCALIZED_SUBTITLE_SCHEMA = { }, "text": {"type": "string", "title": _("text content")}, }, - "required": ["lang", "s"], + "required": ["lang", "text"], }, "minItems": 0, "maxItems": 1, @@ -154,14 +155,14 @@ class Edition(Item): # _("subtitle"), null=True, blank=True, default=None, max_length=500 # ) orig_title = jsondata.CharField( - _("original title"), null=True, blank=True, default=None, max_length=500 + _("original title"), null=True, blank=True, max_length=500 ) - author = jsondata.ArrayField( + author = jsondata.JSONField( verbose_name=_("author"), - base_field=models.CharField(max_length=500), null=False, blank=False, default=list, + schema=LIST_OF_ONE_PLUS_STR_SCHEMA, ) translator = jsondata.ArrayField( verbose_name=_("translator"), @@ -172,7 +173,7 @@ class Edition(Item): ) language = LanguageListField() pub_house = jsondata.CharField( - _("publishing house"), null=True, blank=False, default=None, max_length=500 + _("publishing house"), null=True, blank=False, max_length=500 ) pub_year = jsondata.IntegerField( _("publication year"), @@ -186,14 +187,10 @@ class Edition(Item): blank=True, validators=[MinValueValidator(1), MaxValueValidator(12)], ) - binding = jsondata.CharField( - _("binding"), null=True, blank=True, default=None, max_length=500 - ) + binding = jsondata.CharField(_("binding"), null=True, blank=True, max_length=500) pages = jsondata.IntegerField(_("pages"), blank=True, default=None) - series = jsondata.CharField( - _("series"), null=True, blank=True, default=None, max_length=500 - ) - contents = jsondata.TextField(_("contents"), null=True, blank=True, default=None) + series = jsondata.CharField(_("series"), null=True, blank=True, max_length=500) + contents = jsondata.TextField(_("contents"), null=True, blank=True) price = jsondata.CharField(_("price"), null=True, blank=True, max_length=500) imprint = jsondata.CharField(_("imprint"), null=True, blank=True, max_length=500) diff --git a/catalog/common/models.py b/catalog/common/models.py index f24ebab8..7965c6ac 100644 --- a/catalog/common/models.py +++ b/catalog/common/models.py @@ -308,7 +308,7 @@ LOCALIZED_TITLE_SCHEMA = { }, "text": {"type": "string", "title": _("text content")}, }, - "required": ["lang", "s"], + "required": ["lang", "text"], }, "minItems": 1, "uniqueItems": True, @@ -330,11 +330,18 @@ LOCALIZED_DESCRIPTION_SCHEMA = { "widget": "textarea", }, }, - "required": ["lang", "s"], + "required": ["lang", "text"], }, "uniqueItems": True, } +LIST_OF_ONE_PLUS_STR_SCHEMA = { + "type": "list", + "items": {"type": "string", "required": True}, + "minItems": 1, + "uniqueItems": True, +} + def LanguageListField(): return jsondata.ArrayField( diff --git a/catalog/forms.py b/catalog/forms.py index 0740124c..a12d2ded 100644 --- a/catalog/forms.py +++ b/catalog/forms.py @@ -47,7 +47,7 @@ def _EditForm(item_model): # {'id': 547, 'primary_lookup_id_type': 'imdb', 'primary_lookup_id_value': 'tt0056923', 'cover': , 'orig_title': 'Charade', 'other_title': [], 'director': ['Stanley Donen'], 'playwright': ['Peter Stone'], 'actor': ['Cary Grant', 'Audrey Hepburn', 'Walter Matthau', 'James Coburn', 'George Kennedy', 'Dominique Minot', 'Ned Glass', 'Jacques Marin', 'Paul Bonifas', 'Thomas Chelimsky', 'Marc Arian', 'Claudine Berg', 'Marcel Bernier', 'Albert Daumergue', 'Raoul Delfosse', 'Stanley Donen', 'Jean Gold', 'Chantal Goya', 'Clément Harari', 'Monte Landis', 'Bernard Musson', 'Antonio Passalia', 'Jacques Préboist', 'Peter Stone', 'Michel Thomass', 'Roger Trapp', 'Louis Viret'], 'genre': ['喜剧', '悬疑', '爱情'], 'showtime': [{'time': '1963-12-05', 'region': ''}], 'site': '', 'area': [], 'language': ['English', 'Français', 'Deutsch', 'Italiano'], 'year': 1963, 'duration': '', 'localized_title': [], 'localized_description': []} def migrate_initial(self): - if self.initial and self.instance: + if self.initial and self.instance and self.instance.pk: if ( "localized_title" in self.Meta.fields and not self.initial["localized_title"] diff --git a/catalog/movie/models.py b/catalog/movie/models.py index ee009915..55624873 100644 --- a/catalog/movie/models.py +++ b/catalog/movie/models.py @@ -65,7 +65,7 @@ class Movie(Item): # "brief", ] orig_title = jsondata.CharField( - verbose_name=_("original title"), blank=True, default="", max_length=500 + verbose_name=_("original title"), blank=True, max_length=500 ) other_title = jsondata.ArrayField( verbose_name=_("other title"), @@ -130,9 +130,7 @@ class Movie(Item): }, }, ) - site = jsondata.URLField( - verbose_name=_("website"), blank=True, default="", max_length=200 - ) + site = jsondata.URLField(verbose_name=_("website"), blank=True, max_length=200) area = jsondata.ArrayField( verbose_name=_("region"), base_field=models.CharField( @@ -146,9 +144,7 @@ class Movie(Item): ) language = LanguageListField() year = jsondata.IntegerField(verbose_name=_("year"), null=True, blank=True) - duration = jsondata.CharField( - verbose_name=_("length"), blank=True, default="", max_length=200 - ) + duration = jsondata.CharField(verbose_name=_("length"), blank=True, max_length=200) season_number = jsondata.IntegerField( null=True, blank=True ) # TODO remove after migration diff --git a/catalog/music/models.py b/catalog/music/models.py index edd16d30..f456d065 100644 --- a/catalog/music/models.py +++ b/catalog/music/models.py @@ -16,6 +16,7 @@ from catalog.common import ( PrimaryLookupIdDescriptor, jsondata, ) +from catalog.common.models import LIST_OF_ONE_PLUS_STR_SCHEMA class AlbumInSchema(ItemInSchema): @@ -63,10 +64,12 @@ class Album(Item): duration = jsondata.IntegerField( _("length"), null=True, blank=True, help_text=_("milliseconds") ) - artist = jsondata.ArrayField( - models.CharField(blank=True, default="", max_length=200), + artist = jsondata.JSONField( verbose_name=_("artist"), + null=False, + blank=False, default=list, + schema=LIST_OF_ONE_PLUS_STR_SCHEMA, ) genre = jsondata.ArrayField( verbose_name=pgettext_lazy("music", "genre"), @@ -82,7 +85,7 @@ class Album(Item): blank=True, default=list, ) - track_list = jsondata.TextField(_("tracks"), blank=True, default="") + track_list = jsondata.TextField(_("tracks"), blank=True) other_title = jsondata.ArrayField( verbose_name=_("other title"), base_field=models.CharField(blank=True, default="", max_length=200), @@ -90,11 +93,9 @@ class Album(Item): blank=True, default=list, ) - album_type = jsondata.CharField( - _("album type"), blank=True, default="", max_length=500 - ) - media = jsondata.CharField(_("media type"), blank=True, default="", max_length=500) - bandcamp_album_id = jsondata.CharField(blank=True, default="", max_length=500) + album_type = jsondata.CharField(_("album type"), blank=True, max_length=500) + media = jsondata.CharField(_("media type"), blank=True, max_length=500) + bandcamp_album_id = jsondata.CharField(blank=True, max_length=500) disc_count = jsondata.IntegerField( _("number of discs"), blank=True, default="", max_length=500 ) diff --git a/catalog/performance/models.py b/catalog/performance/models.py index bbbaf660..5c9b8931 100644 --- a/catalog/performance/models.py +++ b/catalog/performance/models.py @@ -109,7 +109,7 @@ class Performance(Item): category = ItemCategory.Performance url_path = "performance" orig_title = jsondata.CharField( - verbose_name=_("original name"), blank=True, default="", max_length=500 + verbose_name=_("original name"), blank=True, max_length=500 ) other_title = jsondata.ArrayField( verbose_name=_("other title"), diff --git a/catalog/tv/models.py b/catalog/tv/models.py index 8dc8104f..2ced702c 100644 --- a/catalog/tv/models.py +++ b/catalog/tv/models.py @@ -135,7 +135,7 @@ class TVShow(Item): "single_episode_length", ] orig_title = jsondata.CharField( - verbose_name=_("original title"), blank=True, default="", max_length=500 + verbose_name=_("original title"), blank=True, max_length=500 ) other_title = jsondata.ArrayField( base_field=models.CharField(blank=True, default="", max_length=500), @@ -200,9 +200,7 @@ class TVShow(Item): }, }, ) - site = jsondata.URLField( - verbose_name=_("website"), blank=True, default="", max_length=200 - ) + site = jsondata.URLField(verbose_name=_("website"), blank=True, max_length=200) area = jsondata.ArrayField( verbose_name=_("region"), base_field=models.CharField( @@ -224,7 +222,7 @@ class TVShow(Item): null=True, blank=True ) # TODO remove after migration duration = jsondata.CharField( - blank=True, default="", max_length=200 + blank=True, max_length=200 ) # TODO remove after migration @classmethod