summaryrefslogtreecommitdiff
path: root/ishtar_common
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common')
-rw-r--r--ishtar_common/admin.py30
-rw-r--r--ishtar_common/forms_common.py1
-rw-r--r--ishtar_common/models.py45
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')