From 6a05adcb9247d7f7133eadb6153270b157582ae4 Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Sun, 26 Jan 2025 03:08:20 +0330 Subject: [PATCH] order app update --- backend/core/settings.py | 1 + backend/order/__init__.py | 0 backend/order/admin.py | 3 + backend/order/apps.py | 6 ++ backend/order/migrations/__init__.py | 0 backend/order/models.py | 86 ++++++++++++++++++++++++++++ backend/order/tests.py | 3 + backend/order/views.py | 3 + 8 files changed, 102 insertions(+) create mode 100644 backend/order/__init__.py create mode 100644 backend/order/admin.py create mode 100644 backend/order/apps.py create mode 100644 backend/order/migrations/__init__.py create mode 100644 backend/order/models.py create mode 100644 backend/order/tests.py create mode 100644 backend/order/views.py diff --git a/backend/core/settings.py b/backend/core/settings.py index 65ce072..f15282e 100644 --- a/backend/core/settings.py +++ b/backend/core/settings.py @@ -108,6 +108,7 @@ INSTALLED_APPS = [ 'account', 'ticket', 'chat', + 'order', ] MIDDLEWARE = [ diff --git a/backend/order/__init__.py b/backend/order/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/order/admin.py b/backend/order/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/backend/order/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/backend/order/apps.py b/backend/order/apps.py new file mode 100644 index 0000000..42888e4 --- /dev/null +++ b/backend/order/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class OrderConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'order' diff --git a/backend/order/migrations/__init__.py b/backend/order/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/order/models.py b/backend/order/models.py new file mode 100644 index 0000000..9d6b739 --- /dev/null +++ b/backend/order/models.py @@ -0,0 +1,86 @@ +from django.db import models +from account.models import User, UserAddressModel +from product.models import ProductModel +from django.utils import timezone + +class OrderModel(models.Model): + STATUS_CHOICES = [ + ('CART', 'در سبد خرید'), + ('ADMIN_PENDING', 'در انتظار تایید'), + ('PENDING', 'درحال پردازش'), + ('POSTED', 'ارسال شده'), + ('RECEIVED', 'تحویل شده'), + ('CANCELED', 'لغو شده'), + ('BACK', 'مرجوع شده'), + ] + user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='orders') + address = models.ForeignKey(UserAddressModel, on_delete=models.SET_NULL, related_name='orders', null=True) + created_at = models.DateTimeField(auto_now_add=True, verbose_name="تاریخ سفارش") + is_paid = models.BooleanField(default=False, verbose_name="وضعیت پرداخت") + discount_code = models.ForeignKey(DiscountCode, on_delete=models.PROTECT, null=True, blank=True, verbose_name="کدتخفیف") + status = models.CharField(max_length=20, choices=STATUS_CHOICES, verbose_name="وضعیت سفارش") + def __str__(self): + return f'سفارش: {self.id}' + + class Meta: + verbose_name = 'سفارش' + verbose_name_plural = 'سفارشات' + + def total_without_tax(self): + return sum(item.total() for item in self.items.all()) + + + def total_with_discount(self): + total_with_item_discount = sum(item.total_with_discount() for item in self.items.all()) + if self.discount_code and self.discount_code.is_valid(): + discount_percent = self.discount_code.percent + return total_with_item_discount * ((100 - discount_percent) / 100) + return total_with_item_discount + + + def tax(self): + return self.total_without_tax() * 0.2 + + def total(self): + return self.total_without_tax + self.tax() + + def remove_order_item(self, item_pk, quantity): + pass + def add_order_item(self, item_pk, quantity): + status = '' + return status + + def clear_cart(self): + pass + + + +class OrderItemModel(models.Model): + order = models.ForeignKey(OrderModel, on_delete=models.CASCADE, related_name='items') + quantity = models.SmallIntegerField(verbose_name="تعداد") + product = models.ForeignKey(ProductModel, on_delete=models.CASCADE, verbose_name="محصول") + class Meta: + verbose_name = 'محصول خریداری شده' + verbose_name_plural = 'محصولات خریداری شده' + + def total(self): + return self.quantity * self.product.get_toman_price() + + def total_with_discount(self): + return self.quantity * self.product.get_toman_price_after_discount() + + +class DiscountCode(models.Model): + name = models.CharField(max_length=50) + percent = models.DecimalField(max_digits=4, decimal_places=2) + quantity = models.PositiveIntegerField() + expiration_date = models.DateTimeField() + + def __str__(self): + return self.name + + class Meta: + verbose_name = 'کد تخفیف' + verbose_name_plural = 'کد های تخفیف' + def is_valid(self): + return self.expiration_date > timezone.now() and self.quantity > 0 \ No newline at end of file diff --git a/backend/order/tests.py b/backend/order/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/backend/order/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/backend/order/views.py b/backend/order/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/backend/order/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here.