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}))
--- /dev/null
+<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>
+ <strong>OU</strong>
+ <label>Année :
+ {{ form.annee }}
+ </label>
+ <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>
{% extends "admin/change_list.html" %}
+{% load change_list %}
{% block object-tools-items %}
<li>
</li>
{% endcomment %}
{% endblock %}
+
+{% block result_list %}
+ {% recherche_par_annees cl %}
+ {{ block.super }}
+{% endblock %}
--- /dev/null
+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'})
+ }