Filtres sur rapport poste
authorPA Parent <paparent@paparent.me>
Sun, 11 Dec 2011 21:44:18 +0000 (16:44 -0500)
committerPA Parent <paparent@paparent.me>
Sun, 11 Dec 2011 21:44:18 +0000 (16:44 -0500)
project/rh/templates/admin/filter_select.html [new file with mode: 0644]
project/rh/templates/rh/rapports/postes.html
project/rh/templatetags/__init__.py [new file with mode: 0644]
project/rh/templatetags/rapports.py [new file with mode: 0644]
project/rh/views.py

diff --git a/project/rh/templates/admin/filter_select.html b/project/rh/templates/admin/filter_select.html
new file mode 100644 (file)
index 0000000..3ed78f7
--- /dev/null
@@ -0,0 +1,21 @@
+{% load i18n %}
+
+<h3>{% blocktrans with title as filter_title %} By {{ filter_title }} {% endblocktrans %}</h3>
+{% if choices|length > 5 %}
+<select style="width: 160px;" onchange="window.location=window.location.pathname+this.options[this.selectedIndex].value">
+{% for choice in choices %}
+    <option{% if choice.selected %} selected="selected"{% endif %} style="width: 130px;"
+     value="{{ choice.query_string|iriencode }}">{{ choice.display }}</option>
+{% endfor %}
+</select>
+
+{% else %}
+<ul>
+{% for choice in choices %}
+    <li{% if choice.selected %} class="selected"{% endif %}>
+    <a href="{{ choice.query_string|iriencode }}">{{ choice.display }}</a></li>
+{% endfor %}
+</ul>
+{% endif %}
+
+
index ec41658..01b8854 100644 (file)
@@ -1,5 +1,12 @@
 {% extends 'admin/base_site.html' %}
-{% load i18n %}
+{% load adminmedia rapports i18n %}
+
+{% block extrastyle %}
+{{ block.super }}
+<link rel="stylesheet" type="text/css" href="{% admin_media_prefix %}css/changelists.css" />
+{% endblock %}
+
+{% block bodyclass %}change-list{% endblock %}
 
 {% block breadcrumbs %}{% if not is_popup %}
 <div class="breadcrumbs">
 {% endif %}{% endblock %}
 
 {% block content %}
-<div id="content-main">
+<div id="content-main"><div class="module filtered" id="changelist">
 
-       <table>
+<div id="changelist-filter">
+<h2>{% trans 'Filter' %}</h2>
+{% filter_region %}
+{% filter_implantation %}
+</div>
+
+       <table id="result_list">
+       <thead>
        <tr>
                <th># du poste</th>
                <th>Nom du poste</th>
@@ -21,8 +35,9 @@
                <th>Nom</th>
                <th>Prénom</th>
        </tr>
+       </thead>
        {% spaceless %}{% for poste in postes %}
-       <tr>
+       <tr class="{% cycle 'row1' 'row2' %}">
                <td>{{ poste.id }}</td>
                <td>{{ poste.nom }}</td>
                <td>{{ poste.implantation }}</td>
@@ -33,5 +48,5 @@
        {% endfor %}{% endspaceless %}
        </table>
 
-</div>
+</div></div>
 {% endblock %}
diff --git a/project/rh/templatetags/__init__.py b/project/rh/templatetags/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/project/rh/templatetags/rapports.py b/project/rh/templatetags/rapports.py
new file mode 100644 (file)
index 0000000..fd6f936
--- /dev/null
@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+
+from django.utils.encoding import smart_unicode
+from django.template import Library
+from django.utils.http import urlencode
+
+from datamaster_modeles.models import Implantation, Region
+
+
+register = Library()
+
+
+@register.inclusion_tag('admin/filter_select.html', takes_context=True)
+def filter_region(context):
+    return {'title': u"région",
+            'choices': prepare_choices(Region.objects.values_list('id', 'nom'), 'implantation__region', context, remove=['pays', 'nord_sud'])}
+
+
+@register.inclusion_tag('admin/filter_select.html', takes_context=True)
+def filter_implantation(context):
+    return {'title': u"implantation",
+            'choices': prepare_choices(Implantation.objects.values_list('id', 'nom'), 'implantation', context)}
+
+
+def get_query_string(request, new_params=None, remove=None):
+    if new_params is None: new_params = {}
+    if remove is None: remove = []
+    p = dict(request.GET.items())
+    for r in remove:
+        for k in p.keys():
+            if k.startswith(r):
+                del p[k]
+    for k, v in new_params.items():
+        if v is None:
+            if k in p:
+                del p[k]
+        else:
+            p[k] = v
+    return '?%s' % urlencode(p)
+
+
+def prepare_choices(choices, query_param, context, remove=[]):
+    request = context['request']
+    query_val = request.GET.get(query_param)
+    result = [{'selected': query_val is None,
+               'query_string': get_query_string(request, {}, [query_param] + remove),
+               'display': 'Tout'}]
+    for k, v in choices:
+        result.append({'selected': smart_unicode(k) == query_val,
+                       'query_string': get_query_string(request, {query_param: k}, remove),
+                       'display': v})
+    return result
index 2f05329..d72531e 100644 (file)
@@ -2,6 +2,7 @@
 from datetime import date
 
 from django.contrib.auth.decorators import login_required
+from django.utils.encoding import smart_str
 from django.shortcuts import redirect, render_to_response, get_object_or_404
 from django.template import RequestContext
 
@@ -59,7 +60,18 @@ def employe(request, id):
 @login_required
 def rapports_poste(request):
 
+    lookup_params = dict(request.GET.items())
+
+    for key, value in lookup_params.items():
+        if not isinstance(key, str):
+            # 'key' will be used as a keyword argument later, so Python
+            # requires it to be a string.
+            del lookup_params[key]
+            lookup_params[smart_str(key)] = value
+
     postes = rh.Poste.actifs.select_related('implantation').all()
+    postes = postes.filter(**lookup_params)
+
     poste_ids = set([p.pk for p in postes])
 
     dossiers = rh.Dossier.objects.select_related('poste', 'employe').filter(poste__in=poste_ids)