summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@peacefrogs.net>2013-06-18 17:24:41 +0200
committerÉtienne Loks <etienne.loks@peacefrogs.net>2013-06-18 17:24:41 +0200
commit22cb85975464ddeef3e688a0596f5c649e955e95 (patch)
tree897c0dccbd2069bc2d447f09e64bde52d23a2044
parent6dc5fc52282013ef548ced96c9eab148eeba0748 (diff)
downloadChimère-22cb85975464ddeef3e688a0596f5c649e955e95.tar.bz2
Chimère-22cb85975464ddeef3e688a0596f5c649e955e95.zip
Make conditon on actions - simplify map rigth management
-rw-r--r--chimere/actions.py42
-rw-r--r--chimere/models.py31
-rw-r--r--chimere/static/chimere/css/styles.css4
-rw-r--r--chimere/templates/chimere/blocks/maps.html8
-rw-r--r--chimere/templatetags/chimere_tags.py2
-rw-r--r--chimere/views.py69
6 files changed, 93 insertions, 63 deletions
diff --git a/chimere/actions.py b/chimere/actions.py
index 7a4b263..d9ed274 100644
--- a/chimere/actions.py
+++ b/chimere/actions.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (C) 2008-2010 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
+# Copyright (C) 2008-2013 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as
@@ -25,41 +25,57 @@ from django.contrib.auth import models
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _
-from models import Page
+from chimere.models import Page, Map
class Action:
- def __init__(self, id, path, label, extra_url_args=[]):
+ def __init__(self, id, path, label, extra_url_args=[],
+ condition=None):
self.id, self.path, self.label = id, path, label
self.extra_url_args, self.url = extra_url_args, None
+ self.condition = condition
def update_url(self, map_name):
self.url = reverse(self.path,
args=[map_name + '/' if map_name else ''] + self.extra_url_args)
-default_actions = [(Action('view', 'chimere:index', _('View')), []),
- (Action('contribute', 'chimere:edit', _('Contribute')),
+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))),
(Action('edit', 'chimere:edit', _('Add a new point of interest')),
Action('edit-route', 'chimere:editroute', _('Add a new route'))),
- ),]
+ ],
+ ]
if settings.CHIMERE_FEEDS:
- default_actions.append((Action('rss', 'chimere:feeds-form',
- _('RSS feeds')), []))
+ DEFAULT_ACTIONS.append([Action('rss', 'chimere:feeds-form',
+ _('RSS feeds')), []])
if settings.EMAIL_HOST:
- default_actions.append((Action('contact', 'chimere:contact',
- _('Contact us')), []),)
+ DEFAULT_ACTIONS.append([Action('contact', 'chimere:contact',
+ _('Contact us')), []],)
-
-def actions(map_name=''):
- acts = default_actions[:]
+def actions(user, map_name='', default_actions=DEFAULT_ACTIONS):
+ acts, idx = [], -1
for act, childs in default_actions:
+ if act.id not in settings.CHIMERE_DEFAULT_ACTIONS:
+ continue
+ idx += 1
+ if act.condition:
+ if not act.condition(user, map_name):
+ continue
act.update_url(map_name)
for child_act in childs:
child_act.update_url(map_name)
+ if "CHIMERE_DEFAULT_ACTION_LABEL" in dir(settings):
+ if len(settings.CHIMERE_DEFAULT_ACTION_LABEL) > idx:
+ act.label = settings.CHIMERE_DEFAULT_ACTION_LABEL[idx]
+ acts.append((act, childs))
for page in Page.objects.filter(available=True).order_by('order'):
act = Action(page.mnemonic, 'chimere:extra_page', page.title,
[page.mnemonic])
act.update_url(map_name)
acts.append((act, []))
+
return acts
diff --git a/chimere/models.py b/chimere/models.py
index b791a8b..f851b9c 100644
--- a/chimere/models.py
+++ b/chimere/models.py
@@ -1398,10 +1398,37 @@ class Map(models.Model, SimpleArea):
verbose_name = _("Map")
@classmethod
- def getAvailable(cls):
+ def getAvailable(cls, user=None, urn=None, single=False, edit=False):
'''Get available maps
'''
- return cls.objects.filter(available=True)
+ map_filter = {'available':True}
+ if urn:
+ map_filter['urn'] = urn
+ elif single:
+ map_filter['default'] = True
+ filters = [{'public_write':True},
+ {'public_propose':True},
+ ] if edit else [
+ {'public_read':True}]
+ if user and user.is_authenticated():
+ filters += [{'mapusers__user':user, 'mapusers__write':True},
+ {'mapusers__user':user, 'mapusers__propose':True},
+ ] if edit else [
+ {'mapusers__user':user, 'mapusers__read':True},]
+ query = None
+ for fltr in filters:
+ fltr.update(map_filter)
+ if not query:
+ query = Q(**fltr)
+ else:
+ query = query | Q(**fltr)
+ maps = cls.objects.filter(query)
+ if single:
+ if not maps.count():
+ return
+ return maps.all()[0]
+ else:
+ return maps.all()
def getWkt(self):
return "SRID=%d;POLYGON((%f %f,%f %f,%f %f,%f %f, %f %f))" % (
diff --git a/chimere/static/chimere/css/styles.css b/chimere/static/chimere/css/styles.css
index c0844df..28ced33 100644
--- a/chimere/static/chimere/css/styles.css
+++ b/chimere/static/chimere/css/styles.css
@@ -299,6 +299,10 @@ ul#action-2 {
padding:0.3em;
}
+#maps-div label{
+ font-weight:bold;
+}
+
#maps{
position:absolute;
z-index:5;
diff --git a/chimere/templates/chimere/blocks/maps.html b/chimere/templates/chimere/blocks/maps.html
index b069660..92bcfdc 100644
--- a/chimere/templates/chimere/blocks/maps.html
+++ b/chimere/templates/chimere/blocks/maps.html
@@ -1,6 +1,7 @@
{% load i18n %}
-{% if maps and maps.count > 1 %}
+{% if maps %}
<div id='maps-div'>
+ {% if maps|length > 1 %}
<label for='maps-select'>{% trans "Maps:" %}</label>
<select id='maps-select'>
{% if not has_default_map %}<option value=''>--</option>{% endif %}
@@ -8,7 +9,6 @@
<option value='{{map.urn}}'{% if map_name and map.urn == map_name %} selected='selected'{% endif %}{% if not map_name and map.default %} selected='selected'{% endif %}>{{map.name}}</option>
{% endfor %}
</select>
- </div>
<script language='javascript' type='text/javascript'>
jQuery('#maps-select').change(
function (){
@@ -22,4 +22,8 @@
}
);
</script>
+ {% else %}
+ <label for='maps-select'>{{maps.0.name}}</label>
+ {% endif %}
+ </div>
{% endif %}
diff --git a/chimere/templatetags/chimere_tags.py b/chimere/templatetags/chimere_tags.py
index 461cd15..406aa0c 100644
--- a/chimere/templatetags/chimere_tags.py
+++ b/chimere/templatetags/chimere_tags.py
@@ -26,7 +26,7 @@ def display_maps(context):
"""
Display available maps.
"""
- context_data = {"maps": Map.getAvailable(),
+ context_data = {"maps": list(Map.getAvailable(user=context['user'])),
"base_url": reverse('chimere:index')
}
if "map_name" in context:
diff --git a/chimere/views.py b/chimere/views.py
index 18039b7..d9231e1 100644
--- a/chimere/views.py
+++ b/chimere/views.py
@@ -45,7 +45,7 @@ from django.utils import simplejson as json
from django.utils.http import urlquote
from django.utils.translation import ugettext as _
-from chimere.actions import actions
+from chimere.actions import actions as default_actions
from chimere.models import Category, SubCategory, PropertyModel, Page,\
Marker, Route, News, SimpleArea, Map, Color, TinyUrl, RouteFile,\
AggregatedRoute
@@ -88,35 +88,12 @@ def get_base_response(request, map_name="", edit=False):
base_url += '/'
base_url += map_name + '/'
base_response_dct['extra_url'] = base_url
- map_filter = {'available':True}
- if map_name:
- map_filter['urn'] = map_name
- else:
- map_filter['default'] = True
- filters = [{'public_write':True},
- {'public_propose':True},
- ] if edit else [
- {'public_read':True}]
- if base_response_dct['is_authenticated']:
- filters += [{'mapusers__user':request.user, 'mapusers__write':True},
- {'mapusers__user':request.user, 'mapusers__propose':True},
- ] if edit else [
- {'mapusers__user':request.user, 'mapusers__read':True},]
- query = None
- for fltr in filters:
- fltr.update(map_filter)
- if not query:
- query = Q(**fltr)
- else:
- query = query | Q(**fltr)
- map = None
- try:
- map = Map.objects.get(query)
+ map = Map.getAvailable(user=request.user, urn=map_name, edit=edit,
+ single=True)
+ if map:
map_name = map.urn
- except ObjectDoesNotExist:
- if map_name:
- return None, redirect(reverse('chimere:index'))
-
+ elif map_name:
+ return None, redirect(reverse('chimere:index'))
if edit and map:
base_response_dct['can_write'] = bool(map.public_write or
Map.objects.filter(pk=map.pk, mapusers__user=request.user,
@@ -164,7 +141,7 @@ def logout_view(request):
return redirect(reverse('chimere:index'))
def index(request, map_name=None, default_map=None, simple=False,
- get_response=False):
+ get_response=False, actions=default_actions):
"""
Main page
"""
@@ -215,7 +192,7 @@ def index(request, map_name=None, default_map=None, simple=False,
except:
pass
response_dct.update({
- 'actions':actions(response_dct['map_name']),
+ 'actions':actions(request.user, response_dct['map_name']),
'action_selected':('view',),
'error_message':'',
'news_visible': news_visible,
@@ -351,7 +328,8 @@ def get_edit_page(redirect_url, item_cls, item_form,
get_edit_marker = get_edit_page('chimere:edit', Marker, MarkerForm)
-def edit(request, map_name="", item_id=None, submited=False):
+def edit(request, map_name="", item_id=None, submited=False,
+ actions=default_actions):
"""
Edition page
"""
@@ -370,7 +348,7 @@ def edit(request, map_name="", item_id=None, submited=False):
if request.POST and request.POST.get('point'):
point_value = request.POST.get('point')
response_dct.update({
- 'actions':actions(response_dct['map_name']),
+ 'actions':actions(request.user, response_dct['map_name']),
'action_selected':('contribute', 'edit'),
'map_layer':settings.CHIMERE_DEFAULT_MAP_LAYER,
'form':form,
@@ -459,7 +437,8 @@ def processRouteFile(request, map_name='', file_id=None):
get_edit_route = get_edit_page('chimere:editroute', Route, RouteForm)
-def editRoute(request, map_name="", item_id=None, submited=False):
+def editRoute(request, map_name="", item_id=None, submited=False,
+ actions=default_actions):
"""
Route edition page
"""
@@ -478,7 +457,7 @@ def editRoute(request, map_name="", item_id=None, submited=False):
if request.POST and request.POST.get('route'):
route_value = request.POST.get('route')
response_dct.update({
- 'actions':actions(response_dct['map_name']),
+ 'actions':actions(request.user, response_dct['map_name']),
'action_selected':('contribute', 'edit-route'),
'error_message':'',
'map_layer':settings.CHIMERE_DEFAULT_MAP_LAYER,
@@ -499,31 +478,31 @@ def editRoute(request, map_name="", item_id=None, submited=False):
return render_to_response('chimere/edit_route.html', response_dct,
context_instance=RequestContext(request))
-def submited(request, map_name="", action=""):
+def submited(request, map_name="", action="", actions=default_actions):
"""
Successful submission page
"""
response_dct, redir = get_base_response(request, map_name)
if redir:
return redir
- response_dct.update({'actions':actions(response_dct['map_name']),
+ response_dct.update({'actions':actions(request.user, response_dct['map_name']),
'action_selected':action,})
return render_to_response('chimere/submited.html', response_dct,
context_instance=RequestContext(request))
-def charte(request, map_name=""):
+def charte(request, map_name="", actions=default_actions):
"""
Affichage de la charte
"""
response_dct, redir = get_base_response(request, map_name)
if redir:
return redir
- response_dct.update({'actions':actions(response_dct['map_name']),
+ response_dct.update({'actions':actions(request.user, response_dct['map_name']),
'action_selected':('charte',)})
return render_to_response('chimere/charte.html', response_dct,
context_instance=RequestContext(request))
-def contactus(request, map_name=""):
+def contactus(request, map_name="", actions=default_actions):
"""
Contact page
"""
@@ -547,13 +526,13 @@ def contactus(request, map_name=""):
response_dct, redir = get_base_response(request, map_name)
if redir:
return redir
- response_dct.update({'actions':actions(response_dct['map_name']),
+ response_dct.update({'actions':actions(request.user, response_dct['map_name']),
'action_selected':('contact',),
'contact_form':form, 'message':msg})
return render_to_response('chimere/contactus.html', response_dct,
context_instance=RequestContext(request))
-def extraPage(request, map_name="", page_id=""):
+def extraPage(request, map_name="", page_id="", actions=default_actions):
"""
Extra dynamic pages
"""
@@ -564,7 +543,7 @@ def extraPage(request, map_name="", page_id=""):
response_dct, redir = get_base_response(request, map_name)
if redir:
return redir
- response_dct.update({'actions':actions(response_dct['map_name']),
+ response_dct.update({'actions':actions(request.user, response_dct['map_name']),
'action_selected':(page_id,),
'content':page.content,
'title':page.title})
@@ -880,14 +859,14 @@ def get_json(request, map_name='', app_name='', filename=''):
return HttpResponse(open(settings.STATIC_ROOT+app_name+'/json/'+filename+'.json'),
'application/javascript', status=200)
-def rss(request, map_name=''):
+def rss(request, map_name='', actions=default_actions):
'''
Redirect to RSS subscription page
'''
response_dct, redir = get_base_response(request, map_name)
if redir:
return redir
- response_dct.update({'actions':actions(response_dct['map_name']),
+ response_dct.update({'actions':actions(request.user, response_dct['map_name']),
'action_selected':('rss',),
'category_rss_feed':'',})
# If the form has been submited