Files
lottery_ycms/lottery/draw/models.py
2025-06-13 21:10:20 +09:00

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 = "Результаты розыгрыша"