diff --git a/AKModel/forms.py b/AKModel/forms.py index 8295dd7ca67a9524ef8058fc57cbe6042dc7c818..eb60a04071ba1267681176ccd32d7e79e6437492 100644 --- a/AKModel/forms.py +++ b/AKModel/forms.py @@ -10,9 +10,11 @@ from django import forms from django.core.exceptions import ValidationError from django.forms.utils import ErrorList from django.utils.translation import gettext_lazy as _ +from jsonschema.exceptions import best_match from AKModel.availability.forms import AvailabilitiesFormMixin from AKModel.models import Event, AKCategory, AKRequirement, Room, AKType +from AKModel.utils import construct_schema_validator class DateTimeInput(forms.DateInput): @@ -300,19 +302,29 @@ class JSONScheduleImportForm(AdminIntermediateForm): help_text=_("File with JSON data from the scheduling solver"), ) + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.json_schema_validator = construct_schema_validator( + schema="solver-output.schema.json" + ) + def _check_json_data(self, data: str): try: schedule = json.loads(data) except json.JSONDecodeError as ex: raise ValidationError(_("Cannot decode as JSON"), "invalid") from ex - for field in ["input", "scheduled_aks"]: - if not field in schedule: - raise ValidationError( - _("Invalid JSON format: field '%(field)s' is missing"), - "invalid", - params={"field": field} - ) - # TODO: Add further checks on json input + + error = best_match(self.json_schema_validator.iter_errors(schedule)) + if error: + raise ValidationError( + _("Invalid JSON format: %(msg)s at %(error_path)s"), + "invalid", + params={ + "msg": error.message, + "error_path": error.json_path + } + ) from error + return schedule def clean(self): diff --git a/AKModel/locale/de_DE/LC_MESSAGES/django.po b/AKModel/locale/de_DE/LC_MESSAGES/django.po index 107e562e2303c840a08d03f7dd567afeb01f9cb5..2d6588319229e137d0d8b93defc6e96c8ec34cee 100644 --- a/AKModel/locale/de_DE/LC_MESSAGES/django.po +++ b/AKModel/locale/de_DE/LC_MESSAGES/django.po @@ -303,8 +303,8 @@ msgstr "Dekodierung als JSON fehlgeschlagen" #: AKModel/forms.py:311 #, python-format -msgid "Invalid JSON format: field '%(field)s' is missing" -msgstr "Ungültige JSON-Eingabe: das Feld '%(field)s' fehlt" +msgid "Invalid JSON format: %(msg)s at %(error_path)s" +msgstr "Ungültige JSON-Eingabe: %(msg)s bei %(error_path)s" #: AKModel/forms.py:321 msgid "Please enter data as a file OR via text, not both." @@ -1495,6 +1495,10 @@ msgstr "Zu Anforderungen gehörige AKs anzeigen" msgid "Event Status" msgstr "Eventstatus" +#, python-format +#~ msgid "Invalid JSON format: field '%(field)s' is missing" +#~ msgstr "Ungültige JSON-Eingabe: das Feld '%(field)s' fehlt" + #~ msgid "Opening time for expression of interest." #~ msgstr "Öffnungszeitpunkt für die Angabe von Interesse an AKs."