summaryrefslogtreecommitdiff
path: root/chimere/forms.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2016-08-03 18:31:09 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2016-08-03 18:54:02 +0200
commit8631cdccea4ae3564a598736652d65a8f0b9f85b (patch)
tree9eb06f689fb6c642b7c341e741728f5c0ab0ab71 /chimere/forms.py
parent786141bc3d411fdf5b5529fa4bc37f454e52a82d (diff)
downloadChimère-8631cdccea4ae3564a598736652d65a8f0b9f85b.tar.bz2
Chimère-8631cdccea4ae3564a598736652d65a8f0b9f85b.zip
Change mean populating dynamically forms with properties in order to allow tests
Diffstat (limited to 'chimere/forms.py')
-rw-r--r--chimere/forms.py79
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']