diff options
| author | Étienne Loks <etienne.loks@peacefrogs.net> | 2013-08-07 17:36:41 +0200 |
|---|---|---|
| committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2013-08-07 17:36:41 +0200 |
| commit | a6fc315c72946489a0c683a640f5953c5fb7e6b9 (patch) | |
| tree | 26521dd75186ff2d25fbd2b275e1f5753c116c47 | |
| parent | 9a9e37ef2be3f07ac6efed8cb7319114b9803756 (diff) | |
| download | Chimère-a6fc315c72946489a0c683a640f5953c5fb7e6b9.tar.bz2 Chimère-a6fc315c72946489a0c683a640f5953c5fb7e6b9.zip | |
Better management of map rights
| -rw-r--r-- | chimere/actions.py | 2 | ||||
| -rw-r--r-- | chimere/models.py | 48 | ||||
| -rw-r--r-- | chimere/views.py | 19 |
3 files changed, 44 insertions, 25 deletions
diff --git a/chimere/actions.py b/chimere/actions.py index d9ed274..824b14f 100644 --- a/chimere/actions.py +++ b/chimere/actions.py @@ -42,7 +42,7 @@ DEFAULT_ACTIONS = [[Action('view', 'chimere:index', _('View')), []], [Action('contribute', 'chimere:edit', _('Contribute'), condition=lambda user, map_name:bool( Map.getAvailable(user=user, urn=map_name, single=True, - edit=True))), + propose=True))), (Action('edit', 'chimere:edit', _('Add a new point of interest')), Action('edit-route', 'chimere:editroute', _('Add a new route'))), ], diff --git a/chimere/models.py b/chimere/models.py index cd2996d..d5b3f1b 100644 --- a/chimere/models.py +++ b/chimere/models.py @@ -1397,8 +1397,17 @@ class Map(models.Model, SimpleArea): ordering = ('order', 'name') verbose_name = _("Map") + def can_write(self, user=None): + return bool(self.getAvailable(user=user, urn=self.urn, single=True, + edit=True)) + + def can_propose(self, user=None): + return bool(self.getAvailable(user=user, urn=self.urn, single=True, + propose=True)) + @classmethod - def getAvailable(cls, user=None, urn=None, single=False, edit=False): + def getAvailable(cls, user=None, urn=None, single=False, edit=False, + propose=False): '''Get available maps ''' map_filter = {'available':True} @@ -1406,19 +1415,38 @@ class Map(models.Model, SimpleArea): map_filter['urn'] = urn elif single: map_filter['default'] = True - filters = [{'public_write':True}, - {'public_propose':True}, - ] if edit else [ - {'public_read':True}] + filters = [] + if not propose and not edit: + filters = [{'public_write':True}, + {'public_propose':True}, + {'public_read':True}] + elif propose: + filters = [{'public_write':True}, + {'public_propose':True}] + elif edit: + filters = [{'public_write':True}] if user and user.is_authenticated(): - filters += [ + if not propose and not edit: + filters += [ + {'mapusers__user':user, 'mapusers__read':True}, {'mapusers__user':user, 'mapusers__write':True}, {'mapusers__user':user, 'mapusers__propose':True}, + {'mapgroups__group__user':user, 'mapgroups__read':True}, {'mapgroups__group__user':user, 'mapgroups__write':True}, - {'mapgroups__group__user':user, 'mapgroups__propose':True}, - ] if edit else [ - {'mapusers__user':user, 'mapusers__read':True}, - {'mapgroups__group__user':user, 'mapgroups__read':True},] + {'mapgroups__group__user':user, 'mapgroups__propose':True} + ] + elif propose: + filters += [ + {'mapusers__user':user, 'mapusers__write':True}, + {'mapusers__user':user, 'mapusers__propose':True}, + {'mapgroups__group__user':user, 'mapgroups__write':True}, + {'mapgroups__group__user':user, 'mapgroups__propose':True} + ] + elif edit: + filters += [ + {'mapusers__user':user, 'mapusers__write':True}, + {'mapgroups__group__user':user, 'mapgroups__write':True}, + ] query = None for fltr in filters: fltr.update(map_filter) diff --git a/chimere/views.py b/chimere/views.py index e7a3059..6cd87d0 100644 --- a/chimere/views.py +++ b/chimere/views.py @@ -71,7 +71,7 @@ def get_base_uri(request): return base_uri #TODO: convert to requestcontext -def get_base_response(request, map_name="", edit=False): +def get_base_response(request, map_name="", propose=False): """ Get the base url """ @@ -88,24 +88,15 @@ def get_base_response(request, map_name="", edit=False): base_url += '/' base_url += map_name + '/' base_response_dct['extra_url'] = base_url - map = Map.getAvailable(user=request.user, urn=map_name, edit=edit, + map = Map.getAvailable(user=request.user, urn=map_name, propose=propose, single=True) if map: map_name = map.urn elif map_name: return None, redirect(reverse('chimere:index')) if map: - base_response_dct['can_write'] = map.public_write - base_response_dct['can_propose'] = map.public_propose - if base_response_dct['is_authenticated']: - base_response_dct['can_write'] = \ - base_response_dct['can_write'] or bool( - Map.objects.filter(pk=map.pk, mapusers__user=request.user, - mapusers__write=True).count()) - base_response_dct['can_propose'] = \ - base_response_dct['can_propose'] or bool( - Map.objects.filter(pk=map.pk, mapusers__user=request.user, - mapusers__propose=True).count()) + base_response_dct['can_write'] = map.can_write(user=request.user) + base_response_dct['can_propose'] = map.can_propose(user=request.user) base_response_dct['map'] = map base_response_dct['map_name'] = map_name @@ -230,7 +221,7 @@ def get_edit_page(redirect_url, item_cls, item_form, Edition page """ def func(request, map_name="", item_id=None, cat_type=['M']): - response_dct, redir = get_base_response(request, map_name, edit=True) + response_dct, redir = get_base_response(request, map_name, propose=True) if redir: return redir, None, None if 'map_name' in response_dct: |
