vbv/server/vbv_lernwelt/events/models.py

67 lines
2.0 KiB
Python

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