def __init__(self, attrs=None): default_attrs = { "class": "form-control form-control-lg" } if attrs: default_attrs.update(attrs) get_original(widgets.Textarea)(self, attrs=default_attrs)
def __init__(self, attrs=None, choices=()): default_attrs = { "class": "custom-select custom-select-lg" } if attrs: default_attrs.update(attrs) get_original(widgets.Select)(self, attrs=default_attrs, choices=choices)
def __init__(self, field, admin_site, attrs=None, choices=(), using=None): default_attrs = { "class": "custom-select custom-select-lg" } if attrs: default_attrs.update(attrs) get_original(AutocompleteMixin)(self, field, admin_site, attrs=default_attrs, choices=choices, using=using)
def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None): response = get_original(ModelAdmin)(self, request, context, add=add, change=change, form_url=form_url, obj=obj) # Перенос кода из `admin_modify.submit_row`. _context = response.context_data add = _context["add"] change = _context["change"] is_popup = _context["is_popup"] save_as = _context["save_as"] show_save = _context.get("show_save", True) show_save_and_add_another = _context.get("show_save_and_add_another", True) show_save_and_continue = _context.get("show_save_and_continue", True) has_add_permission = _context["has_add_permission"] has_change_permission = _context["has_change_permission"] has_view_permission = _context["has_view_permission"] has_editable_inline_admin_formsets = _context[ "has_editable_inline_admin_formsets"] can_save = ((has_change_permission and change) or (has_add_permission and add) or has_editable_inline_admin_formsets) _context.update({ "can_change": (has_change_permission or has_editable_inline_admin_formsets), "show_delete_link": (not is_popup and _context["has_delete_permission"] and change and _context.get("show_delete", True)), "show_save_as_new": (not is_popup and has_change_permission and change and save_as), "show_save_and_add_another": (has_add_permission and not is_popup and (not save_as or add) and can_save and show_save_and_add_another), "show_save_and_continue": (not is_popup and can_save and has_view_permission and show_save_and_continue), "show_save": show_save and can_save, "show_close": not (show_save and can_save) }) # Показывать ли кнопку логов _context["show_history"] = self.object_history return response
def password_change(self, request, extra_context=None): # Добавляем шаблонную переменную opts, как в changeform from django.contrib.auth import get_user_model UserModel = get_user_model() extra_context = extra_context or {} extra_context.setdefault("opts", UserModel._meta) return get_original(AdminSite)(self, request, extra_context)
def __init__(self, model, admin_site): get_original(ModelAdmin)(self, model, admin_site) if self.sortable: # remove sortable field from `list_editable` list self.list_editable = self.list_editable or [] if self.sortable in self.list_editable: self.list_editable = [ field for field in self.list_editable if field != self.sortable ] # add sortable field to `exclude` list self.exclude = self.exclude or [] if self.sortable not in self.exclude: self.exclude = list(self.exclude) + [self.sortable]
def history_view(self, request, object_id, extra_context=None): # Добавление в список логов ссылки на пользователя и ссылки на запись лога from django.contrib.admin.models import LogEntry log_opts = LogEntry._meta codename = get_permission_codename("view", log_opts) has_log_change_permission = request.user.has_perm( "%s.%s" % (log_opts.app_label, codename)) log_model_registered = self.admin_site.is_registered(LogEntry) UserModel = get_user_model() user_opts = UserModel._meta codename = get_permission_codename("view", user_opts) has_user_change_permission = request.user.has_perm( "%s.%s" % (user_opts.app_label, codename)) user_model_registered = self.admin_site.is_registered(UserModel) default_extra = { "log_opts": log_opts, "user_opts": user_opts, "show_log_link": has_log_change_permission and log_model_registered, "show_user_link": has_user_change_permission and user_model_registered } default_extra.update(extra_context or {}) return get_original(ModelAdmin)(self, request, object_id, default_extra)
def __init__( self, form, fieldsets, prepopulated_fields, readonly_fields=None, model_admin=None ): get_original(AdminForm)( self, form, fieldsets, prepopulated_fields, readonly_fields=readonly_fields, model_admin=model_admin ) self.prepopulated_fields = prepopulated_fields
def formfield_for_dbfield(self, db_field, request, **kwargs): if self.sortable and db_field.name == self.sortable: kwargs["widget"] = forms.HiddenInput( attrs={ "class": "paper-formset__order", }) return get_original(InlineModelAdmin)(self, db_field, request, **kwargs)
def get_urls(self): urlpatterns = [] if self.sortable: info = self.model._meta.app_label, self.model._meta.model_name urlpatterns.extend([ path( "set-order/", self.admin_site.admin_view(self.set_order), name="%s_%s_order" % info, ) ]) return urlpatterns + get_original(ModelAdmin)(self)
def get_formset(self, *args, **kwargs): form = type(self.form.__name__, (self.form, ), {}) if form.default_renderer is None: form.default_renderer = PaperFormRenderer kwargs.setdefault("form", form) if django.VERSION >= (4, 0): # Начиная с Django 4.0, функция formset_factory() принимает новый параметр # renderer. Если значение этой переменной не задано, то используется # рендерер по умолчанию (Django Templates), а не form.default_renderer. kwargs.setdefault("renderer", PaperFormRenderer()) return get_original(InlineModelAdmin)(self, *args, **kwargs)
def get_urls(self): from django.urls import path urlpatterns = get_original(AdminSite)(self) # Снимаем требование прав доступа на JS-каталог for index, url in enumerate(urlpatterns): if url.name == "jsi18n": urlpatterns.pop(index) urlpatterns.insert( index, path('jsi18n/', self.i18n_javascript, name='jsi18n')) break return urlpatterns
def get_changelist(self, request, **kwargs): base_changelist_class = get_original(MPTTModelAdmin)(self, request, **kwargs) class ChangeList(base_changelist_class): def get_ordering(self, request, queryset): ordering = super().get_ordering(request, queryset) or [] if self.sortable_allowed: mptt_opts = self.model._mptt_meta ordering = [mptt_opts.tree_id_attr, mptt_opts.left_attr ] + ordering return ordering return ChangeList
def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None): tabs_config = self.get_tabs(request, obj) if conf.DEFAULT_TAB_NAME in dict(tabs_config): default_tab_name = conf.DEFAULT_TAB_NAME elif tabs_config: default_tab_name = tabs_config[0][0] else: raise RuntimeError("at least one tab required") tabs = [] adminform = context.get("adminform") inline_formsets = context.get("inline_admin_formsets") for tab_name, tab_title in self.get_tabs(request, obj): tab_obj = AdminTab(request, tab_name, tab_title) for fieldset in adminform: if fieldset.tab == tab_name or (fieldset.tab is None and tab_name == default_tab_name): tab_obj.fieldsets.append(fieldset) for inline_formset in inline_formsets: if inline_formset.tab == tab_name or ( inline_formset.tab is None and tab_name == default_tab_name): tab_obj.inline_formsets.append(inline_formset) tabs.append(tab_obj) if len(tabs) > 1: for tab in tabs: if tab.invalid: tab.active = True break else: tabs[0].active = True context["tabs"] = tabs return get_original(ModelAdmin)(self, request, context, add=add, change=change, form_url=form_url, obj=obj)
def get_ordering(self, request, queryset): if self.sortable_allowed: return [self.model_admin.sortable, "-" + self.model._meta.pk.name] else: return get_original(ChangeList)(self, request, queryset)
def get_sortable_by(self, request): if self.sortable and self.has_change_permission(request): return [] else: return get_original(ModelAdmin)(self, request)
def get_ordering_field_columns(self): if self.sortable_allowed: return OrderedDict() else: return get_original(ChangeList)(self)
def __init__(self, *args, **kwargs): self.tab = kwargs.pop("tab", None) get_original(Fieldset)(self, *args, **kwargs)
def changelist_view(self, request, extra_context=None): response = get_original(MPTTModelAdmin)(self, request, extra_context) if self.is_bulk_edit(request): self.model._default_manager.rebuild() return response
def get_changelist_form(self, *args, **kwargs): form = get_original(ModelAdmin)(self, *args, **kwargs) if form.default_renderer is None: form.default_renderer = PaperFormRenderer return form
def __init__(self, *args, **kwargs): prepopulated_fields = kwargs.pop("prepopulated_fields", None) or {} get_original(AdminField)(self, *args, **kwargs) self.is_prepopulated = self.field.name in prepopulated_fields
def __init__(self, *args, **kwargs): get_original(InlineAdminFormSet)(self, *args, **kwargs) self.sortable_allowed = self.model_admin.sortable and self.has_change_permission
def __init__(self, rel, admin_site, attrs=None, using=None): get_original(ManyToManyRawIdWidget)(self, rel, admin_site, attrs=attrs, using=using) self.attrs["class"] = (self.attrs.get("class", "") + " vManyToManyRawIdAdminField").strip()
def _set_order(self, order_dict): get_original(MPTTModelAdmin)(self, order_dict) self.model._default_manager.rebuild()
def save_model(self, request, obj, form, change): if self.sortable and not change: order_value = self.model._default_manager.aggregate( max_order=models.Max(self.sortable))["max_order"] or 0 setattr(obj, self.sortable, order_value + 1) get_original(ModelAdmin)(self, request, obj, form, change)
def __init__(self, *args, **kwargs): get_original(AdminReadonlyField)(self, *args, **kwargs) self.is_prepopulated = False self.field["contents"] = self.contents()
def __init__(self, request, *args, **kwargs): self.request = request get_original(ChangeList)(self, request, *args, **kwargs)
def __init__(self, *args, **kwargs): self.prepopulated_fields = kwargs.pop("prepopulated_fields", None) get_original(Fieldset)(self, *args, **kwargs)
def get_context(self, name, value, attrs): # disable select2 allowClear attrs = attrs or {} attrs.setdefault("data-allow-clear", "false") return get_original(widgets.SelectDateWidget)(self, name, value, attrs)
def save_model(self, request, obj, form, change): get_original(MPTTModelAdmin)(self, request, obj, form, change) if not self.is_bulk_edit(request): self.model._default_manager.rebuild()