132 lines
3.7 KiB
Python
132 lines
3.7 KiB
Python
from datetime import datetime
|
||
from django.db import models
|
||
from django.contrib.auth.models import User
|
||
from django.utils.safestring import mark_safe
|
||
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)
|
||
)
|
||
created = models.DateTimeField("Создано", default=datetime.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}'
|