Files @ 34509d23eb9f
Branch filter:

Location: symposion_app/pinaxcon/raffle/models.py - annotation

bsturmfels
Make vendored symposion into an installable Python package

This allows us to install with `pip install "-e vendor/symposion"` similar to
the other vendored packages. There's no good reason for this to be different to
the others and depend on PYTHONPATH hacking.

Re-add
252697b842c0
d1ff8d72533c
d1ff8d72533c
908dca311ce9
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
cd77380eac27
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
908dca311ce9
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
252697b842c0
252697b842c0
252697b842c0
252697b842c0
252697b842c0
d1ff8d72533c
d1ff8d72533c
252697b842c0
252697b842c0
252697b842c0
252697b842c0
252697b842c0
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
252697b842c0
252697b842c0
252697b842c0
252697b842c0
252697b842c0
d1ff8d72533c
252697b842c0
252697b842c0
252697b842c0
252697b842c0
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
908dca311ce9
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
252697b842c0
252697b842c0
252697b842c0
252697b842c0
252697b842c0
252697b842c0
252697b842c0
252697b842c0
252697b842c0
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
908dca311ce9
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
d1ff8d72533c
252697b842c0
252697b842c0
252697b842c0
252697b842c0
252697b842c0
252697b842c0
252697b842c0
252697b842c0
252697b842c0
252697b842c0
252697b842c0
252697b842c0
d1ff8d72533c
d1ff8d72533c
252697b842c0
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}"