Ajout de la recherche temporelle pour les dossiers
authorJean-Philippe Caissy <jpcaissy@piji.ca>
Wed, 15 Feb 2012 16:37:23 +0000 (10:37 -0600)
committerJean-Philippe Caissy <jpcaissy@piji.ca>
Wed, 15 Feb 2012 16:37:23 +0000 (10:37 -0600)
project/rh/admin.py
project/rh/templates/admin/rh/annee_select.html [new file with mode: 0644]
project/rh/templates/admin/rh/dossier/change_list.html
project/rh/templatetags/change_list.py [new file with mode: 0644]

index 692157a..a87fbce 100644 (file)
@@ -44,34 +44,47 @@ class DateRangeMixin(object):
         return ChangeList
 
 class ChangeList(DjangoChangeList):
+    PERIODE_CHOICE = ('', 'actuelle', 'passee', 'future')
 
     def __init__(self, *args, **kwargs):
+        self.annees = {'actuelle': 'actuelle', 'passee': 'passee', 'future': 'future'}
         super(ChangeList, self).__init__(*args, **kwargs)
     
     def get_query_set(self):
         old = self.params.copy()
+        periode = None
+        annee = None
         date_debut = None
         date_fin = None
+        today = datetime.date.today()
         for k, v in self.params.items():
-            if 'date_debut' in k:
-                prefix_debut = "".join(k.split('date_debut')[0:-1]) + 'date_debut'
-                date_debut = v
+            if 'periode' == k:
+                periode = self.params[k]
                 del self.params[k]
-            elif 'date_fin' in k:
-                prefix_fin = "".join(k.split('date_fin')[0:-1]) + 'date_fin'
-                date_fin = v
+            if 'annee' == k:
+                annee = self.params[k]
+                del self.params[k]
+            if 'date_debut' == k:
+                date_debut = self.params[k]
+                del self.params[k]
+            if 'date_fin' == k:
+                date_fin = self.params[k]
                 del self.params[k]
-        qs = super(ChangeList, self).get_query_set()
-
-        # hack pour spécifier un range
-        if date_fin is None and date_debut is not None:
-            date_fin = '2020-01-01'
-            prefix_fin = prefix_debut.replace('debut', 'fin')
-        if date_debut is None and date_fin is not None:
-            date_debut = '1000-01-01'
-            prefix_debut = prefix_fin.replace('fin', 'debut')
 
-        if date_debut is not None and date_fin is not None:    
+        qs = super(ChangeList, self).get_query_set()
+        if periode == 'actuelle':
+            qs = qs.filter(date_fin__exact=today, date_debut__exact=today).distinct()
+        elif periode == 'passee':
+            qs = qs.filter(date_fin__lt=today)
+        elif periode == 'future':
+            qs = qs.filter(date_debut__gt=today)
+        elif annee:
+            date_debut = datetime.date(int(annee), 01, 01)
+            date_fin = datetime.date(int(annee), 12, 31)
+
+        if date_debut and date_fin:
+            prefix_debut = 'date_debut'
+            prefix_fin = 'date_fin'
             q_left = (Q(**{'%s__isnull' % prefix_debut : True}) | Q(**{'%s__lte' % prefix_debut : date_debut})) & (Q(**{'%s__gte' % prefix_fin : date_debut}) & Q(**{'%s__lte' % prefix_fin : date_fin}))
             q_right = (Q(**{'%s__isnull' % prefix_fin : True}) | Q(**{'%s__gte' % prefix_fin : date_fin})) & (Q(**{'%s__gte' % prefix_debut : date_debut}) & Q(**{'%s__lte' % prefix_debut : date_fin}))
             q_both = Q(**{'%s__isnull' % prefix_fin : True}) | Q(**{'%s__lte' % prefix_fin : date_fin}) & (Q(**{'%s__isnull' % prefix_debut : True}) | Q(**{'%s__gte' % prefix_debut : date_debut}))
