# Create your models here. from django.db import models import uuid from cloudinary.models import CloudinaryField class Category(models.Model): name = models.CharField(max_length=50, unique=True) # tableware, decor, custom slug = models.SlugField(unique=True) def __str__(self): return self.name class Product(models.Model): id = models.CharField( max_length=100, primary_key=True ) # matches frontend slug like "ceremonial-tea-bowl-001" name = models.CharField(max_length=255) category = models.ForeignKey( Category, on_delete=models.CASCADE, related_name="products" ) description = models.TextField() long_description = models.TextField(blank=True, null=True) price = models.PositiveIntegerField() stock = models.PositiveIntegerField() weight = models.FloatField(help_text="Weight in KG") featured = models.BooleanField(default=False) is_customizable = models.BooleanField(default=False) # JSON fields (PostgreSQL only) images = models.JSONField(default=list) available_colors = models.JSONField(default=list) features = models.JSONField(default=list) materials = models.JSONField(default=list) care_instructions = models.JSONField(default=list) dimensions = models.JSONField(blank=True, null=True) related_products = models.JSONField(blank=True, null=True) is_food_safe = models.BooleanField(default=True) is_microwave_safe = models.BooleanField(default=False) is_dishwasher_safe = models.BooleanField(default=False) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return self.name class CustomOrder(models.Model): PRODUCT_TYPE_CHOICES = [ ("cups_mugs", "Cups & Mugs"), ("bowls", "Bowls"), ("plates", "Plates"), ("vases", "Vases"), ("decorative", "Decorative pieces"), ("other", "Other"), ] STATUS_CHOICES = [ ("pending", "Pending"), ("reviewed", "Reviewed"), ("quoted", "Quoted"), ("approved", "Approved"), ("rejected", "Rejected"), ] name = models.CharField(max_length=100) email = models.EmailField() phone = models.CharField(max_length=20, blank=True) product_type = models.CharField( max_length=50, choices=PRODUCT_TYPE_CHOICES ) quantity = models.PositiveIntegerField(default=1) dimensions = models.CharField(max_length=100, blank=True) preferred_colors = models.CharField(max_length=100, blank=True) timeline = models.CharField(max_length=100, blank=True) budget_range = models.CharField(max_length=100, blank=True) description = models.TextField() admin_notes = models.TextField( blank=True, help_text="Internal notes for admin only" ) # Order management status = models.CharField( max_length=20, choices=STATUS_CHOICES, default="pending" ) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: ordering = ["-created_at"] email_verification_token = models.UUIDField( default=uuid.uuid4, unique=True, editable=False ) email_verified = models.BooleanField(default=False) def __str__(self): return f"{self.name} - {self.product_type}" class CustomOrderImage(models.Model): order = models.ForeignKey( CustomOrder, related_name="images", on_delete=models.CASCADE ) image = CloudinaryField("image") def __str__(self): return f"Image for Order {self.order.id}" class CustomOrderEmailLog(models.Model): order = models.ForeignKey( CustomOrder, related_name="email_logs", on_delete=models.CASCADE ) subject = models.CharField(max_length=255) message = models.TextField() sent_at = models.DateTimeField(auto_now_add=True) def __str__(self): return f"Email for Order {self.order.id} at {self.sent_at}"