Skip to content

Instantly share code, notes, and snippets.

@frague59
Created May 26, 2017 12:54
Show Gist options
  • Save frague59/aa5236eb11982bd810f81342da8bc05d to your computer and use it in GitHub Desktop.
Save frague59/aa5236eb11982bd810f81342da8bc05d to your computer and use it in GitHub Desktop.
forms for peoples
# noinspection PyClassHasNoInit
class PeopleAdminForm(dj_forms.ModelForm):
"""
Administration form for :class:`directory.models.people.People` items
.. note::
This form us used by super-admins
"""
# noinspection PyClassHasNoInit
class Media:
"""
Provides some additional js js for auto detection on email and phone number
"""
js = (static('js/admin/people_admin_form.js'),)
class Meta:
#: model bound to the form
model = directory.models.people.People
#: No excluded fields
exclude = ()
#: Set `phone_uid` widget to HiddenField
widgets = {'phone_uid': HiddenInput,
'comment': SummernoteWidget,
'additional_role': CheckboxSelectMultiple}
#: Overrides the :attr:`directory.admin.forms.PeopleAdminForm.hierarchy` to use a
#: :class:`mptt:mptt.forms.TreeNodeChoiceField` field
#: .. note:: The queryset if overridden on form creation, to display the hierarchies authorized for the logged user
hierarchy = TreeNodeChoiceField(queryset=directory.models.hierarchy.Hierarchy.objects.all(),
empty_label=None, label=_('Hierarchy'), required=True)
#: Overrides the :attr:`directory.admin.forms.PeopleAdminForm.last_name` to use a
#: :class:`ftk:utils.models.forms.UpperCaseCharField` field
last_name = UpperCaseCharField(label=_('last name'), max_length=255, required=True)
#: Overrides the :attr:`directory.admin.forms.PeopleAdminForm.usage_name` to use a
#: :class:`ftk:utils.models.forms.UpperCaseCharField` field
usage_name = UpperCaseCharField(label=_('usage name'), max_length=255, required=False)
#: Overrides the :attr:`directory.admin.forms.PeopleAdminForm.first_name` to use a
#: :class:`ftk:utils.models.forms.TitleCharField` field
first_name = TitleCharField(label=_('first name'), max_length=255, required=True)
class EditorPeopleAdminForm(PeopleAdminForm):
"""
Administration form for :class:`directory.models.people.People` items
.. note::
This form us used by super-admins
"""
class Meta:
exclude = ('image', )
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
initial=None, error_class=ErrorList, label_suffix=None,
empty_permitted=False, instance=None):
super(EditorPeopleAdminForm, self).__init__(data=data, files=files, auto_id=auto_id, prefix=prefix,
initial=initial, error_class=error_class, label_suffix=label_suffix,
empty_permitted=empty_permitted, instance=instance)
if 'image' in self.fields:
self.fields['image'].widget.attrs['readonly'] = True
logger.debug('EditorPeopleAdminForm::__init__() `image` updated')
if 'idcard_guid' in self.fields:
self.fields['idcard_guid'].widget.attrs['readonly'] = True
logger.debug('EditorPeopleAdminForm::__init__() `idcard_guid` updated')
if 'idcard_date' in self.fields:
self.fields['idcard_date'].widget.attrs['readonly'] = True
logger.debug('EditorPeopleAdminForm::__init__() `idcard_date` updated')
def clean(self):
"""
Overrides the :method:`django:django.forms.ModelForm.clean` method to check on creation if the people
is unique in the database
:returns: cleaned data
"""
cleaned_data = super(PeopleAdminForm, self).clean()
civility = cleaned_data.get('civility')
last_name = cleaned_data.get('last_name')
first_name = cleaned_data.get('first_name')
if directory.models.people.People.objects.filter(civility=civility,
last_name=last_name,
first_name=first_name).exclude(pk=self.instance.id).count() > 0:
msg = _('People MUST be unique in the directory.')
self.add_error('civility', msg)
self.add_error('last_name', msg)
self.add_error('first_name', msg)
raise dj_forms.ValidationError(_('A user with civility %(civility)s, '
'last name %(last_name)s and first name %(first_name)s '
'already exists in the directory.'))
return cleaned_data
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment