vbv/server/vbv_lernwelt/events/factories.py

70 lines
2.3 KiB
Python

import datetime
import structlog
from django.utils import timezone
from factory.django import DjangoModelFactory
from .models import Event
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 EventFactory(DjangoModelFactory):
class Meta:
model = Event
title = "Prüfung Versicherungsvermittler/-in"
end = get_date("Jan 01 2021")
def generate_events(start=timezone.now()):
for i in range(20):
EventFactory(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_events_for_all_course_sessions():
all_course_sessions: list[CourseSession] = CourseSession.objects.all()
for course_session in all_course_sessions:
create_events_for_course_session(course_session)
def create_events_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()
event, created = Event.objects.get_or_create(course_session=course_session, title=content.title, url=url)
if created:
logger.info(f"Created event {event} for course session {course_session} and content {content}")
#
def set_default_times_for_events():
now = hour_rounder(timezone.now())
for i, event in enumerate(Event.objects.filter(end__isnull=True)):
event.start = now + datetime.timedelta(days=i)
event.end = event.start + datetime.timedelta(hours=3)
event.save()