Source code for intranet.apps.enrichment.models

import datetime

from django.conf import settings
from django.contrib.auth.models import Group as DjangoGroup
from django.db import models
from django.db.models import Manager
from django.utils import timezone

from ...utils.date import get_date_range_this_year, is_current_year
from ...utils.deletion import set_historical_user


[docs]class EnrichmentActivityQuerySet(models.query.QuerySet):
[docs] def this_year(self): """Get enrichment activities created during this school year. Returns: Enrichment activities created during this school year. """ start_date, end_date = get_date_range_this_year() return self.filter(added__gte=start_date, added__lte=end_date)
[docs]class EnrichmentActivityManager(Manager):
[docs] def get_queryset(self): return EnrichmentActivityQuerySet(self.model, using=self._db)
[docs] def visible_to_user(self, *args): # , user): """Get a list of visible enrichment activities for a given user (usually request.user). TODO: implement this method. Add group restrictions. """ return EnrichmentActivity.objects.all().this_year()
[docs]class EnrichmentActivity(models.Model): """An enrichment activity available to the TJ community.""" objects = EnrichmentActivityManager() title = models.CharField(max_length=100) description = models.TextField(max_length=10000) added = models.DateTimeField(auto_now=True) time = models.DateTimeField(blank=True, null=True) location = models.CharField(max_length=300) user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=set_historical_user) capacity = models.SmallIntegerField(default=28) attending = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name="enrichments_attending") attended = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name="enrichments_attended") attendance_taken = models.BooleanField(default=False) presign = models.BooleanField(default=False) groups_allowed = models.ManyToManyField(DjangoGroup, related_name="allowed_enrichments_set", blank=True) groups_blacklisted = models.ManyToManyField(DjangoGroup, related_name="blacklisted_enrichments_set", blank=True)
[docs] def user_can_signup(self, user): """Return whether a user can sign up for an enrichment activity. Args: user: The user to check. Returns: Whether the user can sign up for the enrichment activity. """ return (not self.groups_allowed.exists() or any(group in user.groups.all() for group in self.groups_allowed.all())) and not any( group in user.groups.all() for group in self.groups_blacklisted.all() )
[docs] def user_is_blacklisted(self, user): return any(group in user.groups.all() for group in self.groups_blacklisted.all())
@property def is_this_year(self): """Return whether the enrichment activity was created after the start of the school year.""" return is_current_year(self.added) @property def happened(self): """Return whether an enrichment activity has happened.""" return self.time < timezone.now() @property def restricted(self): return self.groups_allowed.exists() @property def is_too_early_to_signup(self): """Returns whether it is too early to sign up for the activity if it is a presign. This contains the 2 day presign logic. Returns: Whether it is too early to sign up for this scheduled activity and when the activity opens for signups. """ now = timezone.localtime() # Midnight of the day of the activity activity_date = self.time.astimezone(timezone.get_default_timezone()) activity_date = datetime.datetime.combine(activity_date.date(), datetime.time(0, 0, 0), tzinfo=activity_date.tzinfo) presign_period = datetime.timedelta(minutes=settings.EIGHTH_PRESIGNUP_HOURS * 60 + settings.EIGHTH_PRESIGNUP_MINUTES) return (now < (activity_date - presign_period), activity_date - presign_period) def __str__(self): return f"{self.title} - {self.time}" class Meta: ordering = ["time"] verbose_name_plural = "enrichment activities"