def _group_fieldsets(self, fieldsets):
        # Fieldsets are not grouped by default. The function is activated by
        # setting TranslationAdmin.group_fieldsets to True. If the admin class
        # already defines a fieldset, we leave it alone and assume the author
        # has done whatever grouping for translated fields they desire.
        if self.group_fieldsets is True:
            flattened_fieldsets = flatten_fieldsets(fieldsets)

            # Create a fieldset to group each translated field's localized fields
            fields = sorted((f for f in self.opts.get_fields() if f.concrete))
            untranslated_fields = [
                f.name for f in fields if (
                    # Exclude the primary key field
                    f is not self.opts.auto_field
                    # Exclude non-editable fields
                    and f.editable
                    # Exclude the translation fields
                    and not hasattr(f, 'translated_field')
                    # Honour field arguments. We rely on the fact that the
                    # passed fieldsets argument is already fully filtered
                    # and takes options like exclude into account.
                    and f.name in flattened_fieldsets)
            ]
            # TODO: Allow setting a label
            fieldsets = ([(
                '',
                {
                    'fields': untranslated_fields
                },
            )] if untranslated_fields else [])

            temp_fieldsets = {}
            for orig_field, trans_fields in self.trans_opts.fields.items():
                trans_fieldnames = [
                    f.name for f in sorted(trans_fields, key=lambda x: x.name)
                ]
                if any(f in trans_fieldnames for f in flattened_fieldsets):
                    # Extract the original field's verbose_name for use as this
                    # fieldset's label - using gettext_lazy in your model
                    # declaration can make that translatable.
                    label = self.model._meta.get_field(
                        orig_field).verbose_name.capitalize()
                    temp_fieldsets[orig_field] = (
                        label,
                        {
                            'fields': trans_fieldnames,
                            'classes': ('mt-fieldset', )
                        },
                    )

            fields_order = unique(f.translated_field.name
                                  for f in self.opts.fields
                                  if hasattr(f, 'translated_field')
                                  and f.name in flattened_fieldsets)
            for field_name in fields_order:
                fieldsets.append(temp_fieldsets.pop(field_name))
            assert not temp_fieldsets  # cleaned

        return fieldsets
 def __new__(cls, name, bases, attrs):
     parents = [b for b in bases if isinstance(b, FieldsAggregationMetaClass)]
     if not parents:
         return super(FieldsAggregationMetaClass, cls).__new__(cls, name, bases, attrs)
     attrs["fields"] = tuple(attrs.get("fields", ()))
     for base in parents:
         attrs["fields"] += tuple(base.fields)
     attrs["fields"] = tuple(unique(attrs["fields"]))
     return super(FieldsAggregationMetaClass, cls).__new__(cls, name, bases, attrs)
 def __new__(cls, name, bases, attrs):
     parents = [b for b in bases if isinstance(b, FieldsAggregationMetaClass)]
     if not parents:
         return super(FieldsAggregationMetaClass, cls).__new__(cls, name, bases, attrs)
     attrs['fields'] = tuple(attrs.get('fields', ()))
     for base in parents:
         attrs['fields'] += tuple(base.fields)
     attrs['fields'] = tuple(unique(attrs['fields']))
     return super(FieldsAggregationMetaClass, cls).__new__(cls, name, bases, attrs)
Example #4
0
    def _group_fieldsets(self, fieldsets):
        # Fieldsets are not grouped by default. The function is activated by
        # setting TranslationAdmin.group_fieldsets to True. If the admin class
        # already defines a fieldset, we leave it alone and assume the author
        # has done whatever grouping for translated fields they desire.
        if not self.declared_fieldsets and self.group_fieldsets is True:
            flattened_fieldsets = flatten_fieldsets(fieldsets)

            # Create a fieldset to group each translated field's localized fields
            untranslated_fields = [
                f.name
                for f in self.opts.fields
                if (
                    # Exclude the primary key field
                    f is not self.opts.auto_field
                    # Exclude non-editable fields
                    and f.editable
                    # Exclude the translation fields
                    and not hasattr(f, "translated_field")
                    # Honour field arguments. We rely on the fact that the
                    # passed fieldsets argument is already fully filtered
                    # and takes options like exclude into account.
                    and f.name in flattened_fieldsets
                )
            ]
            # TODO: Allow setting a label
            fieldsets = [("", {"fields": untranslated_fields})] if untranslated_fields else []

            temp_fieldsets = {}
            for orig_field, trans_fields in self.trans_opts.fields.items():
                trans_fieldnames = [f.name for f in sorted(trans_fields, key=lambda x: x.name)]
                if any(f in trans_fieldnames for f in flattened_fieldsets):
                    # Extract the original field's verbose_name for use as this
                    # fieldset's label - using ugettext_lazy in your model
                    # declaration can make that translatable.
                    label = self.model._meta.get_field(orig_field).verbose_name
                    temp_fieldsets[orig_field] = (label, {"fields": trans_fieldnames, "classes": ("mt-fieldset",)})

            fields_order = unique(
                f.translated_field.name
                for f in self.opts.fields
                if hasattr(f, "translated_field") and f.name in flattened_fieldsets
            )
            for field_name in fields_order:
                fieldsets.append(temp_fieldsets.pop(field_name))
            assert not temp_fieldsets  # cleaned

        return fieldsets