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 DEFAULT_TAGS as DEFAULT_MESSAGE_TAGS
from django.contrib.messages import get_messages from django.contrib.messages import get_messages
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.db.models import QuerySet
from django.http import HttpResponse, HttpResponseNotModified, HttpResponseRedirect from django.http import HttpResponse, HttpResponseNotModified, HttpResponseRedirect
from django.shortcuts import redirect, render from django.shortcuts import redirect, render
from django.utils.cache import patch_vary_headers 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.editor.models import ChangeSet
from c3nav.mapdata.models.access import AccessPermission from c3nav.mapdata.models.access import AccessPermission
from c3nav.mapdata.models.base import SerializableMixin
from c3nav.mapdata.utils.user import can_access_editor from c3nav.mapdata.utils.user import can_access_editor
@ -198,10 +200,18 @@ class APIHybridTemplateContextResponse(APIHybridResponse):
self.ctx = ctx self.ctx = ctx
self.fields = fields 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): def get_api_response(self, request):
result = self.ctx result = self.ctx
if self.fields: 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 return result
def get_html_response(self, request): def get_html_response(self, request):

View file

@ -59,7 +59,7 @@ def main_index(request):
}, fields=('can_create_level', 'child_models')) }, fields=('can_create_level', 'child_models'))
@sidebar_view @sidebar_view(api_hybrid=True)
@etag(etag_func) @etag(etag_func)
def level_detail(request, pk): def level_detail(request, pk):
Level = request.changeset.wrap_model('Level') Level = request.changeset.wrap_model('Level')
@ -71,7 +71,7 @@ def level_detail(request, pk):
else: else:
submodels = ('Space', ) 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), 'levels': Level.objects.filter(Level.q_for_request(request), on_top_of__isnull=True),
'level': level, 'level': level,
'level_url': 'editor.levels.detail', '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(), '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) 'geometry_url': ('/api/editor/geometries/?level='+str(level.primary_level_pk)
if request.user_permissions.can_access_base_mapdata else None), 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 @sidebar_view