Files @ 8838b9b47d79
Branch filter:

Location: symposion_app/pinaxcon/raffle/models.py

Joel Addison
Highlight current talks on schedule
from django.conf import settings
from django.db import models

from pinaxcon.raffle.mixins import PrizeMixin, RaffleMixin


class Raffle(RaffleMixin, models.Model):
    """
    Stores a single Raffle object, related to one or many
    :model:`pinaxcon_registrasion.Product`, which  is usually a raffle ticket,
    but can be set to tickets or other products for door prizes.
    """
    description = models.CharField(max_length=255)
    products = models.ManyToManyField('registrasion.Product')
    hidden = models.BooleanField(default=True)

    def __str__(self):
        return self.description


class Prize(PrizeMixin, models.Model):
    """
    Stores a Prize for a given :model:`pinaxcon_raffle.Raffle`.

    Once `winning_ticket` has been set to a :model:`pinaxcon_raffle.DrawnTicket`
    object, no further changes are permitted unless the object is explicitely
    unlocked.
    """
    description = models.CharField(max_length=255)
    raffle = models.ForeignKey(
        'pinaxcon_raffle.Raffle',
        related_name='prizes',
        on_delete=models.CASCADE,
    )
    order = models.PositiveIntegerField()
    winning_ticket = models.OneToOneField(
        'pinaxcon_raffle.DrawnTicket',
        null=True,
        blank=True,
        related_name='+',
        on_delete=models.PROTECT,
    )

    class Meta:
        unique_together = ('raffle', 'order')

    def __str__(self):
        return f"{self.order}. Prize: {self.description}"


class PrizeAudit(models.Model):
    """
    Stores an audit event for changes to a particular :model:`pinaxcon_raffle.Prize`.
    """
    reason = models.CharField(max_length=255)
    prize = models.ForeignKey(
        'pinaxcon_raffle.Prize',
        related_name='audit_events',
        on_delete=models.CASCADE,
    )

    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
    )
    timestamp = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ('-timestamp',)

    def __str__(self):
        return self.reason


class Draw(models.Model):
    """
    Stores a draw for a given :model:`pinaxcon_raffle.Raffle`, along with audit fields
    for the creating :model:`auth.User` and the creation timestamp.
    """
    raffle = models.ForeignKey(
        'pinaxcon_raffle.Raffle',
        related_name='draws',
        on_delete=models.CASCADE,
    )
    drawn_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
    )
    drawn_time = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.raffle}: {self.drawn_time}"


class DrawnTicket(models.Model):
    """
    Stores the result of a ticket draw, along with the corresponding
    :model:`pinaxcon_raffle.Draw`, :model:`pinaxcon_raffle.Prize` and the
    :model:`registrasion.commerce.LineItem` from which it was generated.
    """
    ticket = models.CharField(max_length=255)

    draw = models.ForeignKey(
        'pinaxcon_raffle.Draw',
        on_delete=models.CASCADE,
    )
    prize = models.ForeignKey(
        'pinaxcon_raffle.Prize',
        on_delete=models.CASCADE,
    )
    lineitem = models.ForeignKey(
        'registrasion.LineItem',
        on_delete=models.CASCADE,
    )

    def __str__(self):
        return f"{self.ticket}: {self.draw.raffle}"