demo-int-table/back/object/models.py

172 lines
5.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from PIL import Image
from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator
from django.core.exceptions import ValidationError
from colorfield.fields import ColorField
import logging
logger = logging.getLogger("root")
def group_based_upload_to(instance, filename):
logger.info(instance)
return "files/image/{}/{}/{}".format(
type(instance).__name__.lower(), instance.id, filename
)
def maximum_size_validator(image):
max_width = 512
max_height = 512
img = Image.open(image)
fw, fh = img.size
if fw > max_width or fh > max_height:
raise ValidationError("Height or Width is larger than what is allowed")
class Environment(models.Model):
clear_color = ColorField(
blank=True,
null=True,
verbose_name="Цвет очистки (начальный)"
)
clear_color_to = ColorField(
blank=True,
null=True,
verbose_name="Цвет очистки (конечный)"
)
hdr_gainmap = models.FileField(
upload_to=group_based_upload_to,
blank=True,
null=True,
verbose_name="HDR Gainmap файл"
)
hdr_json = models.FileField(
upload_to=group_based_upload_to,
blank=True,
null=True,
verbose_name="HDR JSON файл"
)
hdr_webp = models.FileField(
upload_to=group_based_upload_to,
blank=True,
null=True,
verbose_name="HDR WEBP файл"
)
def __str__(self):
return f"Среда #{self.id}"
class Meta:
verbose_name = "Среда"
verbose_name_plural = "Среды"
class Element3D(models.Model):
model_file = models.FileField(
upload_to=group_based_upload_to,
verbose_name="Файл модели"
)
name = models.CharField(
max_length=255,
verbose_name="Название элемента"
)
description = models.TextField(
blank=True,
null=True,
verbose_name="Описание элемента"
)
is_enabled = models.BooleanField(
default=True,
verbose_name="Включен"
)
can_not_disable = models.BooleanField(
default=False,
verbose_name="Невозможно отключить"
)
x_pos = models.IntegerField(
default=0,
verbose_name="Позиция X"
)
y_pos = models.IntegerField(
default=0,
verbose_name="Позиция Y"
)
z_pos = models.IntegerField(
default=0,
verbose_name="Позиция Z"
)
def __str__(self):
return self.name
class Meta:
verbose_name = "Элемент 3D"
verbose_name_plural = "Элементы 3D"
class Scene3D(models.Model):
name = models.CharField(max_length=120, verbose_name="Название сцены")
description = models.TextField(blank=True, null=True, verbose_name="Описание сцены")
elements = models.ManyToManyField("Element3D", verbose_name="Элементы 3D")
env = models.ForeignKey(
"Environment",
on_delete=models.RESTRICT,
blank=True,
null=True,
verbose_name="Среда",
)
min_distance = models.IntegerField(
default=10,
validators=[MinValueValidator(1), MaxValueValidator(600)],
verbose_name="Минимальное расстояние",
)
max_distance = models.IntegerField(
default=20,
validators=[MinValueValidator(2), MaxValueValidator(1000)],
verbose_name="Максимальное расстояние",
)
def __str__(self):
return self.name
class Meta:
verbose_name = "Сцена 3D"
verbose_name_plural = "Сцены 3D"
class ClickableArea(models.Model):
name = models.CharField(
verbose_name="Название",
max_length=255,
help_text="Название кликабельной области",
)
description = models.TextField(
verbose_name="Описание",
help_text="Описание кликабельной области",
)
target = models.ForeignKey(
"Scene3D", # Предполагается, что Scene3D определен где-то выше или в том же файле
on_delete=models.PROTECT,
related_name="clickable_areas",
blank=True,
null=True,
help_text="На какую сцену ведет клик",
)
source = models.ForeignKey(
"Element3D", # Предполагается, что Element3D определен где-то выше или в том же файле
on_delete=models.PROTECT,
help_text="В каком элементе искать object_name",
)
object_name = models.CharField(
verbose_name="Название объекта",
max_length=255,
help_text="Имя mesh или group в элементе 3D",
)
def __str__(self):
return self.name
class Meta:
verbose_name = "Кликабельная область" # Человекочитаемое имя одной записи
verbose_name_plural = "Кликабельные области" # Человекочитаемое имя множественного числа