summaryrefslogtreecommitdiff
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
parent786141bc3d411fdf5b5529fa4bc37f454e52a82d (diff)
downloadChimère-8631cdccea4ae3564a598736652d65a8f0b9f85b.tar.bz2
Chimère-8631cdccea4ae3564a598736652d65a8f0b9f85b.zip
Change mean populating dynamically forms with properties in order to allow tests
-rw-r--r--chimere/admin.py11
-rw-r--r--chimere/forms.py79
2 files changed, 56 insertions, 34 deletions
diff --git a/chimere/admin.py b/chimere/admin.py
index ce1f2b9..a30f0df 100644
--- a/chimere/admin.py
+++ b/chimere/admin.py
@@ -26,6 +26,7 @@ from copy import deepcopy
from django.conf import settings
from django.contrib import admin, messages
from django.contrib.admin import SimpleListFilter
+from django.contrib.admin.util import flatten_fieldsets
from django.contrib.auth.admin import UserAdmin as VanillaUserAdmin
from django.contrib.auth.models import User
from django.core.exceptions import ObjectDoesNotExist
@@ -341,18 +342,20 @@ class MarkerAdmin(admin.ModelAdmin):
inlines = [MultimediaInline, PictureInline]
has_properties = True
- def __init__(self, *args, **kwargs):
+ def get_fieldsets(self, request, obj=None):
"""
Manage properties in fieldsets.
"""
+ fieldsets = super(MarkerAdmin, self).get_fieldsets(request, obj)
+ newfieldsets = list(fieldsets)
if self.has_properties:
- main_fields = self.fieldsets[0][1]['fields']
+ main_fields = newfieldsets[0][1]['fields']
for pm in PropertyModel.objects.filter(available=True)\
.order_by('order').all():
pm_name = pm.getNamedId()
if pm_name not in main_fields:
main_fields.append(pm_name)
- super(MarkerAdmin, self).__init__(*args, **kwargs)
+ return newfieldsets
def queryset(self, request):
qs = self.model._default_manager.get_query_set()
@@ -381,6 +384,8 @@ class MarkerAdmin(admin.ModelAdmin):
return my_urls + urls
def get_form(self, request, obj=None, **kwargs):
+ # remove dynamic field to prevent admin check
+ kwargs['fields'] = flatten_fieldsets(self.declared_fieldsets)
form = super(MarkerAdmin, self).get_form(request, obj, **kwargs)
q = request.user.subcategory_limit_to
if not q.count():
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']