예제 #1
0
 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)
예제 #2
0
 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)
예제 #3
0
 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)
예제 #4
0
    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
예제 #5
0
 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)
예제 #6
0
    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]
예제 #7
0
    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)
예제 #8
0
 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
예제 #9
0
 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)
예제 #10
0
 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)
예제 #11
0
    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)
예제 #12
0
    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
예제 #13
0
    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
예제 #14
0
    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)
예제 #15
0
 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)
예제 #16
0
 def get_sortable_by(self, request):
     if self.sortable and self.has_change_permission(request):
         return []
     else:
         return get_original(ModelAdmin)(self, request)
예제 #17
0
 def get_ordering_field_columns(self):
     if self.sortable_allowed:
         return OrderedDict()
     else:
         return get_original(ChangeList)(self)
예제 #18
0
 def __init__(self, *args, **kwargs):
     self.tab = kwargs.pop("tab", None)
     get_original(Fieldset)(self, *args, **kwargs)
예제 #19
0
 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
예제 #20
0
 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
예제 #21
0
 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
예제 #22
0
 def __init__(self, *args, **kwargs):
     get_original(InlineAdminFormSet)(self, *args, **kwargs)
     self.sortable_allowed = self.model_admin.sortable and self.has_change_permission
예제 #23
0
 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()
예제 #24
0
 def _set_order(self, order_dict):
     get_original(MPTTModelAdmin)(self, order_dict)
     self.model._default_manager.rebuild()
예제 #25
0
 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)
예제 #26
0
 def __init__(self, *args, **kwargs):
     get_original(AdminReadonlyField)(self, *args, **kwargs)
     self.is_prepopulated = False
     self.field["contents"] = self.contents()
예제 #27
0
 def __init__(self, request, *args, **kwargs):
     self.request = request
     get_original(ChangeList)(self, request, *args, **kwargs)
예제 #28
0
 def __init__(self, *args, **kwargs):
     self.prepopulated_fields = kwargs.pop("prepopulated_fields", None)
     get_original(Fieldset)(self, *args, **kwargs)
예제 #29
0
 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)
예제 #30
0
 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()