2016-06-11 13:42:40 +00:00
from enum import IntEnum
from django . contrib . auth . models import User
2016-06-11 13:47:08 +00:00
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-07-23 12:17:11 +00:00
from django . utils . translation import ugettext_lazy as _
2016-08-21 10:41:22 +00:00
from django . utils . translation import ugettext
2016-06-07 20:59:13 +00:00
2016-06-25 11:39:28 +00:00
from ponyconf . utils import PonyConfModel , enum_to_choices
2016-06-07 20:59:13 +00:00
2016-06-19 23:00:08 +00:00
from . utils import generate_user_uid
2016-06-07 20:59:13 +00:00
2016-06-11 13:47:08 +00:00
2016-06-25 11:39:28 +00:00
class Profile ( PonyConfModel ) :
2016-06-07 20:59:13 +00:00
2016-06-11 13:42:40 +00:00
user = models . OneToOneField ( User )
2016-07-23 12:17:11 +00:00
biography = models . TextField ( blank = True , verbose_name = _ ( ' Biography ' ) )
2016-06-15 20:31:03 +00:00
email_token = models . CharField ( max_length = 12 , default = generate_user_uid , unique = True )
2016-06-11 13:42:40 +00:00
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-11 13:42:40 +00:00
2016-07-10 20:21:31 +00:00
class Option ( models . Model ) :
name = models . CharField ( max_length = 64 , unique = True )
class Meta :
abstract = True
def __str__ ( self ) :
2016-08-21 10:41:22 +00:00
return ugettext ( self . name )
2016-07-10 20:21:31 +00:00
class Transport ( Option ) :
pass
class Connector ( Option ) :
pass
2016-06-25 11:39:28 +00:00
class Participation ( PonyConfModel ) :
2016-06-11 13:42:40 +00:00
2016-07-09 22:42:40 +00:00
LICENCES = IntEnum ( ' Video licence ' , ' CC-Zero CC-BY CC-BY-SA CC-BY-ND CC-BY-NC CC-BY-NC-SA CC-BY-NC-ND ' )
2016-10-06 19:24:52 +00:00
ACCOMMODATION_NO = 0
ACCOMMODATION_HOTEL = 1
ACCOMMODATION_HOMESTAY = 2
ACCOMMODATION_CHOICES = (
( ACCOMMODATION_NO , _ ( ' No ' ) ) ,
( ACCOMMODATION_HOTEL , _ ( ' Hotel ' ) ) ,
( ACCOMMODATION_HOMESTAY , _ ( ' Homestay ' ) ) ,
)
2016-06-11 13:42:40 +00:00
site = models . ForeignKey ( Site , on_delete = models . CASCADE )
2016-06-12 14:40:23 +00:00
user = models . ForeignKey ( User )
2016-06-14 19:39:04 +00:00
2016-08-08 22:55:19 +00:00
2016-10-13 18:48:05 +00:00
need_transport = models . NullBooleanField ( verbose_name = _ ( ' Defray transportation? ' ) , default = None )
2016-06-11 13:42:40 +00:00
arrival = models . DateTimeField ( blank = True , null = True )
departure = models . DateTimeField ( blank = True , null = True )
2016-10-13 18:48:05 +00:00
transport = models . ManyToManyField ( Transport , verbose_name = _ ( " I want to travel by " ) , blank = True )
2016-10-13 18:31:51 +00:00
transport_city_outward = models . CharField ( blank = True , default = ' ' , max_length = 256 , verbose_name = _ ( " Departure city " ) )
transport_city_return = models . CharField ( blank = True , default = ' ' , max_length = 256 , verbose_name = _ ( " Return city " ) , help_text = _ ( " If different from departure city " ) )
2016-10-03 12:07:37 +00:00
transport_booked = models . BooleanField ( default = False )
2016-08-08 22:55:19 +00:00
2016-10-06 19:24:52 +00:00
accommodation = models . IntegerField ( choices = ACCOMMODATION_CHOICES , verbose_name = _ ( ' Need accommodation? ' ) , null = True , blank = True )
accommodation_booked = models . BooleanField ( default = False )
2016-08-08 22:55:19 +00:00
2016-08-07 07:11:04 +00:00
constraints = models . TextField ( blank = True , verbose_name = _ ( " Constraints " ) )
2016-08-08 22:55:19 +00:00
connector = models . ManyToManyField ( Connector , verbose_name = _ ( " I can output " ) , blank = True )
2016-07-23 12:17:11 +00:00
sound = models . BooleanField ( _ ( " I need sound " ) , default = False )
2016-08-08 22:55:19 +00:00
2016-07-23 12:17:11 +00:00
videotaped = models . BooleanField ( _ ( " I ' m ok to be recorded on video " ) , default = True )
2016-08-31 21:46:26 +00:00
video_licence = models . IntegerField ( choices = enum_to_choices ( LICENCES ) , default = 2 , verbose_name = _ ( " Video licence " ) )
2016-08-08 22:55:19 +00:00
2016-10-03 12:35:26 +00:00
notes = models . TextField ( default = ' ' , blank = True , verbose_name = _ ( " Notes " ) , help_text = _ ( ' This field is only visible by organizers. ' ) )
2016-06-25 14:46:44 +00:00
orga = models . BooleanField ( default = False )
2016-06-11 13:42:40 +00:00
class Meta :
2016-06-14 19:39:04 +00:00
# A User can participe only once to a Conference (= Site)
2016-06-11 13:42:40 +00:00
unique_together = ( ' site ' , ' user ' )
2016-06-11 15:28:39 +00:00
def __str__ ( self ) :
2016-07-03 20:58:19 +00:00
return str ( self . user . profile )
2016-06-12 19:09:52 +00:00
def get_absolute_url ( self ) :
2016-07-03 20:58:19 +00:00
return reverse ( ' show-speaker ' , kwargs = { ' username ' : self . user . username } )
2016-06-11 15:28:39 +00:00
2016-07-05 23:32:31 +00:00
def is_orga ( self ) :
2016-07-22 23:50:38 +00:00
return self . orga
2016-07-05 23:32:31 +00:00
2016-06-25 13:12:18 +00:00
def is_staff ( self ) :
2016-10-10 11:55:18 +00:00
return self . is_orga ( ) or self . topic_set . exists ( ) or self . track_set . exists ( )
2016-07-11 20:56:25 +00:00
@property
def topic_set ( self ) :
2016-07-12 14:16:40 +00:00
return self . user . topic_set . filter ( site = self . site )
2016-07-12 17:47:26 +00:00
2016-10-10 11:55:18 +00:00
@property
def track_set ( self ) :
return self . user . track_set . filter ( site = self . site )
2016-07-12 17:47:26 +00:00
@property
def talk_set ( self ) :
return self . user . talk_set . filter ( site = self . site )
2016-10-10 21:07:07 +00:00
# return True, False or None if availabilities have not been filled
def is_available ( self , start , end = None ) :
if not self . availabilities . exists ( ) :
return None
for timeslot in self . availabilities . all ( ) :
if start < timeslot . start :
continue
if start > timeslot . end :
continue
if end :
assert ( start < end )
if end > timeslot . end :
continue
return True
return False
class AvailabilityTimeslot ( models . Model ) :
participation = models . ForeignKey ( Participation , related_name = ' availabilities ' )
start = models . DateTimeField ( blank = True )
end = models . DateTimeField ( blank = True )