PonyConf/accounts/models.py

67 lines
2.2 KiB
Python

from enum import IntEnum
from django.contrib.auth.models import User
from django.contrib.sites.managers import CurrentSiteManager
from django.contrib.sites.models import Site
from django.core.urlresolvers import reverse
from django.db import models
from django.utils.crypto import get_random_string
__all__ = ['Profile', 'Participation']
def enum_to_choices(enum):
return ((item.value, item.name) for item in list(enum))
def generate_user_uid():
return get_random_string(length=12, allowed_chars='abcdefghijklmnopqrstuvwxyz0123456789')
class Profile(models.Model):
user = models.OneToOneField(User)
biography = models.TextField(blank=True, verbose_name='Biography')
email_token = models.CharField(max_length=12, default=generate_user_uid)
def __str__(self):
return self.user.get_full_name() or self.user.username
def get_absolute_url(self):
return reverse('profile')
class Participation(models.Model):
TRANSPORTS = IntEnum('Transport', 'train plane')
CONNECTORS = IntEnum('Connector', 'VGA HDMI miniDP')
site = models.ForeignKey(Site, on_delete=models.CASCADE)
user = models.ForeignKey(User)
arrival = models.DateTimeField(blank=True, null=True)
departure = models.DateTimeField(blank=True, null=True)
# TODO: These should multi-choice fields
transport = models.IntegerField(choices=enum_to_choices(TRANSPORTS), blank=True, null=True)
connector = models.IntegerField(choices=enum_to_choices(CONNECTORS), blank=True, null=True)
constraints = models.TextField(blank=True)
objects = models.Manager()
on_site = CurrentSiteManager()
class Meta:
# A User can participe only once to a Conference (= Site)
unique_together = ('site', 'user')
def __str__(self):
return "%s participation to %s" % (str(self.user.profile), self.site.name)
def get_absolute_url(self):
return reverse('show-participation', kwargs={'username': self.user.username})
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
models.signals.post_save.connect(create_profile, sender=User, weak=False, dispatch_uid='create_profile')