Project

General

Profile

Download (16.8 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
46f98e2c Serghei MIHAI
import logging
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
46f98e2c Serghei MIHAI
logger = logging.getLogger(__name__)

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)
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')
a78c2263 Jérôme Schneider
qs = qs.filter()
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:
672109c5 Serghei MIHAI
qs2 = models.Holiday.objects.today().filter(worker__isnull=False)
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):
3396c6cb Jérôme Schneider
model = User
success_url = '../'
form_class = forms.UserForm
template_name = 'calebasse/simple-form.html'
template_name_suffix = '_new.html'
34029347 Benjamin Dauvergne
a37b870f Jérôme Schneider
class UserDisactivateView(cbv.DeleteView):
7843b54f Jérôme Schneider
model = User
success_url = "../../"
template_name = 'calebasse/generic_confirm_delete.html'

a37b870f Jérôme Schneider
def delete(self, request, *args, **kwargs):
self.object = self.get_object()
self.object.is_active = False
self.object.save()
return HttpResponseRedirect(self.get_success_url())

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

5b88932c Mikaël Ates
class WorkerUpdateView(cbv.ServiceViewMixin, cbv.MultiUpdateView):
04022fee Benjamin Dauvergne
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) \
f1db8cdd Serghei MIHAI
.order_by('-start_date')
04022fee Benjamin Dauvergne
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

