82 lines
2.6 KiB
Python
82 lines
2.6 KiB
Python
from decimal import Decimal
|
||
|
||
from django.db import models
|
||
|
||
|
||
class Category(models.Model):
|
||
name = models.CharField(max_length=120, unique=True)
|
||
slug = models.SlugField(unique=True)
|
||
description = models.TextField(blank=True)
|
||
sort_order = models.PositiveIntegerField(default=0)
|
||
|
||
class Meta:
|
||
ordering = ["sort_order", "name"]
|
||
|
||
def __str__(self):
|
||
return self.name
|
||
|
||
|
||
class Product(models.Model):
|
||
category = models.ForeignKey(Category, on_delete=models.PROTECT, related_name="products")
|
||
name = models.CharField(max_length=160)
|
||
slug = models.SlugField(unique=True)
|
||
short_description = models.CharField(max_length=220)
|
||
description = models.TextField()
|
||
material = models.CharField(max_length=120, blank=True)
|
||
price_from = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
|
||
collection_note = models.CharField(max_length=180, blank=True)
|
||
is_featured = models.BooleanField(default=False)
|
||
is_active = models.BooleanField(default=True)
|
||
created_at = models.DateTimeField(auto_now_add=True)
|
||
updated_at = models.DateTimeField(auto_now=True)
|
||
|
||
class Meta:
|
||
ordering = ["name"]
|
||
|
||
def __str__(self):
|
||
return self.name
|
||
|
||
@property
|
||
def price_label(self):
|
||
if self.price_from is None:
|
||
return "Preis auf Anfrage"
|
||
quantized = self.price_from.quantize(Decimal("1.00"))
|
||
return f"ab {quantized:,.2f} €".replace(",", "X").replace(".", ",").replace("X", ".")
|
||
|
||
|
||
class ContactInquiry(models.Model):
|
||
class PreferredContactMethod(models.TextChoices):
|
||
PHONE = "phone", "Telefon"
|
||
EMAIL = "email", "E-Mail"
|
||
|
||
class Status(models.TextChoices):
|
||
NEW = "new", "Neu"
|
||
CONTACTED = "contacted", "Kontaktiert"
|
||
CLOSED = "closed", "Abgeschlossen"
|
||
|
||
product = models.ForeignKey(
|
||
Product,
|
||
on_delete=models.SET_NULL,
|
||
related_name="inquiries",
|
||
blank=True,
|
||
null=True,
|
||
)
|
||
name = models.CharField(max_length=120)
|
||
email = models.EmailField()
|
||
phone = models.CharField(max_length=40, blank=True)
|
||
subject = models.CharField(max_length=160, blank=True)
|
||
message = models.TextField()
|
||
preferred_contact_method = models.CharField(
|
||
max_length=10,
|
||
choices=PreferredContactMethod.choices,
|
||
default=PreferredContactMethod.PHONE,
|
||
)
|
||
status = models.CharField(max_length=20, choices=Status.choices, default=Status.NEW)
|
||
created_at = models.DateTimeField(auto_now_add=True)
|
||
|
||
class Meta:
|
||
ordering = ["-created_at"]
|
||
|
||
def __str__(self):
|
||
return f"{self.name} – {self.subject or 'Allgemeine Anfrage'}"
|