Project

General

Profile

Download (16.6 KB) Statistics
| Branch: | Tag: | Revision:

calebasse / calebasse / personnes / views.py @ 37ef36c7

1
# -*- coding: utf-8 -*-
2
from collections import defaultdict
3
from datetime import date
4
from interval import IntervalSet
5
import logging
6

    
7
from dateutil.relativedelta import relativedelta
8

    
9
from django.http import HttpResponseRedirect, Http404, HttpResponse
10
from django.db.models import Q
11
from django.contrib.auth.models import User
12
from django.contrib import messages
13
from django.core.urlresolvers import reverse
14
from django.utils.dateformat import format as date_format
15
from django.views.decorators.csrf import csrf_exempt
16

    
17
from calebasse import cbv, models as cb_models
18
from calebasse.ressources.models import Service
19

    
20
import json
21

    
22
from calebasse.decorators import super_user_only
23

    
24
import forms
25
import models
26

    
27
logger = logging.getLogger(__name__)
28

    
29

    
30
FILTER_CRITERIA = (
31
        'username',
32
        'first_name',
33
        'last_name',
34
        'email',
35
        'userworker__worker__display_name',
36
)
37

    
38
class AccessView(cbv.ListView):
39
    model = User
40
    template_name = 'personnes/acces.html'
41

    
42
    def get_queryset(self):
43
        qs = super(AccessView, self).get_queryset()
44
        identifier = self.request.GET.get('identifier')
45
        if identifier:
46
            for part in identifier.split():
47
                filters = []
48
                for criteria in FILTER_CRITERIA:
49
                    q = Q(**{criteria+'__contains': part})
50
                    filters.append(q)
51
                qs = qs.filter(reduce(Q.__or__, filters))
52
        qs = qs.prefetch_related('userworker__worker')
53
        return qs
54

    
55
    def get_context_data(self, **kwargs):
56
        ctx = super(AccessView, self).get_context_data(**kwargs)
57
        ctx['active_list'] = ctx['object_list'].filter(is_active=True)
58
        ctx['inactive_list'] = ctx['object_list'].filter(is_active=False)
59
        return ctx
60

    
61

    
62
class AccessUpdateView(cbv.ServiceFormMixin, cbv.UpdateView):
63
    model = User
64
    template_name = 'personnes/acces-update.html'
65
    form_class = forms.UserForm
66
    success_url = '../'
67

    
68

    
69
class WorkerView(cbv.ListView):
70
    model = models.Worker
71
    template_name = 'personnes/workers.html'
72

    
73
    def get_form(self):
74
        return forms.WorkerSearchForm(data=self.request.GET or None)
75

    
76
    def get_queryset(self):
77
        qs = super(WorkerView, self).get_queryset()
78
        qs = qs.select_related()
79
        qs = qs.prefetch_related('services')
80
        form = self.get_form()
81
        if form.is_valid():
82
            cleaned_data = form.cleaned_data
83
            last_name = cleaned_data.get('last_name')
84
            first_name = cleaned_data.get('first_name')
85
            profession = cleaned_data.get('profession')
86
            intervene_status = cleaned_data.get('intervene_status')
87
            if last_name:
88
                qs = qs.filter(last_name__icontains=last_name)
89
            if first_name:
90
                qs = qs.filter(first_name__icontains=first_name)
91
            if profession:
92
                qs = qs.filter(type=profession)
93
            if intervene_status and 0 < len(intervene_status) < 2:
94
                qs = qs.filter(enabled=intervene_status[0] == 'a')
95
        else:
96
            # only display current workers by default
97
            qs = qs.filter(enabled=True)
98
        today = date.today()
99
        if models.Holiday.objects.for_service(self.service).future() \
100
                .filter(start_date__lte=today).exists():
101
            for worker in qs:
102
                worker.holiday = True
103
        else:
104
            qs2 = models.Holiday.objects.today().filter(worker__isnull=False)
105
            worker_dict = dict(((w.id, w) for w in qs))
106
            for worker in qs:
107
                worker.holiday = False
108
            for holiday in qs2:
109
                if holiday.worker.id in worker_dict:
110
                    worker_dict[holiday.worker.id].holiday = True
111
        return qs
112

    
113
    def get_context_data(self, **kwargs):
114
        ctx = super(WorkerView, self).get_context_data(**kwargs)
115
        ctx['search_form'] = self.get_form()
116
        return ctx
117

    
118
homepage = cbv.TemplateView.as_view(template_name='personnes/index.html')
119

    
120

    
121
user_listing = super_user_only(AccessView.as_view())
122

    
123

    
124
class UserCreateView(cbv.ServiceFormMixin, cbv.CreateView):
125
    model = User
126
    success_url = '../'
127
    form_class = forms.UserForm
