from django.db import models
from django.conf import settings
from rest_framework import serializers
from commons.models import CommonModel
from events.models import Event, EventSerializer
from users.models import UserSerializer
MAX_CODE_LENGTH = 60
MAX_FAKE_CODE_LENGTH = MAX_CODE_LENGTH + 30
[docs]class TicketPack(CommonModel):
name = models.CharField(max_length=50)
prefix = models.CharField(max_length=2)
event = models.ForeignKey(Event, related_name='ticket_packs')
event.event_filter = True
class Meta:
unique_together = (('event', 'prefix'), ('event', 'name'))
[docs] def get_prefix(self):
return self.event.prefix + self.prefix
[docs] def get_ticket_count(self):
return self.ticket_codes.all().count()
def __str__(self):
return self.name + " for event " + self.event.name
[docs]class TicketPackSerializer(serializers.ModelSerializer):
event = EventSerializer()
[docs]class TicketCodeManager(models.Manager):
[docs] def get_for_attempt(self, code):
if not code:
raise TicketCode.DoesNotExist("Code is required")
return self.get(code=code,
ticket_pack__event__active=True)
[docs] def make_attempt(self, code, user):
item = self.get_for_attempt(code=code)
return item.make_attempt(user), item
[docs]class TicketCode(CommonModel):
TICKET_CODE_STATUS_NEW = u'NW'
TICKET_CODE_STATUS_USED = u'US'
TICKET_CODE_STATUS_DISABLED = u'DS'
TICKET_CODE_STATUS = (
(TICKET_CODE_STATUS_NEW, u'New'),
(TICKET_CODE_STATUS_USED, u'Used'),
(TICKET_CODE_STATUS_DISABLED, u'Disabled')
)
code = models.CharField(max_length=MAX_CODE_LENGTH, unique=True)
ticket_pack = models.ForeignKey(TicketPack, related_name='ticket_codes')
status = models.CharField('status', max_length=2, choices=TICKET_CODE_STATUS, editable=False,
default=TICKET_CODE_STATUS_NEW)
ticket_number = models.PositiveIntegerField('Ticket number', null=True)
external_id = models.CharField(max_length=50, null=True)
external_customer_name = models.CharField(max_length=200, null=True)
external_fiscal_number = models.CharField(max_length=20, null=True)
external_locator = models.CharField(max_length=40, null=True)
objects = TicketCodeManager()
class Meta:
unique_together = (('ticket_pack', 'ticket_number'),
('external_id', 'ticket_number'))
[docs] def attempt_count(self):
return self.attempt_list.count()
[docs] def event(self):
return self.ticket_pack.event
[docs] def make_attempt(self, user):
if self.status == TicketCode.TICKET_CODE_STATUS_DISABLED:
return None
at = Attempt(code=self.code,
success=False,
user=user,
ticket_code=self)
at.save()
first_attempt = self.attempt_list.order_by('id').all()[:1][0]
if (self.status != TicketCode.TICKET_CODE_STATUS_USED) and (first_attempt.id == at.id):
at.success = True
at.save()
self.status = TicketCode.TICKET_CODE_STATUS_USED
self.user_last_modified = user
self.save()
return at
def __str__(self):
return self.code
[docs]class TicketCodeSerializer(serializers.ModelSerializer):
ticket_pack = TicketPackSerializer()
modified_by = UserSerializer()
[docs]class AbstractAttempt(models.Model):
date = models.DateTimeField('attempt datetime', auto_now_add=True, editable=False)
user = models.ForeignKey(settings.AUTH_USER_MODEL, None, models.ManyToOneRel, related_name="attempts_%(class)s")
[docs] def save(self, force_insert=False, force_update=False, using=None, request=None):
if request and request.user:
self.user = request.user
models.Model.save(self, force_insert, force_update, using)
[docs]class Attempt(AbstractAttempt):
code = models.CharField(max_length=MAX_CODE_LENGTH)
ticket_code = models.ForeignKey(TicketCode, editable=False, null=False,
blank=False, related_name='attempt_list')
success = models.BooleanField('Using success', default=False, editable=False)
[docs]class AttemptListItemSerializer(serializers.ModelSerializer):
user = UserSerializer()
[docs]class AttemptSerializer(serializers.ModelSerializer):
user = UserSerializer()
ticket_code = TicketCodeSerializer()
[docs]class FakeAttempt(AbstractAttempt):
code = models.CharField(max_length=MAX_FAKE_CODE_LENGTH)