70 lines
2.5 KiB
Python
70 lines
2.5 KiB
Python
from collections import Counter
|
|
from datetime import timedelta
|
|
|
|
import structlog
|
|
from django.db.models import QuerySet
|
|
from django.utils import timezone
|
|
|
|
from vbv_lernwelt.course.models import CourseSessionUser
|
|
from vbv_lernwelt.course_session.models import CourseSessionAttendanceCourse
|
|
from vbv_lernwelt.learnpath.models import Circle
|
|
from vbv_lernwelt.notify.services import NotificationService
|
|
|
|
logger = structlog.get_logger(__name__)
|
|
|
|
PRESENCE_COURSE_REMINDER_LEAD_TIME = timedelta(weeks=2)
|
|
|
|
|
|
def send_attendance_reminder_notifications():
|
|
"""Checks if an attendance course is coming up and sends a reminder to the participants"""
|
|
start = timezone.now()
|
|
end = timezone.now() + PRESENCE_COURSE_REMINDER_LEAD_TIME
|
|
results_counter = Counter()
|
|
attendance_courses = CourseSessionAttendanceCourse.objects.filter(
|
|
due_date__start__lte=end,
|
|
due_date__start__gte=start,
|
|
)
|
|
|
|
logger.info(
|
|
"Querying for attendance courses in specified time range",
|
|
start_time=start.isoformat(),
|
|
end_time=end.isoformat(),
|
|
label="attendance_course_reminder_notification_job",
|
|
num_attendance_courses=len(attendance_courses),
|
|
)
|
|
for attendance_course in attendance_courses:
|
|
cs_id = attendance_course.course_session.id
|
|
csu = get_recipients(attendance_course)
|
|
logger.info(
|
|
"Sending attendance course reminder notification",
|
|
start_time=start.isoformat(),
|
|
end_time=end.isoformat(),
|
|
label="attendance_course_reminder_notification_job",
|
|
num_users=len(csu),
|
|
course_session_id=cs_id,
|
|
)
|
|
for user in csu:
|
|
result = NotificationService.send_attendance_course_reminder_notification(
|
|
user.user, attendance_course
|
|
)
|
|
results_counter[result] += 1
|
|
if not attendance_courses:
|
|
logger.info(
|
|
"No attendance courses found",
|
|
label="attendance_course_reminder_notification_job",
|
|
)
|
|
return dict(results_counter)
|
|
|
|
|
|
def get_recipients(
|
|
attendance_course: CourseSessionAttendanceCourse,
|
|
) -> QuerySet["CourseSessionUser"]:
|
|
cs_id = attendance_course.course_session.id
|
|
circle_page = attendance_course.learning_content.get_parent_circle()
|
|
circle = Circle.objects.get(page_ptr=circle_page.id)
|
|
experts = circle.expert.all()
|
|
members = CourseSessionUser.objects.filter(
|
|
course_session_id=cs_id, role=CourseSessionUser.Role.MEMBER
|
|
)
|
|
return members | experts
|