128
    template_name = 'calebasse/simple-form.html'
129
    template_name_suffix = '_new.html'
130

    
131
class UserDeleteView(cbv.DeleteView):
132
    model = User
133
    success_url = "../../"
134
    template_name = 'calebasse/generic_confirm_delete.html'
135

    
136

    
137
user_new = super_user_only(UserCreateView.as_view())
138
user_update = super_user_only(AccessUpdateView.as_view())
139
user_delete = super_user_only(UserDeleteView.as_view())
140

    
141

    
142
class WorkerUpdateView(cbv.ServiceViewMixin, cbv.MultiUpdateView):
143
    model = models.Worker
144
    forms_classes = {
145
            'id': forms.WorkerIdForm,
146
            'services': forms.WorkerServiceForm
147
    }
148
    template_name = 'personnes/worker_update.html'
149
    success_url = './'
150

    
151
    def get_context_data(self, **kwargs):
152
        ctx = super(WorkerUpdateView, self).get_context_data(**kwargs)
153
        _timetables = defaultdict(lambda: [])
154
        for timetable in self.object.timetable_set.order_by('start_time'):
155
            _timetables[timetable.weekday].append(timetable)
156
        timetable = []
157
        for weekday, name in models.TimeTable.WEEKDAYS:
158
            timetable.append({
159
                'weekday': name,
160
                'schedules': _timetables[weekday]})
161
        ctx['weekdays'] = list(models.TimeTable.WEEKDAYS)
162
        ctx['timetables'] = timetable
163
        ctx['holidays'] = models.Holiday.objects \
164
                            .for_worker(self.object) \
165
                            .future() \
166
                            .order_by('start_date')
167
        try:
168
            holiday = models.Holiday.objects \
169
                    .for_worker(self.object) \
170
                    .today()[0]
171
        except IndexError:
172
            holiday = None
173
        ctx['holiday'] = holiday
174
        return ctx
175

    
176
    def form_valid(self, form):
177
        messages.add_message(self.request, messages.INFO, u'Modification enregistrée avec succès.')
178
        return super(WorkerUpdateView, self).form_valid(form)
179

    
180

    
181
class WorkerScheduleUpdateView(cbv.UpdateView):
182
    model = models.Worker
183
    form_class = forms.TimetableFormSet
184
    success_url = '../'
185
    template_name = 'personnes/worker_schedule_update.html'
186

    
187
    def get_form_kwargs(self):
188
        kwargs = super(WorkerScheduleUpdateView, self).get_form_kwargs()
189
        kwargs['queryset'] = models.TimeTable.objects.filter(weekday=self.weekday).prefetch_related('services')
190
        kwargs['initial'] = [{ 'services': Service.objects.all().values_list('pk', flat=True) }] * 3
191
        return kwargs
192

    
193
    def get_context_data(self, **kwargs):
194
        ctx = super(WorkerScheduleUpdateView, self).get_context_data(**kwargs)
195
        ctx['weekday'] = models.TimeTable.WEEKDAYS[self.weekday][1]
196
        return ctx
197

    
198
    def dispatch(self, *args, **kwargs):
199
        self.weekday = int(kwargs['weekday'])
200
        if self.weekday > 6:
201
            raise Http404()
202
        return super(WorkerScheduleUpdateView, self).dispatch(*args, **kwargs)
203

    
204
    def form_valid(self, form):
205
        instances = form.save(commit=False)
206
        for instance in instances:
207
            instance.weekday = self.weekday
208
            instance.save()
209
        form.save_m2m()
210
        return HttpResponseRedirect('')
211

    
212

    
213
class WorkerHolidaysUpdateView(cbv.UpdateView):
214
    model = models.Worker
215
    form_class = forms.HolidayFormSet
216
    success_url = '../'
217
    template_name = 'personnes/worker_holidays_update.html'
218

    
219
    def get_success_url(self):
220
        return self.success_url
221

    
222

    
223
worker_listing = WorkerView.as_view()
224
worker_new = cbv.CreateView.as_view(model=models.Worker,
225
        template_name='calebasse/simple-form.html',
226
        success_url='../')
227
worker_update = WorkerUpdateView.as_view()
228
worker_schedule_update = WorkerScheduleUpdateView.as_view()
229
worker_holidays_update = WorkerHolidaysUpdateView.as_view()
230
worker_delete = cbv.DeleteView.as_view(model=models.Worker,
231
        template_name='calebasse/simple-form.html',
232
        success_url='../../')
233

    
234

    
235
class HolidayView(cbv.TemplateView, cbv.ServiceViewMixin):
236
    months = 3
237
    template_name='personnes/holidays.html'
238

    
239
    def get_form(self):
240
        return forms.HolidaySearchForm(data=self.request.GET)
241

    
242
    def get_context_data(self, **kwargs):
