Project

General

Profile

« Previous | Next » 

Revision 84614733

Added by Benjamin Dauvergne over 12 years ago

personnes: rewrite holidays view (fixes #2308)

View differences:

calebasse/personnes/views.py
1 1
# -*- coding: utf-8 -*-
2 2
from collections import defaultdict
3 3
from datetime import date
4
from interval import IntervalSet
4 5

  
5 6
from dateutil.relativedelta import relativedelta
6 7

  
......
8 9
from django.db.models import Q
9 10
from django.contrib.auth.models import User
10 11
from django.contrib import messages
12
from django.core.urlresolvers import reverse
11 13

  
12 14
from calebasse import cbv, models as cb_models
13 15
from calebasse.ressources.models import Service
......
227 229

  
228 230
    def get_context_data(self, **kwargs):
229 231
        ctx = super(HolidayView, self).get_context_data(**kwargs)
230
        end_date = date.today() + relativedelta(months=self.months)
231
        qs = models.Holiday.objects.future().select_related('worker')
232
        form = forms.HolidaySearchForm(data=self.request.GET)
233

  
232 234
        today = date.today()
233
        future_qs = qs.for_period(today, end_date).select_related('worker')
234
        group_qs = models.Holiday.objects.for_service(self.service).select_related()
235
        current_qs = qs.today()
236
        form = self.get_form()
237
        if form.is_valid() and form.cleaned_data.get('start_date'):
238
            cleaned_data = form.cleaned_data
239
            start_date = cleaned_data['start_date']
240
            end_date = cleaned_data['end_date']
241
            future_qs = models.Holiday.objects \
242
                    .for_period(start_date, end_date) \
243
                    .for_service_workers(self.service)
244
            group_qs = group_qs.for_period(start_date, end_date)
245
            current_qs = []
246
        ctx['end_date'] = end_date
247
        ctx['current_holidays'] = current_qs
248
        future_holidays = defaultdict(lambda:[])
249
        for holiday in future_qs:
250
            key = (holiday.start_date.year, holiday.start_date.month, holiday.start_date.strftime('%B'))
251
            future_holidays[key].append(holiday)
252
        ctx['future_holidays'] = [ {
253
            'date': date(day=1, month=key[1], year=key[0]),
254
            'holidays': future_holidays[key]
255
          } for key in sorted(future_holidays.keys()) ]
256
        ctx['group_holidays'] = group_qs.order_by('-start_date')
235
        filter_start_date = today
236
        filter_end_date = date.today() + relativedelta(months=self.months)
237

  
238
        if form.is_valid():
239
            if form.cleaned_data.get('start_date'):
240
                filter_start_date = form.cleaned_data.get('start_date')
241
            if form.cleaned_data.get('end_date'):
242
                filter_end_date = form.cleaned_data.get('end_date')
243

  
244
        workers = models.Worker.objects.filter(enabled=True)
245
        holidays = models.Holiday.objects \
246
                .filter(end_date__gte=filter_start_date,
247
                        start_date__lte=filter_end_date) \
248
                .select_related('worker', 'service')
249
        holiday_by_worker = defaultdict(lambda: [])
250
        all_holidays = holidays.filter(worker__isnull=True)
251

  
252
        for worker in workers:
253
            holiday_by_worker[worker] = list(all_holidays)
254

  
255
        for holiday in holidays.filter(worker__isnull=False):
256
            holiday_by_worker[holiday.worker].append(holiday)
257

  
258
        def holiday_url(holiday):
259
            if holiday.worker:
260
                return reverse('worker-holidays-update', kwargs=dict(
261
                    service=self.service.slug, pk=holiday.worker.pk))
262
            else:
263
                slug = holiday.service.slug if holiday.service else self.service.slug
264
                return reverse('group-holiday-update', kwargs=dict(
265
                    service=slug))
266

  
267
        currents = []
268
        futures = defaultdict(lambda: [])
269
        for worker, holidays in holiday_by_worker.iteritems():
270
            for holiday in holidays:
271
                url = holiday_url(holiday)
272
                holiday_tpl = dict(worker=worker.display_name, holiday=holiday, url=url)
273
                if holiday.start_date <= today <= holiday.end_date:
274
                    currents.append(holiday_tpl)
275
                start_date = max(holiday.start_date, filter_start_date)
276
                month_name = start_date.strftime('%B')
277
                key = start_date.year, start_date.month, month_name
278
                futures[key].append(holiday_tpl)
279

  
280
        future_holidays = []
281
        for key in sorted(futures.keys()):
282
            future_holidays.append(dict(
283
                month=key[2],
284
                holidays=futures[key]))
285
        future_holidays2 = []
286
        for i in range(0, len(future_holidays), 2):
287
            future_holidays2.append(future_holidays[i:i+2])
288

  
289
        ctx['end_date'] = filter_end_date
290
        ctx['current_holidays'] = currents
291
        ctx['future_holidays'] = future_holidays2
292
        ctx['group_holidays'] = all_holidays.order_by('-start_date')
257 293
        ctx['search_form'] = form
258 294
        return ctx
259 295

  

Also available in: Unified diff