Features: 1) Introduced ActivationActionsMixin to centralize activation-related admin actions; 2) Integrated DALFModelAdmin for enhanced admin functionality in ProductAdmin.

Fixes: 1) Removed unused imports to reduce clutter; 2) Simplified media property in `ProductAdmin` by removing unnecessary customization logic.

Extra: Refactored all admin model classes to utilize `ActivationActionsMixin` for consistency and maintainability.
This commit is contained in:
Egor Pavlovich Gorbunov 2025-07-01 13:37:50 +03:00
parent 1edec85c3a
commit 9e2bf380dd

View file

@ -2,13 +2,10 @@ from contextlib import suppress
from constance.admin import Config from constance.admin import Config
from constance.admin import ConstanceAdmin as BaseConstanceAdmin from constance.admin import ConstanceAdmin as BaseConstanceAdmin
from dalf.admin import DALFRelatedFieldAjax, DALFRelatedOnlyField from dalf.admin import DALFModelAdmin, DALFRelatedFieldAjax, DALFRelatedOnlyField
from django import forms
from django.apps import apps from django.apps import apps
from django.conf import settings
from django.contrib import admin from django.contrib import admin
from django.contrib.admin import ModelAdmin, TabularInline from django.contrib.admin import ModelAdmin, TabularInline
from django.contrib.admin.widgets import get_select2_language
from django.contrib.gis.admin import GISModelAdmin from django.contrib.gis.admin import GISModelAdmin
from django.db.models import Model from django.db.models import Model
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@ -87,7 +84,7 @@ class FieldsetsMixin:
return fieldsets return fieldsets
class BasicModelAdmin(ModelAdmin): class ActivationActionsMixin:
@admin.action(description=str(_("activate selected %(verbose_name_plural)s"))) @admin.action(description=str(_("activate selected %(verbose_name_plural)s")))
def activate_selected(self, request, queryset) -> str: def activate_selected(self, request, queryset) -> str:
if request: if request:
@ -171,7 +168,7 @@ class CategoryChildrenInline(TabularInline):
@admin.register(AttributeGroup) @admin.register(AttributeGroup)
class AttributeGroupAdmin(FieldsetsMixin, BasicModelAdmin): class AttributeGroupAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = AttributeGroup # type: ignore model = AttributeGroup # type: ignore
list_display = ("name", "modified") list_display = ("name", "modified")
search_fields = ("uuid", "name") search_fields = ("uuid", "name")
@ -182,7 +179,7 @@ class AttributeGroupAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(Attribute) @admin.register(Attribute)
class AttributeAdmin(FieldsetsMixin, BasicModelAdmin): class AttributeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = Attribute # type: ignore model = Attribute # type: ignore
list_display = ("name", "group", "value_type", "modified") list_display = ("name", "group", "value_type", "modified")
list_filter = ("value_type", "group", "is_active") list_filter = ("value_type", "group", "is_active")
@ -195,7 +192,7 @@ class AttributeAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(AttributeValue) @admin.register(AttributeValue)
class AttributeValueAdmin(FieldsetsMixin, BasicModelAdmin): class AttributeValueAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = AttributeValue # type: ignore model = AttributeValue # type: ignore
list_display = ("attribute", "value", "modified") list_display = ("attribute", "value", "modified")
list_filter = ("attribute__group", "is_active") list_filter = ("attribute__group", "is_active")
@ -208,7 +205,7 @@ class AttributeValueAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(Category) @admin.register(Category)
class CategoryAdmin(FieldsetsMixin, DraggableMPTTAdmin, BasicModelAdmin): class CategoryAdmin(FieldsetsMixin, DraggableMPTTAdmin, ActivationActionsMixin, ModelAdmin):
model = Category # type: ignore model = Category # type: ignore
list_display = ("indented_title", "parent", "is_active", "modified") list_display = ("indented_title", "parent", "is_active", "modified")
# noinspection PyUnresolvedReferences # noinspection PyUnresolvedReferences
@ -223,7 +220,7 @@ class CategoryAdmin(FieldsetsMixin, DraggableMPTTAdmin, BasicModelAdmin):
@admin.register(Brand) @admin.register(Brand)
class BrandAdmin(FieldsetsMixin, BasicModelAdmin): class BrandAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = Brand # type: ignore model = Brand # type: ignore
list_display = ("name",) list_display = ("name",)
list_filter = ("categories", "is_active") list_filter = ("categories", "is_active")
@ -235,7 +232,7 @@ class BrandAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(Product) @admin.register(Product)
class ProductAdmin(FieldsetsMixin, BasicModelAdmin): class ProductAdmin(FieldsetsMixin, ActivationActionsMixin, DALFModelAdmin):
model = Product # type: ignore model = Product # type: ignore
list_display = ( list_display = (
"name", "name",
@ -272,39 +269,9 @@ class ProductAdmin(FieldsetsMixin, BasicModelAdmin):
general_fields = ["is_active", "name", "partnumber", "is_digital"] general_fields = ["is_active", "name", "partnumber", "is_digital"]
relation_fields = ["category", "brand", "tags"] relation_fields = ["category", "brand", "tags"]
@property
def media(self):
i18n_name = get_select2_language()
extra = "" if settings.DEBUG else ".min"
js = [
f"vendor/jquery/jquery{extra}.js",
"jquery.init.js",
"core.js",
"admin/RelatedObjectLookups.js",
"actions.js",
"urlify.js",
"prepopulate.js",
f"vendor/xregexp/xregexp{extra}.js",
"vendor/jquery/jquery.min.js",
"vendor/select2/select2.full.min.js",
f"vendor/select2/i18n/{i18n_name}.js" if i18n_name else (),
"jquery.init.js",
"django_admin_list_filter.js",
]
return super().media + forms.Media(
js=[f"admin/js/{url}" for url in js],
css={
"screen": (
"admin/css/vendor/select2/select2.min.css",
"admin/css/autocomplete.css",
"admin/css/django_admin_list_filter.css",
),
},
)
@admin.register(ProductTag) @admin.register(ProductTag)
class ProductTagAdmin(FieldsetsMixin, BasicModelAdmin): class ProductTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = ProductTag # type: ignore model = ProductTag # type: ignore
list_display = ("tag_name",) list_display = ("tag_name",)
search_fields = ("tag_name",) search_fields = ("tag_name",)
@ -315,7 +282,7 @@ class ProductTagAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(CategoryTag) @admin.register(CategoryTag)
class CategoryTagAdmin(FieldsetsMixin, BasicModelAdmin): class CategoryTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = CategoryTag # type: ignore model = CategoryTag # type: ignore
list_display = ("tag_name",) list_display = ("tag_name",)
search_fields = ("tag_name",) search_fields = ("tag_name",)
@ -326,7 +293,7 @@ class CategoryTagAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(Vendor) @admin.register(Vendor)
class VendorAdmin(FieldsetsMixin, BasicModelAdmin): class VendorAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = Vendor # type: ignore model = Vendor # type: ignore
list_display = ("name", "markup_percent", "modified") list_display = ("name", "markup_percent", "modified")
list_filter = ("markup_percent", "is_active") list_filter = ("markup_percent", "is_active")
@ -339,7 +306,7 @@ class VendorAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(Feedback) @admin.register(Feedback)
class FeedbackAdmin(FieldsetsMixin, BasicModelAdmin): class FeedbackAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = Feedback # type: ignore model = Feedback # type: ignore
list_display = ("order_product", "rating", "comment", "modified") list_display = ("order_product", "rating", "comment", "modified")
list_filter = ("rating", "is_active") list_filter = ("rating", "is_active")
@ -351,7 +318,7 @@ class FeedbackAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(Order) @admin.register(Order)
class OrderAdmin(FieldsetsMixin, BasicModelAdmin): class OrderAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = Order # type: ignore model = Order # type: ignore
list_display = ( list_display = (
"human_readable_id", "human_readable_id",
@ -379,7 +346,7 @@ class OrderAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(OrderProduct) @admin.register(OrderProduct)
class OrderProductAdmin(FieldsetsMixin, BasicModelAdmin): class OrderProductAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = OrderProduct # type: ignore model = OrderProduct # type: ignore
list_display = ("order", "product", "quantity", "buy_price", "status", "modified") list_display = ("order", "product", "quantity", "buy_price", "status", "modified")
list_filter = ("status",) list_filter = ("status",)
@ -392,7 +359,7 @@ class OrderProductAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(PromoCode) @admin.register(PromoCode)
class PromoCodeAdmin(FieldsetsMixin, BasicModelAdmin): class PromoCodeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = PromoCode # type: ignore model = PromoCode # type: ignore
list_display = ( list_display = (
"code", "code",
@ -420,7 +387,7 @@ class PromoCodeAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(Promotion) @admin.register(Promotion)
class PromotionAdmin(FieldsetsMixin, BasicModelAdmin): class PromotionAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = Promotion # type: ignore model = Promotion # type: ignore
list_display = ("name", "discount_percent", "modified") list_display = ("name", "discount_percent", "modified")
search_fields = ("name",) search_fields = ("name",)
@ -432,7 +399,7 @@ class PromotionAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(Stock) @admin.register(Stock)
class StockAdmin(FieldsetsMixin, BasicModelAdmin): class StockAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = Stock # type: ignore model = Stock # type: ignore
list_display = ("product", "vendor", "sku", "quantity", "price", "modified") list_display = ("product", "vendor", "sku", "quantity", "price", "modified")
list_filter = ("vendor", "quantity") list_filter = ("vendor", "quantity")
@ -452,7 +419,7 @@ class StockAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(Wishlist) @admin.register(Wishlist)
class WishlistAdmin(FieldsetsMixin, BasicModelAdmin): class WishlistAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = Wishlist # type: ignore model = Wishlist # type: ignore
list_display = ("user", "modified") list_display = ("user", "modified")
search_fields = ("user__email",) search_fields = ("user__email",)
@ -463,7 +430,7 @@ class WishlistAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(ProductImage) @admin.register(ProductImage)
class ProductImageAdmin(FieldsetsMixin, BasicModelAdmin): class ProductImageAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = ProductImage # type: ignore model = ProductImage # type: ignore
list_display = ("alt", "product", "priority", "modified") list_display = ("alt", "product", "priority", "modified")
list_filter = ("priority",) list_filter = ("priority",)