Revision 84614733
Added by Benjamin Dauvergne over 12 years ago
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
personnes: rewrite holidays view (fixes #2308)