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)
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