mirror of
https://github.com/narrrl/holy-flavor-rater.git
synced 2026-11-03 16:41:27 +01:00
54 lines
1.8 KiB
Python
54 lines
1.8 KiB
Python
from django.db import models
|
|
from django.db.models import Avg
|
|
|
|
|
|
class Category(models.Model):
|
|
name = models.CharField(max_length=50, unique=True)
|
|
slug = models.SlugField(unique=True)
|
|
|
|
class Meta:
|
|
verbose_name_plural = "Categories"
|
|
ordering = ["name"]
|
|
|
|
def __str__(self) -> str:
|
|
return self.name
|
|
|
|
|
|
class Flavor(models.Model):
|
|
category = models.ForeignKey(Category, related_name="flavors", on_delete=models.CASCADE)
|
|
name = models.CharField(max_length=100)
|
|
description = models.TextField(blank=True)
|
|
image_url = models.URLField(max_length=1000, blank=True, null=True)
|
|
image_urls = models.JSONField(blank=True, default=list)
|
|
image = models.ImageField(upload_to="flavors/", blank=True, null=True)
|
|
local_image_paths = models.JSONField(blank=True, default=list)
|
|
main_image_path = models.CharField(max_length=500, blank=True, null=True)
|
|
shop_url = models.URLField(max_length=500, blank=True, null=True)
|
|
is_available = models.BooleanField(default=True)
|
|
is_legacy = models.BooleanField(default=False)
|
|
external_id = models.BigIntegerField(unique=True, null=True, blank=True)
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
|
|
class Meta:
|
|
constraints = [
|
|
models.UniqueConstraint(
|
|
fields=["name", "category"],
|
|
name="unique_flavor_name_per_category",
|
|
)
|
|
]
|
|
ordering = ["name"]
|
|
|
|
def __str__(self) -> str:
|
|
return f"{self.name} ({self.category.name})"
|
|
|
|
@property
|
|
def get_average_rating(self) -> float:
|
|
result = self.ratings.aggregate(avg=Avg("score"))["avg"]
|
|
return result or 0.0
|
|
|
|
@property
|
|
def cached_image_url(self) -> str | None:
|
|
if self.image:
|
|
return self.image.url
|
|
return self.image_url
|