diff --git a/project/rh/templates/admin/rh/annee_select.html b/project/rh/templates/admin/rh/annee_select.html
new file mode 100644 (file)
index 0000000..e3e6a3d
--- /dev/null
@@ -0,0 +1,46 @@
+<script type="text/javascript">
+  $(document).ready(function(){
+    function updateQueryStringParameter(a, k, v) {
+      var re = new RegExp("([?|&])" + k + "=.*?(&|$)", "i"),
+        separator = a.indexOf('?') !== -1 ? "&" : "?";
+
+      if (a.match(re)) return a.replace(re, '$1' + k + "=" + v + '$2');
+      else return a + separator + k + "=" + v;
+    }
+    $("#plage_date_rechercher").click(function(e){
+      e.preventDefault();
+      uri = window.location.search;
+      if($("#id_date_fin").val()) 
+        uri = updateQueryStringParameter(uri, 'date_fin', $("#id_date_fin").val());
+      if($("#id_date_debut").val()) 
+        uri = updateQueryStringParameter(uri, 'date_debut', $("#id_date_debut").val());
+      window.location = window.location.pathname+uri;
+    });
+    $("#id_date_fin").keypress(function(e){
+      if(e.keyCode == 13) {
+        e.preventDefault();
+        $("#plage_date_rechercher").trigger("click");
+      }
+    });
+    $("#id_date_debut").keypress(function(e){
+      if(e.keyCode == 13) {
+        e.preventDefault();
+        $("#plage_date_rechercher").trigger("click");
+      }
+    });
+  });
+</script>
+<div class="actions">
+  <label>Période :
+    {{ form.periode }}
+  </label>
+  &nbsp;&nbsp;<strong>OU</strong>
+  <label>Année :
+    {{ form.annee }}
+  </label>
+  &nbsp;&nbsp;<strong>OU</strong>
+  <label>Plage de dates:
+    {{ form.date_debut }} au {{ form.date_fin }}
+  </label>
+  <a href="{{ plage_date_querystring }}" id="plage_date_rechercher">Rechercher</a>
+</div>
index b1ed52c..bf82955 100644 (file)
@@ -1,4 +1,5 @@
 {% extends "admin/change_list.html" %}
+{% load change_list %}
 
 {% block object-tools-items %}
   <li>
@@ -14,3 +15,8 @@
   </li>
   {% endcomment %}
 {% endblock %}
+
+{% block result_list %}
+    {% recherche_par_annees cl %}
+    {{ block.super }}
+{% endblock %}
diff --git a/project/rh/templatetags/change_list.py b/project/rh/templatetags/change_list.py
new file mode 100644 (file)
index 0000000..690048c
--- /dev/null
@@ -0,0 +1,48 @@
+from django.template import Library
+from django.db import connection
+from django import forms
+
+register = Library()
+
+@register.simple_tag
+def query_string_builder(cl, name, value):
+    return cl.get_query_string({name: value})
+
+@register.simple_tag
+def add_selected(cl, key, value):
+    return 'selected="selected" ' if key in cl.params and cl.params[key] == value else ''
+
+@register.inclusion_tag('admin/rh/annee_select.html')
+def recherche_par_annees(cl):
+
+    cursor = connection.cursor()
+    cursor.execute("SELECT year(date_debut) FROM rh_dossier WHERE year(date_debut) IS NOT NULL GROUP BY year(date_debut)")
+    set_annees = set(row[0] for row in cursor.fetchall())
+    cursor.execute("SELECT year(date_fin) FROM rh_dossier WHERE year(date_fin) IS NOT NULL GROUP BY year(date_fin)")
+    for row in cursor.fetchall():
+        set_annees.add(row[0])
+    list_annees = list(set_annees)
+    list_annees.insert(0, '')
+
+    class RechercheTemporelle(forms.Form):
+        periode = forms.ChoiceField(
+                choices=((cl.get_query_string({'periode': p }, ('annee', 'date_debut', 'date_fin')), p) for p in cl.PERIODE_CHOICE),
+                    widget=forms.Select(attrs = {
+                        'onchange' : """window.location=window.location.pathname+this.options[this.selectedIndex].value""",
+                        }))
+        annee = forms.ChoiceField(choices=((cl.get_query_string({'annee': a}, {'periode', 'date_debut', 'date_fin'}), a) for a in list_annees),
+                    widget=forms.Select(attrs = {
+                        'onchange' : """window.location=window.location.pathname+this.options[this.selectedIndex].value""",
+                        }))
+        date_debut = forms.DateField()
+        date_fin = forms.DateField()
+    params = cl.params
+    if 'periode' in params:
+        params['periode'] = cl.get_query_string({'periode': params['periode']})
+    if 'annee' in params:
+        params['annee'] = cl.get_query_string({'annee': params['annee']})
+    f = RechercheTemporelle(params)
+    return {
+            'form': f,
+            'plage_date_querystring': cl.get_query_string(remove={'annee', 'periode'})
+            }