diff options
Diffstat (limited to 'chimere/forms.py')
-rw-r--r-- | chimere/forms.py | 79 |
1 files changed, 48 insertions, 31 deletions
diff --git a/chimere/forms.py b/chimere/forms.py index ae0092f..8b86df1 100644 --- a/chimere/forms.py +++ b/chimere/forms.py @@ -256,6 +256,32 @@ class CategoryAdminForm(forms.ModelForm): model = Category +def get_properties(queryset): + # As we have dynamic fields, it's cleaner to make the class dynamic too + fields = {} + for prop in queryset: + key = "property_%d_%d" % (prop.order, prop.id) + if prop.type == 'C': + choices = PropertyModelChoice.objects.filter(propertymodel=prop, + available=True + ).order_by('value') + fields[key] = forms.ChoiceField( + label=prop.name, choices=[('', '--')] + + [(choice.pk, unicode(choice)) for choice in choices], + required=False) + elif prop.type == 'A': + widget = PropertyModel.TYPE_WIDGET[prop.type] + widget = widget(slug=prop.slug) + fields[key] = forms.CharField(label=prop.name, widget=widget, + required=False) + else: + widget = PropertyModel.TYPE_WIDGET[prop.type] + fields[key] = forms.CharField( + label=prop.name, widget=widget, + required=False) + return fields + + class MarkerAdminFormBase(forms.ModelForm): """ Main form for marker @@ -263,10 +289,25 @@ class MarkerAdminFormBase(forms.ModelForm): is_admin = True name = forms.CharField(_(u"Name"), required=True) description = forms.CharField(widget=TextareaAdminWidget, required=False) + _PROPERTY_FILTERS = {} class Meta: model = Marker + @classmethod + def _set_cls_fields(cls): + fields = get_properties( + PropertyModel.objects.filter(**cls._PROPERTY_FILTERS).all()) + for key in fields: + print(key) + setattr(cls, key, fields[key]) + + def _set_fields(self): + fields = get_properties( + PropertyModel.objects.filter(**self._PROPERTY_FILTERS).all()) + for key in fields: + self.fields[key] = fields[key] + def __init__(self, *args, **keys): """ Custom initialization method in order to manage properties @@ -292,6 +333,7 @@ class MarkerAdminFormBase(forms.ModelForm): subcategories = keys.pop('subcategories') \ if 'subcategories' in keys else [] super(MarkerAdminFormBase, self).__init__(*args, **keys) + self._set_fields() if settings.CHIMERE_DAYS_BEFORE_EVENT: self.fields['start_date'].widget = DatePickerWidget() self.fields['end_date'].widget = DatePickerWidget() @@ -380,38 +422,13 @@ class MarkerAdminFormBase(forms.ModelForm): return new_marker -def get_properties(queryset): - # As we have dynamic fields, it's cleaner to make the class dynamic too - fields = {} - for prop in queryset: - key = "property_%d_%d" % (prop.order, prop.id) - if prop.type == 'C': - choices = PropertyModelChoice.objects.filter(propertymodel=prop, - available=True - ).order_by('value') - fields[key] = forms.ChoiceField( - label=prop.name, choices=[('', '--')] + - [(choice.pk, unicode(choice)) for choice in choices], - required=False) - elif prop.type == 'A': - widget = PropertyModel.TYPE_WIDGET[prop.type] - widget = widget(slug=prop.slug) - fields[key] = forms.CharField(label=prop.name, widget=widget, - required=False) - else: - widget = PropertyModel.TYPE_WIDGET[prop.type] - fields[key] = forms.CharField( - label=prop.name, widget=widget, - required=False) - return fields +class MarkerAdminForm(MarkerAdminFormBase): + pass + -# in admin all fields are displayed -MarkerAdminForm = type( - "MarkerAdminForm", (MarkerAdminFormBase,), - get_properties(PropertyModel.objects.all())) -MarkerBaseForm = type( - "MarkerBaseForm", (MarkerAdminFormBase,), - get_properties(PropertyModel.objects.filter(available=True))) +class MarkerBaseForm(MarkerAdminFormBase): + # in public form only visible fields are displayed + _PROPERTY_FILTERS = {'available': True} EXCLUDED_FIELDS = ['status'] |