allow json bodies for editor form
This commit is contained in:
parent
4887a387fc
commit
e778c50f2e
5 changed files with 28 additions and 6 deletions
21
src/c3nav/api/middleware.py
Normal file
21
src/c3nav/api/middleware.py
Normal file
|
@ -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)
|
|
@ -361,7 +361,7 @@ class ChangedObject(models.Model):
|
||||||
pks = set(related_obj.pk for related_obj in getattr(obj, name).all())
|
pks = set(related_obj.pk for related_obj in getattr(obj, name).all())
|
||||||
elif not self.is_created:
|
elif not self.is_created:
|
||||||
field = self.model_class._meta.get_field(name)
|
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))
|
pks = set(field.related_model.objects.filter(**{rel_name+'__pk': self.obj_pk}).values_list('pk', flat=True))
|
||||||
else:
|
else:
|
||||||
pks = set()
|
pks = set()
|
||||||
|
|
|
@ -36,12 +36,10 @@ def sidebar_view(func=None, select_related=None, api_hybrid=False):
|
||||||
if not can_access_editor(request):
|
if not can_access_editor(request):
|
||||||
raise PermissionDenied
|
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)
|
request.changeset = ChangeSet.get_for_request(request, select_related)
|
||||||
|
|
||||||
if api:
|
if api:
|
||||||
|
request.is_delete = request.method == 'DELETE'
|
||||||
return call_api_hybrid_view_for_api(func, request, *args, **kwargs)
|
return call_api_hybrid_view_for_api(func, request, *args, **kwargs)
|
||||||
|
|
||||||
ajax = request.is_ajax() or 'ajax' in request.GET
|
ajax = request.is_ajax() or 'ajax' in request.GET
|
||||||
|
|
|
@ -124,7 +124,7 @@ def get_changeset_exceeded(request):
|
||||||
|
|
||||||
@sidebar_view(api_hybrid=True)
|
@sidebar_view(api_hybrid=True)
|
||||||
@etag(etag_func)
|
@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)
|
changeset_exceeded = get_changeset_exceeded(request)
|
||||||
model_changes = {}
|
model_changes = {}
|
||||||
if changeset_exceeded:
|
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.'))
|
message=_('You need to log in to create Wifi Measurements.'))
|
||||||
|
|
||||||
error = None
|
error = None
|
||||||
|
delete = getattr(request, 'is_delete', False)
|
||||||
if request.method == 'POST' or (not new and delete):
|
if request.method == 'POST' or (not new and delete):
|
||||||
if nosave:
|
if nosave:
|
||||||
return APIHybridMessageRedirectResponse(
|
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
|
ctx['obj_title'] = obj.title
|
||||||
return render(request, 'editor/delete.html', ctx)
|
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)
|
request=request, space_id=space_id, force_geometry_editable=force_geometry_editable)
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
# Update/create objects
|
# Update/create objects
|
||||||
|
|
|
@ -225,6 +225,7 @@ MIDDLEWARE = [
|
||||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||||
'c3nav.mapdata.middleware.UserDataMiddleware',
|
'c3nav.mapdata.middleware.UserDataMiddleware',
|
||||||
'c3nav.control.middleware.UserPermissionsMiddleware',
|
'c3nav.control.middleware.UserPermissionsMiddleware',
|
||||||
|
'c3nav.api.middleware.JsonRequestBodyMiddleware',
|
||||||
]
|
]
|
||||||
|
|
||||||
with suppress(ImportError):
|
with suppress(ImportError):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue