vbv/server/vbv_lernwelt/duedate/factories.py

73 lines
2.5 KiB
Python

import datetime
import structlog
from django.utils import timezone
from factory.django import DjangoModelFactory
from .models import DueDate
from ..assignment.models import Assignment
from ..course.models import CourseSession
from ..learnpath.models import LearningContentAttendanceCourse
logger = structlog.get_logger(__name__)
def get_date(date_string):
return datetime.datetime.strptime(date_string, '%b %d %Y', ).astimezone(timezone.get_current_timezone())
class DueDateFactory(DjangoModelFactory):
class Meta:
model = DueDate
title = "Prüfung Versicherungsvermittler/-in"
end = get_date("Jan 01 2021")
def generate_events(start=timezone.now()):
for i in range(20):
DueDateFactory(title=f"{i}", start=start + datetime.timedelta(days=i),
end=start + datetime.timedelta(days=i, hours=1))
def hour_rounder(t):
# Rounds to nearest hour by adding a timedelta hour if minute >= 30
return (t.replace(second=0, microsecond=0, minute=0, hour=t.hour)
+ datetime.timedelta(hours=t.minute // 30))
def create_duedates_for_all_course_sessions():
all_course_sessions: list[CourseSession] = CourseSession.objects.all()
for course_session in all_course_sessions:
create_duedates_for_course_session(course_session)
def create_duedates_for_course_session(course_session: CourseSession):
course = course_session.course
attendance_courses = list(LearningContentAttendanceCourse.objects.descendant_of(course.get_learning_path()))
assignments = list(Assignment.objects.descendant_of(course.get_learning_path()))
contents = attendance_courses + assignments
for content in contents:
if callable(getattr(content, 'get_frontend_url', None)):
url = content.get_frontend_url()
duedate, created = DueDate.objects.get_or_create(course_session=course_session,
title=content.title,
url=url,
page=content.specific)
if created:
pass
logger.info("Created duedate ", duedate=duedate, course_session=course_session, content=content)
def set_default_times_for_duedates():
now = hour_rounder(timezone.now())
for i, event in enumerate(DueDate.objects.filter(end__isnull=True)):
event.start = now + datetime.timedelta(days=i)
event.end = event.start + datetime.timedelta(hours=3)
event.save()