date range filter
authorOlivier Larchevêque <olivier.larcheveque@auf.org>
Tue, 7 Feb 2012 22:34:59 +0000 (17:34 -0500)
committerOlivier Larchevêque <olivier.larcheveque@auf.org>
Tue, 7 Feb 2012 22:34:59 +0000 (17:34 -0500)
project/rh/admin.py
project/rh/filters.py
project/templates/admin/filter.html
src/auf.django.metadata/auf/django/metadata/admin.py

index 2005bd9..4d28a4a 100644 (file)
@@ -7,6 +7,7 @@ from django.db import models
 from django import forms
 from django.core.urlresolvers import reverse
 from django.contrib import admin
+from django.contrib.admin.views.main import ChangeList as DjangoChangeList
 from django.conf import settings
 from django.db.models import Q
 from django.template.defaultfilters import date
@@ -19,6 +20,42 @@ import models as rh
 import filters
 
 
+
+class ChangeList(DjangoChangeList):
+
+    def __init__(self, *args, **kwargs):
+        super(ChangeList, self).__init__(*args, **kwargs)
+    
+    def get_query_set(self):
+        old = self.params.copy()
+        date_debut = None
+        date_fin = None
+        for k, v in self.params.items():
+            if k.startswith('date_debut'):
+                date_debut = v
+                del self.params[k]
+            elif k.startswith('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
+        if date_debut is None and date_fin is not None:
+            date_debut = date_fin
+
+        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__gte=date_fin) & (Q(date_debut__isnull=True) | Q(date_debut__lte=date_debut))
+            qs = qs.filter(q_left | q_right | q_both)
+
+            
+
+        self.params = old
+        return qs
+
 # Override of the InlineModelAdmin to support the link in the tabular inline
 class LinkedInline(admin.options.InlineModelAdmin):
     template = "admin/linked.html"
@@ -256,6 +293,8 @@ class DossierAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin,
             ):
             return True
 
+    def get_changelist(self, request, **kwargs):
+        return ChangeList
 
     def _id(self, d):
         apercu_link = u"""<a title="Aperçu du dossier" onclick="return showAddAnotherPopup(this);" href='%s'><img src="%simg/loupe.png" /></a>""" % \
@@ -544,7 +583,7 @@ class PosteAdmin(AUFMetadataAdminMixin, ProtectRegionMixin, admin.ModelAdmin, Aj
     def _occupe_par(self, obj):
         """Formatte la méthode Poste.occupe_par() pour l'admin"""
         output = u"Vacant"
-        if obj.date_fin is not None and obj.date_fin < datetime.datetime.now():
+        if obj.date_fin is not None and obj.date_fin < datetime.date.now():
             return u"s/o"
         employes = obj.occupe_par()
         if employes:
index d300996..1a129cd 100644 (file)
@@ -3,6 +3,10 @@
 import datetime
 from django.contrib.admin.filterspecs import FilterSpec
 
+year = datetime.date.today().year
+start = year + 5
+end = year - 5
+
 class DateDebutFieldFilterSpec(FilterSpec):
     def __init__(self, f, request, params, model, model_admin,
                  field_path=None): 
@@ -17,17 +21,16 @@ class DateDebutFieldFilterSpec(FilterSpec):
         today = datetime.date.today()
         self.links = [
             (u"Toutes" ,{}),
-            (u"Cette année", {'%s__gte' % self.field_path: "%s-01-01" % str(today.year), }),
-            (u"Sans valeur" ,{'%s__isnull' % self.field_path: str(True)}),
         ]
-        for i in range(1, 10):
-            t = (today.year-i, {
-                '%s__gte' % self.field_path: "%s-01-01" % str(today.year-i),
+        annees = [i for i in range(start, end, -1)]
+        for i in annees:
+            t = (i, {
+                '%s__gte' % self.field_path: "%s-01-01" % str(i),
                 }) 
             self.links.append(t)
 
     def title(self):
-        return self.field.verbose_name
+        return "Date borne gauche"
 
     def choices(self, cl):
         for title, param_dict in self.links:
@@ -50,18 +53,17 @@ class DateFinFieldFilterSpec(FilterSpec):
                                  if k.startswith(self.field_generic)])
         today = datetime.date.today()
         self.links = [
-            (u"Cette année", {'%s__lte' % self.field_path: "%s-12-31" % str(today.year)}),
             (u"Toutes" ,{}),
-            (u"Sans valeur" ,{'%s__isnull' % self.field_path: str(True)}),
         ]
-        for i in range(1, 10):
-            t = (today.year-i, {
-                '%s__lte' % self.field_path: "%s-12-31" % str(today.year-i),
+        annees = [i for i in range(start, end, -1)]
+        for i in annees:
+            t = (i, {
+                '%s__lte' % self.field_path: "%s-12-31" % str(i),
                 }) 
             self.links.append(t)
 
     def title(self):
-        return self.field.verbose_name
+        return "Date borne droite"
 
     def choices(self, cl):
         for title, param_dict in self.links:
index 69684d1..42376c6 100644 (file)
@@ -1,7 +1,6 @@
 {% load i18n %}
 
 <h3>{% blocktrans with title as filter_title %} By {{ filter_title }} {% endblocktrans %}</h3>
-{% if choices|length > 2 %}
 <select dir="rtl" style="width: 95%;" onchange="window.location=window.location.pathname+this.options[this.selectedIndex].value">
 {% for choice in choices %}
     <option{% if choice.selected %} selected="selected"{% endif %}
@@ -9,12 +8,3 @@
      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 3868c27..e798ccf 100755 (executable)
@@ -43,14 +43,6 @@ class AUFMetadataAdminMixin(object):
             obj.date_creation = datetime.datetime.now()
         obj.user_modification = request.user
         obj.date_modification = datetime.datetime.now()
-        initial = getattr(form, 'initial', None)
-        if initial:
-            if form.initial['actif'] is True and obj.actif is False:
-                obj.user_desactivation = request.user
-                obj.date_desactivation = datetime.datetime.now()
-            if form.initial['actif'] is False and obj.actif is True:
-                obj.user_activation = request.user
-                obj.date_activation = datetime.datetime.now()
         obj.save()
 
     def has_metadata(self, instance):