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.
This commit is contained in:
Egor Pavlovich Gorbunov 2025-07-01 13:43:14 +03:00
parent 9e2bf380dd
commit 19c0ca377a
4 changed files with 43 additions and 48 deletions

View file

@ -1,13 +1,13 @@
from django.contrib import admin from django.contrib.admin import ModelAdmin, register
from django_summernote.admin import SummernoteModelAdminMixin from django_summernote.admin import SummernoteModelAdminMixin
from core.admin import BasicModelAdmin, FieldsetsMixin from core.admin import ActivationActionsMixin, FieldsetsMixin
from .models import Post, PostTag from .models import Post, PostTag
@admin.register(Post) @register(Post)
class PostAdmin(SummernoteModelAdminMixin, FieldsetsMixin, BasicModelAdmin): class PostAdmin(SummernoteModelAdminMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
list_display = ("title", "author", "slug", "created", "modified") list_display = ("title", "author", "slug", "created", "modified")
list_filter = ("author", "tags", "created", "modified") list_filter = ("author", "tags", "created", "modified")
search_fields = ("title", "content", "slug") search_fields = ("title", "content", "slug")
@ -33,8 +33,8 @@ class PostAdmin(SummernoteModelAdminMixin, FieldsetsMixin, BasicModelAdmin):
] ]
@admin.register(PostTag) @register(PostTag)
class PostTagAdmin(admin.ModelAdmin): class PostTagAdmin(ModelAdmin):
list_display = ("tag_name", "name") list_display = ("tag_name", "name")
search_fields = ("tag_name", "name") search_fields = ("tag_name", "name")
ordering = ("tag_name",) ordering = ("tag_name",)

View file

