Project

General

Profile

Download (14.4 KB) Statistics
| Branch: | Tag: | Revision:
c2f3ff62 Mikaël Ates
# -*- coding: utf-8 -*-
04022fee Benjamin Dauvergne
from collections import defaultdict
from datetime import date
84614733 Benjamin Dauvergne
from interval import IntervalSet
04022fee Benjamin Dauvergne
f69ae8a2 Benjamin Dauvergne
from dateutil.relativedelta import relativedelta

c029f285 Serghei MIHAI
from django.http import HttpResponseRedirect, Http404, HttpResponse
32486db7 Benjamin Dauvergne
from django.db.models import Q
from django.contrib.auth.models import User
c2f3ff62 Mikaël Ates
from django.contrib import messages
84614733 Benjamin Dauvergne
from django.core.urlresolvers import reverse
e6e5249f Benjamin Dauvergne
from django.utils.dateformat import format as date_format
c029f285 Serghei MIHAI
from django.views.decorators.csrf import csrf_exempt
32486db7 Benjamin Dauvergne
04022fee Benjamin Dauvergne
from calebasse import cbv, models as cb_models
f8f903c3 Benjamin Dauvergne
from calebasse.ressources.models import Service
32486db7 Benjamin Dauvergne
c029f285 Serghei MIHAI
import json

5c9faa2c Mikaël Ates
from calebasse.decorators import super_user_only

32486db7 Benjamin Dauvergne
import forms
957da834 Benjamin Dauvergne
import models
32486db7 Benjamin Dauvergne

FILTER_CRITERIA = (
'username',
'first_name',
'last_name',
'email',
'userworker__worker__display_name',
)

957da834 Benjamin Dauvergne
class AccessView(cbv.ListView):
32486db7 Benjamin Dauvergne
model = User
template_name = 'personnes/acces.html'

def get_queryset(self):
qs = super(AccessView, self).get_queryset()
identifier = self.request.GET.get('identifier')
if identifier:
for part in identifier.split():
filters = []
for criteria in FILTER_CRITERIA:
q = Q(**{criteria+'__contains': part})
filters.append(q)
qs = qs.filter(reduce(Q.__or__, filters))
qs = qs.prefetch_related('userworker__worker')
return qs

548f19f9 Benjamin Dauvergne
def get_context_data(self, **kwargs):
ctx = super(AccessView, self).get_context_data(**kwargs)
ctx['active_list'] = ctx['object_list'].filter(is_active=True)
ctx['inactive_list'] = ctx['object_list'].filter(is_active=False)
return ctx

957da834 Benjamin Dauvergne
class AccessUpdateView(cbv.ServiceFormMixin, cbv.UpdateView):
32486db7 Benjamin Dauvergne
model = User
template_name = 'personnes/acces-update.html'
form_class = forms.UserForm
957da834 Benjamin Dauvergne
success_url = '../'


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

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

def get_queryset(self):
qs = super(WorkerView, self).get_queryset()
04022fee Benjamin Dauvergne
qs = qs.select_related()
qs = qs.prefetch_related('services')
957da834 Benjamin Dauvergne
form = self.get_form()
if form.is_valid():
cleaned_data = form.cleaned_data
last_name = cleaned_data.get('last_name')
first_name = cleaned_data.get('first_name')
profession = cleaned_data.get('profession')
intervene_status = cleaned_data.get('intervene_status')
if last_name:
qs = qs.filter(last_name__icontains=last_name)
if first_name:
qs = qs.filter(first_name__icontains=first_name)
if profession:
qs = qs.filter(type=profession)
if intervene_status and 0 < len(intervene_status) < 2:
c5dd5b8a Mikaël Ates
qs = qs.filter(enabled=intervene_status[0] == 'a')
937f1ad2 Frédéric Péters
else:
# only display current workers by default
qs = qs.filter(enabled=True)
04022fee Benjamin Dauvergne
today = date.today()
a5bdc8ec Benjamin Dauvergne
if models.Holiday.objects.for_service(self.service).future() \
04022fee Benjamin Dauvergne
.filter(start_date__lte=today).exists():
for worker in qs:
worker.holiday = True
else:
a5bdc8ec Benjamin Dauvergne
qs2 = models.Holiday.objects.today()
04022fee Benjamin Dauvergne
worker_dict = dict(((w.id, w) for w in qs))
for worker in qs:
worker.holiday = False
for holiday in qs2:
if holiday.worker.id in worker_dict:
worker_dict[holiday.worker.id].holiday = True
957da834 Benjamin Dauvergne
return qs

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

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


