Project

General

Profile

Download (9.17 KB) Statistics
| Branch: | Tag: | Revision:
957da834 Benjamin Dauvergne
# -*- coding: utf-8 -*-
32486db7 Benjamin Dauvergne
from django import forms
f69ae8a2 Benjamin Dauvergne
from django.forms.models import (inlineformset_factory, modelformset_factory,
57212b18 Benjamin Dauvergne
BaseInlineFormSet, BaseModelFormSet)
32486db7 Benjamin Dauvergne
from django.utils.translation import gettext_lazy as _
1f724c01 Benjamin Dauvergne
from django.contrib.auth.models import User

6fd524bc Mikaël Ates
from calebasse.ressources.models import WorkerType, Service, HolidayType
957da834 Benjamin Dauvergne
6c1bf4ad Jérôme Schneider
from models import Worker, UserWorker, TimeTable, Holiday, ExternalTherapist, ExternalWorker
1f724c01 Benjamin Dauvergne
957da834 Benjamin Dauvergne
32486db7 Benjamin Dauvergne
class UserForm(forms.ModelForm):
8ad901c7 Benjamin Dauvergne
error_messages = {
'duplicate_username': _("A user with that username already exists."),
'password_mismatch': _("The two password fields didn't match."),
}

32486db7 Benjamin Dauvergne
worker = forms.ModelChoiceField(label=_('Personnel'),
c0f82cd1 Frédéric Péters
queryset=Worker.objects.filter(enabled=True), empty_label=_('None'),
32486db7 Benjamin Dauvergne
required=False)
password1 = forms.CharField(label=_("Password"),
b478e27e Benjamin Dauvergne
widget=forms.PasswordInput, required=False)
32486db7 Benjamin Dauvergne
password2 = forms.CharField(label=_("Password confirmation"),
widget=forms.PasswordInput,
b478e27e Benjamin Dauvergne
help_text=_("Enter the same password as above, for verification."),
required=False)
1f724c01 Benjamin Dauvergne
32486db7 Benjamin Dauvergne
def __init__(self, service=None, *args, **kwargs):
self.service = service
super(UserForm, self).__init__(*args, **kwargs)
self.fields['worker'].queryset = Worker.objects.for_service(service)
self.fields['username'].label = _('Identifiant')
if self.instance:
try:
worker = self.instance.userworker.worker
self.fields['worker'].initial = worker.pk
except UserWorker.DoesNotExist:
pass
1f724c01 Benjamin Dauvergne
32486db7 Benjamin Dauvergne
def clean_username(self):
# Since User.username is unique, this check is redundant,
# but it sets a nicer error message than the ORM. See #13147.
username = self.cleaned_data["username"]
1b19a9e4 Benjamin Dauvergne
if self.instance is None:
try:
User.objects.get(username=username)
raise forms.ValidationError(self.error_messages['duplicate_username'])
except User.DoesNotExist:
pass
return username
1f724c01 Benjamin Dauvergne
32486db7 Benjamin Dauvergne
def clean_password2(self):
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise forms.ValidationError(
self.error_messages['password_mismatch'])
return password2
1f724c01 Benjamin Dauvergne
class Meta:
32486db7 Benjamin Dauvergne
model = User
fa494312 Mikaël Ates
fields = ('username', 'email', 'password1', 'password2', 'worker', 'groups')
widgets = {
'groups': forms.CheckboxSelectMultiple,
}
32486db7 Benjamin Dauvergne
def save(self, commit=True):
instance = super(UserForm, self).save(commit=False)
if self.cleaned_data['password1']:
instance.set_password(self.cleaned_data['password1'])
worker = self.cleaned_data.get('worker')
if worker is not None:
65141e8b Benjamin Dauvergne
instance.first_name = worker.first_name
instance.last_name = worker.last_name
b478e27e Benjamin Dauvergne
def save_m2m():
65141e8b Benjamin Dauvergne
qs = UserWorker.objects.filter(user=instance)
if qs.exists():
qs.update(worker=worker)
b478e27e Benjamin Dauvergne
else:
65141e8b Benjamin Dauvergne
UserWorker.objects.create(user=instance, worker=worker)
32486db7 Benjamin Dauvergne
self.save_m2m = save_m2m
fa494312 Mikaël Ates
if instance.pk:
instance.groups = self.cleaned_data['groups']
32486db7 Benjamin Dauvergne
if commit:
instance.save()
b478e27e Benjamin Dauvergne
self.save_m2m()
32486db7 Benjamin Dauvergne
return instance
e3c5afd2 Jérôme Schneider
957da834 Benjamin Dauvergne
class WorkerSearchForm(forms.Form):
last_name = forms.CharField(label=u'Nom', required=False)
first_name = forms.CharField(label=u'Prénom', required=False)
profession = forms.ModelChoiceField(label=u'Profession',
queryset=WorkerType.objects.all(), required=False)

