customerwebsitebackend/orders/models.py
vickytechkey b73cab8f92
All checks were successful
Deploy Beta (NATIVE) / deploy (push) Successful in 23s
feat: add cart, checkout, payment, and order management views with serialization and routing
2026-10-04 20:26:09 +05:30

131 lines
5.5 KiB
Python

from django.db import models
from django.contrib.auth.models import User
from products.models import Product
class CustomerProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='customer_profile', db_constraint=False)
phone = models.CharField(max_length=20, blank=True)
gender = models.CharField(max_length=30, default='Prefer not to say', blank=True)
wallet_balance = models.DecimalField(max_digits=12, decimal_places=2, default=0.00)
loyalty_coins = models.IntegerField(default=00)
default_address = models.TextField(blank=True)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.user.username
class Address(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='addresses')
full_name = models.CharField(max_length=150)
phone = models.CharField(max_length=20)
street = models.CharField(max_length=255)
area = models.CharField(max_length=255, blank=True)
city = models.CharField(max_length=100)
state = models.CharField(max_length=100)
pincode = models.CharField(max_length=10)
address_type = models.CharField(max_length=20, default='Home')
is_default = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.full_name} - {self.city} ({self.address_type})"
class WalletTransaction(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='wallet_transactions')
transaction_id = models.CharField(max_length=50, unique=True)
title = models.CharField(max_length=255)
type = models.CharField(max_length=20) # 'credit' or 'debit'
amount = models.DecimalField(max_digits=10, decimal_places=2)
status = models.CharField(max_length=50, default='Completed')
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.transaction_id} - {self.type} ₹{self.amount}"
class Wishlist(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='wishlist_items')
product_id = models.IntegerField()
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = ('user', 'product_id')
def __str__(self):
return f"Wishlist item {self.product_id} for {self.user.username}"
class ProductReview(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='product_reviews')
product_id = models.IntegerField()
rating = models.IntegerField(default=5)
title = models.CharField(max_length=255)
comment = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"Review by {self.user.username} - {self.rating} stars"
class Cart(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='cart', db_constraint=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return f"Cart for {self.user.username}"
class CartItem(models.Model):
cart = models.ForeignKey(Cart, on_delete=models.CASCADE, related_name='items')
product_id = models.IntegerField(default=1) # Keep reference as simple int since product is in productprofile db
quantity = models.PositiveIntegerField(default=1)
price_at_add = models.DecimalField(max_digits=10, decimal_places=2)
@property
def product(self):
try:
return Product.objects.get(id=self.product_id)
except Product.DoesNotExist:
return None
def __str__(self):
return f"{self.quantity} x Product {self.product_id}"
class Order(models.Model):
STATUS_CHOICES = (
('pending', 'Pending'),
('confirmed', 'Confirmed'),
('shipped', 'Shipped'),
('delivered', 'Delivered'),
('cancelled', 'Cancelled'),
)
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='orders', db_constraint=False)
razorpay_order_id = models.CharField(max_length=100, blank=True, null=True)
razorpay_payment_id = models.CharField(max_length=100, blank=True, null=True)
total_amount = models.DecimalField(max_digits=10, decimal_places=2)
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending')
shipping_address = models.TextField()
cancellation_reason = models.TextField(blank=True, null=True)
return_reason = models.TextField(blank=True, null=True)
placed_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"Order {self.id} by {self.user.username}"
# Align to seller_central_backend api_order schema
class SellerOrder(models.Model):
supplier_id = models.IntegerField() # Raw integer referring to User in sellerprofile db
order_id = models.CharField(max_length=50, unique=True)
date = models.DateField()
item = models.CharField(max_length=255)
quantity = models.IntegerField(default=1)
customer = models.CharField(max_length=255)
total = models.DecimalField(max_digits=10, decimal_places=2)
status = models.CharField(max_length=50, default='Pending Acceptance')
carrier = models.CharField(max_length=100, default='Pending')
tracking = models.CharField(max_length=100, default='Pending')
eta = models.CharField(max_length=50, default='N/A')
class Meta:
db_table = 'api_order'
managed = False # Managed by seller central backend migrations
def __str__(self):
return self.order_id