premises-rental/app/models.py

116 строки
2.9 KiB
Python

import os
import uuid
from django.db.models import Model
from django.db.models import OneToOneField, ManyToManyField, CASCADE
from django.db.models import CharField, TextField, IntegerField, DecimalField, BooleanField, ImageField
from django.utils.deconstruct import deconstructible
@deconstructible
class UploadTo:
def __init__(self, path):
self.path = path
def __call__(self, instance, filename):
return os.path.join(
self.path,
'%s.%s' % (
uuid.uuid4(),
filename.split('.')[-1],
),
)
class RoomImage(Model):
class Meta:
verbose_name = 'изображение комнаты'
verbose_name_plural = 'изображения комнат'
name = CharField(
verbose_name='Название',
max_length=32,
unique=True,
)
image = ImageField(
verbose_name='Изображение',
upload_to=UploadTo('media/rooms/images'),
)
def __str__(self):
return self.name
class RoomPanorama(Model):
class Meta:
verbose_name = 'панорама комнаты'
verbose_name_plural = 'панорамы комнат'
name = CharField(
verbose_name='Название',
max_length=32,
unique=True,
)
image = ImageField(
verbose_name='Изображение',
upload_to=UploadTo('media/rooms/panoramas'),
)
def __str__(self):
return self.name
class Room(Model):
class Meta:
verbose_name = 'комната'
verbose_name_plural = 'комнаты'
name = CharField(
verbose_name='Название',
max_length=32,
unique=True,
)
description = TextField(
verbose_name='Описание',
max_length=4096,
)
preview_image = OneToOneField(
verbose_name='Изображение в каталоге',
to=RoomImage,
on_delete=CASCADE,
related_name='room_preview',
)
room_images = ManyToManyField(
verbose_name='Изображения',
to=RoomImage,
related_name='room_images',
)
panorama_images = ManyToManyField(
verbose_name='Панорамы',
to=RoomPanorama,
)
area = DecimalField(
verbose_name='Площадь',
max_digits=4,
decimal_places=1,
)
price = DecimalField(
verbose_name='Стоимость',
max_digits=10,
decimal_places=2,
)
ordinal = IntegerField(
verbose_name='Порядковый номер',
)
is_visible = BooleanField(
verbose_name='Отображать в каталоге',
default=True,
)
is_available = BooleanField(
verbose_name='Доступна для аренды',
default=True,
)
def __str__(self):
return self.name