diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-05-23 12:58:38 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-06-12 08:49:06 +0200 |
commit | 88c9aeaeafd9bc77decbf0982be0fd9d20fd3993 (patch) | |
tree | 1e9650dcdfb9359e6c1a70031f7705d18700374d /ishtar_common | |
parent | b40361b7c1b8e98690b1f4cf6b5154f8b22395ff (diff) | |
download | Ishtar-88c9aeaeafd9bc77decbf0982be0fd9d20fd3993.tar.bz2 Ishtar-88c9aeaeafd9bc77decbf0982be0fd9d20fd3993.zip |
Wizards - JSON fields: inlines for custom form in admin pages (refs #4089)
Diffstat (limited to 'ishtar_common')
-rw-r--r-- | ishtar_common/admin.py | 30 | ||||
-rw-r--r-- | ishtar_common/forms_common.py | 1 | ||||
-rw-r--r-- | ishtar_common/models.py | 45 |
3 files changed, 67 insertions, 9 deletions
diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py index 1edbd0f68..48847b804 100644 --- a/ishtar_common/admin.py +++ b/ishtar_common/admin.py @@ -874,13 +874,41 @@ class ExcludeFieldInline(admin.TabularInline): formset = ExcludeFieldFormset +class JsonFieldFormset(BaseInlineFormSet): + def get_form_kwargs(self, index): + kwargs = super(JsonFieldFormset, self).get_form_kwargs(index) + if not self.instance or not self.instance.pk: + return kwargs + kwargs['choices'] = [('', '--')] + \ + self.instance.get_available_json_fields() + return kwargs + + +class JsonFieldForm(forms.ModelForm): + class Meta: + model = models.CustomFormJsonField + exclude = [] + + def __init__(self, *args, **kwargs): + choices = kwargs.pop('choices') + super(JsonFieldForm, self).__init__(*args, **kwargs) + self.fields['json_field'].choices = choices + + +class JsonFieldInline(admin.TabularInline): + model = models.CustomFormJsonField + extra = 2 + form = JsonFieldForm + formset = JsonFieldFormset + + class CustomFormAdmin(admin.ModelAdmin): list_display = ['name', 'form', 'available', 'enabled', 'apply_to_all', 'users_lbl', 'user_types_lbl'] fields = ('name', 'form', 'available', 'enabled', 'apply_to_all', 'users', 'user_types') form = CustomFormForm - inlines = [ExcludeFieldInline] + inlines = [ExcludeFieldInline, JsonFieldInline] def get_inline_instances(self, request, obj=None): # no inline on creation diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index 23b29aef4..5b4566a31 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -994,7 +994,6 @@ def get_image_help(): class SourceForm(CustomForm, ManageOldType): form_label = _(u"Documentation informations") form_admin_name = _("Source - General") - form_slug = "source-general" file_upload = True associated_models = {'source_type': models.SourceType} diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 0900b2d9a..bb285883f 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -1817,19 +1817,25 @@ class CustomForm(models.Model): @classmethod def register(cls): - if hasattr(cls, '_register'): - return cls._register + if hasattr(cls, '_register') and hasattr(cls, '_register_fields'): + return cls._register, cls._register_fields cache_key, value = get_cache(cls.__class__, ['dct-forms'], app_label='ishtar_common') - if value: + cache_key_fields, value_fields = get_cache( + cls.__class__, ['dct-fields'], app_label='ishtar_common') + if value and value_fields: cls._register = value - return cls._register - cls._register = {} + cls._register_fields = value_fields + return cls._register, cls._register_fields + cls._register, cls._register_fields = {}, {} # ideally should be improved but only used in admin from ishtar_common.admin import ISHTAR_FORMS from ishtar_common.forms import CustomForm as CustomFormForm for app_form in ISHTAR_FORMS: + app_name = app_form.__package__ + if app_name == "archaeological_files_pdl": + app_name = "archaeological_files" for form in dir(app_form): if 'Form' not in form: # not very clean... but do not treat inappropriate items @@ -1839,15 +1845,40 @@ class CustomForm(models.Model): or not issubclass(form, CustomFormForm) \ or not getattr(form, 'form_slug', None): continue + model_name = form.form_slug.split('-')[0].replace('_', '') + if app_name not in cls._register_fields: + cls._register_fields[app_name] = [] + if model_name not in cls._register_fields[app_name]: + cls._register_fields[app_name].append(model_name) cls._register[form.form_slug] = form - return cls._register + return cls._register, cls._register_fields def get_form_class(self): - register = self.register() + register, register_fields = self.register() if self.form not in self._register: return return register[self.form] + def get_available_json_fields(self): + register, register_fields = self.register() + if self.form not in self._register: + return [] + current_form = register[self.form] + app_name = current_form.__module__.split('.')[0] + if app_name == "archaeological_files_pdl": + app_name = "archaeological_files" + if app_name not in register_fields: + return [] + res = [] + for model_name in register_fields[app_name]: + ct = ContentType.objects.get(app_label=app_name, model=model_name) + for json_field in JsonDataField.objects.filter( + content_type=ct).all(): + res.append((json_field.pk, u"{} ({})".format( + json_field.name, + dict(JSON_VALUE_TYPES)[json_field.value_type]))) + return res + class ExcludedField(models.Model): custom_form = models.ForeignKey(CustomForm, related_name='excluded_fields') |