5c9faa2c Mikaël Ates
user_listing = super_user_only(AccessView.as_view())
34029347 Benjamin Dauvergne

class UserCreateView(cbv.ServiceFormMixin, cbv.CreateView):
model=User
success_url='../'
form_class=forms.UserForm
template_name='calebasse/simple-form.html'
template_name_suffix='_new.html'

7843b54f Jérôme Schneider
class UserDeleteView(cbv.DeleteView):
model = User
success_url = "../../"
template_name = 'calebasse/generic_confirm_delete.html'

34029347 Benjamin Dauvergne
5c9faa2c Mikaël Ates
user_new = super_user_only(UserCreateView.as_view())
user_update = super_user_only(AccessUpdateView.as_view())
7843b54f Jérôme Schneider
user_delete = super_user_only(UserDeleteView.as_view())
957da834 Benjamin Dauvergne

04022fee Benjamin Dauvergne
class WorkerUpdateView(cbv.MultiUpdateView):
model = models.Worker
forms_classes = {
c5dd5b8a Mikaël Ates
'id': forms.WorkerIdForm,
04022fee Benjamin Dauvergne
'services': forms.WorkerServiceForm
}
4696b827 Benjamin Dauvergne
template_name = 'personnes/worker_update.html'
04022fee Benjamin Dauvergne
success_url = './'

def get_context_data(self, **kwargs):
ctx = super(WorkerUpdateView, self).get_context_data(**kwargs)
_timetables = defaultdict(lambda: [])
for timetable in self.object.timetable_set.order_by('start_time'):
_timetables[timetable.weekday].append(timetable)
timetable = []
f8f903c3 Benjamin Dauvergne
for weekday, name in models.TimeTable.WEEKDAYS:
04022fee Benjamin Dauvergne
timetable.append({
f8f903c3 Benjamin Dauvergne
'weekday': name,
04022fee Benjamin Dauvergne
'schedules': _timetables[weekday]})
f8f903c3 Benjamin Dauvergne
ctx['weekdays'] = list(models.TimeTable.WEEKDAYS)
04022fee Benjamin Dauvergne
ctx['timetables'] = timetable
ctx['holidays'] = models.Holiday.objects \
.for_worker(self.object) \
a5bdc8ec Benjamin Dauvergne
.future() \
04022fee Benjamin Dauvergne
.order_by('start_date')
try:
a5bdc8ec Benjamin Dauvergne
holiday = models.Holiday.objects \
.for_worker(self.object) \
.today()[0]
04022fee Benjamin Dauvergne
except IndexError:
holiday = None
ctx['holiday'] = holiday
return ctx

c2f3ff62 Mikaël Ates
def form_valid(self, form):
messages.add_message(self.request, messages.INFO, u'Modification enregistrée avec succès.')
return super(WorkerUpdateView, self).form_valid(form)


04022fee Benjamin Dauvergne
class WorkerScheduleUpdateView(cbv.UpdateView):
model = models.Worker
form_class = forms.TimetableFormSet
success_url = '../'
template_name = 'personnes/worker_schedule_update.html'

def get_form_kwargs(self):
kwargs = super(WorkerScheduleUpdateView, self).get_form_kwargs()
f8f903c3 Benjamin Dauvergne
kwargs['queryset'] = models.TimeTable.objects.filter(weekday=self.weekday).prefetch_related('services')
kwargs['initial'] = [{ 'services': Service.objects.all().values_list('pk', flat=True) }] * 3
04022fee Benjamin Dauvergne
return kwargs

def get_context_data(self, **kwargs):
ctx = super(WorkerScheduleUpdateView, self).get_context_data(**kwargs)
f8f903c3 Benjamin Dauvergne
ctx['weekday'] = models.TimeTable.WEEKDAYS[self.weekday][1]
04022fee Benjamin Dauvergne
return ctx

