From e778c50f2ecaa2bbb4afe9f0f547b4213bc35f99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Thu, 22 Nov 2018 18:34:52 +0100 Subject: [PATCH] allow json bodies for editor form --- src/c3nav/api/middleware.py | 21 +++++++++++++++++++++ src/c3nav/editor/models/changedobject.py | 2 +- src/c3nav/editor/views/base.py | 4 +--- src/c3nav/editor/views/edit.py | 6 ++++-- src/c3nav/settings.py | 1 + 5 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 src/c3nav/api/middleware.py diff --git a/src/c3nav/api/middleware.py b/src/c3nav/api/middleware.py new file mode 100644 index 00000000..1198829e --- /dev/null +++ b/src/c3nav/api/middleware.py @@ -0,0 +1,21 @@ +import json + +from django.http import HttpResponseBadRequest + + +class JsonRequestBodyMiddleware: + """ + Enables posting JSON requests. + """ + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + is_json = request.META.get('CONTENT_TYPE').lower() == 'application/json' + if is_json: + try: + data = json.loads(request.body) + except json.JSONDecodeError: + raise HttpResponseBadRequest + request.json_body = data + return self.get_response(request) diff --git a/src/c3nav/editor/models/changedobject.py b/src/c3nav/editor/models/changedobject.py index 6738a145..ec7afff9 100644 --- a/src/c3nav/editor/models/changedobject.py +++ b/src/c3nav/editor/models/changedobject.py @@ -361,7 +361,7 @@ class ChangedObject(models.Model): pks = set(related_obj.pk for related_obj in getattr(obj, name).all()) elif not self.is_created: field = self.model_class._meta.get_field(name) - rel_name = field.rel.related_name + rel_name = field.remote_field.related_name pks = set(field.related_model.objects.filter(**{rel_name+'__pk': self.obj_pk}).values_list('pk', flat=True)) else: pks = set() diff --git a/src/c3nav/editor/views/base.py b/src/c3nav/editor/views/base.py index 6ac21031..b2289f8d 100644 --- a/src/c3nav/editor/views/base.py +++ b/src/c3nav/editor/views/base.py @@ -36,12 +36,10 @@ def sidebar_view(func=None, select_related=None, api_hybrid=False): if not can_access_editor(request): raise PermissionDenied - if api_hybrid and api and func.__name__ == 'edit': - kwargs['delete'] = request.method == 'DELETE' - request.changeset = ChangeSet.get_for_request(request, select_related) if api: + request.is_delete = request.method == 'DELETE' return call_api_hybrid_view_for_api(func, request, *args, **kwargs) ajax = request.is_ajax() or 'ajax' in request.GET diff --git a/src/c3nav/editor/views/edit.py b/src/c3nav/editor/views/edit.py index 028f885f..38aa1df1 100644 --- a/src/c3nav/editor/views/edit.py +++ b/src/c3nav/editor/views/edit.py @@ -124,7 +124,7 @@ def get_changeset_exceeded(request): @sidebar_view(api_hybrid=True) @etag(etag_func) -def edit(request, pk=None, model=None, level=None, space=None, on_top_of=None, explicit_edit=False, delete=True): +def edit(request, pk=None, model=None, level=None, space=None, on_top_of=None, explicit_edit=False): changeset_exceeded = get_changeset_exceeded(request) model_changes = {} if changeset_exceeded: @@ -281,6 +281,7 @@ def edit(request, pk=None, model=None, level=None, space=None, on_top_of=None, e message=_('You need to log in to create Wifi Measurements.')) error = None + delete = getattr(request, 'is_delete', False) if request.method == 'POST' or (not new and delete): if nosave: return APIHybridMessageRedirectResponse( @@ -334,7 +335,8 @@ 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) - form = model.EditorForm(instance=model() if new else obj, data=request.POST, + data = getattr(request, 'json_body', request.POST) + form = model.EditorForm(instance=model() if new else obj, data=data, request=request, space_id=space_id, force_geometry_editable=force_geometry_editable) if form.is_valid(): # Update/create objects diff --git a/src/c3nav/settings.py b/src/c3nav/settings.py index e3c5208a..19903017 100644 --- a/src/c3nav/settings.py +++ b/src/c3nav/settings.py @@ -225,6 +225,7 @@ MIDDLEWARE = [ 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'c3nav.mapdata.middleware.UserDataMiddleware', 'c3nav.control.middleware.UserPermissionsMiddleware', + 'c3nav.api.middleware.JsonRequestBodyMiddleware', ] with suppress(ImportError):