Project

General

Profile

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

calebasse / calebasse / personnes / views.py @ 84614733

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

    
6
from dateutil.relativedelta import relativedelta
7

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

    
14
from calebasse import cbv, models as cb_models
15
from calebasse.ressources.models import Service
16

    
17
from calebasse.decorators import super_user_only
18

    
19
import forms
20
import models
21

    
22

    
23
FILTER_CRITERIA = (
24
        'username',
25
        'first_name',
26
        'last_name',
27
        'email',
28
        'userworker__worker__display_name',
29
)
30

    
31
class AccessView(cbv.ListView):
32
    model = User
33
    template_name = 'personnes/acces.html'
34

    
35
    def get_queryset(self):
36
        qs = super(AccessView, self).get_queryset()
37
        identifier = self.request.GET.get('identifier')
38
        if identifier:
39
            for part in identifier.split():
40
                filters = []
41
                for criteria in FILTER_CRITERIA:
42
                    q = Q(**{criteria+'__contains': part})
43
                    filters.append(q)
44
                qs = qs.filter(reduce(Q.__or__, filters))
45
        qs = qs.prefetch_related('userworker__worker')
46
        return qs
47

    
48
    def get_context_data(self, **kwargs):
49
        ctx = super(AccessView, self).get_context_data(**kwargs)
50
        ctx['active_list'] = ctx['object_list'].filter(is_active=True)
51
        ctx['inactive_list'] = ctx['object_list'].filter(is_active=False)
52
        return ctx
53

    
54

    
55
class AccessUpdateView(cbv.ServiceFormMixin, cbv.UpdateView):
56
    model = User
57
    template_name = 'personnes/acces-update.html'
58
    form_class = forms.UserForm
59
    success_url = '../'
60

    
61

    
62
class WorkerView(cbv.ListView):
63
    model = models.Worker
64
    template_name = 'personnes/workers.html'
65

    
66
    def get_form(self):
67
        return forms.WorkerSearchForm(data=self.request.GET or None)
68

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

    
106
    def get_context_data(self, **kwargs):
107
        ctx = super(WorkerView, self).get_context_data(**kwargs)
108
        ctx['search_form'] = self.get_form()
109
        return ctx
110

    
111
homepage = cbv.TemplateView.as_view(template_name='personnes/index.html')
112

    
113

    
114
user_listing = super_user_only(AccessView.as_view())
115

    
116

    
117
class UserCreateView(cbv.ServiceFormMixin, cbv.CreateView):
118
    model=User
119
    success_url='../'
120
    form_class=forms.UserForm
121
    template_name='calebasse/simple-form.html'
122
    template_name_suffix='_new.html'
123

    
124

    
125
user_new = super_user_only(UserCreateView.as_view())
126
user_update = super_user_only(AccessUpdateView.as_view())
127
user_delete = super_user_only(cbv.DeleteView.as_view(model=User))
128

    
129

    
130
class WorkerUpdateView(cbv.MultiUpdateView):
131
    model = models.Worker
132
    forms_classes = {
133
            'id': forms.WorkerIdForm,
134
            'services': forms.WorkerServiceForm
135
    }
136
    template_name = 'personnes/worker_update.html'
137
    success_url = './'
138

    
139
    def get_context_data(self, **kwargs):
140
        ctx = super(WorkerUpdateView, self).get_context_data(**kwargs)
141
        _timetables = defaultdict(lambda: [])
142
        for timetable in self.object.timetable_set.order_by('start_time'):
143
            _timetables[timetable.weekday].append(timetable)
144
        timetable = []
145
        for weekday, name in models.TimeTable.WEEKDAYS:
146
            timetable.append({
147
                'weekday': name,
148
                'schedules': _timetables[weekday]})
149
        ctx['weekdays'] = list(models.TimeTable.WEEKDAYS)
150
        ctx['timetables'] = timetable
151
        ctx['holidays'] = models.Holiday.objects \
152
                            .for_worker(self.object) \
153
                            .future() \
154
                            .order_by('start_date')
155
        try:
156
            holiday = models.Holiday.objects \
157
                    .for_worker(self.object) \
