level_detail editor api

This commit is contained in:
Laura Klünder 2018-11-21 22:12:34 +01:00
parent 5c87cb9592
commit 46ffca598b
2 changed files with 14 additions and 4 deletions

View file

@ -8,6 +8,7 @@ from django.contrib.auth.views import redirect_to_login
from django.contrib.messages import DEFAULT_TAGS as DEFAULT_MESSAGE_TAGS
from django.contrib.messages import get_messages
from django.core.exceptions import PermissionDenied
from django.db.models import QuerySet
from django.http import HttpResponse, HttpResponseNotModified, HttpResponseRedirect
from django.shortcuts import redirect, render
from django.utils.cache import patch_vary_headers
@ -17,6 +18,7 @@ from rest_framework.response import Response as APIResponse
from c3nav.editor.models import ChangeSet
from c3nav.mapdata.models.access import AccessPermission
from c3nav.mapdata.models.base import SerializableMixin
from c3nav.mapdata.utils.user import can_access_editor
@ -198,10 +200,18 @@ class APIHybridTemplateContextResponse(APIHybridResponse):
self.ctx = ctx
self.fields = fields
def _maybe_serialize_value(self, value):
if isinstance(value, SerializableMixin):
value = value.serialize(geometry=False)
elif isinstance(value, QuerySet) and issubclass(value.model, SerializableMixin):
value = [item.serialize(geometry=False) for item in value]
return value
def get_api_response(self, request):
result = self.ctx
if self.fields:
result = {name: value for name, value in result.items() if name in self.fields}
result = {name: self._maybe_serialize_value(value)
for name, value in result.items() if name in self.fields}
return result
def get_html_response(self, request):

View file

@ -59,7 +59,7 @@ def main_index(request):
}, fields=('can_create_level', 'child_models'))
@sidebar_view
@sidebar_view(api_hybrid=True)
@etag(etag_func)
def level_detail(request, pk):
Level = request.changeset.wrap_model('Level')
@ -71,7 +71,7 @@ def level_detail(request, pk):
else:
submodels = ('Space', )
return render(request, 'editor/level.html', {
return APIHybridTemplateContextResponse('editor/level.html', {
'levels': Level.objects.filter(Level.q_for_request(request), on_top_of__isnull=True),
'level': level,
'level_url': 'editor.levels.detail',
@ -85,7 +85,7 @@ def level_detail(request, pk):
'levels_on_top': level.levels_on_top.filter(Level.q_for_request(request)).all(),
'geometry_url': ('/api/editor/geometries/?level='+str(level.primary_level_pk)
if request.user_permissions.can_access_base_mapdata else None),
})
}, fields=('level', 'can_edit_graph', 'can_create_level', 'child_models', 'levels_on_top'))
@sidebar_view