@ -4,8 +4,7 @@ from constance.admin import Config
from constance.admin import ConstanceAdmin as BaseConstanceAdmin from constance.admin import ConstanceAdmin as BaseConstanceAdmin
from dalf.admin import DALFModelAdmin, DALFRelatedFieldAjax, DALFRelatedOnlyField from dalf.admin import DALFModelAdmin, DALFRelatedFieldAjax, DALFRelatedOnlyField
from django.apps import apps from django.apps import apps
from django.contrib import admin from django.contrib.admin import ModelAdmin, TabularInline, action, register, site
from django.contrib.admin import ModelAdmin, TabularInline
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 _
@ -85,14 +84,14 @@ class FieldsetsMixin:
class ActivationActionsMixin: 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: def activate_selected(self, request, queryset) -> str:
if request: if request:
pass pass
queryset.update(is_active=True) queryset.update(is_active=True)
return str(_("%(verbose_name_plural)s activated successfully!")) 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: def deactivate_selected(self, request, queryset) -> str:
if request: if request:
pass pass
@ -167,7 +166,7 @@ class CategoryChildrenInline(TabularInline):
icon = "fa-solid fa-leaf" icon = "fa-solid fa-leaf"
@admin.register(AttributeGroup) @register(AttributeGroup)
class AttributeGroupAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): class AttributeGroupAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = AttributeGroup # type: ignore model = AttributeGroup # type: ignore
list_display = ("name", "modified") list_display = ("name", "modified")
@ -178,7 +177,7 @@ class AttributeGroupAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
relation_fields = [] relation_fields = []
@admin.register(Attribute) @register(Attribute)
class AttributeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): 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")
@ -191,7 +190,7 @@ class AttributeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
relation_fields = ["group", "categories"] relation_fields = ["group", "categories"]
@admin.register(AttributeValue) @register(AttributeValue)
class AttributeValueAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): class AttributeValueAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = AttributeValue # type: ignore model = AttributeValue # type: ignore
list_display = ("attribute", "value", "modified") list_display = ("attribute", "value", "modified")
@ -204,7 +203,7 @@ class AttributeValueAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
relation_fields = ["attribute", "product"] relation_fields = ["attribute", "product"]
@admin.register(Category) @register(Category)
class CategoryAdmin(FieldsetsMixin, DraggableMPTTAdmin, ActivationActionsMixin, ModelAdmin): 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")
@ -219,7 +218,7 @@ class CategoryAdmin(FieldsetsMixin, DraggableMPTTAdmin, ActivationActionsMixin,
relation_fields = ["parent", "tags"] relation_fields = ["parent", "tags"]
@admin.register(Brand) @register(Brand)
class BrandAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): class BrandAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = Brand # type: ignore model = Brand # type: ignore
list_display = ("name",) list_display = ("name",)
@ -231,7 +230,7 @@ class BrandAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
relation_fields = ["small_logo", "big_logo", "categories"] relation_fields = ["small_logo", "big_logo", "categories"]
@admin.register(Product) @register(Product)
class ProductAdmin(FieldsetsMixin, ActivationActionsMixin, DALFModelAdmin): class ProductAdmin(FieldsetsMixin, ActivationActionsMixin, DALFModelAdmin):
model = Product # type: ignore model = Product # type: ignore
list_display = ( list_display = (
@ -270,7 +269,7 @@ class ProductAdmin(FieldsetsMixin, ActivationActionsMixin, DALFModelAdmin):
relation_fields = ["category", "brand", "tags"] relation_fields = ["category", "brand", "tags"]
@admin.register(ProductTag) @register(ProductTag)
class ProductTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): class ProductTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = ProductTag # type: ignore model = ProductTag # type: ignore
list_display = ("tag_name",) list_display = ("tag_name",)
@ -281,7 +280,7 @@ class ProductTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
relation_fields = [] relation_fields = []
@admin.register(CategoryTag) @register(CategoryTag)
class CategoryTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): class CategoryTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = CategoryTag # type: ignore model = CategoryTag # type: ignore
list_display = ("tag_name",) list_display = ("tag_name",)
@ -292,7 +291,7 @@ class CategoryTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
relation_fields = [] relation_fields = []
@admin.register(Vendor) @register(Vendor)
class VendorAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): 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")
@ -305,7 +304,7 @@ class VendorAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
relation_fields = [] relation_fields = []
@admin.register(Feedback) @register(Feedback)
class FeedbackAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): 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")
@ -317,7 +316,7 @@ class FeedbackAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
relation_fields = ["order_product"] relation_fields = ["order_product"]
@admin.register(Order) @register(Order)
class OrderAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): class OrderAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = Order # type: ignore model = Order # type: ignore
list_display = ( list_display = (
@ -345,7 +344,7 @@ class OrderAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
relation_fields = ["promo_code", "billing_address", "shipping_address"] relation_fields = ["promo_code", "billing_address", "shipping_address"]
@admin.register(OrderProduct) @register(OrderProduct)
class OrderProductAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): 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")
@ -358,7 +357,7 @@ class OrderProductAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
relation_fields = ["order", "product"] relation_fields = ["order", "product"]
@admin.register(PromoCode) @register(PromoCode)
class PromoCodeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): class PromoCodeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = PromoCode # type: ignore model = PromoCode # type: ignore
list_display = ( list_display = (
@ -386,7 +385,7 @@ class PromoCodeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
relation_fields = ["user"] relation_fields = ["user"]
@admin.register(Promotion) @register(Promotion)
class PromotionAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): 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")
@ -398,7 +397,7 @@ class PromotionAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
relation_fields = ["products"] relation_fields = ["products"]
@admin.register(Stock) @register(Stock)
class StockAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): 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")
@ -418,7 +417,7 @@ class StockAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
relation_fields = ["product", "vendor"] relation_fields = ["product", "vendor"]
@admin.register(Wishlist) @register(Wishlist)
class WishlistAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): class WishlistAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
model = Wishlist # type: ignore model = Wishlist # type: ignore
list_display = ("user", "modified") list_display = ("user", "modified")
@ -429,7 +428,7 @@ class WishlistAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
relation_fields = ["products"] relation_fields = ["products"]
@admin.register(ProductImage) @register(ProductImage)
class ProductImageAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): 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")
@ -442,7 +441,7 @@ class ProductImageAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
relation_fields = ["product"] relation_fields = ["product"]
@admin.register(Address) @register(Address)
class AddressAdmin(FieldsetsMixin, GISModelAdmin): class AddressAdmin(FieldsetsMixin, GISModelAdmin):
model = Address # type: ignore model = Address # type: ignore
list_display = ("street", "city", "region", "country", "user") list_display = ("street", "city", "region", "country", "user")
@ -504,8 +503,8 @@ class ConstanceConfig:
_meta = Meta() _meta = Meta()
admin.site.unregister([Config]) # type: ignore site.unregister([Config]) # type: ignore
admin.site.register([ConstanceConfig], BaseConstanceAdmin) # type: ignore site.register([ConstanceConfig], BaseConstanceAdmin) # type: ignore
admin.site.site_title = CONSTANCE_CONFIG["PROJECT_NAME"][0] # type: ignore site.site_title = CONSTANCE_CONFIG["PROJECT_NAME"][0] # type: ignore
admin.site.site_header = "eVibes" site.site_header = "eVibes"
admin.site.index_title = CONSTANCE_CONFIG["PROJECT_NAME"][0] # type: ignore site.index_title = CONSTANCE_CONFIG["PROJECT_NAME"][0] # type: ignore