243
        ctx = super(HolidayView, self).get_context_data(**kwargs)
244
        form = forms.HolidaySearchForm(data=self.request.GET)
245

    
246
        today = date.today()
247
        filter_start_date = today
248
        filter_end_date = date.today() + relativedelta(months=self.months)
249

    
250
        if form.is_valid():
251
            if form.cleaned_data.get('start_date'):
252
                filter_start_date = form.cleaned_data.get('start_date')
253
            if form.cleaned_data.get('end_date'):
254
                filter_end_date = form.cleaned_data.get('end_date')
255

    
256
        workers = models.Worker.objects.filter(enabled=True)
257
        holidays = models.Holiday.objects \
258
                .filter(end_date__gte=filter_start_date,
259
                        start_date__lte=filter_end_date) \
260
                .select_related('worker', 'service')
261
        holiday_by_worker = defaultdict(lambda: [])
262
        service = Service.objects.get(slug = ctx['service'])
263
        all_holidays = holidays.filter(services=service, worker__isnull=True)
264

    
265
        for worker in workers:
266
            holiday_by_worker[worker] = list(all_holidays)
267

    
268
        for holiday in holidays.filter(worker__isnull=False):
269
            holiday_by_worker[holiday.worker].append(holiday)
270

    
271
        def holiday_url(holiday):
272
            if holiday.worker:
273
                return reverse('worker_update', kwargs=dict(
274
                    service = ctx['service'], pk=holiday.worker.pk))
275
            else:
276
                slug = ctx['service']
277
                return reverse('group-holidays', kwargs=dict(
278
                    service=slug))
279

    
280
        currents = []
281
        futures = defaultdict(lambda: [])
282
        for worker, holidays in holiday_by_worker.iteritems():
283
            for holiday in holidays:
284
                url = holiday_url(holiday)
285
                holiday_tpl = dict(worker=worker.display_name, holiday=holiday, url=url)
286
                if holiday.start_date <= today <= holiday.end_date:
287
                    currents.append(holiday_tpl)
288
                start_date = max(holiday.start_date, filter_start_date)
289
                month_name = date_format(start_date, 'F')
290
                key = start_date.year, start_date.month, month_name
291
                futures[key].append(holiday_tpl)
292

    
293
        future_holidays = []
294
        for key in sorted(futures.keys()):
295
            future_holidays.append(dict(
296
                month=key[2],
297
                holidays=futures[key]))
298
        future_holidays2 = []
299
        for i in range(0, len(future_holidays), 2):
300
            future_holidays2.append(future_holidays[i:i+2])
301

    
302
        ctx['end_date'] = filter_end_date
303
        ctx['current_holidays'] = currents
304
        ctx['future_holidays'] = future_holidays2
305
        ctx['group_holidays'] = all_holidays.order_by('-start_date')
306
        ctx['search_form'] = form
307
        return ctx
308

    
309

    
310
holiday_listing = HolidayView.as_view()
311

    
312

    
313
class GroupHolidayUpdateView(cbv.FormView):
314
    form_class = forms.GroupHolidayFormSet
315
    template_name = 'personnes/group_holiday_update.html'
316
    success_url = '.'
317

    
318
    def get_form_kwargs(self):
319
        kwargs = super(GroupHolidayUpdateView, self).get_form_kwargs()
320
        qs = models.Holiday.objects.for_service(self.service)
321
        kwargs['queryset'] = qs
322
        kwargs['service'] = self.service
323
        return kwargs
324

    
325
    def form_valid(self, form):
326
        form.save()
327
        return super(GroupHolidayUpdateView, self).form_valid(form)
328

    
329

    
330
group_holiday_update = GroupHolidayUpdateView.as_view()
331

    
332
class GroupHolidaysList(cbv.ListView):
333
    model = models.Holiday
334
    template_name = 'personnes/group_holidays_list.html'
335
    queryset = model.objects.future().filter(worker__isnull=True)
336

    
337
    def get_queryset(self, *args, **kwargs):
338
        qs = super(GroupHolidaysList, self).get_queryset(*args, **kwargs)
339
        return qs
340

    
341
group_holidays = GroupHolidaysList.as_view()
342

    
343
class HolidayManagement(object):
344
    """
345
    A class providing some methods for handling the absences management
346
    """
347
    model = models.Holiday
348
    form_class = forms.HolidayForm
349

    
350
    def get_initial(self):
351
        worker = models.Worker.objects.get(pk=self.kwargs['worker_pk'])
352
        return {'services': worker.services.all()}
353

    
354
    def form_valid(self, form):
355
        holiday = form.save()
356
        worker = models.Worker.objects.get(pk=self.kwargs['worker_pk'])
357
        holiday.worker = worker
358
        holiday.save()
359

    
360
    def render_to_json(self, location, err = 0, **kwargs):