5b90c12e Serghei MIHAI
class HolidayView(cbv.TemplateView, cbv.ServiceViewMixin):
f69ae8a2 Benjamin Dauvergne
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: [])
b4e25157 Serghei MIHAI
service = Service.objects.get(slug = ctx['service'])
14a6b60b Serghei MIHAI
all_holidays = holidays.filter(services=service, worker__isnull=True)
84614733 Benjamin Dauvergne
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(
5b90c12e Serghei MIHAI
service = ctx['service'], pk=holiday.worker.pk))
84614733 Benjamin Dauvergne
else:
5b90c12e Serghei MIHAI
slug = ctx['service']
3ade90b9 Serghei MIHAI
return reverse('group-holidays', kwargs=dict(
84614733 Benjamin Dauvergne
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
3ade90b9 Serghei MIHAI
class GroupHolidaysList(cbv.ListView):
model = models.Holiday
template_name = 'personnes/group_holidays_list.html'
8379904e Serghei MIHAI
queryset = model.objects.future().filter(worker__isnull=True)
3ade90b9 Serghei MIHAI
5b90c12e Serghei MIHAI
def get_queryset(self, *args, **kwargs):
qs = super(GroupHolidaysList, self).get_queryset(*args, **kwargs)
return qs

3ade90b9 Serghei MIHAI
group_holidays = GroupHolidaysList.as_view()

8e003db0 Serghei MIHAI
class HolidayManagement(object):
"""
A class providing some methods for handling the absences management
"""
c029f285 Serghei MIHAI
model = models.Holiday
form_class = forms.HolidayForm

bc16b4d1 Serghei MIHAI
def get_initial(self):
worker = models.Worker.objects.get(pk=self.kwargs['worker_pk'])
return {'services': worker.services.all()}

c2953462 Serghei MIHAI
def form_valid(self, form):
holiday = form.save()
worker = models.Worker.objects.get(pk=self.kwargs['worker_pk'])
holiday.worker = worker
holiday.save()

8e003db0 Serghei MIHAI
def render_to_json(self, location, err = 0, **kwargs):
data = {'err': err, 'location': location}
response = json.dumps(data)
kwargs['content_type'] = 'application/json'
return HttpResponse(response, **kwargs)

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

9090fa1a Serghei MIHAI
class GroupHolidayManagement(HolidayManagement):
form_class = forms.GroupHolidayForm

b1c329fc Serghei MIHAI
def get_initial(self):
return {'services': Service.objects.all()}

9090fa1a Serghei MIHAI
def get_success_url(self):
slug = self.service.slug
return reverse('group-holidays', kwargs={'service': slug})

class CreateGroupHolidayView(GroupHolidayManagement, cbv.CreateView):

template_name_suffix = '_group_form'

def form_valid(self, form):
try:
form.save()
messages.success(self.request, u'Absence ajoutée avec succès')
46f98e2c Serghei MIHAI
except Exception, e:
logger.debug('Error on creating a group holiday: %s' % e)
9090fa1a Serghei MIHAI
messages.error(self.request, u'Une erreur est survenue lors de l\'ajout de l\'absence')
return self.render_to_json(self.get_success_url())

create_group_holiday = CreateGroupHolidayView.as_view()

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

6fd0e5b8 Serghei MIHAI
def get_initial(self):
return

9090fa1a Serghei MIHAI
def get_form_kwargs(self):
kwargs = super(EditGroupHolidayView, self).get_form_kwargs()
kwargs['instance'] = self.model.objects.get(pk = self.kwargs['pk'])
return kwargs

def form_valid(self, form):
try:
form.save()
messages.success(self.request, u'Données mises à jour avec succès')
46f98e2c Serghei MIHAI
except Exception, e:
logger.debug('Error on updating a group holiday: %s' % e)
9090fa1a Serghei MIHAI
messages.error(self.request, u'Une erreur est survenue lors de la mise à jour de l\'absence')
return self.render_to_json(self.get_success_url())

c2953462 Serghei MIHAI
9090fa1a Serghei MIHAI
edit_group_holiday = EditGroupHolidayView.as_view()

8e003db0 Serghei MIHAI
class HolidayCreateView(HolidayManagement, cbv.CreateView):

def form_valid(self, form):
9090fa1a Serghei MIHAI
try:
c2953462 Serghei MIHAI
super(HolidayCreateView, self).form_valid(form)
9090fa1a Serghei MIHAI
messages.success(self.request, u'Absence ajoutée avec succès')
46f98e2c Serghei MIHAI
except Exception, e:
logger.debug('Error on creating a holiday: %s' % e)
c2953462 Serghei MIHAI
messages.error(self.request, u'Une erreur est survenue lors de l\'ajout de l\'absence')
8e003db0 Serghei MIHAI
return self.render_to_json(self.get_success_url())
cb647183 Serghei MIHAI
c029f285 Serghei MIHAI
create_holiday = HolidayCreateView.as_view()

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

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

8e003db0 Serghei MIHAI
def form_valid(self, form):
try:
c2953462 Serghei MIHAI
super(EditHolidayView, self).form_valid(form)
8e003db0 Serghei MIHAI
messages.success(self.request, u'Données mises à jour avec succès')
46f98e2c Serghei MIHAI
except Exception, e:
logger.debug('Error on updating a holiday: %s' % e)
8e003db0 Serghei MIHAI
messages.error(self.request, u'Une erreur est survenue lors de la mise à jour de l\'absence')
return self.render_to_json(self.get_success_url())
c029f285 Serghei MIHAI
edit_holiday = EditHolidayView.as_view()

8e003db0 Serghei MIHAI
class DeleteHolidayView(HolidayManagement, cbv.DeleteView):
c029f285 Serghei MIHAI
template_name = 'personnes/holiday_update_form.html'

8e003db0 Serghei MIHAI
def delete(self, request, *args, **kwargs):
c029f285 Serghei MIHAI
try:
8e003db0 Serghei MIHAI
super(DeleteHolidayView, self).delete(request, *args, **kwargs)
messages.success(request, u'Absence supprimée avec succès')
46f98e2c Serghei MIHAI
except Exception, e:
logger.debug('Error on deleting a holiday: %s' % e)
8e003db0 Serghei MIHAI
messages.error(request, u'Une erreur est survenue lors de la suppression de l\'absence')

return self.render_to_json(self.get_success_url())
c029f285 Serghei MIHAI
delete_holiday = DeleteHolidayView.as_view()
7843b54f Jérôme Schneider
9090fa1a Serghei MIHAI
class DeleteGroupHolidayView(GroupHolidayManagement, DeleteHolidayView):
template_name = 'personnes/group_holiday_update_form.html'

delete_group_holiday = DeleteGroupHolidayView.as_view()