improve input validation

This commit is contained in:
Your Name 2024-07-16 02:28:53 -04:00 committed by Henri Dickson
parent 8778100656
commit 1e24e434e6
7 changed files with 36 additions and 37 deletions

View file

@ -38,6 +38,7 @@ from catalog.common import (
jsondata, jsondata,
) )
from catalog.common.models import ( from catalog.common.models import (
LIST_OF_ONE_PLUS_STR_SCHEMA,
LOCALE_CHOICES_JSONFORM, LOCALE_CHOICES_JSONFORM,
SCRIPT_CHOICES, SCRIPT_CHOICES,
LanguageListField, LanguageListField,
@ -81,7 +82,7 @@ EDITION_LOCALIZED_TITLE_SCHEMA = {
}, },
"text": {"type": "string", "title": _("text content")}, "text": {"type": "string", "title": _("text content")},
}, },
"required": ["lang", "s"], "required": ["lang", "text"],
}, },
"minItems": 1, "minItems": 1,
"maxItems": 1, "maxItems": 1,
@ -100,7 +101,7 @@ EDITION_LOCALIZED_SUBTITLE_SCHEMA = {
}, },
"text": {"type": "string", "title": _("text content")}, "text": {"type": "string", "title": _("text content")},
}, },
"required": ["lang", "s"], "required": ["lang", "text"],
}, },
"minItems": 0, "minItems": 0,
"maxItems": 1, "maxItems": 1,
@ -154,14 +155,14 @@ class Edition(Item):
# _("subtitle"), null=True, blank=True, default=None, max_length=500 # _("subtitle"), null=True, blank=True, default=None, max_length=500
# ) # )
orig_title = jsondata.CharField( 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"), verbose_name=_("author"),
base_field=models.CharField(max_length=500),
null=False, null=False,
blank=False, blank=False,
default=list, default=list,
schema=LIST_OF_ONE_PLUS_STR_SCHEMA,
) )
translator = jsondata.ArrayField( translator = jsondata.ArrayField(
verbose_name=_("translator"), verbose_name=_("translator"),
@ -172,7 +173,7 @@ class Edition(Item):
) )
language = LanguageListField() language = LanguageListField()
pub_house = jsondata.CharField( 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( pub_year = jsondata.IntegerField(
_("publication year"), _("publication year"),
@ -186,14 +187,10 @@ class Edition(Item):
blank=True, blank=True,
validators=[MinValueValidator(1), MaxValueValidator(12)], validators=[MinValueValidator(1), MaxValueValidator(12)],
) )
binding = jsondata.CharField( binding = jsondata.CharField(_("binding"), null=True, blank=True, max_length=500)
_("binding"), null=True, blank=True, default=None, max_length=500
)
pages = jsondata.IntegerField(_("pages"), blank=True, default=None) pages = jsondata.IntegerField(_("pages"), blank=True, default=None)
series = jsondata.CharField( series = jsondata.CharField(_("series"), null=True, blank=True, max_length=500)
_("series"), null=True, blank=True, default=None, max_length=500 contents = jsondata.TextField(_("contents"), null=True, blank=True)
)
contents = jsondata.TextField(_("contents"), null=True, blank=True, default=None)
price = jsondata.CharField(_("price"), null=True, blank=True, max_length=500) price = jsondata.CharField(_("price"), null=True, blank=True, max_length=500)
imprint = jsondata.CharField(_("imprint"), null=True, blank=True, max_length=500) imprint = jsondata.CharField(_("imprint"), null=True, blank=True, max_length=500)

View file

@ -308,7 +308,7 @@ LOCALIZED_TITLE_SCHEMA = {
}, },
"text": {"type": "string", "title": _("text content")}, "text": {"type": "string", "title": _("text content")},
}, },
"required": ["lang", "s"], "required": ["lang", "text"],
}, },
"minItems": 1, "minItems": 1,
"uniqueItems": True, "uniqueItems": True,
@ -330,11 +330,18 @@ LOCALIZED_DESCRIPTION_SCHEMA = {
"widget": "textarea", "widget": "textarea",
}, },
}, },
"required": ["lang", "s"], "required": ["lang", "text"],
}, },
"uniqueItems": True, "uniqueItems": True,
} }
LIST_OF_ONE_PLUS_STR_SCHEMA = {
"type": "list",
"items": {"type": "string", "required": True},
"minItems": 1,
"uniqueItems": True,
}
def LanguageListField(): def LanguageListField():
return jsondata.ArrayField( return jsondata.ArrayField(

View file

@ -47,7 +47,7 @@ def _EditForm(item_model):
# {'id': 547, 'primary_lookup_id_type': 'imdb', 'primary_lookup_id_value': 'tt0056923', 'cover': <ImageFieldFile: item/tmdb_movie/2024/01/12/10973d2b-1d20-4e37-8c3c-ecc89e671a80.jpg>, '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': []} # {'id': 547, 'primary_lookup_id_type': 'imdb', 'primary_lookup_id_value': 'tt0056923', 'cover': <ImageFieldFile: item/tmdb_movie/2024/01/12/10973d2b-1d20-4e37-8c3c-ecc89e671a80.jpg>, '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): def migrate_initial(self):
if self.initial and self.instance: if self.initial and self.instance and self.instance.pk:
if ( if (
"localized_title" in self.Meta.fields "localized_title" in self.Meta.fields
and not self.initial["localized_title"] and not self.initial["localized_title"]

View file

@ -65,7 +65,7 @@ class Movie(Item):
# "brief", # "brief",
] ]
orig_title = jsondata.CharField( 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( other_title = jsondata.ArrayField(
verbose_name=_("other title"), verbose_name=_("other title"),
@ -130,9 +130,7 @@ class Movie(Item):
}, },
}, },
) )
site = jsondata.URLField( site = jsondata.URLField(verbose_name=_("website"), blank=True, max_length=200)
verbose_name=_("website"), blank=True, default="", max_length=200
)
area = jsondata.ArrayField( area = jsondata.ArrayField(
verbose_name=_("region"), verbose_name=_("region"),
base_field=models.CharField( base_field=models.CharField(
@ -146,9 +144,7 @@ class Movie(Item):
) )
language = LanguageListField() language = LanguageListField()
year = jsondata.IntegerField(verbose_name=_("year"), null=True, blank=True) year = jsondata.IntegerField(verbose_name=_("year"), null=True, blank=True)
duration = jsondata.CharField( duration = jsondata.CharField(verbose_name=_("length"), blank=True, max_length=200)
verbose_name=_("length"), blank=True, default="", max_length=200
)
season_number = jsondata.IntegerField( season_number = jsondata.IntegerField(
null=True, blank=True null=True, blank=True
) # TODO remove after migration ) # TODO remove after migration

View file

@ -16,6 +16,7 @@ from catalog.common import (
PrimaryLookupIdDescriptor, PrimaryLookupIdDescriptor,
jsondata, jsondata,
) )
from catalog.common.models import LIST_OF_ONE_PLUS_STR_SCHEMA
class AlbumInSchema(ItemInSchema): class AlbumInSchema(ItemInSchema):
@ -63,10 +64,12 @@ class Album(Item):
duration = jsondata.IntegerField( duration = jsondata.IntegerField(
_("length"), null=True, blank=True, help_text=_("milliseconds") _("length"), null=True, blank=True, help_text=_("milliseconds")
) )
artist = jsondata.ArrayField( artist = jsondata.JSONField(
models.CharField(blank=True, default="", max_length=200),
verbose_name=_("artist"), verbose_name=_("artist"),
null=False,
blank=False,
default=list, default=list,
schema=LIST_OF_ONE_PLUS_STR_SCHEMA,
) )
genre = jsondata.ArrayField( genre = jsondata.ArrayField(
verbose_name=pgettext_lazy("music", "genre"), verbose_name=pgettext_lazy("music", "genre"),
@ -82,7 +85,7 @@ class Album(Item):
blank=True, blank=True,
default=list, default=list,
) )
track_list = jsondata.TextField(_("tracks"), blank=True, default="") track_list = jsondata.TextField(_("tracks"), blank=True)
other_title = jsondata.ArrayField( other_title = jsondata.ArrayField(
verbose_name=_("other title"), verbose_name=_("other title"),
base_field=models.CharField(blank=True, default="", max_length=200), base_field=models.CharField(blank=True, default="", max_length=200),
@ -90,11 +93,9 @@ class Album(Item):
blank=True, blank=True,
default=list, default=list,
) )
album_type = jsondata.CharField( album_type = jsondata.CharField(_("album type"), blank=True, max_length=500)
_("album type"), blank=True, default="", max_length=500 media = jsondata.CharField(_("media type"), blank=True, max_length=500)
) bandcamp_album_id = jsondata.CharField(blank=True, 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)
disc_count = jsondata.IntegerField( disc_count = jsondata.IntegerField(
_("number of discs"), blank=True, default="", max_length=500 _("number of discs"), blank=True, default="", max_length=500
) )

View file

@ -109,7 +109,7 @@ class Performance(Item):
category = ItemCategory.Performance category = ItemCategory.Performance
url_path = "performance" url_path = "performance"
orig_title = jsondata.CharField( 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( other_title = jsondata.ArrayField(
verbose_name=_("other title"), verbose_name=_("other title"),

View file

@ -135,7 +135,7 @@ class TVShow(Item):
"single_episode_length", "single_episode_length",
] ]
orig_title = jsondata.CharField( 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( other_title = jsondata.ArrayField(
base_field=models.CharField(blank=True, default="", max_length=500), base_field=models.CharField(blank=True, default="", max_length=500),
@ -200,9 +200,7 @@ class TVShow(Item):
}, },
}, },
) )
site = jsondata.URLField( site = jsondata.URLField(verbose_name=_("website"), blank=True, max_length=200)
verbose_name=_("website"), blank=True, default="", max_length=200
)
area = jsondata.ArrayField( area = jsondata.ArrayField(
verbose_name=_("region"), verbose_name=_("region"),
base_field=models.CharField( base_field=models.CharField(
@ -224,7 +222,7 @@ class TVShow(Item):
null=True, blank=True null=True, blank=True
) # TODO remove after migration ) # TODO remove after migration
duration = jsondata.CharField( duration = jsondata.CharField(
blank=True, default="", max_length=200 blank=True, max_length=200
) # TODO remove after migration ) # TODO remove after migration
@classmethod @classmethod