__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)" __license__ = "AGPL v3" import datetime from django.db import models from django.utils import timezone from scipost.models import get_sentinel_user from ..constants import POTENTIAL_FELLOWSHIP_STATUSES,\ POTENTIAL_FELLOWSHIP_IDENTIFIED, POTENTIAL_FELLOWSHIP_EVENTS from ..managers import PotentialFellowshipQuerySet class PotentialFellowship(models.Model): """ A PotentialFellowship is defined when a researcher has been identified by Admin or EdAdmin as a potential member of an Editorial College, or when a current Advisory Board member or Fellow nominates the person. It is linked to Profile as ForeignKey and not as OneToOne, since the same person can eventually be approached on different occasions. Using Profile allows to consider both registered Contributors and non-registered people. """ college = models.ForeignKey( 'colleges.College', on_delete=models.PROTECT, related_name='potential_fellowships' ) profile = models.ForeignKey('profiles.Profile', on_delete=models.CASCADE) status = models.CharField(max_length=32, choices=POTENTIAL_FELLOWSHIP_STATUSES, default=POTENTIAL_FELLOWSHIP_IDENTIFIED) in_agreement = models.ManyToManyField( 'scipost.Contributor', related_name='in_agreement_with_election', blank=True) in_abstain = models.ManyToManyField( 'scipost.Contributor', related_name='in_abstain_with_election', blank=True) in_disagreement = models.ManyToManyField( 'scipost.Contributor', related_name='in_disagreement_with_election', blank=True) voting_deadline = models.DateTimeField('voting deadline', default=timezone.now) elected = models.NullBooleanField() objects = PotentialFellowshipQuerySet.as_manager() class Meta: ordering = ['profile__last_name'] def __str__(self): return '%s, %s' % (self.profile.__str__(), self.get_status_display()) def latest_event_details(self): event = self.potentialfellowshipevent_set.order_by('-noted_on').first() if not event: return 'No event recorded' return '%s [%s]' % (event.get_event_display(), event.noted_on.strftime('%Y-%m-%d')) class PotentialFellowshipEvent(models.Model): """Any event directly related to a PotentialFellowship instance registered as plain text.""" potfel = models.ForeignKey('colleges.PotentialFellowship', on_delete=models.CASCADE) event = models.CharField(max_length=32, choices=POTENTIAL_FELLOWSHIP_EVENTS) comments = models.TextField(blank=True) noted_on = models.DateTimeField(auto_now_add=True) noted_by = models.ForeignKey('scipost.Contributor', on_delete=models.SET(get_sentinel_user), blank=True, null=True) def __str__(self): return '%s, %s %s: %s' % (self.potfel.profile.last_name, self.potfel.profile.get_title_display(), self.potfel.profile.first_name, self.get_event_display())