View file

@ -1,8 +1,8 @@
# noinspection PyUnresolvedReferences
from django.contrib import admin from django.contrib import admin
from django.contrib.admin import ModelAdmin, register
from django.utils.translation import gettext_lazy as _ 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.forms import TransactionForm
from payments.models import Balance, Transaction from payments.models import Balance, Transaction
@ -19,8 +19,8 @@ class TransactionInline(admin.TabularInline):
qs = super().get_queryset(request) qs = super().get_queryset(request)
return qs.select_related("order") return qs.select_related("order")
@register(Balance)
class BalanceAdmin(BasicModelAdmin): class BalanceAdmin(ActivationActionsMixin, ModelAdmin):
inlines = (TransactionInline,) inlines = (TransactionInline,)
list_display = ("user", "amount") list_display = ("user", "amount")
search_fields = ("user__email",) search_fields = ("user__email",)
@ -30,14 +30,10 @@ class BalanceAdmin(BasicModelAdmin):
qs = super().get_queryset(request) qs = super().get_queryset(request)
return qs.prefetch_related("transactions", "user") return qs.prefetch_related("transactions", "user")
@register(Transaction)
class TransactionAdmin(BasicModelAdmin): class TransactionAdmin(ActivationActionsMixin, ModelAdmin):
list_display = ("balance", "amount", "currency", "payment_method", "order") list_display = ("balance", "amount", "currency", "payment_method", "order")
search_fields = ("balance__user__email", "currency", "payment_method") search_fields = ("balance__user__email", "currency", "payment_method")
list_filter = ("currency", "payment_method") list_filter = ("currency", "payment_method")
ordering = ("balance",) ordering = ("balance",)
form = TransactionForm form = TransactionForm
admin.site.register(Balance, BalanceAdmin)
admin.site.register(Transaction, TransactionAdmin)

View file

@ -22,7 +22,7 @@ from rest_framework_simplejwt.token_blacklist.models import (
OutstandingToken as BaseOutstandingToken, OutstandingToken as BaseOutstandingToken,
) )
from core.admin import BasicModelAdmin from core.admin import ActivationActionsMixin
from core.models import Order from core.models import Order
from payments.models import Balance from payments.models import Balance
from vibes_auth.forms import UserForm from vibes_auth.forms import UserForm
@ -48,7 +48,7 @@ class OrderInline(admin.TabularInline):
icon = "fa-solid fa-cart-shopping" icon = "fa-solid fa-cart-shopping"
class UserAdmin(BaseUserAdmin, BasicModelAdmin): class UserAdmin(ActivationActionsMixin, BaseUserAdmin):
inlines = (BalanceInline, OrderInline) inlines = (BalanceInline, OrderInline)
fieldsets = ( fieldsets = (
(None, {"fields": ("email", "password")}), (None, {"fields": ("email", "password")}),
@ -110,15 +110,15 @@ class UserAdmin(BaseUserAdmin, BasicModelAdmin):
super().save_model(request, obj, form, change) super().save_model(request, obj, form, change)
class GroupAdmin(BaseGroupAdmin, BasicModelAdmin): class GroupAdmin(BaseGroupAdmin):
pass pass
class BlacklistedTokenAdmin(BaseBlacklistedTokenAdmin, BasicModelAdmin): class BlacklistedTokenAdmin(BaseBlacklistedTokenAdmin):
pass pass
class OutstandingTokenAdmin(BaseOutstandingTokenAdmin, BasicModelAdmin): class OutstandingTokenAdmin(BaseOutstandingTokenAdmin):
pass pass