158
                    .today()[0]
159
        except IndexError:
160
            holiday = None
161
        ctx['holiday'] = holiday
162
        return ctx
163

    
164
    def form_valid(self, form):
165
        messages.add_message(self.request, messages.INFO, u'Modification enregistrée avec succès.')
166
        return super(WorkerUpdateView, self).form_valid(form)
167

    
168

    
169
class WorkerScheduleUpdateView(cbv.UpdateView):
170
    model = models.Worker
171
    form_class = forms.TimetableFormSet
172
    success_url = '../'
173
    template_name = 'personnes/worker_schedule_update.html'
174

    
175
    def get_form_kwargs(self):
176
        kwargs = super(WorkerScheduleUpdateView, self).get_form_kwargs()
177
        kwargs['queryset'] = models.TimeTable.objects.filter(weekday=self.weekday).prefetch_related('services')
178
        kwargs['initial'] = [{ 'services': Service.objects.all().values_list('pk', flat=True) }] * 3
179
        return kwargs
180

    
181
    def get_context_data(self, **kwargs):
182
        ctx = super(WorkerScheduleUpdateView, self).get_context_data(**kwargs)
183
        ctx['weekday'] = models.TimeTable.WEEKDAYS[self.weekday][1]
184
        return ctx
185

    
186
    def dispatch(self, *args, **kwargs):
187
        self.weekday = int(kwargs['weekday'])
188
        if self.weekday > 6:
189
            raise Http404()
190
        return super(WorkerScheduleUpdateView, self).dispatch(*args, **kwargs)
191

    
192
    def form_valid(self, form):
193
        instances = form.save(commit=False)
194
        for instance in instances:
195
            instance.weekday = self.weekday
196
            instance.save()
197
        form.save_m2m()
198
        return HttpResponseRedirect('')
199

    
200

    
201
class WorkerHolidaysUpdateView(cbv.UpdateView):
202
    model = models.Worker
203
    form_class = forms.HolidayFormSet
204
    success_url = '../'
205
    template_name = 'personnes/worker_holidays_update.html'
206

    
207
    def get_success_url(self):
208
        return self.success_url
209

    
210

    
211
worker_listing = WorkerView.as_view()
212
worker_new = cbv.CreateView.as_view(model=models.Worker,
213
        template_name='calebasse/simple-form.html',
214
        success_url='../')
215
worker_update = WorkerUpdateView.as_view()
216
worker_schedule_update = WorkerScheduleUpdateView.as_view()
217
worker_holidays_update = WorkerHolidaysUpdateView.as_view()
218
worker_delete = cbv.DeleteView.as_view(model=models.Worker,
219
        template_name='calebasse/simple-form.html',
220
        success_url='../')
221

    
222

    
223
class HolidayView(cbv.TemplateView):
224
    months = 3
225
    template_name='personnes/holidays.html'
226

    
227
    def get_form(self):
228
        return forms.HolidaySearchForm(data=self.request.GET)
229

    
230
    def get_context_data(self, **kwargs):
231
        ctx = super(HolidayView, self).get_context_data(**kwargs)
232
        form = forms.HolidaySearchForm(data=self.request.GET)
233

    
234
        today = date.today()
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')
293
        ctx['search_form'] = form
294
        return ctx
295

    
296

    
297
holiday_listing = HolidayView.as_view()
298

    
299

    
300
class GroupHolidayUpdateView(cbv.FormView):
301
    form_class = forms.GroupHolidayFormSet
302
    template_name = 'personnes/group_holiday_update.html'
303
    success_url = '.'
304

    
305
    def get_form_kwargs(self):
306
        kwargs = super(GroupHolidayUpdateView, self).get_form_kwargs()
307
        qs = models.Holiday.objects.for_service(self.service)
308
        kwargs['queryset'] = qs
309
        kwargs['service'] = self.service
310
        return kwargs
311

    
312
    def form_valid(self, form):
313
        form.save()
314
        return super(GroupHolidayUpdateView, self).form_valid(form)
315

    
316

    
317
group_holiday_update = GroupHolidayUpdateView.as_view()
(8-8/8)