plug recherche temporelle dans rapport contrats
authorOlivier Larchevêque <olivier.larcheveque@auf.org>
Fri, 17 Feb 2012 21:06:20 +0000 (16:06 -0500)
committerOlivier Larchevêque <olivier.larcheveque@auf.org>
Fri, 17 Feb 2012 21:06:20 +0000 (16:06 -0500)
project/rh/change_list.py
project/rh/templates/admin/filter_select.html
project/rh/templates/rh/rapports/contrats.html
project/rh/templatetags/rapports.py
project/rh/views.py

index 93b6176..c01524a 100644 (file)
@@ -24,16 +24,23 @@ STATUT_INACTIF = 'Inactif'
 STATUT_FUTUR = 'Futur'
 STATUT_INCONNU = 'Inconnu'
 
-class ChangeList(DjangoChangeList):
+
+class RechercheTemporelle(object):
+    model = None
+    params = None
+    prefixe_recherche_temporelle = ""
+    lookup_recherche_temporelle = {}
 
     internal_fields = (KEY_ANNEE, KEY_DATE_DEBUT, KEY_DATE_FIN, KEY_STATUT, )
     STATUT_CHOICES = (STATUT_ACTIF, STATUT_INACTIF, STATUT_FUTUR, STATUT_INCONNU )
-
-    def __init__(self, *args, **kwargs):
-        super(ChangeList, self).__init__(*args, **kwargs)
+    
+    def __init__(self, request, model):
+        self.model = model
+        self.params = dict(request.GET.items())
 
     def get_prefix(self):
-        return getattr(self.model_admin, 'prefixe_recherche_temporelle', "")
+        klass = getattr(self, "model_admin", self)
+        return getattr(klass, 'prefixe_recherche_temporelle', "")
 
     def get_annees(self):
         prefix = self.get_prefix()
@@ -47,7 +54,6 @@ class ChangeList(DjangoChangeList):
         annees.sort(reverse=True)
         return annees
 
-
     def get_q_inconnu(self, prefix):
         date_debut_nulle = Q(**{"%s%s__isnull" % (prefix, KEY_DATE_DEBUT) : True})
         date_fin_nulle = Q(**{"%s%s__isnull" % (prefix, KEY_DATE_FIN) : True})
@@ -83,9 +89,66 @@ class ChangeList(DjangoChangeList):
 
         return q_range
 
+    def purge_params(self, lookup_params):
+        params = lookup_params.copy()
+        for key, value in lookup_params.items():
+            # ignorer les param GET pour la recherche temporelle
+            if len([i for i in self.internal_fields if key.endswith(i)]) > 0:
+                del params[key]
+                self.lookup_recherche_temporelle[key] = value
+                continue
+        return params
+
+    def filter_temporel(self, qs):
+        q = Q()
+        prefix = self.get_prefix()
+        borne_gauche = None
+        borne_droite = None
+        for k, v in self.lookup_recherche_temporelle.items():
+
+            if k.endswith(KEY_ANNEE):
+                borne_gauche = "%s-01-01" % v
+                borne_droite = "%s-12-31" % v
+
+            if k.endswith(KEY_DATE_DEBUT):
+                date = time.strptime(v, settings.DATE_INPUT_FORMATS[0])
+                borne_gauche = time.strftime("%Y-%m-%d", date)
+
+            if k.endswith(KEY_DATE_FIN):
+                date = time.strptime(v, settings.DATE_INPUT_FORMATS[0])
+                borne_droite = time.strftime("%Y-%m-%d", date)
+
+            if k.endswith(KEY_STATUT):
+                aujourdhui = datetime.date.today()
+                if v == STATUT_ACTIF:
+                    borne_gauche = aujourdhui
+                    borne_droite = aujourdhui
+                elif v == STATUT_INACTIF:
+                    # dans le cas d'une FK, on retire des inactifs ceux qui ont une FK active
+                    if prefix != "":
+                        q_range = self.get_q_range(prefix, aujourdhui, aujourdhui)
+                        id_actifs = [o.id for o in qs.filter(q_range).distinct()]
+                        qs = qs.exclude(id__in=id_actifs)
+                    borne_droite = aujourdhui
+                elif v == STATUT_FUTUR:
+                    borne_gauche = aujourdhui
+                elif v == STATUT_INCONNU:
+                    q = q & self.get_q_inconnu(prefix)
+                
+        q_range = self.get_q_range(prefix, borne_gauche, borne_droite)
+        qs = qs.filter(q & q_range).distinct()
+        return qs
+
+RechercheTemporelle.get_query_string = DjangoChangeList.get_query_string.im_func
+
+
+class ChangeList(DjangoChangeList, RechercheTemporelle):
+
+    def __init__(self, *args, **kwargs):
+        super(ChangeList, self).__init__(*args, **kwargs)
+
     def get_query_set(self):
 
