feat: add profit and special discount fields to ProductVariant model
- Updated ProductVariant model to include 'profit' and 'special_discount_percent' fields. - Added corresponding fields in the admin interface for ProductVariant. - Created migration to add new fields to the database. feat: implement special discount code functionality in cart - Added composables for submitting and deleting special discount codes. - Updated CartSummary and CartItem components to handle special discount codes. - Enhanced API endpoints to support special discount operations. - Updated global types to include special discount code details in the cart.
This commit is contained in:
@@ -1,9 +1,11 @@
|
||||
from django.conf import settings
|
||||
from rest_framework import serializers
|
||||
from .models import OrderItemModel, OrderModel, DiscountCode, Cart, CartItem
|
||||
from product.serializers import ProductVariantSerialzier, AttributeValueSerialzier, ProductImageSerailizer
|
||||
from account.serializers import UserAddressSerializer
|
||||
from product.models import ProductVariant
|
||||
|
||||
|
||||
class ProductVariantSerialzier(serializers.ModelSerializer):
|
||||
product_attributes = AttributeValueSerialzier(many=True)
|
||||
image = serializers.SerializerMethodField()
|
||||
@@ -13,12 +15,14 @@ class ProductVariantSerialzier(serializers.ModelSerializer):
|
||||
final_price = serializers.SerializerMethodField()
|
||||
category = serializers.SerializerMethodField()
|
||||
slug = serializers.CharField(source='product.slug')
|
||||
|
||||
class Meta:
|
||||
model = ProductVariant
|
||||
fields = ['id', 'slug', 'title', 'product_attributes', 'in_stock', 'price', 'discount', 'color', 'image', 'discount_amount', 'category', 'final_price']
|
||||
fields = ['id', 'slug', 'title', 'product_attributes', 'in_stock', 'price',
|
||||
'discount', 'color', 'image', 'discount_amount', 'category', 'final_price']
|
||||
|
||||
def get_discount_amount(self, obj):
|
||||
discount_amount = int(obj.price * (obj.discount / 100))
|
||||
discount_amount = int(obj.price * (obj.discount / 100))
|
||||
return f'{discount_amount:,.0f} تومان'
|
||||
|
||||
def get_final_price(self, obj):
|
||||
@@ -51,10 +55,13 @@ class OrderItemSerailzier(serializers.ModelSerializer):
|
||||
price = serializers.SerializerMethodField()
|
||||
final_price = serializers.SerializerMethodField()
|
||||
discount = serializers.SerializerMethodField()
|
||||
special_discount_amount = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = CartItem
|
||||
exclude = ('cart',)
|
||||
read_only_fields = ('cart', 'product', 'discount_percent')
|
||||
|
||||
def get_product(self, obj):
|
||||
return ProductVariantSerialzier(instance=obj.product_variant, context={'request': self.context.get('request')}).data
|
||||
|
||||
@@ -70,7 +77,20 @@ class OrderItemSerailzier(serializers.ModelSerializer):
|
||||
def get_discount(self, obj):
|
||||
return obj.product_variant.discount
|
||||
|
||||
from django.conf import settings
|
||||
def get_special_discount_amount(self, obj):
|
||||
# For cart items
|
||||
print('in here asdfasfd')
|
||||
amount = getattr(obj, 'special_discount_amount', None)
|
||||
print(amount)
|
||||
if amount is None:
|
||||
print('in here')
|
||||
# If it's an order item, check item_special_discount_amount property
|
||||
amount = getattr(obj, 'item_special_discount_amount', 0)
|
||||
if amount is None:
|
||||
amount = 0
|
||||
print('in here ')
|
||||
return f'{int(amount):,.0f} تومان'
|
||||
|
||||
|
||||
class CartSerializer(serializers.ModelSerializer):
|
||||
items = OrderItemSerailzier(many=True)
|
||||
@@ -79,11 +99,23 @@ class CartSerializer(serializers.ModelSerializer):
|
||||
final_price = serializers.SerializerMethodField()
|
||||
discount_code = serializers.SerializerMethodField()
|
||||
items_discount_amount = serializers.SerializerMethodField()
|
||||
special_discount_total = serializers.SerializerMethodField()
|
||||
special_discount_code = serializers.SerializerMethodField()
|
||||
address = UserAddressSerializer()
|
||||
|
||||
class Meta:
|
||||
model = Cart
|
||||
fields = ['items_discount_amount', 'discount_code', 'items', 'cart_total', 'tax_amount', 'final_price', 'address']
|
||||
fields = ['items_discount_amount', 'discount_code', 'items', 'cart_total', 'tax_amount',
|
||||
'final_price', 'address', 'special_discount_total', 'special_discount_code']
|
||||
|
||||
def get_special_discount_code(self, obj):
|
||||
if obj.special_discount_code:
|
||||
return {
|
||||
'code': f'{obj.special_discount_code.code}',
|
||||
'user': f'{obj.special_discount_code.user.phone}'
|
||||
}
|
||||
else:
|
||||
return None
|
||||
|
||||
def get_discount_code(self, obj):
|
||||
if obj.discount_code:
|
||||
@@ -95,7 +127,6 @@ class CartSerializer(serializers.ModelSerializer):
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
def get_tax_amount(self, obj):
|
||||
return f'{obj.tax_amount:,.0f} تومان'
|
||||
|
||||
@@ -107,17 +138,26 @@ class CartSerializer(serializers.ModelSerializer):
|
||||
|
||||
def get_final_price(self, obj):
|
||||
return f'{obj.final_price:,.0f} تومان'
|
||||
|
||||
|
||||
def get_special_discount_total(self, obj):
|
||||
# sum of special discounts on cart items
|
||||
total = obj.special_discount_total if hasattr(
|
||||
obj, 'special_discount_total') else 0
|
||||
return f'{int(total):,.0f} تومان'
|
||||
|
||||
|
||||
class OrderListSerializer(serializers.ModelSerializer):
|
||||
count = serializers.SerializerMethodField()
|
||||
images = serializers.SerializerMethodField()
|
||||
count = serializers.SerializerMethodField()
|
||||
images = serializers.SerializerMethodField()
|
||||
verbose_status = serializers.SerializerMethodField()
|
||||
order_id = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = OrderModel
|
||||
fields = ['created_at', 'status', "images", "count", "id", 'final_price', 'order_id', 'verbose_status']
|
||||
fields = ['created_at', 'status', "images", "count",
|
||||
"id", 'final_price', 'order_id', 'verbose_status']
|
||||
read_only_fields = ['count', 'images', 'order_id', 'verbose_status']
|
||||
|
||||
def get_verbose_status(self, obj):
|
||||
return obj.get_status_display()
|
||||
|
||||
@@ -126,6 +166,7 @@ class OrderListSerializer(serializers.ModelSerializer):
|
||||
|
||||
def get_order_id(self, obj):
|
||||
return obj.pk + 1000
|
||||
|
||||
def get_images(self, obj):
|
||||
image_list = [
|
||||
self.context.get('request').build_absolute_uri(image.image.url)
|
||||
@@ -136,16 +177,18 @@ class OrderListSerializer(serializers.ModelSerializer):
|
||||
|
||||
|
||||
class OrderGetSerializer(serializers.ModelSerializer):
|
||||
count = serializers.SerializerMethodField()
|
||||
images = serializers.SerializerMethodField()
|
||||
count = serializers.SerializerMethodField()
|
||||
images = serializers.SerializerMethodField()
|
||||
order_id = serializers.SerializerMethodField()
|
||||
verbose_status = serializers.SerializerMethodField()
|
||||
items = OrderItemSerailzier(many=True)
|
||||
address = UserAddressSerializer()
|
||||
discount_code = DiscountCodeSerializer()
|
||||
|
||||
class Meta:
|
||||
model = OrderModel
|
||||
fields = ['created_at', 'status', "images", "count", "id", 'final_price', 'order_id', 'verbose_status', 'address', 'items', 'tax' , 'cart_total', 'discount_code', 'discount_amount']
|
||||
fields = ['created_at', 'status', "images", "count", "id", 'final_price', 'order_id', 'verbose_status',
|
||||
'address', 'items', 'tax', 'cart_total', 'discount_code', 'discount_amount', 'special_discount_total']
|
||||
|
||||
def get_verbose_status(self, obj):
|
||||
return obj.get_status_display()
|
||||
@@ -160,5 +203,6 @@ class OrderGetSerializer(serializers.ModelSerializer):
|
||||
for item in obj.items.all()[:3]
|
||||
]
|
||||
return filter(lambda x: x is not None, image_list)
|
||||
|
||||
def get_order_id(self, obj):
|
||||
return obj.id + 1000
|
||||
return obj.id + 1000
|
||||
|
||||
Reference in New Issue
Block a user