From b75b0858dfa8b489d6f009064e65b0ee1368e44b Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Mon, 18 May 2026 12:11:09 +0330 Subject: [PATCH] varient drop down --- backend/product/admin.py | 85 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 79 insertions(+), 6 deletions(-) diff --git a/backend/product/admin.py b/backend/product/admin.py index d0db23f..a8c33f3 100644 --- a/backend/product/admin.py +++ b/backend/product/admin.py @@ -1,7 +1,9 @@ from django.contrib import admin, messages from django import forms import logging - +from django.contrib.postgres.aggregates import StringAgg +from django.db.models import Value +from django.db.models.functions import Coalesce logger = logging.getLogger(__name__) # from product.tasks import update_prices from .models import * @@ -346,13 +348,66 @@ class ProductVariantAdmin(ProductVariantAdminPermission, ModelAdmin, ImportExpor cache.delete(HOME_CACHE_KEY) +from unfold.sections import TableSection + +class VariantsTableSection(TableSection): + verbose_name = 'تنوع های محصولی' + related_name = "variants" + height = 380 + fields = [ + 'get_name', + "price", + 'in_stock', + 'sell', + ] + + # @display(description='برگذار شده', label=True) + # def get_done(self, obj): + # from django.utils import timezone + # now = timezone.localtime() + # today = now.date() + # time = now.time() + # return obj.date > today or (obj.date == today and obj.time > time) + + @display(description='نام تنوع') + def get_name(self, obj): + attrs = getattr(obj, "attrs", "") + return f"{obj.product.name} - {attrs}" + + + + + + def get_queryset(self, request): + qs = super().get_queryset(request) + + qs = qs.select_related("product").annotate( + attrs=Coalesce( + StringAgg("product_attributes__value", delimiter=", "), + Value("") + ) + ) + + return qs.only( + "id", + "product__name", + "price", + "in_stock", + "sell", + ) + + + @admin.register(ProductModel) class ProductModelAdmin(ProductAdminPermission, ModelAdmin, ImportExportModelAdmin): + list_sections = [VariantsTableSection] import_form_class = ImportForm export_form_class = ExportForm inlines = [ProductVariantInLine] readonly_fields = ('slug', 'created_at') search_fields = ['name', 'description', ] + + list_per_page = 10 list_filter = [('category', RelatedDropdownFilter), 'show_in_bot', ('category__parent', RelatedDropdownFilter)] list_filter_submit = True autocomplete_fields = ['related_products', 'shop', 'category'] @@ -360,7 +415,7 @@ class ProductModelAdmin(ProductAdminPermission, ModelAdmin, ImportExportModelAdm warn_unsaved_form = True # list_per_page = 2 actions_list = ['redirect_to_learn', 'update_products_price'] - list_display = ['display_image', 'shop__shop_name','display_price', 'view', 'rating', 'category', 'created_at' ,'show_in_website', ] + list_display = ['display_image', 'shop__shop_name', 'view', 'rating', 'category', 'created_at' ,'show_in_website', ] fieldsets = ( ('فیلد های اصلی', {'fields': ('name', 'description', 'category', 'image', 'related_products','show_in_trends', 'show_in_most_viewed', 'show_in_lot_of_discount', 'show_in_top_seller', 'shop', 'show_in_bot', 'bot_banner'), "classes": ["tab"],}), ('فیلد های سيو', {'fields': ('meta_description', 'meta_keywords', 'meta_rating', 'slug'), "classes": ["tab"],}), @@ -388,10 +443,28 @@ class ProductModelAdmin(ProductAdminPermission, ModelAdmin, ImportExportModelAdm super().save_model(request, obj, form, change) cache.delete(HOME_CACHE_KEY) - def display_price(self, obj): - if obj.variants.all().first(): - return obj.variants.all().first().price - display_price.short_description = 'قیمت تومانی' + def get_queryset(self, request): + qs = super().get_queryset(request) + + qs = qs.select_related( + "shop", + "category", + "category__parent", + ).only( + "id", + "name", + "description", + "image", + "view", + "rating", + "created_at", + "show_in_bot", + "category", + "shop", + ) + + return qs + def show_in_website(self, obj): url = f"https://heymlz.com/product/{obj.slug}"