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