Add default event genration function for Course assignment
This commit is contained in:
parent
4d8c219076
commit
f43a2c94e8
|
|
@ -29,3 +29,4 @@ def command():
|
||||||
call_command("migrate")
|
call_command("migrate")
|
||||||
call_command("create_default_users")
|
call_command("create_default_users")
|
||||||
call_command("create_default_courses")
|
call_command("create_default_courses")
|
||||||
|
call_command("create_default_events")
|
||||||
|
|
|
||||||
|
|
@ -193,6 +193,8 @@ class CourseSession(models.Model):
|
||||||
Das anhängen kann via CourseSessionUser oder "Schulklasse (TODO)" geschehen
|
Das anhängen kann via CourseSessionUser oder "Schulklasse (TODO)" geschehen
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# TODO: Das wird durch event modell ersetzt
|
||||||
|
|
||||||
ATTENDANCE_COURSES_SCHEMA = {
|
ATTENDANCE_COURSES_SCHEMA = {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,17 @@
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
|
||||||
|
from vbv_lernwelt.events.models import Event
|
||||||
|
|
||||||
|
|
||||||
# Register your models here.
|
# Register your models here.
|
||||||
|
@admin.register(Event)
|
||||||
|
class EventAdmin(admin.ModelAdmin):
|
||||||
|
date_hierarchy = "end"
|
||||||
|
list_display = [
|
||||||
|
"title",
|
||||||
|
"course_session",
|
||||||
|
"start",
|
||||||
|
"end",
|
||||||
|
"unset"
|
||||||
|
]
|
||||||
|
list_filter = ["course_session"]
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,19 @@
|
||||||
from datetime import datetime
|
import datetime
|
||||||
|
|
||||||
|
import structlog
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from factory.django import DjangoModelFactory
|
from factory.django import DjangoModelFactory
|
||||||
|
|
||||||
from .models import Event
|
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):
|
def get_date(date_string):
|
||||||
return datetime.strptime(date_string, '%b %d %Y', ).astimezone(timezone.get_current_timezone())
|
return datetime.datetime.strptime(date_string, '%b %d %Y', ).astimezone(timezone.get_current_timezone())
|
||||||
|
|
||||||
|
|
||||||
class EventFactory(DjangoModelFactory):
|
class EventFactory(DjangoModelFactory):
|
||||||
|
|
@ -16,3 +22,48 @@ class EventFactory(DjangoModelFactory):
|
||||||
|
|
||||||
title = "Prüfung Versicherungsvermittler/-in"
|
title = "Prüfung Versicherungsvermittler/-in"
|
||||||
end = get_date("Jan 01 2021")
|
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()
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
import djclick as click
|
||||||
|
|
||||||
|
from vbv_lernwelt.events.factories import create_events_for_all_course_sessions, set_default_times_for_events
|
||||||
|
|
||||||
|
|
||||||
|
@click.command()
|
||||||
|
def command():
|
||||||
|
create_events_for_all_course_sessions()
|
||||||
|
set_default_times_for_events()
|
||||||
|
|
@ -10,8 +10,9 @@ from vbv_lernwelt.course.models import CourseSession
|
||||||
|
|
||||||
class Event(models.Model):
|
class Event(models.Model):
|
||||||
start = models.DateTimeField(null=True, db_index=True)
|
start = models.DateTimeField(null=True, db_index=True)
|
||||||
end = models.DateTimeField(db_index=True)
|
end = models.DateTimeField(db_index=True, null=True)
|
||||||
title = models.CharField(default=_('Termin'), max_length=255)
|
title = models.CharField(default=_('Termin'), max_length=1024)
|
||||||
|
url = models.URLField(null=True, blank=True, max_length=1024)
|
||||||
course_session = models.ForeignKey(
|
course_session = models.ForeignKey(
|
||||||
'course.CourseSession',
|
'course.CourseSession',
|
||||||
on_delete=models.CASCADE,
|
on_delete=models.CASCADE,
|
||||||
|
|
@ -20,20 +21,18 @@ class Event(models.Model):
|
||||||
blank=True,
|
blank=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
learning_content = models.ForeignKey(
|
learning_content_id = models.CharField(blank=True, null=True, max_length=255)
|
||||||
'learnpath.LearningContentAttendanceCourse',
|
|
||||||
on_delete=models.CASCADE,
|
|
||||||
related_name='events',
|
|
||||||
null=True,
|
|
||||||
blank=True,
|
|
||||||
)
|
|
||||||
|
|
||||||
def Meta(self):
|
def Meta(self):
|
||||||
ordering = ['start', 'end']
|
ordering = ['start', 'end']
|
||||||
verbose_name = _("Termin")
|
verbose_name = _("Termin")
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.title} {self.start}"
|
return f"Event: {self.title} {self.start} to {self.end}"
|
||||||
|
|
||||||
|
@property
|
||||||
|
def unset(self):
|
||||||
|
return self.end is None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def duration(self):
|
def duration(self):
|
||||||
|
|
|
||||||
|
|
@ -279,6 +279,9 @@ class LearningContent(CourseBasePage):
|
||||||
|
|
||||||
|
|
||||||
class LearningContentAttendanceCourse(LearningContent):
|
class LearningContentAttendanceCourse(LearningContent):
|
||||||
|
"""
|
||||||
|
Präsenzkurs
|
||||||
|
"""
|
||||||
parent_page_types = ["learnpath.Circle"]
|
parent_page_types = ["learnpath.Circle"]
|
||||||
subpage_types = []
|
subpage_types = []
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue