From a4ea17d81691e383399516e6f23e40fc71c97f97 Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Thu, 27 Mar 2025 22:17:03 +0330 Subject: [PATCH] clean up cart and add order_id filed to order --- backend/order/admin.py | 7 +-- ...ritemmodel_discount_ordermodel_order_id.py | 23 ++++++++ backend/order/models.py | 52 +++++++++---------- backend/order/serializers.py | 3 -- 4 files changed, 52 insertions(+), 33 deletions(-) create mode 100644 backend/order/migrations/0024_orderitemmodel_discount_ordermodel_order_id.py diff --git a/backend/order/admin.py b/backend/order/admin.py index dedddf7..f7527bf 100644 --- a/backend/order/admin.py +++ b/backend/order/admin.py @@ -35,6 +35,7 @@ class BankRecordInline(StackedInline): model = Bank extra = 0 max_num = 0 + tab = True def has_delete_permission(self, request, obj=None): return False def get_readonly_fields(self, request, obj=None): @@ -46,11 +47,11 @@ class BankRecordInline(StackedInline): class OrderAdmin(ModelAdmin, ImportExportModelAdmin): import_form_class = ImportForm export_form_class = ExportForm - + search_fields = ['order_id', 'user__phone', 'user__first_name', 'user__last_name', 'user__email'] list_filter = ['is_paid', 'status'] actions_list = ['redirect_to_learn', 'udpate_bank_status'] - list_display = ['user', 'is_paid', 'status', 'discount_code', 'address',] - readonly_fields = ('created_at', ) + list_display = ['order_id', 'user', 'is_paid', 'status', 'discount_code', 'address',] + readonly_fields = ('created_at', 'order_id', 'tax', 'final_price', 'cart_total', 'discount', 'discount_code', 'user', 'address', 'is_paid') compressed_fields = True warn_unsaved_form = True # exclude = ('bank_records',) diff --git a/backend/order/migrations/0024_orderitemmodel_discount_ordermodel_order_id.py b/backend/order/migrations/0024_orderitemmodel_discount_ordermodel_order_id.py new file mode 100644 index 0000000..06629d2 --- /dev/null +++ b/backend/order/migrations/0024_orderitemmodel_discount_ordermodel_order_id.py @@ -0,0 +1,23 @@ +# Generated by Django 5.1.2 on 2025-03-27 10:19 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('order', '0023_remove_ordermodel_bank_records'), + ] + + operations = [ + migrations.AddField( + model_name='orderitemmodel', + name='discount', + field=models.SmallIntegerField(default=0, verbose_name='تخفیف'), + ), + migrations.AddField( + model_name='ordermodel', + name='order_id', + field=models.PositiveIntegerField(blank=True, null=True, unique=True), + ), + ] diff --git a/backend/order/models.py b/backend/order/models.py index 25049ed..8d7ba6a 100644 --- a/backend/order/models.py +++ b/backend/order/models.py @@ -44,6 +44,7 @@ class OrderModel(models.Model): ('CANCELED', 'لغو شده'), ('REFUNDED', 'مرجوع شده'), ] + order_id = models.PositiveIntegerField(unique=True, null=True, blank=True, verbose_name='شماره سفارش') user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='orders', verbose_name='کاربر') address = models.ForeignKey(UserAddressModel, on_delete=models.SET_NULL, related_name='orders', null=True, verbose_name='ادرس') created_at = jmodels.jDateField(blank=True, null=True, verbose_name="تاریخ ثبت سفارش") @@ -54,7 +55,6 @@ class OrderModel(models.Model): tax = models.BigIntegerField(null=True, blank=True, verbose_name='مالیات') final_price = models.BigIntegerField(null=True, blank=True, verbose_name='قیمت نهایی') cart_total = models.BigIntegerField(null=True, blank=True, verbose_name='کل سبد خرید') - # bank_records = models.ManyToManyField(Bank, max_length=100, verbose_name='رکورد بانکی', null=True, blank=True) def __str__(self): return f'سفارش: {self.id + 1000}' @@ -66,39 +66,32 @@ class OrderModel(models.Model): def save(self, *args, **kwargs): - try: - push_object = PushSubscription.objects.get(user=self.user) - except: - print('object not found') - try: - push_object.send_notif(f'سفارش شما به {self.get_status_display()} تغییر کرد', f'سفارش شما به {self.get_status_display()} تغییر کرد', ProductImageModel.objects.all().first().image.url) - except: - print('didnt send') + if not self.pk: + last_instance = self.__class__.objects.order_by("pk").last() + self.order_id = (last_instance.pk + 1001) if last_instance else 1001 super().save(*args, **kwargs) - # def discount(self): - # # total_with_item_discount = sum(item.total_with_discount() for item in self.items.all()) - # # discount_percent = self.discount_code.percent - # # return total_with_item_discount * ((100 - discount_percent) / 100) - # pass + def cal_discount(self): + # total_with_item_discount = sum(item.total_with_discount() for item in self.items.all()) + # discount_percent = self.discount_code.percent + # return total_with_item_discount * ((100 - discount_percent) / 100) + pass - # def tax(self): - # return self.total_without_tax() * 0.2 + def cal_tax(self): + return self.total_without_tax() * 0.2 - # def total(self): - # pass - # return self.total_with_discount() + self.tax() + def cal_total(self): + pass + return self.total_with_discount() + self.tax() - # def final_price(self): - # pass + def cal_final_price(self): + pass - # def submit_cart(self): - # pass @@ -108,15 +101,20 @@ class OrderItemModel(models.Model): quantity = models.PositiveSmallIntegerField(verbose_name="تعداد") price = models.PositiveIntegerField(verbose_name='قیمت', default=0) product = models.ForeignKey(ProductVariant, on_delete=models.PROTECT, verbose_name="محصول") + discount = models.SmallIntegerField(default=0, verbose_name='تخفیف') class Meta: verbose_name = 'ایتم سبد خرید' verbose_name_plural = 'ایتم های سبد خرید' - def total(self): - return self.quantity * self.product.price + # def total(self): + # return self.quantity * self.product.price + + # def total_with_discount(self): + # return self.quantity * self.product.get_toman_price_after_discount() + + def update_fields(self): + pass - def total_with_discount(self): - return self.quantity * self.product.get_toman_price_after_discount() def __str__(self): return f'({self.product}) - ({self.order.user})' diff --git a/backend/order/serializers.py b/backend/order/serializers.py index f25a84f..a50d23d 100644 --- a/backend/order/serializers.py +++ b/backend/order/serializers.py @@ -108,7 +108,6 @@ class CartSerializer(serializers.ModelSerializer): class OrderListSerializer(serializers.ModelSerializer): count = serializers.SerializerMethodField() images = serializers.SerializerMethodField() - order_id = serializers.SerializerMethodField() verbose_status = serializers.SerializerMethodField() class Meta: model = OrderModel @@ -127,8 +126,6 @@ class OrderListSerializer(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 class OrderGetSerializer(serializers.ModelSerializer):