Project

General

Profile

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

calebasse / calebasse / personnes / views.py @ a5bdc8ec

1
from collections import defaultdict
2
from datetime import date
3

    
4
from dateutil.relativedelta import relativedelta
5

    
6
from django.http import HttpResponseRedirect, Http404
7
from django.db.models import Q
8
from django.contrib.auth.models import User
9

    
10
from calebasse import cbv, models as cb_models
11

    
12
import forms
13
import models
14

    
15

    
16
FILTER_CRITERIA = (
17
        'username',
18
        'first_name',
19
        'last_name',
20
        'email',
21
        'userworker__worker__display_name',
22
)
23

    
24

    
25
class AccessView(cbv.ListView):
26
    model = User
27
    template_name = 'personnes/acces.html'
28

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

    
42
    def get_context_data(self, **kwargs):
43
        ctx = super(AccessView, self).get_context_data(**kwargs)
44
        ctx['active_list'] = ctx['object_list'].filter(is_active=True)
45
        ctx['inactive_list'] = ctx['object_list'].filter(is_active=False)
46
        return ctx
47

    
48

    
49
class AccessUpdateView(cbv.ServiceFormMixin, cbv.UpdateView):
50
    model = User
51
    template_name = 'personnes/acces-update.html'
52
    form_class = forms.UserForm
53
    success_url = '../'
54

    
55

    
56
class WorkerView(cbv.ListView):
57
    model = models.Worker
58
    template_name = 'personnes/workers.html'
59

    
60
    def get_form(self):
61
        return forms.WorkerSearchForm(data=self.request.GET or None)
62

    
63
    def get_queryset(self):
64
        qs = super(WorkerView, self).get_queryset()
65
        qs = qs.select_related()
66
        qs = qs.prefetch_related('services')
67
        form = self.get_form()
68
        if form.is_valid():
69
            cleaned_data = form.cleaned_data
70
            last_name = cleaned_data.get('last_name')
71
            first_name = cleaned_data.get('first_name')
72
            profession = cleaned_data.get('profession')
73
            intervene_status = cleaned_data.get('intervene_status')
74
            if last_name:
75
                qs = qs.filter(last_name__icontains=last_name)
76
            if first_name:
77
                qs = qs.filter(first_name__icontains=first_name)
78
            if profession:
79
                qs = qs.filter(type=profession)
80
            if intervene_status and 0 < len(intervene_status) < 2:
81
                qs = qs.filter(type__intervene=intervene_status[0] == 'a')
82
        today = date.today()
83
        if models.Holiday.objects.for_service(self.service).future() \
84
                .filter(start_date__lte=today).exists():
85
            for worker in qs:
86
                worker.holiday = True
87
        else:
88
            qs2 = models.Holiday.objects.today()
89
            worker_dict = dict(((w.id, w) for w in qs))
90
            for worker in qs:
91
                worker.holiday = False
92
            for holiday in qs2:
93
                if holiday.worker.id in worker_dict:
94
                    worker_dict[holiday.worker.id].holiday = True
95
        return qs
96

    
97
    def get_context_data(self, **kwargs):
98
        ctx = super(WorkerView, self).get_context_data(**kwargs)
99
        ctx['search_form'] = self.get_form()
100
        return ctx
101

    
102

    
103
homepage = cbv.TemplateView.as_view(template_name='personnes/index.html')
104

    
105

    
106
user_listing = AccessView.as_view()
107
user_new = cbv.CreateView.as_view(model=User,
108
        success_url='../',
109
        form_class=forms.UserForm,
110
        template_name='calebasse/simple-form.html',
111
        template_name_suffix='_new.html')
112
user_update = AccessUpdateView.as_view()
113
user_delete = cbv.DeleteView.as_view(model=User)
114

    
115

    
116
class WorkerUpdateView(cbv.MultiUpdateView):
117
    model = models.Worker
118
    forms_classes = {
119
            'id': forms.WorkerIdForm, 
120
            'services': forms.WorkerServiceForm
121
    }
122
    template_name = 'personnes/worker_update.html'
123
    success_url = './'
124

    
125
    def get_context_data(self, **kwargs):
126
        ctx = super(WorkerUpdateView, self).get_context_data(**kwargs)
127
        _timetables = defaultdict(lambda: [])
128
        for timetable in self.object.timetable_set.order_by('start_time'):
129
            _timetables[timetable.weekday].append(timetable)
130
        timetable = []
131
        for weekday in cb_models.WeekdayField.WEEKDAYS:
132
            timetable.append({
133
                'weekday': weekday,
134
                'schedules': _timetables[weekday]})
135
        ctx['weekdays'] = cb_models.WeekdayField.WEEKDAYS
136
        ctx['timetables'] = timetable
137
        ctx['holidays'] = models.Holiday.objects \
138
                            .for_worker(self.object) \
139
                            .future() \
140
                            .order_by('start_date')
141
        try:
142
            holiday = models.Holiday.objects \
