summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commita6fc315c72946489a0c683a640f5953c5fb7e6b9 (patch)
tree26521dd75186ff2d25fbd2b275e1f5753c116c47
parent9a9e37ef2be3f07ac6efed8cb7319114b9803756 (diff)
downloadChimère-a6fc315c72946489a0c683a640f5953c5fb7e6b9.tar.bz2
Chimère-a6fc315c72946489a0c683a640f5953c5fb7e6b9.zip
Better management of map rights
-rw-r--r--chimere/actions.py2
-rw-r--r--chimere/models.py48
-rw-r--r--chimere/views.py19
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: