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']  | 
