import datetime from django.db import models from django.utils import timezone from django.utils.translation import gettext_lazy as _ from wagtail.models import Page from vbv_lernwelt.core.models import User from vbv_lernwelt.course.models import CourseSession class DueDate(models.Model): start = models.DateTimeField(null=True, db_index=True) end = models.DateTimeField(null=True, blank=True, db_index=True) title = models.CharField(default="", max_length=1024) learning_content_description = models.CharField( default="", blank=True, max_length=1024 ) description = models.CharField(default="", blank=True, max_length=1024) url = models.CharField(default="", blank=True, max_length=1024) course_session = models.ForeignKey( "course.CourseSession", on_delete=models.CASCADE, blank=True, ) page = models.ForeignKey(Page, on_delete=models.SET_NULL, null=True, blank=True) def Meta(self): ordering = ["start", "end"] verbose_name = _("Termin") help = "The start date is mandatory. You can set the end date if you want to have a deadline with a duration." def __str__(self): if self.is_undefined: return f"DueDate: {self.title} undefined" start_str = self.start.strftime("%Y-%m-%d %H:%M") if self.start else "-" result = f"DueDate: {self.title} {start_str}" if self.end: end_str = self.end.strftime("%Y-%m-%d %H:%M") if self.end else "-" result += f" - {end_str}" return result @property def is_undefined(self): return self.start is None @property def duration(self): if self.end 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 due dates that are relevant for the given user. If course_session is given, only due dates for that course_session are returned. The user is determined by via a course session user of a course_assignment. """ qs = cls.get_next_due_dates_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_due_dates_qs(cls): now = timezone.now() qs = cls.objects.filter(start__gte=now) return qs