From 19c0ca377a41a0d595c8038a1a71a07078b3e64b Mon Sep 17 00:00:00 2001 From: Egor fureunoir Gorbunov Date: Tue, 1 Jul 2025 13:43:14 +0300 Subject: [PATCH] Features: 1) Add `ActivationActionsMixin` functionality to admin classes for streamlined activation/deactivation actions; 2) Utilize `@register` decorator for model admin classes across apps for cleaner registration. Fixes: 1) Correct use of `@action` decorator within `ActivationActionsMixin` for defining admin actions; 2) Remove unused `BasicModelAdmin` inheritance from multiple admin classes. Extra: Refactor and simplify admin imports and site registration for better readability and maintainability. --- blog/admin.py | 12 +++++----- core/admin.py | 53 ++++++++++++++++++++++----------------------- payments/admin.py | 16 +++++--------- vibes_auth/admin.py | 10 ++++----- 4 files changed, 43 insertions(+), 48 deletions(-) diff --git a/blog/admin.py b/blog/admin.py index 44a1d244..cb541609 100644 --- a/blog/admin.py +++ b/blog/admin.py @@ -1,13 +1,13 @@ -from django.contrib import admin +from django.contrib.admin import ModelAdmin, register from django_summernote.admin import SummernoteModelAdminMixin -from core.admin import BasicModelAdmin, FieldsetsMixin +from core.admin import ActivationActionsMixin, FieldsetsMixin from .models import Post, PostTag -@admin.register(Post) -class PostAdmin(SummernoteModelAdminMixin, FieldsetsMixin, BasicModelAdmin): +@register(Post) +class PostAdmin(SummernoteModelAdminMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin): list_display = ("title", "author", "slug", "created", "modified") list_filter = ("author", "tags", "created", "modified") search_fields = ("title", "content", "slug") @@ -33,8 +33,8 @@ class PostAdmin(SummernoteModelAdminMixin, FieldsetsMixin, BasicModelAdmin): ] -@admin.register(PostTag) -class PostTagAdmin(admin.ModelAdmin): +@register(PostTag) +class PostTagAdmin(ModelAdmin): list_display = ("tag_name", "name") search_fields = ("tag_name", "name") ordering = ("tag_name",) diff --git a/core/admin.py b/core/admin.py index ad8cb4d4..4b6054ec 100644 --- a/core/admin.py +++ b/core/admin.py @@ -4,8 +4,7 @@ from constance.admin import Config from constance.admin import ConstanceAdmin as BaseConstanceAdmin from dalf.admin import DALFModelAdmin, DALFRelatedFieldAjax, DALFRelatedOnlyField from django.apps import apps -from django.contrib import admin -from django.contrib.admin import ModelAdmin, TabularInline +from django.contrib.admin import ModelAdmin, TabularInline, action, register, site from django.contrib.gis.admin import GISModelAdmin from django.db.models import Model from django.utils.translation import gettext_lazy as _ @@ -85,14 +84,14 @@ class FieldsetsMixin: class ActivationActionsMixin: - @admin.action(description=str(_("activate selected %(verbose_name_plural)s"))) + @action(description=str(_("activate selected %(verbose_name_plural)s"))) def activate_selected(self, request, queryset) -> str: if request: pass queryset.update(is_active=True) return str(_("%(verbose_name_plural)s activated successfully!")) - @admin.action(description=str(_("deactivate selected %(verbose_name_plural)s"))) + @action(description=str(_("deactivate selected %(verbose_name_plural)s"))) def deactivate_selected(self, request, queryset) -> str: if request: pass @@ -167,7 +166,7 @@ class CategoryChildrenInline(TabularInline): icon = "fa-solid fa-leaf" -@admin.register(AttributeGroup) +@register(AttributeGroup) class AttributeGroupAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): model = AttributeGroup # type: ignore list_display = ("name", "modified") @@ -178,7 +177,7 @@ class AttributeGroupAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): relation_fields = [] -@admin.register(Attribute) +@register(Attribute) class AttributeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): model = Attribute # type: ignore list_display = ("name", "group", "value_type", "modified") @@ -191,7 +190,7 @@ class AttributeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): relation_fields = ["group", "categories"] -@admin.register(AttributeValue) +@register(AttributeValue) class AttributeValueAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): model = AttributeValue # type: ignore list_display = ("attribute", "value", "modified") @@ -204,7 +203,7 @@ class AttributeValueAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): relation_fields = ["attribute", "product"] -@admin.register(Category) +@register(Category) class CategoryAdmin(FieldsetsMixin, DraggableMPTTAdmin, ActivationActionsMixin, ModelAdmin): model = Category # type: ignore list_display = ("indented_title", "parent", "is_active", "modified") @@ -219,7 +218,7 @@ class CategoryAdmin(FieldsetsMixin, DraggableMPTTAdmin, ActivationActionsMixin, relation_fields = ["parent", "tags"] -@admin.register(Brand) +@register(Brand) class BrandAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): model = Brand # type: ignore list_display = ("name",) @@ -231,7 +230,7 @@ class BrandAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): relation_fields = ["small_logo", "big_logo", "categories"] -@admin.register(Product) +@register(Product) class ProductAdmin(FieldsetsMixin, ActivationActionsMixin, DALFModelAdmin): model = Product # type: ignore list_display = ( @@ -270,7 +269,7 @@ class ProductAdmin(FieldsetsMixin, ActivationActionsMixin, DALFModelAdmin): relation_fields = ["category", "brand", "tags"] -@admin.register(ProductTag) +@register(ProductTag) class ProductTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): model = ProductTag # type: ignore list_display = ("tag_name",) @@ -281,7 +280,7 @@ class ProductTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): relation_fields = [] -@admin.register(CategoryTag) +@register(CategoryTag) class CategoryTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): model = CategoryTag # type: ignore list_display = ("tag_name",) @@ -292,7 +291,7 @@ class CategoryTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): relation_fields = [] -@admin.register(Vendor) +@register(Vendor) class VendorAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): model = Vendor # type: ignore list_display = ("name", "markup_percent", "modified") @@ -305,7 +304,7 @@ class VendorAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): relation_fields = [] -@admin.register(Feedback) +@register(Feedback) class FeedbackAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): model = Feedback # type: ignore list_display = ("order_product", "rating", "comment", "modified") @@ -317,7 +316,7 @@ class FeedbackAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): relation_fields = ["order_product"] -@admin.register(Order) +@register(Order) class OrderAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): model = Order # type: ignore list_display = ( @@ -345,7 +344,7 @@ class OrderAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): relation_fields = ["promo_code", "billing_address", "shipping_address"] -@admin.register(OrderProduct) +@register(OrderProduct) class OrderProductAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): model = OrderProduct # type: ignore list_display = ("order", "product", "quantity", "buy_price", "status", "modified") @@ -358,7 +357,7 @@ class OrderProductAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): relation_fields = ["order", "product"] -@admin.register(PromoCode) +@register(PromoCode) class PromoCodeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): model = PromoCode # type: ignore list_display = ( @@ -386,7 +385,7 @@ class PromoCodeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): relation_fields = ["user"] -@admin.register(Promotion) +@register(Promotion) class PromotionAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): model = Promotion # type: ignore list_display = ("name", "discount_percent", "modified") @@ -398,7 +397,7 @@ class PromotionAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): relation_fields = ["products"] -@admin.register(Stock) +@register(Stock) class StockAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): model = Stock # type: ignore list_display = ("product", "vendor", "sku", "quantity", "price", "modified") @@ -418,7 +417,7 @@ class StockAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): relation_fields = ["product", "vendor"] -@admin.register(Wishlist) +@register(Wishlist) class WishlistAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): model = Wishlist # type: ignore list_display = ("user", "modified") @@ -429,7 +428,7 @@ class WishlistAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): relation_fields = ["products"] -@admin.register(ProductImage) +@register(ProductImage) class ProductImageAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): model = ProductImage # type: ignore list_display = ("alt", "product", "priority", "modified") @@ -442,7 +441,7 @@ class ProductImageAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): relation_fields = ["product"] -@admin.register(Address) +@register(Address) class AddressAdmin(FieldsetsMixin, GISModelAdmin): model = Address # type: ignore list_display = ("street", "city", "region", "country", "user") @@ -504,8 +503,8 @@ class ConstanceConfig: _meta = Meta() -admin.site.unregister([Config]) # type: ignore -admin.site.register([ConstanceConfig], BaseConstanceAdmin) # type: ignore -admin.site.site_title = CONSTANCE_CONFIG["PROJECT_NAME"][0] # type: ignore -admin.site.site_header = "eVibes" -admin.site.index_title = CONSTANCE_CONFIG["PROJECT_NAME"][0] # type: ignore +site.unregister([Config]) # type: ignore +site.register([ConstanceConfig], BaseConstanceAdmin) # type: ignore +site.site_title = CONSTANCE_CONFIG["PROJECT_NAME"][0] # type: ignore +site.site_header = "eVibes" +site.index_title = CONSTANCE_CONFIG["PROJECT_NAME"][0] # type: ignore diff --git a/payments/admin.py b/payments/admin.py index 9de87f4b..b5ac1c9b 100644 --- a/payments/admin.py +++ b/payments/admin.py @@ -1,8 +1,8 @@ -# noinspection PyUnresolvedReferences from django.contrib import admin +from django.contrib.admin import ModelAdmin, register from django.utils.translation import gettext_lazy as _ -from core.admin import BasicModelAdmin +from core.admin import ActivationActionsMixin from payments.forms import TransactionForm from payments.models import Balance, Transaction @@ -19,8 +19,8 @@ class TransactionInline(admin.TabularInline): qs = super().get_queryset(request) return qs.select_related("order") - -class BalanceAdmin(BasicModelAdmin): +@register(Balance) +class BalanceAdmin(ActivationActionsMixin, ModelAdmin): inlines = (TransactionInline,) list_display = ("user", "amount") search_fields = ("user__email",) @@ -30,14 +30,10 @@ class BalanceAdmin(BasicModelAdmin): qs = super().get_queryset(request) return qs.prefetch_related("transactions", "user") - -class TransactionAdmin(BasicModelAdmin): +@register(Transaction) +class TransactionAdmin(ActivationActionsMixin, ModelAdmin): list_display = ("balance", "amount", "currency", "payment_method", "order") search_fields = ("balance__user__email", "currency", "payment_method") list_filter = ("currency", "payment_method") ordering = ("balance",) form = TransactionForm - - -admin.site.register(Balance, BalanceAdmin) -admin.site.register(Transaction, TransactionAdmin) diff --git a/vibes_auth/admin.py b/vibes_auth/admin.py index 3c1fc286..84f7ca3a 100644 --- a/vibes_auth/admin.py +++ b/vibes_auth/admin.py @@ -22,7 +22,7 @@ from rest_framework_simplejwt.token_blacklist.models import ( OutstandingToken as BaseOutstandingToken, ) -from core.admin import BasicModelAdmin +from core.admin import ActivationActionsMixin from core.models import Order from payments.models import Balance from vibes_auth.forms import UserForm @@ -48,7 +48,7 @@ class OrderInline(admin.TabularInline): icon = "fa-solid fa-cart-shopping" -class UserAdmin(BaseUserAdmin, BasicModelAdmin): +class UserAdmin(ActivationActionsMixin, BaseUserAdmin): inlines = (BalanceInline, OrderInline) fieldsets = ( (None, {"fields": ("email", "password")}), @@ -110,15 +110,15 @@ class UserAdmin(BaseUserAdmin, BasicModelAdmin): super().save_model(request, obj, form, change) -class GroupAdmin(BaseGroupAdmin, BasicModelAdmin): +class GroupAdmin(BaseGroupAdmin): pass -class BlacklistedTokenAdmin(BaseBlacklistedTokenAdmin, BasicModelAdmin): +class BlacklistedTokenAdmin(BaseBlacklistedTokenAdmin): pass -class OutstandingTokenAdmin(BaseOutstandingTokenAdmin, BasicModelAdmin): +class OutstandingTokenAdmin(BaseOutstandingTokenAdmin): pass