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

104 lines
3.1 KiB
Python

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
)
class Environment(models.Model):
env_displacementmap = models.FileField(
upload_to=group_based_upload_to, blank=True, null=True
)
env_normalmap = models.FileField(
upload_to=group_based_upload_to, blank=True, null=True
)
clear_color = ColorField(blank=True, null=True)
hdr_gainmap = models.FileField(
upload_to=group_based_upload_to, blank=True, null=True
)
hdr_json = models.FileField(upload_to=group_based_upload_to, blank=True, null=True)
hdr_webp = models.FileField(upload_to=group_based_upload_to, blank=True, null=True)
class Element3D(models.Model):
parent = models.ForeignKey("self", on_delete=models.PROTECT, blank=True, null=True)
model_file = models.FileField(upload_to=group_based_upload_to)
name = models.CharField(max_length=255)
description = models.TextField(blank=True, null=True)
is_enabled = models.BooleanField(default=True)
can_not_disable = models.BooleanField(default=False)
def __str__(self):
return self.name
class Scene3D(models.Model):
name = models.CharField(max_length=120)
elements = models.ManyToManyField(Element3D)
env = models.ForeignKey(Environment, models.RESTRICT, blank=True, null=True)
min_distance = models.IntegerField(
default=10,
validators=[MinValueValidator(1), MaxValueValidator(600)],
)
max_distance = models.IntegerField(
default=20,
validators=[MinValueValidator(2), MaxValueValidator(1000)],
)
def __str__(self):
return self.name
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 ClickableArea(models.Model):
name = models.CharField("название", max_length=255)
description = models.TextField("описание")
object_name = models.CharField("название объекта", max_length=255)
target_name = models.CharField(
max_length=200,
blank=True,
null=True,
)
target = models.ForeignKey(
Scene3D,
on_delete=models.PROTECT,
related_name="clickable_areas",
blank=True,
null=True,
)
source = models.ForeignKey(
Element3D,
on_delete=models.PROTECT,
)
image = models.ImageField(
"Картинка",
upload_to=group_based_upload_to,
validators=[
maximum_size_validator,
],
blank=True,
null=True,
)
def __str__(self):
return self.name