229 lines
8.2 KiB
Python
229 lines
8.2 KiB
Python
# Generated migration for polls feature
|
||
|
||
from django.conf import settings
|
||
from django.db import migrations, models
|
||
import django.db.models.deletion
|
||
|
||
|
||
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'
|
||
),
|
||
),
|
||
]
|