143
                    .for_worker(self.object) \
144
                    .today()[0]
145
        except IndexError:
146
            holiday = None
147
        ctx['holiday'] = holiday
148
        return ctx
149

    
150
class WorkerScheduleUpdateView(cbv.UpdateView):
151
    model = models.Worker
152
    form_class = forms.TimetableFormSet
153
    success_url = '../'
154
    template_name = 'personnes/worker_schedule_update.html'
155

    
156
    def get_form_kwargs(self):
157
        kwargs = super(WorkerScheduleUpdateView, self).get_form_kwargs()
158
        kwargs['weekday'] = self.kwargs['weekday']
159
        return kwargs
160

    
161
    def get_context_data(self, **kwargs):
162
        ctx = super(WorkerScheduleUpdateView, self).get_context_data(**kwargs)
163
        ctx['weekday'] = self.kwargs['weekday']
164
        return ctx
165

    
166
    def dispatch(self, *args, **kwargs):
167
        if kwargs['weekday'] not in cb_models.WeekdayField.WEEKDAYS:
168
            raise Http404()
169
        return super(WorkerScheduleUpdateView, self).dispatch(*args, **kwargs)
170

    
171
    def form_valid(self, form):
172
        instances = form.save(commit=False)
173
        for instance in instances:
174
            instance.weekday = self.kwargs['weekday']
175
            instance.service = self.service
176
            instance.save()
177
        return HttpResponseRedirect('')
178

    
179

    
180
class WorkerHolidaysUpdateView(cbv.UpdateView):
181
    model = models.Worker
182
    form_class = forms.HolidayFormSet
183
    success_url = '../'
184
    template_name = 'personnes/worker_holidays_update.html'
185

    
186
    def get_success_url(self):
187
        return self.success_url
188

    
189

    
190
worker_listing = WorkerView.as_view()
191
worker_new = cbv.CreateView.as_view(model=models.Worker,
192
        template_name='calebasse/simple-form.html',
193
        success_url='../')
194
worker_update = WorkerUpdateView.as_view()
195
worker_schedule_update = WorkerScheduleUpdateView.as_view()
196
worker_holidays_update = WorkerHolidaysUpdateView.as_view()
197
worker_delete = cbv.DeleteView.as_view(model=models.Worker,
198
        template_name='calebasse/simple-form.html',
199
        success_url='../')
200

    
201

    
202
class HolidayView(cbv.TemplateView):
203
    months = 3
204
    template_name='personnes/holidays.html'
205

    
206
    def get_form(self):
207
        return forms.HolidaySearchForm(data=self.request.GET)
208

    
209
    def get_context_data(self, **kwargs):
210
        ctx = super(HolidayView, self).get_context_data(**kwargs)
211
        end_date = date.today() + relativedelta(months=self.months)
212
        qs = models.Holiday.objects.for_service_workers(self.service).future()
213
        today = date.today()
214
        future_qs = qs.for_period(today, end_date)
215
        annual_qs = models.Holiday.objects.for_service(self.service)
216
        current_qs = qs.today()
217
        form = self.get_form()
218
        if form.is_valid() and form.cleaned_data.get('start_date'):
219
            cleaned_data = form.cleaned_data
220
            start_date = cleaned_data['start_date']
221
            end_date = cleaned_data['end_date']
222
            future_qs = models.Holiday.objects \
223
                    .for_period(start_date, end_date) \
224
                    .for_service_workers(self.service)
225
            annual_qs = annual_qs.for_period(start_date, end_date)
226
            current_qs = []
227
        ctx['current_holidays'] = current_qs
228
        future_holidays = defaultdict(lambda:[])
229
        for holiday in future_qs:
230
            key = (holiday.start_date.year, holiday.start_date.month, holiday.start_date.strftime('%B'))
231
            future_holidays[key].append(holiday)
232
        ctx['future_holidays'] = [ { 
233
            'date': date(day=1, month=key[1], year=key[0]),
234
            'holidays': future_holidays[key] 
235
          } for key in sorted(future_holidays.keys()) ]
236
        ctx['annual_holidays'] = annual_qs
237
        ctx['search_form'] = form
238
        return ctx
239

    
240

    
241
holiday_listing = HolidayView.as_view()
242

    
243

    
244
class YearlyHolidayUpdateView(cbv.FormView):
245
    form_class = forms.YearlyHolidayFormSet
246
    template_name = 'personnes/yearly_holiday_update.html'
247

    
248
    def get_success_url(self):
249
        return '../'
250

    
251
    def get_form_kwargs(self):
252
        kwargs = super(YearlyHolidayUpdateView, self).get_form_kwargs()
253
        qs = models.Holiday.objects.for_service(self.service)
254
        kwargs['queryset'] = qs
255
        kwargs['service'] = self.service
256
        return kwargs
257

    
258

    
259
yearly_holiday_update = YearlyHolidayUpdateView.as_view()
(7-7/7)