This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
calebasse/calebasse/personnes/forms.py

254 lines
9.3 KiB
Python

# -*- coding: utf-8 -*-
from django import forms
from django.forms.models import (inlineformset_factory, modelformset_factory,
BaseInlineFormSet, BaseModelFormSet)
from django.utils.translation import gettext_lazy as _
from django.contrib.auth.models import User
from calebasse.ressources.models import WorkerType, Service, HolidayType
from models import Worker, UserWorker, TimeTable, Holiday, ExternalTherapist, ExternalWorker
class UserForm(forms.ModelForm):
error_messages = {
'duplicate_username': _("A user with that username already exists."),
'password_mismatch': _("The two password fields didn't match."),
}
worker = forms.ModelChoiceField(label=_('Personnel'),
queryset=Worker.objects.filter(enabled=True), empty_label=_('None'),
required=False)
password1 = forms.CharField(label=_("Password"),
widget=forms.PasswordInput, required=False)
password2 = forms.CharField(label=_("Password confirmation"),
widget=forms.PasswordInput,
help_text=_("Enter the same password as above, for verification."),
required=False)
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
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"]
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
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
class Meta:
model = User
fields = ('username', 'email', 'password1', 'password2', 'worker', 'groups')
widgets = {
'groups': forms.CheckboxSelectMultiple,
}
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:
instance.first_name = worker.first_name
instance.last_name = worker.last_name
def save_m2m():
qs = UserWorker.objects.filter(user=instance)
if qs.exists():
qs.update(worker=worker)
else:
UserWorker.objects.create(user=instance, worker=worker)
self.save_m2m = save_m2m
else:
try:
instance.userworker.delete()
except UserWorker.DoesNotExist:
pass
if instance.pk:
instance.groups = self.cleaned_data['groups']
if commit:
instance.save()
self.save_m2m()
return instance
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 = {
'a': u'Actifs',
}
intervene_status = forms.MultipleChoiceField(
choices=INTERVENE_STATUS_CHOICES.iteritems(),
widget=forms.CheckboxSelectMultiple,
initial=INTERVENE_STATUS_CHOICES.keys(),
required=False)
class WorkerIdForm(forms.ModelForm):
class Meta:
model = Worker
fields = ('last_name', 'first_name', 'initials', 'gender', 'type', 'enabled')
widgets = {
'initials': forms.TextInput(attrs={'size': 6}),
}
class WorkerServiceForm(forms.ModelForm):
class Meta:
model = Worker
fields = ('services',)
widgets = {
'services': forms.CheckboxSelectMultiple,
}
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)
]
class BaseTimeTableForm(forms.ModelForm):
class Meta:
model = TimeTable
widgets = {
'services': forms.CheckboxSelectMultiple,
'week_period': forms.HiddenInput(),
'week_parity': forms.HiddenInput(),
'week_rank': forms.HiddenInput(),
}
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'], \
cleaned_data['week_rank'], \
cleaned_data['week_parity'] = PERIOD_LIST_TO_FIELDS[periodicity - 1]
except:
msg = u"Périodicité invalide."
if msg:
self._errors["periodicity"] = self.error_class([msg])
return cleaned_data
TimetableFormSet = inlineformset_factory(Worker, TimeTable,
form=BaseTimeTableForm,
fields=('start_time', 'end_time', 'start_date', 'end_date',
'services', 'periodicity', 'week_period', 'week_parity', 'week_rank'))
class BaseHolidayForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(BaseHolidayForm, self).__init__(*args, **kwargs)
self.fields['holiday_type'].queryset = \
HolidayType.objects.filter(for_group=False)
class Meta:
widgets = {
'comment': forms.Textarea(attrs={'rows': 3}),
}
class HolidayForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(HolidayForm, self).__init__(*args, **kwargs)
self.fields['holiday_type'].queryset = \
HolidayType.objects.filter(for_group=False)
class Meta:
model = Holiday
widgets = {
'comment': forms.Textarea(attrs = {'rows': 3, 'cols': 18}),
'start_date': forms.DateInput(format = '%d/%m/%Y',
attrs = {'size': 10}),
'end_date': forms.DateInput(format = '%d/%m/%Y',
attrs = {'size': 10}),
}
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
HolidayFormSet = inlineformset_factory(
Worker, Holiday,
form=BaseHolidayForm,
fields=('start_date', 'end_date', 'start_time', 'end_time', 'holiday_type', 'comment'))
class HolidaySearchForm(forms.Form):
start_date = forms.DateField(required=False, localize=True)
end_date = forms.DateField(required=False, localize=True)
def clean(self):
cleaned_data = super(HolidaySearchForm, 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
class GroupHolidayBaseFormSet(BaseModelFormSet):
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)
super(GroupHolidayBaseFormSet, self).__init__(*args, **kwargs)
class GroupHolidayForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.service = kwargs.pop('service', None)
super(GroupHolidayForm, self).__init__(*args, **kwargs)
self.fields['holiday_type'].queryset = \
HolidayType.objects.filter(for_group=True)
class Meta:
model = Holiday
widgets = {
'comment': forms.Textarea(attrs = {'rows': 3, 'cols': 18}),
'services': forms.CheckboxSelectMultiple()
}
GroupHolidayFormSet = modelformset_factory(Holiday,
can_delete=True,
form=GroupHolidayForm,
formset=GroupHolidayBaseFormSet,
fields=('start_date', 'end_date', 'start_time', 'end_time', 'holiday_type', 'comment'))