vbv/server/vbv_lernwelt/duedate/models.py

70 lines
2.2 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)
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,
)
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