diff options
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')  | 