INTERVENE_STATUS_CHOICES = {
951c324b Mikaël Ates
'a': u'Actifs',
957da834 Benjamin Dauvergne
}

intervene_status = forms.MultipleChoiceField(
choices=INTERVENE_STATUS_CHOICES.iteritems(),
widget=forms.CheckboxSelectMultiple,
initial=INTERVENE_STATUS_CHOICES.keys(),
required=False)
04022fee Benjamin Dauvergne
class WorkerIdForm(forms.ModelForm):
class Meta:
model = Worker
97bee351 Jérôme Schneider
fields = ('last_name', 'first_name', 'initials', 'gender', 'type', 'enabled')
widgets = {
'initials': forms.TextInput(attrs={'size': 6}),
}
04022fee Benjamin Dauvergne
class WorkerServiceForm(forms.ModelForm):
class Meta:
model = Worker
fields = ('services',)
widgets = {
'services': forms.CheckboxSelectMultiple,
}

eaf1d7af Mikaël Ates
PERIOD_LIST_TO_FIELDS = [(1, None, None),
(2, None, None),
(3, None, None),
(4, None, None),
(5, None, None),
(None, 0, None),
(None, 1, None),
(None, 2, None),
(None, 3, None),
(None, 4, None),
(None, None, 0),
(None, None, 1)
]
f69ae8a2 Benjamin Dauvergne
52d3b722 Benjamin Dauvergne
class BaseTimeTableForm(forms.ModelForm):
class Meta:
model = TimeTable
widgets = {
'services': forms.CheckboxSelectMultiple,
eaf1d7af Mikaël Ates
'week_period': forms.HiddenInput(),
'week_parity': forms.HiddenInput(),
'week_rank': forms.HiddenInput(),
52d3b722 Benjamin Dauvergne
}

eaf1d7af Mikaël Ates
def clean(self):
cleaned_data = super(BaseTimeTableForm, self).clean()
msg = None
if not cleaned_data.get('periodicity'):
msg = u"Périodicité manquante."
else:
try:
periodicity = int(cleaned_data.get('periodicity'))
if periodicity:
if periodicity < 1 or periodicity > 12:
msg = u"Périodicité inconnue."
else:
cleaned_data['week_period'], \
bc7fa41d Mikaël Ates
cleaned_data['week_rank'], \
cleaned_data['week_parity'] = PERIOD_LIST_TO_FIELDS[periodicity - 1]
eaf1d7af Mikaël Ates
except:
msg = u"Périodicité invalide."
if msg:
self._errors["periodicity"] = self.error_class([msg])
return cleaned_data

04022fee Benjamin Dauvergne
TimetableFormSet = inlineformset_factory(Worker, TimeTable,
52d3b722 Benjamin Dauvergne
form=BaseTimeTableForm,
f8f903c3 Benjamin Dauvergne
fields=('start_time', 'end_time', 'start_date', 'end_date',
eaf1d7af Mikaël Ates
'services', 'periodicity', 'week_period', 'week_parity', 'week_rank'))
04022fee Benjamin Dauvergne
a39c35ec Benjamin Dauvergne
class BaseHolidayForm(forms.ModelForm):
6fd524bc Mikaël Ates
def __init__(self, *args, **kwargs):
super(BaseHolidayForm, self).__init__(*args, **kwargs)
self.fields['holiday_type'].queryset = \
HolidayType.objects.filter(for_group=False)
a39c35ec Benjamin Dauvergne
class Meta:
widgets = {
'comment': forms.Textarea(attrs={'rows': 3}),
}

