diff options
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 |
commit | 8631cdccea4ae3564a598736652d65a8f0b9f85b (patch) | |
tree | 9eb06f689fb6c642b7c341e741728f5c0ab0ab71 | |
parent | 786141bc3d411fdf5b5529fa4bc37f454e52a82d (diff) | |
download | Chimè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.py | 11 | ||||
-rw-r--r-- | chimere/forms.py | 79 |
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'] |