Menu droit fonctionne pour tous les briques
authorPA Parent <paparent@paparent.me>
Wed, 26 Oct 2011 14:10:02 +0000 (10:10 -0400)
committerPA Parent <paparent@paparent.me>
Wed, 26 Oct 2011 14:10:02 +0000 (10:10 -0400)
auf_savoirs_en_partage/context_processors.py
auf_savoirs_en_partage/savoirs/templatetags/sep.py
auf_savoirs_en_partage/templates/chercheurs/index.html
auf_savoirs_en_partage/templates/container_base.html
auf_savoirs_en_partage/templates/menu_brique.html [new file with mode: 0644]
auf_savoirs_en_partage/templates/savoirs/actualite_index.html
auf_savoirs_en_partage/templates/savoirs/appels_index.html
auf_savoirs_en_partage/templates/savoirs/evenement_index.html
auf_savoirs_en_partage/templates/savoirs/ressource_index.html
auf_savoirs_en_partage/templates/sites/index.html

index 5150e2e..233e823 100644 (file)
@@ -4,9 +4,15 @@ import re
     
 DISCIPLINE_REGION_RE = re.compile(r'/(discipline/(?P<discipline>\d+)/)?(region/(?P<region>\d+)/)?')
 def discipline_region(request):
-    match = DISCIPLINE_REGION_RE.match(request.path)
-    discipline = match.group('discipline')
-    region = match.group('region')
+    discipline = request.GET.get('discipline', None)
+    region = request.GET.get('region', None)
+
+    if not discipline and not region:
+        match = DISCIPLINE_REGION_RE.match(request.path)
+        discipline = match.group('discipline')
+        region = match.group('region')
+
     discipline = discipline and int(discipline)
     region = region and int(region)
+
     return dict(discipline_active=discipline, region_active=region)
index 131af82..34d63e2 100644 (file)
@@ -5,6 +5,7 @@ from django import template
 from django.conf import settings
 from django.template.defaultfilters import stringfilter
 from django.utils.encoding import smart_str
+from django.utils.safestring import mark_safe
 from datamaster_modeles.models import Region
 from savoirs.models import Discipline
 
@@ -18,6 +19,14 @@ def sep_menu(context, discipline_active, region_active):
                 discipline_active=discipline_active, region_active=region_active,
                 request=context['request'])
 
+@register.inclusion_tag('menu_brique.html', takes_context=True)
+def sep_menu_brique(context, discipline_active, region_active):
+    regions = Region.objects.filter(actif=True).order_by('nom')
+    disciplines = Discipline.objects.all()
+    return dict(disciplines=disciplines, regions=regions,
+                discipline_active=discipline_active, region_active=region_active,
+                request=context['request'])
+
 @register.inclusion_tag('sort_link.html', takes_context=True)
 def sort_link(context, field, label):
     request = context['request']
@@ -36,7 +45,7 @@ def sort_link(context, field, label):
     params['tri'] = sort
     url = request.path + '?' + params.urlencode()
     return dict(label=label, url=url, indicator=indicator)
-    
+
 class URLNode(template.Node):
     def __init__(self, view_name, args, kwargs, asvar):
         self.view_name = view_name
@@ -134,7 +143,7 @@ def change_region(path, region):
     if not rest.startswith('/recherche/'):
         rest = '/'
     return discipline_bit + region_bit + rest
-        
+
 @register.filter
 @stringfilter
 def change_discipline(path, discipline):
@@ -147,6 +156,7 @@ def change_discipline(path, discipline):
         rest = '/'
     return discipline_bit + region_bit + rest
 
+
 @register.filter
 def apply(value, func):
     """Applique une fonction arbitraire à la valeur filtrée."""
@@ -156,3 +166,102 @@ def apply(value, func):
 def getitem(container, key):
     """Applique ``container[key]`` sur la valeur filtrée."""
     return container.get(key, '')
