diff options
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 |
commit | 22cb85975464ddeef3e688a0596f5c649e955e95 (patch) | |
tree | 897c0dccbd2069bc2d447f09e64bde52d23a2044 | |
parent | 6dc5fc52282013ef548ced96c9eab148eeba0748 (diff) | |
download | Chimère-22cb85975464ddeef3e688a0596f5c649e955e95.tar.bz2 Chimère-22cb85975464ddeef3e688a0596f5c649e955e95.zip |
Make conditon on actions - simplify map rigth management
-rw-r--r-- | chimere/actions.py | 42 | ||||
-rw-r--r-- | chimere/models.py | 31 | ||||
-rw-r--r-- | chimere/static/chimere/css/styles.css | 4 | ||||
-rw-r--r-- | chimere/templates/chimere/blocks/maps.html | 8 | ||||
-rw-r--r-- | chimere/templatetags/chimere_tags.py | 2 | ||||
-rw-r--r-- | chimere/views.py | 69 |
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 |