From 7b78b8294933324b565c13c81fda1df6ce83ae4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Thu, 22 Nov 2018 19:14:36 +0100 Subject: [PATCH] require all fields on json form submit --- src/c3nav/editor/forms.py | 10 +++++++++- src/c3nav/editor/views/edit.py | 5 +++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/c3nav/editor/forms.py b/src/c3nav/editor/forms.py index b12a243b..b9489a9b 100644 --- a/src/c3nav/editor/forms.py +++ b/src/c3nav/editor/forms.py @@ -23,7 +23,7 @@ from c3nav.mapdata.models.access import AccessPermission class EditorFormBase(I18nModelFormMixin, ModelForm): - def __init__(self, *args, space_id=None, request=None, force_geometry_editable=False, **kwargs): + def __init__(self, *args, space_id=None, request=None, force_geometry_editable=False, is_json=False, **kwargs): self.request = request super().__init__(*args, **kwargs) creating = not self.instance.pk @@ -185,6 +185,10 @@ class EditorFormBase(I18nModelFormMixin, ModelForm): if 'data' in self.fields and 'data' in self.initial: self.initial['data'] = json.dumps(self.initial['data']) + self.is_json = is_json + self.missing_fields = tuple((name, field) for name, field in self.fields.items() + if name not in self.data and not field.required) + def clean_redirect_slugs(self): old_redirect_slugs = set(self.redirect_slugs) new_redirect_slugs = set(s for s in (s.strip() for s in self.cleaned_data['redirect_slugs'].split(',')) if s) @@ -222,6 +226,10 @@ class EditorFormBase(I18nModelFormMixin, ModelForm): return data def clean(self): + if self.is_json: + for name, field in self.missing_fields: + self.add_error(name, field.error_messages['required']) + if 'geometry' in self.fields: if not self.cleaned_data.get('geometry'): raise ValidationError('Missing geometry.') diff --git a/src/c3nav/editor/views/edit.py b/src/c3nav/editor/views/edit.py index 38aa1df1..cd36af04 100644 --- a/src/c3nav/editor/views/edit.py +++ b/src/c3nav/editor/views/edit.py @@ -335,8 +335,9 @@ def edit(request, pk=None, model=None, level=None, space=None, on_top_of=None, e ctx['obj_title'] = obj.title return render(request, 'editor/delete.html', ctx) - data = getattr(request, 'json_body', request.POST) - form = model.EditorForm(instance=model() if new else obj, data=data, + json_body = getattr(request, 'json_body', None) + data = json_body if json_body is not None else request.POST + form = model.EditorForm(instance=model() if new else obj, data=data, is_json=True, request=request, space_id=space_id, force_geometry_editable=force_geometry_editable) if form.is_valid(): # Update/create objects