361
        data = {'err': err, 'location': location}
362
        response = json.dumps(data)
363
        kwargs['content_type'] = 'application/json'
364
        return HttpResponse(response, **kwargs)
365

    
366
    def get_success_url(self):
367
        slug = self.service.slug
368
        return reverse('worker_update', kwargs={'pk': self.kwargs['worker_pk'],
369
                                                'service': slug})
370

    
371
class GroupHolidayManagement(HolidayManagement):
372
    form_class = forms.GroupHolidayForm
373

    
374
    def get_initial(self):
375
        return {'services': Service.objects.all()}
376

    
377
    def get_success_url(self):
378
        slug = self.service.slug
379
        return reverse('group-holidays', kwargs={'service': slug})
380

    
381
class CreateGroupHolidayView(GroupHolidayManagement, cbv.CreateView):
382

    
383
    template_name_suffix = '_group_form'
384

    
385
    def form_valid(self, form):
386
        try:
387
            form.save()
388
            messages.success(self.request, u'Absence ajoutée avec succès')
389
        except Exception, e:
390
            logger.debug('Error on creating a group holiday: %s' % e)
391
            messages.error(self.request, u'Une erreur est survenue lors de l\'ajout de l\'absence')
392
        return self.render_to_json(self.get_success_url())
393

    
394
create_group_holiday = CreateGroupHolidayView.as_view()
395

    
396
class EditGroupHolidayView(GroupHolidayManagement, cbv.FormView):
397
    template_name = 'personnes/group_holiday_update_form.html'
398

    
399
    def get_initial(self):
400
        return
401

    
402
    def get_form_kwargs(self):
403
        kwargs = super(EditGroupHolidayView, self).get_form_kwargs()
404
        kwargs['instance'] = self.model.objects.get(pk = self.kwargs['pk'])
405
        return kwargs
406

    
407
    def form_valid(self, form):
408
        try:
409
            form.save()
410
            messages.success(self.request, u'Données mises à jour avec succès')
411
        except Exception, e:
412
            logger.debug('Error on updating a group holiday: %s' % e)
413
            messages.error(self.request, u'Une erreur est survenue lors de la mise à jour de l\'absence')
414
        return self.render_to_json(self.get_success_url())
415

    
416

    
417
edit_group_holiday = EditGroupHolidayView.as_view()
418

    
419
class HolidayCreateView(HolidayManagement, cbv.CreateView):
420

    
421
    def form_valid(self, form):
422
        try:
423
            super(HolidayCreateView, self).form_valid(form)
424
            messages.success(self.request, u'Absence ajoutée avec succès')
425
        except Exception, e:
426
            logger.debug('Error on creating a holiday: %s' % e)
427
            messages.error(self.request, u'Une erreur est survenue lors de l\'ajout de l\'absence')
428
        return self.render_to_json(self.get_success_url())
429

    
430
create_holiday = HolidayCreateView.as_view()
431

    
432
class EditHolidayView(HolidayManagement, cbv.FormView):
433
    template_name = 'personnes/holiday_update_form.html'
434

    
435
    def get_form_kwargs(self):
436
        kwargs = super(EditHolidayView, self).get_form_kwargs()
437
        kwargs['instance'] = self.model.objects.get(pk = self.kwargs['pk'])
438
        return kwargs
439

    
440
    def form_valid(self, form):
441
        try:
442
            super(EditHolidayView, self).form_valid(form)
443
            messages.success(self.request, u'Données mises à jour avec succès')
444
        except Exception, e:
445
            logger.debug('Error on updating a holiday: %s' % e)
446
            messages.error(self.request, u'Une erreur est survenue lors de la mise à jour de l\'absence')
447
        return self.render_to_json(self.get_success_url())
448

    
449
edit_holiday = EditHolidayView.as_view()
450

    
451
class DeleteHolidayView(HolidayManagement, cbv.DeleteView):
452
    template_name = 'personnes/holiday_update_form.html'
453

    
454
    def delete(self, request, *args, **kwargs):
455
        try:
456
            super(DeleteHolidayView, self).delete(request, *args, **kwargs)
457
            messages.success(request, u'Absence supprimée avec succès')
458
        except Exception, e:
459
            logger.debug('Error on deleting a holiday: %s' % e)
460
            messages.error(request, u'Une erreur est survenue lors de la suppression de l\'absence')
461

    
462
        return self.render_to_json(self.get_success_url())
463

    
464
delete_holiday = DeleteHolidayView.as_view()
465

    
466
class DeleteGroupHolidayView(GroupHolidayManagement, DeleteHolidayView):
467
    template_name = 'personnes/group_holiday_update_form.html'
468

    
469
delete_group_holiday = DeleteGroupHolidayView.as_view()
(8-8/8)