from django.db import models from django.contrib.auth.models import User from django.db.models.signals import post_save from django.dispatch import receiver class Profile(models.Model): ROLE_CHOICES = ( ('admin', 'Admin'), ('customer', 'Customer'), ) user = models.OneToOneField(User, on_delete=models.CASCADE) role = models.CharField(max_length=10, choices=ROLE_CHOICES, default='customer') avatar = models.ImageField(upload_to='avatars/', null=True, blank=True) def __str__(self): return f"{self.user.username} - {self.role}" class Category(models.Model): name = models.CharField(max_length=100) description = models.TextField(blank=True) class Meta: verbose_name_plural = "Categories" def __str__(self): return self.name class Product(models.Model): category = models.ForeignKey(Category, related_name='products', on_delete=models.CASCADE) title = models.CharField(max_length=200) description = models.TextField() price = models.DecimalField(max_digits=10, decimal_places=2) stock = models.PositiveIntegerField(default=0) image_url = models.URLField(max_length=500, blank=True) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return self.title class Order(models.Model): STATUS_CHOICES = ( ('pending', 'Pending'), ('paid', 'Paid'), ('shipped', 'Shipped'), ('cancelled', 'Cancelled'), ) user = models.ForeignKey(User, related_name='orders', on_delete=models.CASCADE) order_date = models.DateTimeField(auto_now_add=True) total_amount = models.DecimalField(max_digits=10, decimal_places=2, default=0.00) status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='pending') def __str__(self): return f"Order {self.id} - {self.user.username}" class OrderItem(models.Model): order = models.ForeignKey(Order, related_name='items', on_delete=models.CASCADE) product = models.ForeignKey(Product, on_delete=models.CASCADE) quantity = models.PositiveIntegerField(default=1) price = models.DecimalField(max_digits=10, decimal_places=2) def __str__(self): return f"{self.quantity} x {self.product.title}" @receiver(post_save, sender=User) def create_user_profile(sender, instance, created, **kwargs): if created: Profile.objects.create(user=instance) @receiver(post_save, sender=User) def save_user_profile(sender, instance, **kwargs): instance.profile.save()