#!/usr/bin/env python # -*- coding: utf-8 -*- """ openslides.utils.person.forms ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Forms and FormFields for the OpenSlides person api. :copyright: 2011, 2012 by OpenSlides team, see AUTHORS. :license: GNU GPL, see LICENSE for more details. """ from django import forms from openslides.utils.person.api import Persons, get_person class PersonChoices(object): def __init__(self, field): self.field = field def __iter__(self): if self.field.empty_label is not None: yield (u"", self.field.empty_label) for person in sorted(Persons(), key=lambda person: person.sort_name): yield (person.person_id, person) class PersonFormField(forms.fields.ChoiceField): def __init__(self, required=True, initial=None, empty_label=u"---------", *args, **kwargs): if required and (initial is not None): self.empty_label = None else: self.empty_label = empty_label forms.fields.Field.__init__(self, required=required, initial=initial, *args, **kwargs) self.widget.choices = self.choices def __deepcopy__(self, memo): result = super(forms.fields.ChoiceField, self).__deepcopy__(memo) return result def _get_choices(self): # If self._choices is set, then somebody must have manually set # the property self.choices. In this case, just return self._choices. if hasattr(self, '_choices'): return self._choices return PersonChoices(self) choices = property(_get_choices, forms.fields.ChoiceField._set_choices) def to_python(self, value): return get_person(value) def valid_value(self, value): return super(PersonFormField, self).valid_value(value.person_id) class MultiplePersonFormField(PersonFormField): widget = forms.widgets.SelectMultiple def __init__(self, *args, **kwargs): super(MultiplePersonFormField, self).__init__( empty_label=None, *args, **kwargs) def to_python(self, value): if hasattr(value, '__iter__'): return [super(MultiplePersonFormField, self).to_python(v) for v in value] return super(MultiplePersonFormField, self).to_python(value) def valid_value(self, value): if hasattr(value, '__iter__'): return [super(MultiplePersonFormField, self).valid_value(v) for v in value] return super(MultiplePersonFormField, self).valid_value(value)