dynamic date range filter
authorOlivier Larchevêque <olivier.larcheveque@auf.org>
Tue, 7 Feb 2012 23:12:42 +0000 (18:12 -0500)
committerOlivier Larchevêque <olivier.larcheveque@auf.org>
Tue, 7 Feb 2012 23:12:42 +0000 (18:12 -0500)
project/rh/admin.py

index 8fa36ae..b798dc8 100644 (file)
@@ -31,24 +31,27 @@ class ChangeList(DjangoChangeList):
         date_debut = None
         date_fin = None
         for k, v in self.params.items():
-            if k.startswith('date_debut'):
+            if 'date_debut' in k:
+                prefix_debut = "".join(k.split('date_debut')[0:-1]) + 'date_debut'
                 date_debut = v
                 del self.params[k]
-            elif k.startswith('date_fin'):
+            elif 'date_fin' in k:
+                prefix_fin = "".join(k.split('date_fin')[0:-1]) + 'date_fin'
                 date_fin = v
                 del self.params[k]
-
         qs = super(ChangeList, self).get_query_set()
 
         if date_fin is None and date_debut is not None:
             date_fin = date_debut
+            prefix_fin = prefix_debut.replace('debut', 'fin')
         if date_debut is None and date_fin is not None:
             date_debut = date_fin
+            prefix_debut = prefix_fin.replace('fin', 'debut')
 
         if date_debut is not None and date_fin is not None:    
-            q_left = (Q(date_debut__isnull=True) | Q(date_debut__lte=date_debut)) & (Q(date_fin__gte=date_debut) & Q(date_fin__lte=date_fin))
-            q_right = (Q(date_fin__isnull=True) | Q(date_fin__gte=date_fin)) & (Q(date_debut__gte=date_debut) & Q(date_debut__lte=date_fin))
-            q_both = Q(date_fin__isnull=True) | Q(date_fin__lte=date_fin) & (Q(date_debut__isnull=True) | Q(date_debut__gte=date_debut))
+            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}))
             qs = qs.filter(q_left | q_right | q_both)
 
         self.params = old
@@ -370,7 +373,7 @@ class EmployeAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin):
     ordering = ('nom', )
     form = EmployeAdminForm
     list_display = ('_apercu', '_nom', '_dossiers', 'date_modification',  'user_modification', )
-    list_filter = ('rh_dossiers__poste__implantation__region',  'rh_dossiers__poste__implantation', 'nb_postes', )
+    list_filter = ('rh_dossiers__poste__implantation__region',  'rh_dossiers__poste__implantation', 'nb_postes', 'rh_dossiers__date_debut', 'rh_dossiers__date_fin')
     inlines = (AyantDroitInline,
                DossierROInline,
                EmployePieceInline,
@@ -387,6 +390,10 @@ class EmployeAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin):
         }),
         )
 
+    def get_changelist(self, request, **kwargs):
+        return ChangeList
+
+
     def _apercu(self, obj):
         return u"""<a title="Aperçu de l'employé" onclick="return showAddAnotherPopup(this);" href='%s'><img src="%simg/loupe.png" /></a>""" % \
                 (reverse('employe_apercu', args=(obj.id,)), settings.STATIC_URL)
@@ -544,6 +551,11 @@ class PosteAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin, Aj
                PosteComparaisonInline,
                PosteCommentaireInline, )
 
+
+    def get_changelist(self, request, **kwargs):
+        return ChangeList
+
+
     def lookup_allowed(self, key, value):
         if key in (
             'date_debut__gte',