347 lines
12 KiB
Python
347 lines
12 KiB
Python
# Generated by Django 5.2.4 on 2025-08-26 07:37
|
|
|
|
import django.core.validators
|
|
import django.db.models.deletion
|
|
from django.conf import settings
|
|
from django.db import migrations, models
|
|
|
|
import feed.models
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
initial = True
|
|
|
|
dependencies = [
|
|
("employees", "0019_delete_education"),
|
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
]
|
|
|
|
operations = [
|
|
migrations.CreateModel(
|
|
name="Post",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.BigAutoField(
|
|
auto_created=True,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("title", models.CharField(max_length=200, verbose_name="Заголовок")),
|
|
("body", models.TextField(verbose_name="Текст")),
|
|
(
|
|
"created_at",
|
|
models.DateTimeField(auto_now_add=True, verbose_name="Создано"),
|
|
),
|
|
(
|
|
"pinned",
|
|
models.BooleanField(default=False, verbose_name="Закреплено"),
|
|
),
|
|
(
|
|
"type",
|
|
models.CharField(
|
|
choices=[
|
|
("company", "Новость компании"),
|
|
("department", "Новость отдела"),
|
|
("employee", "Публикация сотрудника"),
|
|
],
|
|
max_length=20,
|
|
verbose_name="Тип публикации",
|
|
),
|
|
),
|
|
(
|
|
"image",
|
|
models.ImageField(
|
|
blank=True,
|
|
null=True,
|
|
upload_to="feed/images/%Y/%m/",
|
|
verbose_name="Изображение",
|
|
),
|
|
),
|
|
(
|
|
"attachment",
|
|
models.FileField(
|
|
blank=True,
|
|
null=True,
|
|
upload_to="feed/attachments/%Y/%m/",
|
|
verbose_name="Вложение",
|
|
),
|
|
),
|
|
(
|
|
"likes_count",
|
|
models.PositiveIntegerField(
|
|
db_index=True, default=0, verbose_name="Лайки"
|
|
),
|
|
),
|
|
(
|
|
"author",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="posts",
|
|
to=settings.AUTH_USER_MODEL,
|
|
verbose_name="Автор",
|
|
),
|
|
),
|
|
(
|
|
"department",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
help_text="Для новостей отдела укажите отдел. Для других типов оставьте пустым.",
|
|
null=True,
|
|
on_delete=django.db.models.deletion.PROTECT,
|
|
related_name="posts",
|
|
to="employees.department",
|
|
verbose_name="Отдел",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Публикация",
|
|
"verbose_name_plural": "Публикации",
|
|
"ordering": ["-pinned", "-created_at"],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="Comment",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.BigAutoField(
|
|
auto_created=True,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
(
|
|
"text",
|
|
models.TextField(
|
|
blank=True, default="", verbose_name="Комментарий"
|
|
),
|
|
),
|
|
(
|
|
"image",
|
|
models.ImageField(
|
|
blank=True,
|
|
null=True,
|
|
upload_to="feed/comments/images/%Y/%m/",
|
|
validators=[
|
|
django.core.validators.FileExtensionValidator(
|
|
allowed_extensions=["jpg", "jpeg", "png", "gif", "webp"]
|
|
),
|
|
feed.models.FileSizeValidator(10),
|
|
],
|
|
verbose_name="Изображение",
|
|
),
|
|
),
|
|
(
|
|
"attachment",
|
|
models.FileField(
|
|
blank=True,
|
|
null=True,
|
|
upload_to="feed/comments/attachments/%Y/%m/",
|
|
validators=[
|
|
django.core.validators.FileExtensionValidator(
|
|
allowed_extensions=[
|
|
"pdf",
|
|
"doc",
|
|
"docx",
|
|
"xls",
|
|
"xlsx",
|
|
"txt",
|
|
"csv",
|
|
"png",
|
|
"jpg",
|
|
"jpeg",
|
|
"gif",
|
|
"zip",
|
|
"rar",
|
|
"7z",
|
|
]
|
|
),
|
|
feed.models.FileSizeValidator(25),
|
|
],
|
|
verbose_name="Вложение",
|
|
),
|
|
),
|
|
(
|
|
"created_at",
|
|
models.DateTimeField(auto_now_add=True, verbose_name="Создано"),
|
|
),
|
|
(
|
|
"author",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="comments",
|
|
to=settings.AUTH_USER_MODEL,
|
|
verbose_name="Автор",
|
|
),
|
|
),
|
|
(
|
|
"post",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="comments",
|
|
to="feed.post",
|
|
verbose_name="Публикация",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Комментарий",
|
|
"verbose_name_plural": "Комментарии",
|
|
"ordering": ["created_at"],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="PostLike",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.BigAutoField(
|
|
auto_created=True,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True)),
|
|
(
|
|
"post",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="likes",
|
|
to="feed.post",
|
|
verbose_name="Пост",
|
|
),
|
|
),
|
|
(
|
|
"user",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="post_likes",
|
|
to=settings.AUTH_USER_MODEL,
|
|
verbose_name="Пользователь",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Лайк",
|
|
"verbose_name_plural": "Лайки",
|
|
},
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="post",
|
|
index=models.Index(
|
|
fields=["type", "created_at"], name="feed_post_type_b00891_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="post",
|
|
index=models.Index(
|
|
fields=["pinned", "created_at"], name="feed_post_pinned_e86c9a_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="post",
|
|
index=models.Index(
|
|
fields=["created_at"], name="feed_post_created_ddd8c4_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="post",
|
|
index=models.Index(
|
|
fields=["department", "-created_at"],
|
|
name="feed_post_departm_b35669_idx",
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="post",
|
|
index=models.Index(
|
|
fields=["author", "-created_at"], name="feed_post_author__c854fa_idx"
|
|
),
|
|
),
|
|
migrations.AddConstraint(
|
|
model_name="post",
|
|
constraint=models.CheckConstraint(
|
|
condition=models.Q(
|
|
models.Q(("department__isnull", False), ("type", "department")),
|
|
models.Q(("type", "department"), _negated=True),
|
|
_connector="OR",
|
|
),
|
|
name="post_department_required_when_type_is_department",
|
|
),
|
|
),
|
|
migrations.AddConstraint(
|
|
model_name="post",
|
|
constraint=models.CheckConstraint(
|
|
condition=models.Q(
|
|
("type", "department"),
|
|
("department__isnull", True),
|
|
_connector="OR",
|
|
),
|
|
name="post_department_null_when_type_not_department",
|
|
),
|
|
),
|
|
migrations.AddConstraint(
|
|
model_name="post",
|
|
constraint=models.CheckConstraint(
|
|
condition=models.Q(("likes_count__gte", 0)),
|
|
name="post_likes_count_non_negative",
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="comment",
|
|
index=models.Index(
|
|
fields=["created_at"], name="feed_commen_created_a85775_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="comment",
|
|
index=models.Index(
|
|
fields=["post", "created_at"], name="feed_commen_post_id_3fe3f3_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="comment",
|
|
index=models.Index(
|
|
fields=["author", "created_at"], name="feed_commen_author__b1fbf5_idx"
|
|
),
|
|
),
|
|
migrations.AddConstraint(
|
|
model_name="comment",
|
|
constraint=models.CheckConstraint(
|
|
condition=models.Q(
|
|
models.Q(
|
|
("text__isnull", False), models.Q(("text", ""), _negated=True)
|
|
),
|
|
("image__isnull", False),
|
|
("attachment__isnull", False),
|
|
_connector="OR",
|
|
),
|
|
name="comment_has_any_content_v3",
|
|
violation_error_message="Нужно указать текст, изображение или файл.",
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="postlike",
|
|
index=models.Index(
|
|
fields=["user", "created_at"], name="feed_postli_user_id_15e79d_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="postlike",
|
|
index=models.Index(
|
|
fields=["post", "created_at"], name="feed_postli_post_id_2897d2_idx"
|
|
),
|
|
),
|
|
migrations.AddConstraint(
|
|
model_name="postlike",
|
|
constraint=models.UniqueConstraint(
|
|
fields=("post", "user"), name="uq_postlike_post_user"
|
|
),
|
|
),
|
|
]
|