import datetime from django.db import models from django.utils import timezone from django.utils.translation import gettext_lazy as _ from vbv_lernwelt.core.models import User from vbv_lernwelt.course.models import CourseSession class Event(models.Model): start = models.DateTimeField(null=True, db_index=True) end = models.DateTimeField(db_index=True, null=True) title = models.CharField(default=_('Termin'), max_length=1024) url = models.URLField(null=True, blank=True, max_length=1024) course_session = models.ForeignKey( 'course.CourseSession', on_delete=models.CASCADE, related_name='events', null=True, blank=True, ) learning_content_id = models.CharField(blank=True, null=True, max_length=255) def Meta(self): ordering = ['start', 'end'] verbose_name = _("Termin") def __str__(self): return f"Event: {self.title} {self.start} to {self.end}" @property def unset(self): return self.end is None @property def duration(self): if self.start is None: return datetime.timedelta(0) return self.end - self.start @classmethod def get_users_next_events_qs(cls, user: User, course_session: CourseSession = None, limit=10): """ Returns a queryset of all events that are relevant for the given user. Ordered nearest start date first. If course_session is given, only events for that course_session are returned. The user is determined by via a course session user of an course_assignment. """ qs = cls.get_next_events_qs() if course_session: qs = qs.filter(course_session=course_session, course_session__course_assignment__user=user) else: qs = qs.filter(course_session__course_assignment__user=user) qs = qs.order_by('start')[:limit] return qs @classmethod def get_next_events_qs(cls): now = timezone.now() qs = cls.objects.filter(end__gte=now) return qs