Project

General

Profile

« Previous | Next » 

Revision e46a1c3f

Added by Benjamin Dauvergne over 12 years ago

agenda: base work for the periodic events view (refs #2124)

View differences:

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&nbsp;:</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&nbsp;:</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