from django.db import models from django.urls import reverse from django.utils.text import slugify class MainProduct(models.Model): name = models.CharField(max_length=200) slug = models.SlugField(unique=True, blank=True) short_description = models.CharField(max_length=300) description = models.TextField() image = models.ImageField(upload_to="products/main/", blank=True, null=True) order = models.PositiveIntegerField(default=0) is_active = models.BooleanField(default=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: ordering = ["order", "name"] verbose_name = "Main Product" verbose_name_plural = "Main Products" def __str__(self): return self.name def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.name) super().save(*args, **kwargs) def get_absolute_url(self): return reverse("products:main_product_detail", kwargs={"main_slug": self.slug}) class SubProduct(models.Model): main_product = models.ForeignKey( MainProduct, on_delete=models.CASCADE, related_name="sub_products", ) name = models.CharField(max_length=200) slug = models.SlugField(blank=True) short_description = models.CharField(max_length=300) description = models.TextField() image = models.ImageField(upload_to="products/sub/", blank=True, null=True) order = models.PositiveIntegerField(default=0) is_active = models.BooleanField(default=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: ordering = ["order", "name"] unique_together = [["main_product", "slug"]] verbose_name = "Sub Product" verbose_name_plural = "Sub Products" def __str__(self): return f"{self.main_product.name} › {self.name}" def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.name) super().save(*args, **kwargs) def get_absolute_url(self): return reverse( "products:sub_product_detail", kwargs={ "main_slug": self.main_product.slug, "sub_slug": self.slug, }, ) class Article(models.Model): sub_product = models.ForeignKey( SubProduct, on_delete=models.CASCADE, related_name="articles", ) title = models.CharField(max_length=300) description = models.TextField() order = models.PositiveIntegerField(default=0) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: ordering = ["order", "title"] verbose_name = "Article" verbose_name_plural = "Articles" def __str__(self): return self.title class ArticleSection(models.Model): article = models.ForeignKey( Article, on_delete=models.CASCADE, related_name="sections", ) title = models.CharField(max_length=200) value = models.TextField() order = models.PositiveIntegerField(default=0) class Meta: ordering = ["order"] verbose_name = "Article Section" verbose_name_plural = "Article Sections" def __str__(self): return f"{self.article.title} › {self.title}"