-        lookup_recherche_temporelle = {}
         use_distinct = False
 
         qs = self.root_query_set
@@ -93,6 +156,8 @@ class ChangeList(DjangoChangeList):
         for i in (ALL_VAR, ORDER_VAR, ORDER_TYPE_VAR, SEARCH_VAR, IS_POPUP_VAR, TO_FIELD_VAR):
             if i in lookup_params:
                 del lookup_params[i]
+
+        lookup_params = self.purge_params(lookup_params)       
         for key, value in lookup_params.items():
             if not isinstance(key, str):
                 # 'key' will be used as a keyword argument later, so Python
@@ -100,12 +165,6 @@ class ChangeList(DjangoChangeList):
                 del lookup_params[key]
                 lookup_params[smart_str(key)] = value
 
-            # ignorer les param GET pour la recherche temporelle
-            if len([i for i in self.internal_fields if key.endswith(i)]) > 0:
-                del lookup_params[key]
-                lookup_recherche_temporelle[key] = value
-                continue
-
             if not use_distinct:
                 # Check if it's a relationship that might return more than one
                 # instance
@@ -145,43 +204,7 @@ class ChangeList(DjangoChangeList):
         except:
             raise IncorrectLookupParameters
 
-        q = Q()
-        prefix = self.get_prefix()
-        borne_gauche = None
-        borne_droite = None
-        for k, v in lookup_recherche_temporelle.items():
-
-            if k.endswith(KEY_ANNEE):
-                borne_gauche = "%s-01-01" % v
-                borne_droite = "%s-12-31" % v
-
-            if k.endswith(KEY_DATE_DEBUT):
-                date = time.strptime(v, settings.DATE_INPUT_FORMATS[0])
-                borne_gauche = time.strftime("%Y-%m-%d", date)
-
-            if k.endswith(KEY_DATE_FIN):
-                date = time.strptime(v, settings.DATE_INPUT_FORMATS[0])
-                borne_droite = time.strftime("%Y-%m-%d", date)
-
-            if k.endswith(KEY_STATUT):
-                aujourdhui = datetime.date.today()
-                if v == STATUT_ACTIF:
-                    borne_gauche = aujourdhui
-                    borne_droite = aujourdhui
-                elif v == STATUT_INACTIF:
-                    # dans le cas d'une FK, on retire des inactifs ceux qui ont une FK active
-                    if prefix != "":
-                        q_range = self.get_q_range(prefix, aujourdhui, aujourdhui)
-                        id_actifs = [o.id for o in qs.filter(q_range).distinct()]
-                        qs = qs.exclude(id__in=id_actifs)
-                    borne_droite = aujourdhui
-                elif v == STATUT_FUTUR:
-                    borne_gauche = aujourdhui
-                elif v == STATUT_INCONNU:
-                    q = q & self.get_q_inconnu(prefix)
-                
-        q_range = self.get_q_range(prefix, borne_gauche, borne_droite)
-        qs = qs.filter(q & q_range).distinct()
+        qs = self.filter_temporel(qs)
 
         # Use select_related() if one of the list_display options is a field
         # with a relationship and the provided queryset doesn't already have
