114 lines
4.1 KiB
Python
114 lines
4.1 KiB
Python
from django.db import models
|
|
from decimal import Decimal
|
|
from webapp.models import Invoice # Явно импортируем модель Invoice из приложения webapp
|
|
|
|
class Lottery(models.Model):
|
|
name = models.CharField("Название лотереи", max_length=255)
|
|
description = models.TextField("Описание", blank=True)
|
|
created_at = models.DateTimeField("Дата создания", auto_now_add=True)
|
|
finished = models.BooleanField(default=False, verbose_name="Завершена")
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
class Meta:
|
|
verbose_name = "Лотерея"
|
|
verbose_name_plural = "Лотереи"
|
|
|
|
|
|
class Prize(models.Model):
|
|
lottery = models.ForeignKey(
|
|
Lottery,
|
|
on_delete=models.CASCADE,
|
|
related_name="prizes",
|
|
verbose_name="Лотерея"
|
|
)
|
|
prize_place = models.CharField(
|
|
"Призовое место",
|
|
max_length=50,
|
|
help_text="Например, 1 место, 2 место и т.д."
|
|
)
|
|
description = models.TextField("Описание приза", blank=True)
|
|
reward = models.DecimalField(
|
|
"Награда",
|
|
max_digits=10,
|
|
decimal_places=2,
|
|
default=Decimal("0.00")
|
|
)
|
|
# Победитель назначается администратором из списка участников лотереи (LotteryParticipant)
|
|
winner = models.ForeignKey(
|
|
"draw.LotteryParticipant",
|
|
on_delete=models.SET_NULL,
|
|
null=True,
|
|
blank=True,
|
|
verbose_name="Победитель (счет)",
|
|
help_text="Выберите счет участника лотереи, который выиграл приз"
|
|
)
|
|
|
|
def __str__(self):
|
|
return f"{self.prize_place} - {self.lottery.name}"
|
|
|
|
class Meta:
|
|
verbose_name = "Приз"
|
|
verbose_name_plural = "Призы"
|
|
|
|
|
|
class LotteryParticipant(models.Model):
|
|
lottery = models.ForeignKey(
|
|
Lottery,
|
|
on_delete=models.CASCADE,
|
|
related_name="participants",
|
|
verbose_name="Лотерея"
|
|
)
|
|
# Ссылка на счет-участник из приложения webapp (модель Invoice)
|
|
invoice = models.ForeignKey(
|
|
Invoice,
|
|
on_delete=models.CASCADE,
|
|
verbose_name="Счет участника"
|
|
)
|
|
added_at = models.DateTimeField("Дата добавления", auto_now_add=True)
|
|
used = models.BooleanField("Использован", default=False,
|
|
help_text="Отметка, что этот счет уже участвовал в розыгрыше")
|
|
|
|
class Meta:
|
|
unique_together = ("lottery", "invoice")
|
|
verbose_name = "Участник лотереи"
|
|
verbose_name_plural = "Участники лотереи"
|
|
|
|
def __str__(self):
|
|
return f"{self.invoice} в {self.lottery.name}"
|
|
|
|
|
|
class DrawResult(models.Model):
|
|
"""
|
|
Результат розыгрыша для конкретного приза.
|
|
Каждому призу соответствует один активный результат розыгрыша.
|
|
"""
|
|
lottery = models.ForeignKey(
|
|
Lottery,
|
|
on_delete=models.CASCADE,
|
|
related_name="draw_results",
|
|
verbose_name="Лотерея"
|
|
)
|
|
prize = models.OneToOneField(
|
|
Prize,
|
|
on_delete=models.CASCADE,
|
|
verbose_name="Приз"
|
|
)
|
|
# Ссылка на участника (LotteryParticipant), выбранного в розыгрыше
|
|
participant = models.ForeignKey(
|
|
LotteryParticipant,
|
|
on_delete=models.SET_NULL,
|
|
null=True,
|
|
blank=True,
|
|
verbose_name="Победитель"
|
|
)
|
|
confirmed = models.BooleanField("Подтвержден", default=False)
|
|
drawn_at = models.DateTimeField("Время розыгрыша", auto_now_add=True)
|
|
|
|
def __str__(self):
|
|
return f"Результат для {self.prize} — {self.participant}"
|
|
|
|
class Meta:
|
|
verbose_name = "Результат розыгрыша"
|
|
verbose_name_plural = "Результаты розыгрыша"
|