112 lines
3.4 KiB
Python
112 lines
3.4 KiB
Python
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}"
|