def dispatch(self, *args, **kwargs):
f8f903c3 Benjamin Dauvergne
self.weekday = int(kwargs['weekday'])
if self.weekday > 6:
04022fee Benjamin Dauvergne
raise Http404()
return super(WorkerScheduleUpdateView, self).dispatch(*args, **kwargs)

def form_valid(self, form):
instances = form.save(commit=False)
for instance in instances:
f8f903c3 Benjamin Dauvergne
instance.weekday = self.weekday
04022fee Benjamin Dauvergne
instance.save()
52d3b722 Benjamin Dauvergne
form.save_m2m()
04022fee Benjamin Dauvergne
return HttpResponseRedirect('')


class WorkerHolidaysUpdateView(cbv.UpdateView):
model = models.Worker
form_class = forms.HolidayFormSet
success_url = '../'
template_name = 'personnes/worker_holidays_update.html'

f69ae8a2 Benjamin Dauvergne
def get_success_url(self):
return self.success_url


957da834 Benjamin Dauvergne
worker_listing = WorkerView.as_view()
worker_new = cbv.CreateView.as_view(model=models.Worker,
template_name='calebasse/simple-form.html',
success_url='../')
04022fee Benjamin Dauvergne
worker_update = WorkerUpdateView.as_view()
worker_schedule_update = WorkerScheduleUpdateView.as_view()
worker_holidays_update = WorkerHolidaysUpdateView.as_view()
957da834 Benjamin Dauvergne
worker_delete = cbv.DeleteView.as_view(model=models.Worker,
template_name='calebasse/simple-form.html',
cfbe06e8 Benjamin Dauvergne
success_url='../../')
f69ae8a2 Benjamin Dauvergne

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

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

def get_context_data(self, **kwargs):
ctx = super(HolidayView, self).get_context_data(**kwargs)
84614733 Benjamin Dauvergne
form = forms.HolidaySearchForm(data=self.request.GET)

f69ae8a2 Benjamin Dauvergne
today = date.today()
84614733 Benjamin Dauvergne
filter_start_date = today
filter_end_date = date.today() + relativedelta(months=self.months)

if form.is_valid():
if form.cleaned_data.get('start_date'):
filter_start_date = form.cleaned_data.get('start_date')
if form.cleaned_data.get('end_date'):
filter_end_date = form.cleaned_data.get('end_date')

workers = models.Worker.objects.filter(enabled=True)
holidays = models.Holiday.objects \
.filter(end_date__gte=filter_start_date,
start_date__lte=filter_end_date) \
.select_related('worker', 'service')
holiday_by_worker = defaultdict(lambda: [])
all_holidays = holidays.filter(worker__isnull=True)

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

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

def holiday_url(holiday):
if holiday.worker:
e840a72b Serghei MIHAI
return reverse('worker_update', kwargs=dict(
service=self.service.slug, pk=holiday.worker.pk))
84614733 Benjamin Dauvergne
else:
slug = holiday.service.slug if holiday.service else self.service.slug
return reverse('group-holiday-update', kwargs=dict(
service=slug))

currents = []
futures = defaultdict(lambda: [])
for worker, holidays in holiday_by_worker.iteritems():
for holiday in holidays:
url = holiday_url(holiday)
holiday_tpl = dict(worker=worker.display_name, holiday=holiday, url=url)
if holiday.start_date <= today <= holiday.end_date:
currents.append(holiday_tpl)
start_date = max(holiday.start_date, filter_start_date)
e6e5249f Benjamin Dauvergne
month_name = date_format(start_date, 'F')
84614733 Benjamin Dauvergne
key = start_date.year, start_date.month, month_name
futures[key].append(holiday_tpl)

future_holidays = []
for key in sorted(futures.keys()):
future_holidays.append(dict(
month=key[2],
holidays=futures[key]))
future_holidays2 = []
for i in range(0, len(future_holidays), 2):
future_holidays2.append(future_holidays[i:i+2])

