Files
jeweller-extend/extend/models.py

139 lines
3.9 KiB
Python
Raw 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 django.db import models
from django.contrib.auth.models import User
from django.utils.safestring import mark_safe
from django.utils import timezone
from django.core.validators import FileExtensionValidator
from mptt.models import MPTTModel, TreeForeignKey
from pytils.translit import slugify
from model_utils import Choices
from easy_thumbnails.files import get_thumbnailer
from easy_thumbnails.fields import ThumbnailerImageField
class Category(MPTTModel):
name = models.CharField(
"Название", unique=True, max_length=100
)
slug = models.SlugField(
"Путь",
null=True,
blank=True,
unique=True,
max_length=100,
)
parent = TreeForeignKey(
"self",
on_delete=models.CASCADE,
null=True,
blank=True,
related_name="children",
)
class MPTTMeta:
order_insertion_by = ["name"]
class Meta:
abstract = True
verbose_name = "Категория"
verbose_name_plural = "Категории"
ordering = ["name"]
def __str__(self):
return self.name
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.name)
super().save(*args, **kwargs)
class Tag(models.Model):
name = models.CharField(
"Название", unique=True, max_length=100
)
slug = models.SlugField(
"Путь",
null=True,
blank=True,
unique=True,
max_length=100,
)
class Meta:
abstract = True
verbose_name = "Метка"
verbose_name_plural = "Метки"
ordering = ["name"]
def __str__(self):
return self.name
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.name)
super().save(*args, **kwargs)
class Photo(models.Model):
user = models.ForeignKey(User, null=True, on_delete=models.SET_NULL, verbose_name="Пользователь")
title = models.CharField("Название", blank=True, max_length=255)
image = ThumbnailerImageField(
"Фото",
upload_to="photos/",
max_length=255,
default="",
resize_source=dict(size=(825, 825), sharpen=True),
validators=[FileExtensionValidator(
allowed_extensions=["png", "jpg", "jpeg", "gif"])]
)
created = models.DateTimeField("Создано", default=timezone.now)
updated = models.DateTimeField("Изменено", auto_now=True)
class Meta:
abstract = True
verbose_name = "Фотография"
verbose_name_plural = "Фотографии"
ordering = ["id"]
def __str__(self):
return self.title
def image_tag(self):
if self.image:
options = {'size': (100, 100), 'upscale': True}
thumb_url = get_thumbnailer(self.image).get_thumbnail(options).url
return mark_safe('<img src="%s"/>' % thumb_url)
else:
return 'Изображение отсутствует'
image_tag.short_description = 'Превью'
class Comment(models.Model):
user = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
text = models.TextField("Текст")
created = models.DateTimeField(
"Создано", auto_now_add=True
)
updated = models.DateTimeField(
"Изменено", auto_now=True
)
STATUS = Choices(
("moderation", "На модерации"),
("published", "Опубликовано"),
)
status = models.CharField(
choices=STATUS,
default=STATUS.moderation,
max_length=20,
)
class Meta:
abstract = True
verbose_name = "Комментарий"
verbose_name_plural = "Комментарии"
ordering = ["-created"]
def __str__(self):
return f'{self.created} {self.user.username}'