calebasse/calebasse/personnes/forms.py @ 0d4bf0b4
| 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'))
|