245 lines
8.9 KiB
Python
245 lines
8.9 KiB
Python
# Generated migration for polls feature
|
||
|
||
import django.db.models.deletion
|
||
from django.conf import settings
|
||
from django.db import migrations, models
|
||
|
||
|
||
class Migration(migrations.Migration):
|
||
dependencies = [
|
||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||
("communications", "0018_add_forwarded_metadata"),
|
||
]
|
||
|
||
operations = [
|
||
# Таблица голосований
|
||
migrations.CreateModel(
|
||
name="Poll",
|
||
fields=[
|
||
(
|
||
"id",
|
||
models.BigAutoField(
|
||
auto_created=True,
|
||
primary_key=True,
|
||
serialize=False,
|
||
verbose_name="ID",
|
||
),
|
||
),
|
||
("question", models.CharField(max_length=500, verbose_name="Вопрос")),
|
||
(
|
||
"is_anonymous",
|
||
models.BooleanField(
|
||
default=False, verbose_name="Анонимное голосование"
|
||
),
|
||
),
|
||
(
|
||
"is_multiple_choice",
|
||
models.BooleanField(
|
||
default=False, verbose_name="Множественный выбор"
|
||
),
|
||
),
|
||
(
|
||
"is_quiz",
|
||
models.BooleanField(default=False, verbose_name="Викторина"),
|
||
),
|
||
(
|
||
"allows_custom_answers",
|
||
models.BooleanField(
|
||
default=False, verbose_name="Разрешить свои варианты"
|
||
),
|
||
),
|
||
(
|
||
"is_closed",
|
||
models.BooleanField(
|
||
default=False, verbose_name="Голосование закрыто"
|
||
),
|
||
),
|
||
(
|
||
"closed_at",
|
||
models.DateTimeField(
|
||
blank=True, null=True, verbose_name="Время закрытия"
|
||
),
|
||
),
|
||
(
|
||
"closes_at",
|
||
models.DateTimeField(
|
||
blank=True, null=True, verbose_name="Автоматическое закрытие"
|
||
),
|
||
),
|
||
(
|
||
"created_at",
|
||
models.DateTimeField(auto_now_add=True, verbose_name="Создано"),
|
||
),
|
||
(
|
||
"updated_at",
|
||
models.DateTimeField(auto_now=True, verbose_name="Обновлено"),
|
||
),
|
||
(
|
||
"total_voters",
|
||
models.IntegerField(default=0, verbose_name="Всего проголосовало"),
|
||
),
|
||
(
|
||
"author",
|
||
models.ForeignKey(
|
||
on_delete=django.db.models.deletion.CASCADE,
|
||
related_name="created_polls",
|
||
to=settings.AUTH_USER_MODEL,
|
||
verbose_name="Автор",
|
||
),
|
||
),
|
||
(
|
||
"message",
|
||
models.OneToOneField(
|
||
on_delete=django.db.models.deletion.CASCADE,
|
||
related_name="poll",
|
||
to="communications.message",
|
||
verbose_name="Сообщение",
|
||
),
|
||
),
|
||
],
|
||
options={
|
||
"verbose_name": "Голосование",
|
||
"verbose_name_plural": "Голосования",
|
||
"ordering": ["-created_at"],
|
||
},
|
||
),
|
||
# Таблица вариантов ответа
|
||
migrations.CreateModel(
|
||
name="PollOption",
|
||
fields=[
|
||
(
|
||
"id",
|
||
models.BigAutoField(
|
||
auto_created=True,
|
||
primary_key=True,
|
||
serialize=False,
|
||
verbose_name="ID",
|
||
),
|
||
),
|
||
(
|
||
"text",
|
||
models.CharField(max_length=200, verbose_name="Текст варианта"),
|
||
),
|
||
(
|
||
"position",
|
||
models.IntegerField(default=0, verbose_name="Порядковый номер"),
|
||
),
|
||
(
|
||
"vote_count",
|
||
models.IntegerField(default=0, verbose_name="Количество голосов"),
|
||
),
|
||
(
|
||
"is_correct",
|
||
models.BooleanField(default=False, verbose_name="Правильный ответ"),
|
||
),
|
||
(
|
||
"created_at",
|
||
models.DateTimeField(auto_now_add=True, verbose_name="Создан"),
|
||
),
|
||
(
|
||
"poll",
|
||
models.ForeignKey(
|
||
on_delete=django.db.models.deletion.CASCADE,
|
||
related_name="options",
|
||
to="communications.poll",
|
||
verbose_name="Голосование",
|
||
),
|
||
),
|
||
],
|
||
options={
|
||
"verbose_name": "Вариант ответа",
|
||
"verbose_name_plural": "Варианты ответов",
|
||
"ordering": ["position", "id"],
|
||
},
|
||
),
|
||
# Таблица голосов
|
||
migrations.CreateModel(
|
||
name="PollVote",
|
||
fields=[
|
||
(
|
||
"id",
|
||
models.BigAutoField(
|
||
auto_created=True,
|
||
primary_key=True,
|
||
serialize=False,
|
||
verbose_name="ID",
|
||
),
|
||
),
|
||
(
|
||
"voted_at",
|
||
models.DateTimeField(
|
||
auto_now_add=True, verbose_name="Время голосования"
|
||
),
|
||
),
|
||
(
|
||
"option",
|
||
models.ForeignKey(
|
||
on_delete=django.db.models.deletion.CASCADE,
|
||
related_name="votes",
|
||
to="communications.polloption",
|
||
verbose_name="Выбранный вариант",
|
||
),
|
||
),
|
||
(
|
||
"poll",
|
||
models.ForeignKey(
|
||
on_delete=django.db.models.deletion.CASCADE,
|
||
related_name="votes",
|
||
to="communications.poll",
|
||
verbose_name="Голосование",
|
||
),
|
||
),
|
||
(
|
||
"voter",
|
||
models.ForeignKey(
|
||
on_delete=django.db.models.deletion.CASCADE,
|
||
related_name="poll_votes",
|
||
to=settings.AUTH_USER_MODEL,
|
||
verbose_name="Проголосовавший",
|
||
),
|
||
),
|
||
],
|
||
options={
|
||
"verbose_name": "Голос",
|
||
"verbose_name_plural": "Голоса",
|
||
"ordering": ["-voted_at"],
|
||
},
|
||
),
|
||
# Индексы и констрейнты
|
||
migrations.AddIndex(
|
||
model_name="poll",
|
||
index=models.Index(fields=["message"], name="comm_msg_idx_poll"),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name="poll",
|
||
index=models.Index(
|
||
fields=["author", "created_at"], name="comm_auth_created_poll"
|
||
),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name="poll",
|
||
index=models.Index(
|
||
fields=["is_closed", "closes_at"], name="comm_closed_closes_poll"
|
||
),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name="polloption",
|
||
index=models.Index(fields=["poll", "position"], name="comm_poll_pos_idx"),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name="pollvote",
|
||
index=models.Index(fields=["poll", "voter"], name="comm_poll_voter_idx"),
|
||
),
|
||
migrations.AddIndex(
|
||
model_name="pollvote",
|
||
index=models.Index(fields=["option"], name="comm_option_idx"),
|
||
),
|
||
# Уникальность голоса
|
||
migrations.AddConstraint(
|
||
model_name="pollvote",
|
||
constraint=models.UniqueConstraint(
|
||
fields=["poll", "voter", "option"], name="unique_vote_per_option"
|
||
),
|
||
),
|
||
]
|