From 92dafeb37048e830641e05368f1394d8da93260e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Sun, 9 Dec 2018 20:34:06 +0100 Subject: [PATCH] fix can_create in editor list (and some refactoring) --- src/c3nav/editor/utils.py | 45 ++++++++++++++++++++++++++++++++++ src/c3nav/editor/views/edit.py | 12 ++++----- 2 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 src/c3nav/editor/utils.py diff --git a/src/c3nav/editor/utils.py b/src/c3nav/editor/utils.py new file mode 100644 index 00000000..3b5d9631 --- /dev/null +++ b/src/c3nav/editor/utils.py @@ -0,0 +1,45 @@ +class DefaultEditUtils: + def __init__(self, request): + self.request = request + + @property + def can_access_child_base_mapdata(self): + return self.request.user_permissions.can_access_base_mapdata + + @property + def can_create(self): + return self.can_access_child_base_mapdata + + @property + def _geometry_url(self): + return None + + @property + def geometry_url(self): + return self._geometry_url if self.can_access_child_base_mapdata else None + + +class LevelChildEditUtils(DefaultEditUtils): + def __init__(self, level, request): + super().__init__(request) + self.level = level + + @property + def _geometry_url(self): + return '/api/editor/geometries/?level=' + str(self.level.primary_level_pk) + + +class SpaceChildEditUtils(DefaultEditUtils): + def __init__(self, space, request): + super().__init__(request) + self.space = space + + @property + def can_access_child_base_mapdata(self): + return (self.request.user_permissions.can_access_base_mapdata or + self.space.base_mapdata_accessible or + self.space.pk in self.request.user_space_access) + + @property + def _geometry_url(self): + return '/api/editor/geometries/?space='+str(self.space.pk) diff --git a/src/c3nav/editor/views/edit.py b/src/c3nav/editor/views/edit.py index 3bed77fd..baf50fcc 100644 --- a/src/c3nav/editor/views/edit.py +++ b/src/c3nav/editor/views/edit.py @@ -16,6 +16,7 @@ from django.utils.translation import ugettext_lazy as _ from django.views.decorators.http import etag from c3nav.editor.forms import GraphEdgeSettingsForm, GraphEditorActionForm +from c3nav.editor.utils import DefaultEditUtils, LevelChildEditUtils, SpaceChildEditUtils from c3nav.editor.views.base import (APIHybridError, APIHybridFormTemplateResponse, APIHybridLoginRequiredResponse, APIHybridMessageRedirectResponse, APIHybridTemplateContextResponse, etag_func, sidebar_view) @@ -422,7 +423,6 @@ def list_objects(request, model=None, level=None, space=None, explicit_edit=Fals Space = request.changeset.wrap_model('Space') can_edit = request.changeset.can_edit(request) - can_create = request.user_permissions.can_access_base_mapdata and can_edit ctx = { 'path': request.path, @@ -430,7 +430,6 @@ def list_objects(request, model=None, level=None, space=None, explicit_edit=Fals 'model_title': model._meta.verbose_name, 'model_title_plural': model._meta.verbose_name_plural, 'explicit_edit': explicit_edit, - 'can_create': can_create, } queryset = model.objects.all().order_by('id') @@ -442,20 +441,20 @@ def list_objects(request, model=None, level=None, space=None, explicit_edit=Fals reverse_kwargs['level'] = level level = get_object_or_404(Level.objects.filter(Level.q_for_request(request)), pk=level) queryset = queryset.filter(level=level).defer('geometry') + edit_utils = LevelChildEditUtils(level, request) ctx.update({ 'back_url': reverse('editor.levels.detail', kwargs={'pk': level.pk}), 'back_title': _('back to level'), 'levels': Level.objects.filter(Level.q_for_request(request), on_top_of__isnull=True), 'level': level, 'level_url': resolver_match.url_name, - 'geometry_url': ('/api/editor/geometries/?level='+str(level.primary_level_pk) - if request.user_permissions.can_access_base_mapdata else None), }) elif space is not None: reverse_kwargs['space'] = space sub_qs = Space.objects.filter(Space.q_for_request(request)).select_related('level').defer('geometry') space = get_object_or_404(sub_qs, pk=space) queryset = queryset.filter(space=space).filter(**get_visible_spaces_kwargs(model, request)) + edit_utils = SpaceChildEditUtils(space, request) try: model._meta.get_field('geometry') @@ -485,10 +484,9 @@ def list_objects(request, model=None, level=None, space=None, explicit_edit=Fals 'space': space, 'back_url': reverse('editor.spaces.detail', kwargs={'level': space.level.pk, 'pk': space.pk}), 'back_title': _('back to space'), - 'geometry_url': ('/api/editor/geometries/?space='+str(space.pk) - if request.user_permissions.can_access_base_mapdata else None), }) else: + edit_utils = DefaultEditUtils(request) ctx.update({ 'back_url': reverse('editor.index'), 'back_title': _('back to overview'), @@ -501,6 +499,8 @@ def list_objects(request, model=None, level=None, space=None, explicit_edit=Fals reverse_kwargs.pop('pk', None) ctx.update({ + 'can_create': edit_utils.can_create and can_edit, + 'geometry_url': edit_utils.geometry_url, 'create_url': reverse(resolver_match.url_name[:-4] + 'create', kwargs=reverse_kwargs), 'objects': queryset, })