index 3ed78f7..67baa0e 100644 (file)
@@ -1,5 +1,4 @@
 {% 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">
index c9af890..881c5b8 100644 (file)
@@ -1,5 +1,11 @@
 {% extends 'rh/rapports/base.html' %}
-{% load adminmedia rapports i18n %}
+{% load adminmedia rapports i18n change_list %}
+
+{% block extrastyle %}
+<script type="text/javascript" src="/admin/jsi18n"></script>
+<script type="text/javascript" src="{{ STATIC_URL }}/admin/js/core.js"></script>
+{{ block.super }}
+{% endblock %}
 
 {% block nomrapport %}Rapport Contrats{% endblock %}
 
@@ -17,6 +23,9 @@
 {% filter_a_venir %}
 </div>
 
+
+{% recherche_par_annees cl %}
+
 <table id="result_list" class="results">
 <thead>
 <tr>
index 73661d4..69ba5ea 100644 (file)
@@ -22,31 +22,31 @@ def filter_comble(context):
             'choices': prepare_choices(COMBLE_CHOICES, 'comble', context)}
 
 
-@register.inclusion_tag('admin/filter_select.html', takes_context=True)
+@register.inclusion_tag('admin/filter.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)
+@register.inclusion_tag('admin/filter.html', takes_context=True)
 def filter_implantation(context):
     return {'title': u"implantation",
             'choices': prepare_choices(Implantation.objects.values_list('id', 'nom'), 'implantation', context)}
 
 
-@register.inclusion_tag('admin/filter_select.html', takes_context=True)
+@register.inclusion_tag('admin/filter.html', takes_context=True)
 def filter_region_contrat(context):
     return {'title': u"région",
             'choices': prepare_choices(Region.objects.values_list('id', 'nom'), 'dossier__poste__implantation__region', context, remove=['pays', 'nord_sud'])}
 
 
-@register.inclusion_tag('admin/filter_select.html', takes_context=True)
+@register.inclusion_tag('admin/filter.html', takes_context=True)
 def filter_implantation_contrat(context):
     return {'title': u"implantation",
             'choices': prepare_choices(Implantation.objects.values_list('id', 'nom'), 'dossier__poste__implantation', context)}
 
 
-@register.inclusion_tag('admin/filter_select.html', takes_context=True)
+@register.inclusion_tag('admin/filter.html', takes_context=True)
 def filter_type_contrat(context):
     return {'title': u"type de contrat",
             'choices': prepare_choices(TypeContrat.objects.values_list('id', 'nom'), 'type_contrat', context)}
index c7e494d..4c9d4da 100644 (file)
@@ -17,6 +17,7 @@ from rh import models as rh
 from rh.lib import calc_remun
 from rh.decorators import drh_or_admin_required
 from rh.templatetags.rapports import SortHeaders
+from rh.change_list import RechercheTemporelle
 
 # pas de reference a DAE devrait etre refactorisé
 from dae.utils import get_employe_from_user
@@ -173,7 +174,12 @@ def rapports_contrat(request):
             lookup_params[smart_str(key)] = value
 
     contrats = rh.Contrat.objects.select_related('dossier', 'dossier__poste', 'dossier__poste__implantation', 'type_contrat', 'dossier__employe')
+    
+    cl = RechercheTemporelle(request, rh.Contrat)
+    lookup_params = cl.purge_params(lookup_params)
     contrats = contrats.filter(**lookup_params).exclude(dossier__employe__supprime=1)
+    contrats = cl.filter_temporel(contrats)
+
     if 'o' in request.GET:
         contrats = contrats.order_by("%s%s" % ('-' if 'ot' in request.GET and request.GET['ot'] == "desc" else '', request.GET['o']))
 
@@ -191,6 +197,7 @@ def rapports_contrat(request):
     h = SortHeaders(request, headers, order_field_type="ot", order_field="o")
 
     c = {
+        'cl' : cl,
         'title': 'Rapport des contrats',
         'contrats': contrats,
         'count': len(contrats),