Revision e46a1c3f
Added by Benjamin Dauvergne over 12 years ago
calebasse/agenda/forms.py | ||
---|---|---|
180 | 180 |
'event_type', |
181 | 181 |
'services', |
182 | 182 |
) |
183 |
|
|
184 |
class PeriodicEventsSearchForm(forms.Form): |
|
185 |
start_date = forms.DateField(required=True, localize=True) |
|
186 |
end_date = forms.DateField(required=False, localize=True) |
|
187 |
|
|
188 |
def clean(self): |
|
189 |
cleaned_data = super(PeriodicEventsSearchForm, self).clean() |
|
190 |
if cleaned_data.get('start_date') and cleaned_data.get('end_date'): |
|
191 |
if cleaned_data['start_date'] > cleaned_data['end_date']: |
|
192 |
raise forms.ValidationError(u'La date de début doit être supérieure à la date de fin') |
|
193 |
return cleaned_data |
calebasse/agenda/templates/agenda/periodic-events.html | ||
---|---|---|
1 |
{% extends "agenda/base.html" %} |
|
2 |
{% load widget_tweaks %} |
|
3 |
{% load url from future %} |
|
4 |
{% load apptags %} |
|
5 |
|
|
6 |
{% block appbar %} |
|
7 |
<h2>Rendez-vous périodiques</h2> |
|
8 |
<a href="..">Retourner à l'agenda</a> |
|
9 |
<style> |
|
10 |
div#sidebar form#periodic-events-search-form button { |
|
11 |
width: inherit; |
|
12 |
} |
|
13 |
div#sidebar form#periodic-events-search-form input { |
|
14 |
width: 5em; |
|
15 |
} |
|
16 |
div#sidebar label { |
|
17 |
</style> |
|
18 |
{% endblock %} |
|
19 |
{% block content %} |
|
20 |
<div id="sidebar"> |
|
21 |
<form id="periodic-events-search-form"> |
|
22 |
<div> |
|
23 |
<label for="start_date">Rendez-vous périodiques possédant des occurences après le :</label> |
|
24 |
{{ search_form.start_date|add_class:"datepicker-date" }} |
|
25 |
</div> |
|
26 |
<div> |
|
27 |
<label for="end_date">et au moins une occurrence dans les trois qui suivent ou bien avant cette date :</label> |
|
28 |
{{ search_form.end_date|add_class:"datepicker-date" }} |
|
29 |
</div> |
|
30 |
<button>Rechercher</button> |
|
31 |
</form> |
|
32 |
</div> |
|
33 |
<script> |
|
34 |
$('.datepicker-date').datepicker({dateFormat: 'd/m/yy', showOn: 'button'}); |
|
35 |
</script> |
|
36 |
<div class="content"> |
|
37 |
{% for event in object_list %} |
|
38 |
<pre>{{ event }}</pre> |
|
39 |
{% endfor %} |
|
40 |
</div> |
|
41 |
{% endblock %} |
calebasse/agenda/urls.py | ||
---|---|---|
10 | 10 |
UpdateEventView, AgendaServiceActValidationView, AutomatedValidationView, |
11 | 11 |
UnlockAllView, AgendasTherapeutesView, JoursNonVerrouillesView, |
12 | 12 |
RessourcesView, AjaxWorkerTabView, AjaxWorkerDisponibilityColumnView, |
13 |
DeleteOccurrenceView, DeleteEventView, UpdatePeriodicEventView, UpdatePeriodicAppointmentView) |
|
13 |
DeleteOccurrenceView, DeleteEventView, UpdatePeriodicEventView, UpdatePeriodicAppointmentView, |
|
14 |
PeriodicEventsView) |
|
14 | 15 |
|
15 | 16 |
agenda_patterns = patterns('', |
16 | 17 |
url(r'^$', |
... | ... | |
77 | 78 |
url(r'^ajax-worker-disponibility-column/(?P<worker_id>\d+)$', |
78 | 79 |
AjaxWorkerDisponibilityColumnView.as_view(), |
79 | 80 |
name='ajax-worker-disponibility-column'), |
81 |
url(r'^periodic-events/$', |
|
82 |
PeriodicEventsView.as_view(), |
|
83 |
name='periodic-events'), |
|
80 | 84 |
) |
81 | 85 |
|
82 | 86 |
urlpatterns = patterns('', |
calebasse/agenda/views.py | ||
---|---|---|
1 | 1 |
# -*- coding: utf-8 -*- |
2 | 2 |
|
3 | 3 |
import datetime |
4 |
from itertools import chain |
|
4 | 5 |
|
5 | 6 |
from django.db.models import Q |
6 | 7 |
from django.shortcuts import redirect |
... | ... | |
20 | 21 |
from calebasse import cbv |
21 | 22 |
|
22 | 23 |
from forms import (NewAppointmentForm, NewEventForm, |
23 |
UpdateAppointmentForm, UpdateEventForm) |
|
24 |
UpdateAppointmentForm, UpdateEventForm, PeriodicEventsSearchForm)
|
|
24 | 25 |
|
25 | 26 |
|
26 | 27 |
def redirect_today(request, service): |
... | ... | |
574 | 575 |
context['disponibility'] = Event.objects.daily_disponibilities(self.date, |
575 | 576 |
events_workers, [worker], time_tables_workers, holidays_workers) |
576 | 577 |
return context |
578 |
|
|
579 |
|
|
580 |
class PeriodicEventsView(cbv.ListView): |
|
581 |
model = EventWithAct |
|
582 |
template_name = 'agenda/periodic-events.html' |
|
583 |
|
|
584 |
def get_form(self): |
|
585 |
kwargs = { |
|
586 |
'initial': { |
|
587 |
'start_date': self.date, |
|
588 |
} |
|
589 |
} |
|
590 |
if self.request.GET: |
|
591 |
kwargs['data'] = self.request.GET |
|
592 |
self.form = PeriodicEventsSearchForm(**kwargs) |
|
593 |
return self.form |
|
594 |
|
|
595 |
def get_queryset(self): |
|
596 |
qs1 = Event.objects.exclude(event_type_id=1) |
|
597 |
qs2 = EventWithAct.objects.all() |
|
598 |
form = self.get_form() |
|
599 |
qs1 = self.filter_queryset(form, qs1) |
|
600 |
qs2 = self.filter_queryset(form, qs2) |
|
601 |
return sorted(chain(qs1, qs2), |
|
602 |
key=lambda x: (x.start_datetime, x.recurrence_end_date or datetime.date(9999,12,31))) |
|
603 |
|
|
604 |
def filter_queryset(self, form, qs): |
|
605 |
start_date = datetime.date.today() |
|
606 |
end_date = start_date+datetime.timedelta(days=90) |
|
607 |
if form.is_valid(): |
|
608 |
if form.cleaned_data.get('start_date'): |
|
609 |
start_date = form.cleaned_data['start_date'] |
|
610 |
if form.cleaned_data.get('end_date'): |
|
611 |
start_date = form.cleaned_data['end_date'] |
|
612 |
else: |
|
613 |
end_date = start_date+datetime.timedelta(days=90) |
|
614 |
qs = qs.filter(services=self.service) |
|
615 |
qs = qs.filter(recurrence_periodicity__isnull=False) |
|
616 |
qs = qs.filter(start_datetime__lt=end_date) |
|
617 |
qs = qs.filter(Q(recurrence_end_date__isnull=True) |
|
618 |
| Q(recurrence_end_date__gte=start_date)) |
|
619 |
qs = qs.order_by('start_datetime', 'recurrence_end_date') |
|
620 |
qs = qs.select_related() |
|
621 |
qs = qs.prefetch_related('participants') |
|
622 |
return qs |
|
623 |
|
|
624 |
def get_context_data(self, **kwargs): |
|
625 |
ctx = super(PeriodicEventsView, self).get_context_data(**kwargs) |
|
626 |
ctx['search_form'] = self.form |
|
627 |
return ctx |
Also available in: Unified diff
agenda: base work for the periodic events view (refs #2124)