c029f285 Serghei MIHAI
class HolidayForm(forms.ModelForm):

2b777f8f Serghei MIHAI
def __init__(self, *args, **kwargs):
super(HolidayForm, self).__init__(*args, **kwargs)
cb647183 Serghei MIHAI
self.fields['holiday_type'].queryset = \
HolidayType.objects.filter(for_group=False)
2b777f8f Serghei MIHAI
c029f285 Serghei MIHAI
class Meta:
model = Holiday
widgets = {
'comment': forms.Textarea(attrs = {'rows': 3, 'cols': 18}),
c0052b0f Serghei MIHAI
'start_date': forms.DateInput(format = '%d/%m/%Y',
attrs = {'size': 10}),
'end_date': forms.DateInput(format = '%d/%m/%Y',
2b777f8f Serghei MIHAI
attrs = {'size': 10}),
c029f285 Serghei MIHAI
}

def clean(self):
cleaned_data = super(HolidayForm, self).clean()
if cleaned_data.get('start_date') and cleaned_data.get('end_date'):
if cleaned_data['start_date'] > cleaned_data['end_date']:
raise forms.ValidationError(u'La date de début doit être supérieure à la date de fin')
return cleaned_data

04022fee Benjamin Dauvergne
HolidayFormSet = inlineformset_factory(
724131cb Benjamin Dauvergne
Worker, Holiday,
a39c35ec Benjamin Dauvergne
form=BaseHolidayForm,
6fd524bc Mikaël Ates
fields=('start_date', 'end_date', 'start_time', 'end_time', 'holiday_type', 'comment'))
f69ae8a2 Benjamin Dauvergne
class HolidaySearchForm(forms.Form):
86f4d2f2 Benjamin Dauvergne
start_date = forms.DateField(required=False, localize=True)
end_date = forms.DateField(required=False, localize=True)
f69ae8a2 Benjamin Dauvergne
def clean(self):
cleaned_data = super(HolidaySearchForm, self).clean()
84614733 Benjamin Dauvergne
if cleaned_data.get('start_date') and cleaned_data.get('end_date'):
f69ae8a2 Benjamin Dauvergne
if cleaned_data['start_date'] > cleaned_data['end_date']:
raise forms.ValidationError(u'La date de début doit être supérieure à la date de fin')
return cleaned_data

6fd524bc Mikaël Ates
class GroupHolidayBaseFormSet(BaseModelFormSet):
57212b18 Benjamin Dauvergne
def __init__(self, *args, **kwargs):
self.service = kwargs.pop('service', None)
old_form = self.form
self.form = lambda *args, **kwargs: old_form(*args, service=self.service, **kwargs)
6fd524bc Mikaël Ates
super(GroupHolidayBaseFormSet, self).__init__(*args, **kwargs)
57212b18 Benjamin Dauvergne
6fd524bc Mikaël Ates
class GroupHolidayForm(forms.ModelForm):
f69ae8a2 Benjamin Dauvergne
57212b18 Benjamin Dauvergne
def __init__(self, *args, **kwargs):
self.service = kwargs.pop('service', None)
6fd524bc Mikaël Ates
super(GroupHolidayForm, self).__init__(*args, **kwargs)
self.fields['holiday_type'].queryset = \
HolidayType.objects.filter(for_group=True)
57212b18 Benjamin Dauvergne
f69ae8a2 Benjamin Dauvergne
class Meta:
3ade90b9 Serghei MIHAI
model = Holiday
6fd524bc Mikaël Ates
widgets = {
3ade90b9 Serghei MIHAI
'comment': forms.Textarea(attrs = {'rows': 3, 'cols': 18}),
5b90c12e Serghei MIHAI
'services': forms.CheckboxSelectMultiple()
6fd524bc Mikaël Ates
}
f69ae8a2 Benjamin Dauvergne
6fd524bc Mikaël Ates
GroupHolidayFormSet = modelformset_factory(Holiday,
f69ae8a2 Benjamin Dauvergne
can_delete=True,
6fd524bc Mikaël Ates
form=GroupHolidayForm,
formset=GroupHolidayBaseFormSet,
fields=('start_date', 'end_date', 'start_time', 'end_time', 'holiday_type', 'comment'))