Features: 1) Extend fieldsets by adding additional_fields support in FieldsetsMixin; 2) Add CRMForm for CustomerRelationshipManagementProviderAdmin; 3) Improve Order.__str__ to use human_readable_id for better debugging context;
Fixes: 1) Replace misplaced imports in `core/admin.py` for proper organization; Extra: Adjust admin fieldsets for consistency, formatting, and search enhancements; Minor contributions to migration file cleanup.
This commit is contained in:
parent
c8aaae4946
commit
e0b2f183ce
5 changed files with 506 additions and 129 deletions
618
core/admin.py
618
core/admin.py
|
|
@ -13,7 +13,7 @@ from modeltranslation.translator import NotRegistered, translator
|
||||||
from modeltranslation.utils import get_translation_fields
|
from modeltranslation.utils import get_translation_fields
|
||||||
from mptt.admin import DraggableMPTTAdmin
|
from mptt.admin import DraggableMPTTAdmin
|
||||||
|
|
||||||
from core.forms import OrderForm, OrderProductForm, VendorForm
|
from core.forms import CRMForm, OrderForm, OrderProductForm, VendorForm
|
||||||
from core.models import (
|
from core.models import (
|
||||||
Address,
|
Address,
|
||||||
Attribute,
|
Attribute,
|
||||||
|
|
@ -22,8 +22,10 @@ from core.models import (
|
||||||
Brand,
|
Brand,
|
||||||
Category,
|
Category,
|
||||||
CategoryTag,
|
CategoryTag,
|
||||||
|
CustomerRelationshipManagementProvider,
|
||||||
Feedback,
|
Feedback,
|
||||||
Order,
|
Order,
|
||||||
|
OrderCrmLink,
|
||||||
OrderProduct,
|
OrderProduct,
|
||||||
Product,
|
Product,
|
||||||
ProductImage,
|
ProductImage,
|
||||||
|
|
@ -33,8 +35,6 @@ from core.models import (
|
||||||
Stock,
|
Stock,
|
||||||
Vendor,
|
Vendor,
|
||||||
Wishlist,
|
Wishlist,
|
||||||
CustomerRelationshipManagementProvider,
|
|
||||||
OrderCrmLink,
|
|
||||||
)
|
)
|
||||||
from evibes.settings import CONSTANCE_CONFIG
|
from evibes.settings import CONSTANCE_CONFIG
|
||||||
|
|
||||||
|
|
@ -42,6 +42,7 @@ from evibes.settings import CONSTANCE_CONFIG
|
||||||
class FieldsetsMixin:
|
class FieldsetsMixin:
|
||||||
general_fields: list = []
|
general_fields: list = []
|
||||||
relation_fields: list = []
|
relation_fields: list = []
|
||||||
|
additional_fields: list = []
|
||||||
model: ClassVar[Type[Model]]
|
model: ClassVar[Type[Model]]
|
||||||
|
|
||||||
def get_fieldsets(self, request, obj=None):
|
def get_fieldsets(self, request, obj=None):
|
||||||
|
|
@ -67,6 +68,8 @@ class FieldsetsMixin:
|
||||||
fieldsets.append((_("general"), {"fields": self.general_fields}))
|
fieldsets.append((_("general"), {"fields": self.general_fields}))
|
||||||
if self.relation_fields:
|
if self.relation_fields:
|
||||||
fieldsets.append((_("relations"), {"fields": self.relation_fields}))
|
fieldsets.append((_("relations"), {"fields": self.relation_fields}))
|
||||||
|
if self.additional_fields:
|
||||||
|
fieldsets.append((_("additional info"), {"fields": self.additional_fields}))
|
||||||
opts = self.model._meta
|
opts = self.model._meta
|
||||||
|
|
||||||
meta_fields = []
|
meta_fields = []
|
||||||
|
|
@ -186,69 +189,187 @@ class CategoryChildrenInline(TabularInline):
|
||||||
class AttributeGroupAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
class AttributeGroupAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
||||||
# noinspection PyClassVar
|
# noinspection PyClassVar
|
||||||
model = AttributeGroup # type: ignore [misc]
|
model = AttributeGroup # type: ignore [misc]
|
||||||
list_display = ("name", "modified")
|
list_display = (
|
||||||
search_fields = ("uuid", "name")
|
"name",
|
||||||
readonly_fields = ("uuid", "modified", "created")
|
"modified",
|
||||||
|
)
|
||||||
general_fields = ["is_active", "name", "parent"]
|
search_fields = (
|
||||||
relation_fields = []
|
"uuid",
|
||||||
|
"name",
|
||||||
|
)
|
||||||
|
readonly_fields = (
|
||||||
|
"uuid",
|
||||||
|
"modified",
|
||||||
|
"created",
|
||||||
|
)
|
||||||
|
general_fields = [
|
||||||
|
"is_active",
|
||||||
|
"name",
|
||||||
|
"parent",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@register(Attribute)
|
@register(Attribute)
|
||||||
class AttributeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
class AttributeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
||||||
# noinspection PyClassVar
|
# noinspection PyClassVar
|
||||||
model = Attribute # type: ignore [misc]
|
model = Attribute # type: ignore [misc]
|
||||||
list_display = ("name", "group", "value_type", "modified")
|
list_display = (
|
||||||
list_filter = ("value_type", "group", "is_active")
|
"name",
|
||||||
search_fields = ("uuid", "name", "group__name")
|
"group",
|
||||||
readonly_fields = ("uuid", "modified", "created")
|
"value_type",
|
||||||
autocomplete_fields = ["categories", "group"]
|
"modified",
|
||||||
|
)
|
||||||
general_fields = ["is_active", "name", "value_type", "is_filterable"]
|
list_filter = (
|
||||||
relation_fields = ["group", "categories"]
|
"value_type",
|
||||||
|
"group",
|
||||||
|
"is_active",
|
||||||
|
)
|
||||||
|
search_fields = (
|
||||||
|
"uuid",
|
||||||
|
"name",
|
||||||
|
"group__name",
|
||||||
|
)
|
||||||
|
readonly_fields = (
|
||||||
|
"uuid",
|
||||||
|
"modified",
|
||||||
|
"created",
|
||||||
|
)
|
||||||
|
autocomplete_fields = [
|
||||||
|
"categories",
|
||||||
|
"group",
|
||||||
|
]
|
||||||
|
general_fields = [
|
||||||
|
"is_active",
|
||||||
|
"name",
|
||||||
|
"value_type",
|
||||||
|
"is_filterable",
|
||||||
|
]
|
||||||
|
relation_fields = [
|
||||||
|
"group",
|
||||||
|
"categories",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@register(AttributeValue)
|
@register(AttributeValue)
|
||||||
class AttributeValueAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
class AttributeValueAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
||||||
# noinspection PyClassVar
|
# noinspection PyClassVar
|
||||||
model = AttributeValue # type: ignore [misc]
|
model = AttributeValue # type: ignore [misc]
|
||||||
list_display = ("attribute", "value", "modified")
|
list_display = (
|
||||||
list_filter = ("attribute__group", "is_active")
|
"attribute",
|
||||||
search_fields = ("uuid", "value", "attribute__name")
|
"value",
|
||||||
readonly_fields = ("uuid", "modified", "created")
|
"modified",
|
||||||
autocomplete_fields = ["attribute"]
|
)
|
||||||
|
list_filter = (
|
||||||
general_fields = ["is_active", "value"]
|
"attribute__group",
|
||||||
relation_fields = ["attribute", "product"]
|
"is_active",
|
||||||
|
)
|
||||||
|
search_fields = (
|
||||||
|
"uuid",
|
||||||
|
"value",
|
||||||
|
"attribute__name",
|
||||||
|
)
|
||||||
|
readonly_fields = (
|
||||||
|
"uuid",
|
||||||
|
"modified",
|
||||||
|
"created",
|
||||||
|
)
|
||||||
|
autocomplete_fields = [
|
||||||
|
"attribute",
|
||||||
|
]
|
||||||
|
general_fields = [
|
||||||
|
"is_active",
|
||||||
|
"value",
|
||||||
|
]
|
||||||
|
relation_fields = [
|
||||||
|
"attribute",
|
||||||
|
"product",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@register(Category)
|
@register(Category)
|
||||||
class CategoryAdmin(FieldsetsMixin, ActivationActionsMixin, DraggableMPTTAdmin):
|
class CategoryAdmin(FieldsetsMixin, ActivationActionsMixin, DraggableMPTTAdmin):
|
||||||
# noinspection PyClassVar
|
# noinspection PyClassVar
|
||||||
model = Category
|
model = Category
|
||||||
list_display = ("indented_title", "parent", "is_active", "modified")
|
list_display = (
|
||||||
|
"indented_title",
|
||||||
|
"parent",
|
||||||
|
"is_active",
|
||||||
|
"modified",
|
||||||
|
)
|
||||||
# noinspection PyUnresolvedReferences
|
# noinspection PyUnresolvedReferences
|
||||||
list_filter = ("is_active", "level", "created", "modified")
|
list_filter = (
|
||||||
search_fields = ("uuid", "name")
|
"is_active",
|
||||||
inlines = [CategoryChildrenInline]
|
"level",
|
||||||
autocomplete_fields = ["parent", "tags"]
|
"created",
|
||||||
readonly_fields = ("slug", "uuid", "modified", "created")
|
"modified",
|
||||||
|
)
|
||||||
|
search_fields = (
|
||||||
|
"uuid",
|
||||||
|
"name",
|
||||||
|
)
|
||||||
|
inlines = [
|
||||||
|
CategoryChildrenInline,
|
||||||
|
]
|
||||||
|
autocomplete_fields = [
|
||||||
|
"parent",
|
||||||
|
"tags",
|
||||||
|
]
|
||||||
|
readonly_fields = (
|
||||||
|
"slug",
|
||||||
|
"uuid",
|
||||||
|
"modified",
|
||||||
|
"created",
|
||||||
|
)
|
||||||
|
|
||||||
general_fields = ["is_active", "name", "description", "image", "markup_percent", "priority"]
|
general_fields = [
|
||||||
relation_fields = ["parent", "tags"]
|
"is_active",
|
||||||
|
"name",
|
||||||
|
"description",
|
||||||
|
"image",
|
||||||
|
"markup_percent",
|
||||||
|
"priority",
|
||||||
|
]
|
||||||
|
relation_fields = [
|
||||||
|
"parent",
|
||||||
|
"tags",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@register(Brand)
|
@register(Brand)
|
||||||
class BrandAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
class BrandAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
||||||
# noinspection PyClassVar
|
# noinspection PyClassVar
|
||||||
model = Brand # type: ignore [misc]
|
model = Brand # type: ignore [misc]
|
||||||
list_display = ("name",)
|
list_display = (
|
||||||
list_filter = ("categories", "is_active")
|
"name",
|
||||||
search_fields = ("uuid", "name", "categories__name")
|
"priority",
|
||||||
readonly_fields = ("uuid", "slug", "modified", "created")
|
"is_active",
|
||||||
|
)
|
||||||
general_fields = ["is_active", "name", "description", "priority"]
|
list_filter = (
|
||||||
relation_fields = ["small_logo", "big_logo", "categories"]
|
"categories",
|
||||||
|
"is_active",
|
||||||
|
)
|
||||||
|
search_fields = (
|
||||||
|
"uuid",
|
||||||
|
"name",
|
||||||
|
"categories__name",
|
||||||
|
)
|
||||||
|
readonly_fields = (
|
||||||
|
"uuid",
|
||||||
|
"slug",
|
||||||
|
"modified",
|
||||||
|
"created",
|
||||||
|
)
|
||||||
|
general_fields = [
|
||||||
|
"is_active",
|
||||||
|
"name",
|
||||||
|
"description",
|
||||||
|
"priority",
|
||||||
|
]
|
||||||
|
relation_fields = [
|
||||||
|
"small_logo",
|
||||||
|
"big_logo",
|
||||||
|
"categories",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@register(Product)
|
@register(Product)
|
||||||
|
|
@ -284,12 +405,34 @@ class ProductAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type:
|
||||||
"slug",
|
"slug",
|
||||||
"sku",
|
"sku",
|
||||||
)
|
)
|
||||||
readonly_fields = ("slug", "uuid", "modified", "created")
|
readonly_fields = (
|
||||||
autocomplete_fields = ("category", "brand", "tags")
|
"slug",
|
||||||
inlines = [AttributeValueInline, ProductImageInline, StockInline]
|
"uuid",
|
||||||
|
"modified",
|
||||||
|
"created",
|
||||||
|
)
|
||||||
|
autocomplete_fields = (
|
||||||
|
"category",
|
||||||
|
"brand",
|
||||||
|
"tags",
|
||||||
|
)
|
||||||
|
inlines = [
|
||||||
|
AttributeValueInline,
|
||||||
|
ProductImageInline,
|
||||||
|
StockInline,
|
||||||
|
]
|
||||||
|
|
||||||
general_fields = ["is_active", "name", "partnumber", "is_digital"]
|
general_fields = [
|
||||||
relation_fields = ["category", "brand", "tags"]
|
"is_active",
|
||||||
|
"name",
|
||||||
|
"partnumber",
|
||||||
|
"is_digital",
|
||||||
|
]
|
||||||
|
relation_fields = [
|
||||||
|
"category",
|
||||||
|
"brand",
|
||||||
|
"tags",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@register(ProductTag)
|
@register(ProductTag)
|
||||||
|
|
@ -298,49 +441,113 @@ class ProductTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # ty
|
||||||
model = ProductTag # type: ignore [misc]
|
model = ProductTag # type: ignore [misc]
|
||||||
list_display = ("tag_name",)
|
list_display = ("tag_name",)
|
||||||
search_fields = ("tag_name",)
|
search_fields = ("tag_name",)
|
||||||
readonly_fields = ("uuid", "modified", "created")
|
readonly_fields = (
|
||||||
|
"uuid",
|
||||||
general_fields = ["is_active", "tag_name", "name"]
|
"modified",
|
||||||
relation_fields = []
|
"created",
|
||||||
|
)
|
||||||
|
general_fields = [
|
||||||
|
"is_active",
|
||||||
|
"tag_name",
|
||||||
|
"name",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@register(CategoryTag)
|
@register(CategoryTag)
|
||||||
class CategoryTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
class CategoryTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
||||||
# noinspection PyClassVar
|
# noinspection PyClassVar
|
||||||
model = CategoryTag # type: ignore [misc]
|
model = CategoryTag # type: ignore [misc]
|
||||||
list_display = ("tag_name",)
|
list_display = (
|
||||||
search_fields = ("tag_name",)
|
"name",
|
||||||
readonly_fields = ("uuid", "modified", "created")
|
"tag_name",
|
||||||
|
"is_active",
|
||||||
general_fields = ["is_active", "tag_name", "name"]
|
)
|
||||||
relation_fields = []
|
search_fields = (
|
||||||
|
"name",
|
||||||
|
"tag_name",
|
||||||
|
"is_active",
|
||||||
|
)
|
||||||
|
readonly_fields = (
|
||||||
|
"uuid",
|
||||||
|
"modified",
|
||||||
|
"created",
|
||||||
|
)
|
||||||
|
general_fields = [
|
||||||
|
"is_active",
|
||||||
|
"tag_name",
|
||||||
|
"name",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@register(Vendor)
|
@register(Vendor)
|
||||||
class VendorAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
class VendorAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
||||||
# noinspection PyClassVar
|
# noinspection PyClassVar
|
||||||
model = Vendor # type: ignore [misc]
|
model = Vendor # type: ignore [misc]
|
||||||
list_display = ("name", "markup_percent", "modified")
|
list_display = (
|
||||||
list_filter = ("markup_percent", "is_active")
|
"name",
|
||||||
search_fields = ("name",)
|
"markup_percent",
|
||||||
readonly_fields = ("uuid", "modified", "created")
|
"modified",
|
||||||
|
)
|
||||||
|
list_filter = (
|
||||||
|
"markup_percent",
|
||||||
|
"is_active",
|
||||||
|
)
|
||||||
|
search_fields = (
|
||||||
|
"name",
|
||||||
|
"uuid",
|
||||||
|
)
|
||||||
|
readonly_fields = (
|
||||||
|
"uuid",
|
||||||
|
"modified",
|
||||||
|
"created",
|
||||||
|
)
|
||||||
form = VendorForm
|
form = VendorForm
|
||||||
|
general_fields = [
|
||||||
general_fields = ["is_active", "name", "markup_percent", "authentication", "b2b_auth_token"]
|
"is_active",
|
||||||
relation_fields = ["users"]
|
"name",
|
||||||
|
"markup_percent",
|
||||||
|
"authentication",
|
||||||
|
]
|
||||||
|
relation_fields = [
|
||||||
|
"users",
|
||||||
|
]
|
||||||
|
additional_fields = [
|
||||||
|
"additional_fields",
|
||||||
|
"b2b_auth_token",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@register(Feedback)
|
@register(Feedback)
|
||||||
class FeedbackAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
class FeedbackAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
||||||
# noinspection PyClassVar
|
# noinspection PyClassVar
|
||||||
model = Feedback # type: ignore [misc]
|
model = Feedback # type: ignore [misc]
|
||||||
list_display = ("order_product", "rating", "comment", "modified")
|
list_display = (
|
||||||
list_filter = ("rating", "is_active")
|
"order_product",
|
||||||
search_fields = ("order_product__product__name", "comment")
|
"rating",
|
||||||
readonly_fields = ("uuid", "modified", "created")
|
"comment",
|
||||||
|
"modified",
|
||||||
general_fields = ["is_active", "rating", "comment"]
|
)
|
||||||
relation_fields = ["order_product"]
|
list_filter = (
|
||||||
|
"rating",
|
||||||
|
"is_active",
|
||||||
|
)
|
||||||
|
search_fields = (
|
||||||
|
"order_product__product__name",
|
||||||
|
"comment",
|
||||||
|
)
|
||||||
|
readonly_fields = (
|
||||||
|
"uuid",
|
||||||
|
"modified",
|
||||||
|
"created",
|
||||||
|
)
|
||||||
|
general_fields = [
|
||||||
|
"is_active",
|
||||||
|
"rating",
|
||||||
|
"comment",
|
||||||
|
]
|
||||||
|
relation_fields = [
|
||||||
|
"order_product",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@register(Order)
|
@register(Order)
|
||||||
|
|
@ -355,8 +562,18 @@ class OrderAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: i
|
||||||
"buy_time",
|
"buy_time",
|
||||||
"modified",
|
"modified",
|
||||||
)
|
)
|
||||||
list_filter = ("status", "buy_time", "modified", "created")
|
list_filter = (
|
||||||
search_fields = ("user__email", "status", "uuid", "human_readable_id")
|
"status",
|
||||||
|
"buy_time",
|
||||||
|
"modified",
|
||||||
|
"created",
|
||||||
|
)
|
||||||
|
search_fields = (
|
||||||
|
"user__email",
|
||||||
|
"status",
|
||||||
|
"uuid",
|
||||||
|
"human_readable_id",
|
||||||
|
)
|
||||||
readonly_fields = (
|
readonly_fields = (
|
||||||
"total_price",
|
"total_price",
|
||||||
"total_quantity",
|
"total_quantity",
|
||||||
|
|
@ -365,25 +582,61 @@ class OrderAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: i
|
||||||
"modified",
|
"modified",
|
||||||
"created",
|
"created",
|
||||||
)
|
)
|
||||||
inlines = [OrderProductInline]
|
inlines = [
|
||||||
|
OrderProductInline,
|
||||||
|
]
|
||||||
form = OrderForm
|
form = OrderForm
|
||||||
|
general_fields = [
|
||||||
general_fields = ["is_active", "user", "status", "notifications", "attributes", "buy_time"]
|
"is_active",
|
||||||
relation_fields = ["promo_code", "billing_address", "shipping_address"]
|
"user",
|
||||||
|
"status",
|
||||||
|
"notifications",
|
||||||
|
"attributes",
|
||||||
|
"buy_time",
|
||||||
|
]
|
||||||
|
relation_fields = [
|
||||||
|
"promo_code",
|
||||||
|
"billing_address",
|
||||||
|
"shipping_address",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@register(OrderProduct)
|
@register(OrderProduct)
|
||||||
class OrderProductAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
class OrderProductAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
||||||
# noinspection PyClassVar
|
# noinspection PyClassVar
|
||||||
model = OrderProduct # type: ignore [misc]
|
model = OrderProduct # type: ignore [misc]
|
||||||
list_display = ("order", "product", "quantity", "buy_price", "status", "modified")
|
list_display = (
|
||||||
list_filter = ("status",)
|
"order",
|
||||||
search_fields = ("order__user__email", "product__name")
|
"product",
|
||||||
readonly_fields = ("uuid", "modified", "created")
|
"quantity",
|
||||||
|
"buy_price",
|
||||||
|
"status",
|
||||||
|
"modified",
|
||||||
|
)
|
||||||
|
list_filter = (
|
||||||
|
"status",
|
||||||
|
"modified",
|
||||||
|
)
|
||||||
|
search_fields = (
|
||||||
|
"order__user__email",
|
||||||
|
"product__name",
|
||||||
|
)
|
||||||
|
readonly_fields = (
|
||||||
|
"uuid",
|
||||||
|
"modified",
|
||||||
|
"created",
|
||||||
|
)
|
||||||
form = OrderProductForm
|
form = OrderProductForm
|
||||||
|
general_fields = [
|
||||||
general_fields = ["is_active", "quantity", "buy_price", "status"]
|
"is_active",
|
||||||
relation_fields = ["order", "product"]
|
"quantity",
|
||||||
|
"buy_price",
|
||||||
|
"status",
|
||||||
|
]
|
||||||
|
relation_fields = [
|
||||||
|
"order",
|
||||||
|
"product",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@register(PromoCode)
|
@register(PromoCode)
|
||||||
|
|
@ -398,11 +651,24 @@ class PromoCodeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # typ
|
||||||
"end_time",
|
"end_time",
|
||||||
"used_on",
|
"used_on",
|
||||||
)
|
)
|
||||||
list_filter = ("discount_percent", "discount_amount", "start_time", "end_time")
|
list_filter = (
|
||||||
search_fields = ("code",)
|
"discount_percent",
|
||||||
readonly_fields = ("used_on", "uuid", "modified", "created")
|
"discount_amount",
|
||||||
|
"start_time",
|
||||||
|
"end_time",
|
||||||
|
)
|
||||||
|
search_fields = (
|
||||||
|
"code",
|
||||||
|
"uuid",
|
||||||
|
"user__email",
|
||||||
|
)
|
||||||
|
readonly_fields = (
|
||||||
|
"used_on",
|
||||||
|
"uuid",
|
||||||
|
"modified",
|
||||||
|
"created",
|
||||||
|
)
|
||||||
autocomplete_fields = ("user",)
|
autocomplete_fields = ("user",)
|
||||||
|
|
||||||
general_fields = [
|
general_fields = [
|
||||||
"is_active",
|
"is_active",
|
||||||
"code",
|
"code",
|
||||||
|
|
@ -412,32 +678,68 @@ class PromoCodeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # typ
|
||||||
"end_time",
|
"end_time",
|
||||||
"used_on",
|
"used_on",
|
||||||
]
|
]
|
||||||
relation_fields = ["user"]
|
relation_fields = [
|
||||||
|
"user",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@register(Promotion)
|
@register(Promotion)
|
||||||
class PromotionAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
class PromotionAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
||||||
# noinspection PyClassVar
|
# noinspection PyClassVar
|
||||||
model = Promotion # type: ignore [misc]
|
model = Promotion # type: ignore [misc]
|
||||||
list_display = ("name", "discount_percent", "modified")
|
list_display = (
|
||||||
|
"name",
|
||||||
|
"discount_percent",
|
||||||
|
"modified",
|
||||||
|
)
|
||||||
search_fields = ("name",)
|
search_fields = ("name",)
|
||||||
readonly_fields = ("uuid", "modified", "created")
|
readonly_fields = (
|
||||||
|
"uuid",
|
||||||
|
"modified",
|
||||||
|
"created",
|
||||||
|
)
|
||||||
autocomplete_fields = ("products",)
|
autocomplete_fields = ("products",)
|
||||||
|
general_fields = [
|
||||||
general_fields = ["is_active", "name", "discount_percent", "description"]
|
"is_active",
|
||||||
relation_fields = ["products"]
|
"name",
|
||||||
|
"discount_percent",
|
||||||
|
"description",
|
||||||
|
]
|
||||||
|
relation_fields = [
|
||||||
|
"products",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@register(Stock)
|
@register(Stock)
|
||||||
class StockAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
class StockAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
||||||
# noinspection PyClassVar
|
# noinspection PyClassVar
|
||||||
model = Stock # type: ignore [misc]
|
model = Stock # type: ignore [misc]
|
||||||
list_display = ("product", "vendor", "sku", "quantity", "price", "modified")
|
list_display = (
|
||||||
list_filter = ("vendor", "quantity")
|
"product",
|
||||||
search_fields = ("product__name", "vendor__name", "sku")
|
"vendor",
|
||||||
readonly_fields = ("uuid", "modified", "created")
|
"sku",
|
||||||
autocomplete_fields = ("product", "vendor")
|
"quantity",
|
||||||
|
"price",
|
||||||
|
"modified",
|
||||||
|
)
|
||||||
|
list_filter = (
|
||||||
|
"vendor",
|
||||||
|
"quantity",
|
||||||
|
)
|
||||||
|
search_fields = (
|
||||||
|
"product__name",
|
||||||
|
"vendor__name",
|
||||||
|
"sku",
|
||||||
|
)
|
||||||
|
readonly_fields = (
|
||||||
|
"uuid",
|
||||||
|
"modified",
|
||||||
|
"created",
|
||||||
|
)
|
||||||
|
autocomplete_fields = (
|
||||||
|
"product",
|
||||||
|
"vendor",
|
||||||
|
)
|
||||||
general_fields = [
|
general_fields = [
|
||||||
"is_active",
|
"is_active",
|
||||||
"sku",
|
"sku",
|
||||||
|
|
@ -446,48 +748,100 @@ class StockAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: i
|
||||||
"purchase_price",
|
"purchase_price",
|
||||||
"digital_asset",
|
"digital_asset",
|
||||||
]
|
]
|
||||||
relation_fields = ["product", "vendor"]
|
relation_fields = [
|
||||||
|
"product",
|
||||||
|
"vendor",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@register(Wishlist)
|
@register(Wishlist)
|
||||||
class WishlistAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
class WishlistAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
||||||
# noinspection PyClassVar
|
# noinspection PyClassVar
|
||||||
model = Wishlist # type: ignore [misc]
|
model = Wishlist # type: ignore [misc]
|
||||||
list_display = ("user", "modified")
|
list_display = (
|
||||||
search_fields = ("user__email",)
|
"user",
|
||||||
readonly_fields = ("uuid", "modified", "created")
|
"modified",
|
||||||
|
)
|
||||||
general_fields = ["is_active", "user"]
|
search_fields = (
|
||||||
relation_fields = ["products"]
|
"user__email",
|
||||||
|
"uuid",
|
||||||
|
)
|
||||||
|
readonly_fields = (
|
||||||
|
"uuid",
|
||||||
|
"modified",
|
||||||
|
"created",
|
||||||
|
)
|
||||||
|
general_fields = [
|
||||||
|
"is_active",
|
||||||
|
"user",
|
||||||
|
]
|
||||||
|
relation_fields = [
|
||||||
|
"products",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@register(ProductImage)
|
@register(ProductImage)
|
||||||
class ProductImageAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
class ProductImageAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
|
||||||
# noinspection PyClassVar
|
# noinspection PyClassVar
|
||||||
model = ProductImage # type: ignore [misc]
|
model = ProductImage # type: ignore [misc]
|
||||||
list_display = ("alt", "product", "priority", "modified")
|
list_display = (
|
||||||
list_filter = ("priority",)
|
"alt",
|
||||||
search_fields = ("alt", "product__name")
|
"product",
|
||||||
readonly_fields = ("uuid", "modified", "created")
|
"priority",
|
||||||
|
"modified",
|
||||||
|
)
|
||||||
|
list_filter = (
|
||||||
|
"priority",
|
||||||
|
"modified",
|
||||||
|
"created",
|
||||||
|
)
|
||||||
|
search_fields = (
|
||||||
|
"alt",
|
||||||
|
"product__name",
|
||||||
|
)
|
||||||
|
readonly_fields = (
|
||||||
|
"uuid",
|
||||||
|
"modified",
|
||||||
|
"created",
|
||||||
|
)
|
||||||
autocomplete_fields = ("product",)
|
autocomplete_fields = ("product",)
|
||||||
|
|
||||||
general_fields = [
|
general_fields = [
|
||||||
"is_active",
|
"is_active",
|
||||||
"alt",
|
"alt",
|
||||||
"priority",
|
"priority",
|
||||||
"image",
|
"image",
|
||||||
]
|
]
|
||||||
relation_fields = ["product"]
|
relation_fields = [
|
||||||
|
"product",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@register(Address)
|
@register(Address)
|
||||||
class AddressAdmin(FieldsetsMixin, GISModelAdmin):
|
class AddressAdmin(FieldsetsMixin, GISModelAdmin):
|
||||||
# noinspection PyClassVar
|
# noinspection PyClassVar
|
||||||
model = Address # type: ignore [misc]
|
model = Address # type: ignore [misc]
|
||||||
list_display = ("street", "city", "region", "country", "user")
|
list_display = (
|
||||||
list_filter = ("country", "region")
|
"street",
|
||||||
search_fields = ("street", "city", "postal_code", "user__email")
|
"city",
|
||||||
readonly_fields = ("uuid", "modified", "created")
|
"region",
|
||||||
|
"country",
|
||||||
|
"user",
|
||||||
|
)
|
||||||
|
list_filter = (
|
||||||
|
"country",
|
||||||
|
"region",
|
||||||
|
)
|
||||||
|
search_fields = (
|
||||||
|
"street",
|
||||||
|
"city",
|
||||||
|
"postal_code",
|
||||||
|
"user__email",
|
||||||
|
)
|
||||||
|
readonly_fields = (
|
||||||
|
"uuid",
|
||||||
|
"modified",
|
||||||
|
"created",
|
||||||
|
)
|
||||||
gis_widget_kwargs = {
|
gis_widget_kwargs = {
|
||||||
"attrs": {
|
"attrs": {
|
||||||
"default_lon": 37.61556,
|
"default_lon": 37.61556,
|
||||||
|
|
@ -495,7 +849,6 @@ class AddressAdmin(FieldsetsMixin, GISModelAdmin):
|
||||||
"default_zoom": 6,
|
"default_zoom": 6,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
general_fields = [
|
general_fields = [
|
||||||
"is_active",
|
"is_active",
|
||||||
"address_line",
|
"address_line",
|
||||||
|
|
@ -517,10 +870,20 @@ class AddressAdmin(FieldsetsMixin, GISModelAdmin):
|
||||||
class CustomerRelationshipManagementProviderAdmin(FieldsetsMixin, ModelAdmin):
|
class CustomerRelationshipManagementProviderAdmin(FieldsetsMixin, ModelAdmin):
|
||||||
# noinspection PyClassVar
|
# noinspection PyClassVar
|
||||||
model = CustomerRelationshipManagementProvider # type: ignore [misc]
|
model = CustomerRelationshipManagementProvider # type: ignore [misc]
|
||||||
list_display = ("name", "default")
|
list_display = (
|
||||||
search_fields = ("name",)
|
"name",
|
||||||
readonly_fields = ("uuid", "modified", "created")
|
"default",
|
||||||
|
)
|
||||||
|
search_fields = (
|
||||||
|
"name",
|
||||||
|
"uuid",
|
||||||
|
)
|
||||||
|
readonly_fields = (
|
||||||
|
"uuid",
|
||||||
|
"modified",
|
||||||
|
"created",
|
||||||
|
)
|
||||||
|
form = CRMForm
|
||||||
general_fields = [
|
general_fields = [
|
||||||
"is_active",
|
"is_active",
|
||||||
"name",
|
"name",
|
||||||
|
|
@ -530,22 +893,29 @@ class CustomerRelationshipManagementProviderAdmin(FieldsetsMixin, ModelAdmin):
|
||||||
"attributes",
|
"attributes",
|
||||||
"authentication",
|
"authentication",
|
||||||
]
|
]
|
||||||
relation_fields = []
|
|
||||||
|
|
||||||
|
|
||||||
@register(OrderCrmLink)
|
@register(OrderCrmLink)
|
||||||
class OrderCrmLinkAdmin(FieldsetsMixin, ModelAdmin):
|
class OrderCrmLinkAdmin(FieldsetsMixin, ModelAdmin):
|
||||||
# noinspection PyClassVar
|
# noinspection PyClassVar
|
||||||
model = OrderCrmLink # type: ignore [misc]
|
model = OrderCrmLink # type: ignore [misc]
|
||||||
list_display = ("crm_lead_id",)
|
list_display = (
|
||||||
search_fields = ("crm_lead_id",)
|
"crm_lead_id",
|
||||||
|
"order",
|
||||||
|
)
|
||||||
|
search_fields = (
|
||||||
|
"crm_lead_id",
|
||||||
|
"order__human_readable_id",
|
||||||
|
"order__uuid",
|
||||||
|
"order__user__uuid",
|
||||||
|
"order__user__email",
|
||||||
|
)
|
||||||
readonly_fields = (
|
readonly_fields = (
|
||||||
"uuid",
|
"uuid",
|
||||||
"modified",
|
"modified",
|
||||||
"created",
|
"created",
|
||||||
"crm_lead_id",
|
"crm_lead_id",
|
||||||
)
|
)
|
||||||
|
|
||||||
general_fields = [
|
general_fields = [
|
||||||
"is_active",
|
"is_active",
|
||||||
"crm_lead_id",
|
"crm_lead_id",
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,16 @@ class VendorForm(forms.ModelForm):
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class CRMForm(forms.ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = Product
|
||||||
|
fields = "__all__"
|
||||||
|
widgets = {
|
||||||
|
"authentication": JSONTableWidget(),
|
||||||
|
"attributes": JSONTableWidget(),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class OrderProductForm(forms.ModelForm):
|
class OrderProductForm(forms.ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = OrderProduct
|
model = OrderProduct
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
("core", "0043_attribute_is_filterable_and_more"),
|
("core", "0043_attribute_is_filterable_and_more"),
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -1180,7 +1180,7 @@ class Order(ExportModelOperationsMixin("order"), NiceModel): # type: ignore [mi
|
||||||
verbose_name_plural = _("orders")
|
verbose_name_plural = _("orders")
|
||||||
|
|
||||||
def __str__(self) -> str:
|
def __str__(self) -> str:
|
||||||
return f"#{self.pk} for {self.user.email if self.user else 'unregistered user'}"
|
return f"#{self.human_readable_id} for {self.user.email if self.user else 'unregistered user'}"
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_business(self) -> bool:
|
def is_business(self) -> bool:
|
||||||
|
|
|
||||||
|
|
@ -85,9 +85,7 @@ CONSTANCE_CONFIG_FIELDSETS = OrderedDict(
|
||||||
"ADVERTSIMENT",
|
"ADVERTSIMENT",
|
||||||
"ANALYTICS",
|
"ANALYTICS",
|
||||||
),
|
),
|
||||||
gettext_noop("Debugging Options"): (
|
gettext_noop("Debugging Options"): ("SAVE_VENDORS_RESPONSES",),
|
||||||
"SAVE_VENDORS_RESPONSES",
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue