import datetime from django.db import models from django.urls import reverse from django.utils.translation import ugettext_lazy as _ from django.contrib.auth import get_user_model from timezone_field import TimeZoneField from symposion import constants from symposion.text_parser import parse User = get_user_model() class Speaker(models.Model): user = models.OneToOneField( User, null=True, related_name="speaker_profile", verbose_name=_("User"), on_delete=models.CASCADE, ) name = models.CharField(verbose_name=_("Name"), max_length=100, help_text=_("As you would like it to appear in the" " conference programme.")) pronouns = models.CharField(verbose_name=_("Pronouns"), max_length=20, blank=True, ) biography = models.TextField( blank=True, help_text=_("This will appear on the conference website and in the " "programme. Please write in the third person, eg 'Alice " "is a Moblin hacker...', 150-200 words. " + constants.TEXT_FIELD_MONOSPACE_NOTE), verbose_name=_("Biography"), ) biography_html = models.TextField(blank=True) experience = models.TextField( blank=True, help_text=_("Have you had any experience presenting elsewhere? If so, " "we'd like to know. Anything you put here will only be " "seen by the organisers and reviewers; use it to convince " "them why they should accept your proposal. " + constants.TEXT_FIELD_MONOSPACE_NOTE), verbose_name=_("Speaking experience"), ) experience_html = models.TextField(blank=True) photo = models.ImageField(upload_to="speaker_photos", blank=True, verbose_name=_("Photo")) telephone = models.CharField( max_length=15, help_text=_(u"The conference team will need this to contact you " "during the conference week. If you don't have one, or do " "not wish to provide it, then enter NONE in this field.") ) local_timezone = TimeZoneField( blank=True, verbose_name=_("Local Timezone"), help_text=_("Your local timezone, preferably the one you will use to " "present from. The conference organisers will " "use this to assist with scheduling talks.") ) homepage = models.URLField( blank=True, help_text=_(u"Your home page, if you have one") ) twitter_username = models.CharField( max_length=15, blank=True, help_text=_(u"Your Twitter account") ) mastodon_username = models.CharField( max_length=100, blank=True, help_text=_(u"Your Mastodon account") ) accessibility = models.TextField( blank=True, help_text=_("Let us know how we can help you during the conference, for example " "your accessibility requirements, if you require a Visa invitation letter, whether you require access to child " "minding facilities or anything else you think we should know about."), verbose_name=_("Other requirements")) accessibility_html = models.TextField(blank=True) travel_assistance = models.BooleanField( blank=True, default=False, help_text=_("Check this box if you require assistance to travel to the conference " "in order to present your proposed sessions."), verbose_name=_("Travel assistance required"), ) accommodation_assistance = models.BooleanField( blank=True, default=False, help_text=_("Check this box if you require us to provide you with accommodation " "in order to present your proposed sessions."), verbose_name=_("Accommodation assistance required"), ) assistance = models.TextField( blank=True, help_text=_("We have budget set aside to provide financial assistance to " "speakers and attendees who might otherwise find it difficult to attend. " "Please provide details on why you require travel and/or accommodation assistance " "in order to present your proposed sessions. " "For travel assistance, please also tell us where you will be coming from " "(country, state, etc) to assist with planning."), verbose_name=_("Travel/Accommodation assistance details")) assistance_html = models.TextField(blank=True) agreement = models.BooleanField( default=False, help_text=_("I agree to the " " " "terms and conditions of attendance, and I have read, " "understood, and agree to act according to the standards set " "forth in our " "" "Code of Conduct.") ) annotation = models.TextField(verbose_name=_("Annotation")) # staff only invite_email = models.CharField(max_length=200, unique=True, null=True, db_index=True, verbose_name=_("Invite_email")) invite_token = models.CharField(max_length=40, db_index=True, verbose_name=_("Invite token")) created = models.DateTimeField( default=datetime.datetime.now, editable=False, verbose_name=_("Created") ) class Meta: ordering = ['name'] verbose_name = _("Speaker") verbose_name_plural = _("Speakers") permissions = (('can_view_contact_details', 'Can View Contact Details'),) def save(self, *args, **kwargs): self.biography_html = parse(self.biography) self.experience_html = parse(self.experience) self.accessibility_html = parse(self.accessibility) self.assistance_html = parse(self.assistance) return super(Speaker, self).save(*args, **kwargs) def __str__(self): if self.user: return self.name else: return "?" def get_absolute_url(self): return reverse("speaker_edit") @property def email(self): if self.user is not None: return self.user.email else: return self.invite_email @property def all_presentations(self): presentations = [] if self.presentations: for p in self.presentations.all(): presentations.append(p) for p in self.copresentations.all(): presentations.append(p) return presentations @property def code(self): """ A unique string that identifies this speaker. """ return f"{self.pk}"