PonyConf/accounts/models.py

67 lines
2.2 KiB
Python
Raw Normal View History

from enum import IntEnum
from django.contrib.auth.models import User
2016-06-11 13:47:08 +00:00
from django.contrib.sites.managers import CurrentSiteManager
from django.contrib.sites.models import Site
2016-06-12 19:09:52 +00:00
from django.core.urlresolvers import reverse
2016-06-11 13:47:08 +00:00
from django.db import models
2016-06-14 19:39:04 +00:00
from django.utils.crypto import get_random_string
2016-06-07 20:59:13 +00:00
2016-06-14 19:39:04 +00:00
__all__ = ['Profile', 'Participation']
2016-06-07 20:59:13 +00:00
def enum_to_choices(enum):
return ((item.value, item.name) for item in list(enum))
2016-06-07 20:59:13 +00:00
2016-06-14 19:39:04 +00:00
def generate_user_uid():
return get_random_string(length=12, allowed_chars='abcdefghijklmnopqrstuvwxyz0123456789')
2016-06-11 13:47:08 +00:00
class Profile(models.Model):
2016-06-07 20:59:13 +00:00
user = models.OneToOneField(User)
2016-06-07 20:59:13 +00:00
biography = models.TextField(blank=True, verbose_name='Biography')
2016-06-14 19:39:04 +00:00
email_token = models.CharField(max_length=12, default=generate_user_uid)
2016-06-12 19:09:52 +00:00
def __str__(self):
return self.user.get_full_name() or self.user.username
def get_absolute_url(self):
return reverse('profile')
2016-06-14 19:39:04 +00:00
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)
2016-06-14 19:39:04 +00:00
arrival = models.DateTimeField(blank=True, null=True)
departure = models.DateTimeField(blank=True, null=True)
2016-06-14 19:39:04 +00:00
# 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)
2016-06-12 21:39:04 +00:00
constraints = models.TextField(blank=True)
objects = models.Manager()
on_site = CurrentSiteManager()
class Meta:
2016-06-14 19:39:04 +00:00
# A User can participe only once to a Conference (= Site)
unique_together = ('site', 'user')
2016-06-11 15:28:39 +00:00
def __str__(self):
2016-06-14 19:39:04 +00:00
return "%s participation to %s" % (str(self.user.profile), self.site.name)
2016-06-12 19:09:52 +00:00
def get_absolute_url(self):
2016-06-14 19:39:04 +00:00
return reverse('show-participation', kwargs={'username': self.user.username})
2016-06-11 15:28:39 +00:00
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')