vbv/server/vbv_lernwelt/duedate/models.py

77 lines
2.4 KiB
Python

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(db_index=True, null=True)
title = models.CharField(default=_("Termin"), max_length=1024)
learning_content_description = models.CharField(default=_("GeleiteteFallarbeit"), max_length=1024)
description = models.CharField(default=_("Abgabetermin"), 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="duedates",
null=True,
blank=True,
)
page = models.ForeignKey(Page, on_delete=models.SET_NULL, null=True, blank=True)
def Meta(self):
ordering = ["start", "end"]
verbose_name = _("Termin")
def __str__(self):
start_str = self.start.strftime("%Y-%m-%d %H:%M") if self.start else ""
end_str = self.end.strftime("%Y-%m-%d %H:%M") if self.end else ""
return f"DueDate: {self.title} {start_str} to {end_str}"
@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 duedates that are relevant for the given user. Ordered nearest start date first.
If course_session is given, only duedates for that course_session are returned.
The user is determined by via a course session user of a course_assignment.
"""
qs = cls.get_next_duedates_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_duedates_qs(cls):
now = timezone.now()
qs = cls.objects.filter(end__gte=now)
return qs