+
+
+# Snippet: http://djangosnippets.org/snippets/2237/
+@register.tag
+def query_string(parser, token):
+    """
+    Allows you too manipulate the query string of a page by adding and removing keywords.
+    If a given value is a context variable it will resolve it.
+    Based on similiar snippet by user "dnordberg".
+
+    requires you to add:
+
+    TEMPLATE_CONTEXT_PROCESSORS = (
+    'django.core.context_processors.request',
+    )
+
+    to your django settings.
+
+    Usage:
+    http://www.url.com/{% query_string "param_to_add=value, param_to_add=value" "param_to_remove, params_to_remove" %}
+
+    Example:
+    http://www.url.com/{% query_string "" "filter" %}filter={{new_filter}}
+    http://www.url.com/{% query_string "page=page_obj.number" "sort" %}
+
+    """
+    try:
+        tag_name, add_string,remove_string = token.split_contents()
+    except ValueError:
+        raise template.TemplateSyntaxError, "%r tag requires two arguments" % token.contents.split()[0]
+    if not (add_string[0] == add_string[-1] and add_string[0] in ('"', "'")) or not (remove_string[0] == remove_string[-1] and remove_string[0] in ('"', "'")):
+        raise template.TemplateSyntaxError, "%r tag's argument should be in quotes" % tag_name
+
+    add = string_to_dict(add_string[1:-1])
+    remove = string_to_list(remove_string[1:-1])
+
+    return QueryStringNode(add,remove)
+
+class QueryStringNode(template.Node):
+    def __init__(self, add,remove):
+        self.add = add
+        self.remove = remove
+
+    def render(self, context):
+        p = {}
+        for k, v in context["request"].GET.items():
+            p[k]=v
+        return get_query_string(p,self.add,self.remove,context)
+
+def get_query_string(p, new_params, remove, context):
+    """
+    Add and remove query parameters. From `django.contrib.admin`.
+    """
+    for r in remove:
+        for k in p.keys():
+            if k.startswith(r):
+                del p[k]
+    for k, v in new_params.items():
+        if k in p and v is None:
+            del p[k]
+        elif v is not None:
+            p[k] = v
+
+    for k, v in p.items():
+        try:
+            p[k] = template.Variable(v).resolve(context)
+        except:
+            p[k]=v
+
+    return mark_safe('?' + '&amp;'.join([u'%s=%s' % (k, v) for k, v in p.items()]).replace(' ', '%20'))
+
+# Taken from lib/utils.py
+def string_to_dict(string):
+    kwargs = {}
+
+    if string:
+        string = str(string)
+        if ',' not in string:
+            # ensure at least one ','
+            string += ','
+        for arg in string.split(','):
+            arg = arg.strip()
+            if arg == '': continue
+            kw, val = arg.split('=', 1)
+            kwargs[kw] = val
+    return kwargs
+
+def string_to_list(string):
+    args = []
+    if string:
+        string = str(string)
+        if ',' not in string:
+            # ensure at least one ','
+            string += ','
+        for arg in string.split(','):
+            arg = arg.strip()
+            if arg == '': continue
+            args.append(arg)
+    return args
index 40bb0f2..43d3d77 100644 (file)
@@ -3,6 +3,10 @@
 {% load form_tags %}
 {% load sep %}
 
+{% block sep_menu_droite %}
+{% sep_menu_brique discipline_active region_active %}
+{% endblock %}
+
 {% block contenu %}
 {% autopaginate chercheurs 20 %}
 
index 88ace33..76d6c90 100644 (file)
 
                 <div id="regions_disciplines">
                     <div>
-                        {% sep_menu discipline_active region_active %}
+                        {% block sep_menu_droite %}{% sep_menu discipline_active region_active %}{% endblock %}
                     </div>
                 </div>
             </div>
diff --git a/auf_savoirs_en_partage/templates/menu_brique.html b/auf_savoirs_en_partage/templates/menu_brique.html
new file mode 100644 (file)
index 0000000..5917006
--- /dev/null
@@ -0,0 +1,20 @@
+{% load sep %}
+<h1>Filtrer par <em>région</em></h1>
+<ul>
+    <li{% if not region_active %} class="active"{% endif %}
+    ><a href="{{ request.path }}{% query_string 'region=' '' %}">Toutes les régions</a</li>
+    {% for r in regions %}
+    <li{% ifequal r.id region_active %} class="active"{% endifequal %}
+    ><a href="{{ request.path }}{% query_string 'region=r.id' '' %}">{{ r.nom }}</a></li>
+    {% endfor %}
+</ul>
+
+<h1>Filtrer par <em>discipline</em></h1>
+<ul>
+    <li{% if not discipline_active %} class="active"{% endif %}
+    ><a href="{{ request.path }}{% query_string 'discipline=' '' %}">Toutes les disciplines</a></li>
+    {% for d in disciplines %}
+    <li{% ifequal d.id discipline_active %} class="active"{% endifequal %}
+    ><a href="{{ request.path }}{% query_string 'discipline=d.id' '' %}">{{ d.nom }}</a></li>
+    {% endfor %}
+</ul>
index 5b948ef..de5182c 100644 (file)
@@ -1,7 +1,11 @@
 {% extends "container_base.html" %}
-
+{% load sep %}
 {% load pagination_tags %}
 
+{% block sep_menu_droite %}
+{% sep_menu_brique discipline_active region_active %}
+{% endblock %}
+
 {% block contenu %}
 {% autopaginate actualites 10 %}
 
index 399979a..83e49ec 100644 (file)
@@ -1,7 +1,11 @@
 {% extends "container_base.html" %}
-
+{% load sep %}
 {% load pagination_tags %}
 
+{% block sep_menu_droite %}
+{% sep_menu_brique discipline_active region_active %}
+{% endblock %}
+
 {% block contenu %}
 {% autopaginate actualites 10 %}
 
index d23832a..449bb81 100644 (file)
@@ -1,6 +1,11 @@
 {% extends "container_base.html" %}
+{% load sep %}
 {% load pagination_tags %}
 
+{% block sep_menu_droite %}
+{% sep_menu_brique discipline_active region_active %}
+{% endblock %}
+
 {% block contenu %}
 {% autopaginate evenements 10 %}
 <ul class="actions">
index 6f8cfe2..07ae0f0 100644 (file)
@@ -1,7 +1,11 @@
 {% extends "container_base.html" %}
-
+{% load sep %}
 {% load pagination_tags %}
 
+{% block sep_menu_droite %}
+{% sep_menu_brique discipline_active region_active %}
+{% endblock %}
+
 {% block contenu %}
 {% autopaginate ressources 15 %}
 
index a72e846..ba7f750 100644 (file)
@@ -1,6 +1,11 @@
 {% extends "container_base.html" %}
+{% load sep %}
 {% load pagination_tags %}
 
+{% block sep_menu_droite %}
+{% sep_menu_brique discipline_active region_active %}
+{% endblock %}
+
 {% block contenu %}
 {% autopaginate sites 10 %}