improve input validation
This commit is contained in:
parent
8778100656
commit
1e24e434e6
7 changed files with 36 additions and 37 deletions
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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"]
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
|
@ -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"),
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue