init commit
This commit is contained in:
113
lottery/draw/models.py
Normal file
113
lottery/draw/models.py
Normal file
@@ -0,0 +1,113 @@
|
||||
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 = "Результаты розыгрыша"
|
||||
Reference in New Issue
Block a user