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 ConstanceAdmin as BaseConstanceAdmin
from dalf.admin import DALFRelatedFieldAjax, DALFRelatedOnlyField
from django import forms
from dalf.admin import DALFModelAdmin, DALFRelatedFieldAjax, DALFRelatedOnlyField
from django.apps import apps
from django.conf import settings
from django.contrib import admin
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.db.models import Model
from django.utils.translation import gettext_lazy as _
@ -87,7 +84,7 @@ class FieldsetsMixin:
return fieldsets
class BasicModelAdmin(ModelAdmin):
class ActivationActionsMixin:
@admin.action(description=str(_("activate selected %(verbose_name_plural)s")))
def activate_selected(self, request, queryset) -> str:
if request:
@ -171,7 +168,7 @@ class CategoryChildrenInline(TabularInline):
@admin.register(AttributeGroup)
class AttributeGroupAdmin(FieldsetsMixin, BasicModelAdmin):
class AttributeGroupAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = AttributeGroup # type: ignore
list_display = ("name", "modified")
search_fields = ("uuid", "name")
@ -182,7 +179,7 @@ class AttributeGroupAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(Attribute)
class AttributeAdmin(FieldsetsMixin, BasicModelAdmin):
class AttributeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = Attribute # type: ignore
list_display = ("name", "group", "value_type", "modified")
list_filter = ("value_type", "group", "is_active")
@ -195,7 +192,7 @@ class AttributeAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(AttributeValue)
class AttributeValueAdmin(FieldsetsMixin, BasicModelAdmin):
class AttributeValueAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = AttributeValue # type: ignore
list_display = ("attribute", "value", "modified")
list_filter = ("attribute__group", "is_active")
@ -208,7 +205,7 @@ class AttributeValueAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(Category)
class CategoryAdmin(FieldsetsMixin, DraggableMPTTAdmin, BasicModelAdmin):
class CategoryAdmin(FieldsetsMixin, DraggableMPTTAdmin, ActivationActionsMixin, ModelAdmin):
model = Category # type: ignore
list_display = ("indented_title", "parent", "is_active", "modified")
# noinspection PyUnresolvedReferences
@ -223,7 +220,7 @@ class CategoryAdmin(FieldsetsMixin, DraggableMPTTAdmin, BasicModelAdmin):
@admin.register(Brand)
class BrandAdmin(FieldsetsMixin, BasicModelAdmin):
class BrandAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = Brand # type: ignore
list_display = ("name",)
list_filter = ("categories", "is_active")
@ -235,7 +232,7 @@ class BrandAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(Product)
class ProductAdmin(FieldsetsMixin, BasicModelAdmin):
class ProductAdmin(FieldsetsMixin, ActivationActionsMixin, DALFModelAdmin):
model = Product # type: ignore
list_display = (
"name",
@ -272,39 +269,9 @@ class ProductAdmin(FieldsetsMixin, BasicModelAdmin):
general_fields = ["is_active", "name", "partnumber", "is_digital"]
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)
class ProductTagAdmin(FieldsetsMixin, BasicModelAdmin):
class ProductTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = ProductTag # type: ignore
list_display = ("tag_name",)
search_fields = ("tag_name",)
@ -315,7 +282,7 @@ class ProductTagAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(CategoryTag)
class CategoryTagAdmin(FieldsetsMixin, BasicModelAdmin):
class CategoryTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = CategoryTag # type: ignore
list_display = ("tag_name",)
search_fields = ("tag_name",)
@ -326,7 +293,7 @@ class CategoryTagAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(Vendor)
class VendorAdmin(FieldsetsMixin, BasicModelAdmin):
class VendorAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = Vendor # type: ignore
list_display = ("name", "markup_percent", "modified")
list_filter = ("markup_percent", "is_active")
@ -339,7 +306,7 @@ class VendorAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(Feedback)
class FeedbackAdmin(FieldsetsMixin, BasicModelAdmin):
class FeedbackAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = Feedback # type: ignore
list_display = ("order_product", "rating", "comment", "modified")
list_filter = ("rating", "is_active")
@ -351,7 +318,7 @@ class FeedbackAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(Order)
class OrderAdmin(FieldsetsMixin, BasicModelAdmin):
class OrderAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = Order # type: ignore
list_display = (
"human_readable_id",
@ -379,7 +346,7 @@ class OrderAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(OrderProduct)
class OrderProductAdmin(FieldsetsMixin, BasicModelAdmin):
class OrderProductAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = OrderProduct # type: ignore
list_display = ("order", "product", "quantity", "buy_price", "status", "modified")
list_filter = ("status",)
@ -392,7 +359,7 @@ class OrderProductAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(PromoCode)
class PromoCodeAdmin(FieldsetsMixin, BasicModelAdmin):
class PromoCodeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = PromoCode # type: ignore
list_display = (
"code",
@ -420,7 +387,7 @@ class PromoCodeAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(Promotion)
class PromotionAdmin(FieldsetsMixin, BasicModelAdmin):
class PromotionAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = Promotion # type: ignore
list_display = ("name", "discount_percent", "modified")
search_fields = ("name",)
@ -432,7 +399,7 @@ class PromotionAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(Stock)
class StockAdmin(FieldsetsMixin, BasicModelAdmin):
class StockAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = Stock # type: ignore
list_display = ("product", "vendor", "sku", "quantity", "price", "modified")
list_filter = ("vendor", "quantity")
@ -452,7 +419,7 @@ class StockAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(Wishlist)
class WishlistAdmin(FieldsetsMixin, BasicModelAdmin):
class WishlistAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = Wishlist # type: ignore
list_display = ("user", "modified")
search_fields = ("user__email",)
@ -463,7 +430,7 @@ class WishlistAdmin(FieldsetsMixin, BasicModelAdmin):
@admin.register(ProductImage)
class ProductImageAdmin(FieldsetsMixin, BasicModelAdmin):
class ProductImageAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = ProductImage # type: ignore
list_display = ("alt", "product", "priority", "modified")
list_filter = ("priority",)