From 3195667eeb2f903de828f101bda008fc6d1ede86 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Olivier=20Larchev=C3=AAque?= Date: Tue, 7 Feb 2012 17:34:59 -0500 Subject: [PATCH] date range filter --- project/rh/admin.py | 41 +++++++++++++++++++- project/rh/filters.py | 26 +++++++------ project/templates/admin/filter.html | 10 ----- .../auf/django/metadata/admin.py | 8 ---- 4 files changed, 54 insertions(+), 31 deletions(-) diff --git a/project/rh/admin.py b/project/rh/admin.py index 2005bd9..4d28a4a 100644 --- a/project/rh/admin.py +++ b/project/rh/admin.py @@ -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"""""" % \ @@ -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: diff --git a/project/rh/filters.py b/project/rh/filters.py index d300996..1a129cd 100644 --- a/project/rh/filters.py +++ b/project/rh/filters.py @@ -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: diff --git a/project/templates/admin/filter.html b/project/templates/admin/filter.html index 69684d1..42376c6 100644 --- a/project/templates/admin/filter.html +++ b/project/templates/admin/filter.html @@ -1,7 +1,6 @@ {% load i18n %}

{% blocktrans with title as filter_title %} By {{ filter_title }} {% endblocktrans %}

-{% if choices|length > 2 %} - -{% else %} - -{% endif %} diff --git a/src/auf.django.metadata/auf/django/metadata/admin.py b/src/auf.django.metadata/auf/django/metadata/admin.py index 3868c27..e798ccf 100755 --- a/src/auf.django.metadata/auf/django/metadata/admin.py +++ b/src/auf.django.metadata/auf/django/metadata/admin.py @@ -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): -- 1.7.10.4