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()