ctx['end_date'] = filter_end_date
ctx['current_holidays'] = currents
ctx['future_holidays'] = future_holidays2
ctx['group_holidays'] = all_holidays.order_by('-start_date')
f69ae8a2 Benjamin Dauvergne
ctx['search_form'] = form
return ctx


holiday_listing = HolidayView.as_view()


9edb5f60 Mikaël Ates
class GroupHolidayUpdateView(cbv.FormView):
form_class = forms.GroupHolidayFormSet
template_name = 'personnes/group_holiday_update.html'
d964fe2f Benjamin Dauvergne
success_url = '.'
f69ae8a2 Benjamin Dauvergne
def get_form_kwargs(self):
9edb5f60 Mikaël Ates
kwargs = super(GroupHolidayUpdateView, self).get_form_kwargs()
f69ae8a2 Benjamin Dauvergne
qs = models.Holiday.objects.for_service(self.service)
kwargs['queryset'] = qs
57212b18 Benjamin Dauvergne
kwargs['service'] = self.service
f69ae8a2 Benjamin Dauvergne
return kwargs

d964fe2f Benjamin Dauvergne
def form_valid(self, form):
form.save()
9edb5f60 Mikaël Ates
return super(GroupHolidayUpdateView, self).form_valid(form)
d964fe2f Benjamin Dauvergne
f69ae8a2 Benjamin Dauvergne
9edb5f60 Mikaël Ates
group_holiday_update = GroupHolidayUpdateView.as_view()
7843b54f Jérôme Schneider
c029f285 Serghei MIHAI
class HolidayManagement(object):
def render_to_json(self, id, context, err = 0, **kwargs):
data = {'err': err, 'id': id, 'content': context}
response = json.dumps(data)
kwargs['content_type'] = 'application/json'
return HttpResponse(response, **kwargs)

def form_valid(self, form):
form.save()
if self.request.is_ajax:
instance = form.instance
status = ''
if instance.is_current() and instance.service:
status = u'congés annuels, en cours'
elif instance.is_current():
status = u'en cours'
elif instance.service:
status = u'congés annuels'

context = (('period', '%s' % instance),
('status', status),
('type', '%s' % instance.holiday_type),
('comment', instance.comment)
)
return self.render_to_json(instance.id, context)
return super(HolidayManagement, self).form_valid(form)

class HolidayCreateView(HolidayManagement, cbv.ServiceFormMixin,
cbv.CreateView):
model = models.Holiday
form_class = forms.HolidayForm

def get_form_kwargs(self, *args, **kwargs):
kwargs = super(HolidayCreateView, self).get_form_kwargs(*args, **kwargs)
worker = models.Worker.objects.get(pk = self.kwargs['worker_pk'])
kwargs['initial'] = {'service': self.service, 'worker': worker}
del kwargs['service']
return kwargs

create_holiday = HolidayCreateView.as_view()

class EditHolidayView(HolidayManagement, cbv.FormView):
template_name = 'personnes/holiday_update_form.html'
form_class = forms.HolidayForm
model = models.Holiday

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

def post(self, request, *args, **kwargs):
6ba250f7 Serghei MIHAI
service = models.Service.objects.get(name = kwargs['service'].upper())
worker = models.Worker.objects.get(pk = kwargs['worker_pk'])
obj = self.model.objects.for_worker(worker).get(pk = kwargs['pk'])
c029f285 Serghei MIHAI
form = self.form_class(request.POST, instance = obj)
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)


edit_holiday = EditHolidayView.as_view()

class DeleteHolidayView(cbv.DeleteView):
model = models.Holiday
template_name = 'personnes/holiday_update_form.html'

def post(self, request, *args, **kwargs):
response = HttpResponse('', content_type = 'application/json')
context = {'err': 0, }
try:
worker = models.Worker.objects.get(pk = self.kwargs['worker_pk'])
self.model.objects.for_worker(worker).get(pk = self.kwargs['pk']).delete()
except Exception, e:
context['error': e.message]
response.content = json.dumps(context)
return response

delete_holiday = DeleteHolidayView.as_view()
7843b54f Jérôme Schneider
#user_delete = UserCreateView.as_view()