order app update

This commit is contained in:
Parsa Nazer
2025-01-26 03:08:20 +03:30
parent c65540f560
commit 6a05adcb92
8 changed files with 102 additions and 0 deletions
+1
View File
@@ -108,6 +108,7 @@ INSTALLED_APPS = [
'account', 'account',
'ticket', 'ticket',
'chat', 'chat',
'order',
] ]
MIDDLEWARE = [ MIDDLEWARE = [
View File
+3
View File
@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.
+6
View File
@@ -0,0 +1,6 @@
from django.apps import AppConfig
class OrderConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'order'
+86
View File
@@ -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
+3
View File
@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.
+3
View File
@@ -0,0 +1,3 @@
from django.shortcuts import render
# Create your views here.