Filter export by circles if present

This commit is contained in:
Christian Cueni 2024-05-15 14:50:53 +02:00
parent 296644ff22
commit 984513b3a2
3 changed files with 58 additions and 28 deletions

View File

@ -15,4 +15,4 @@ logger = structlog.get_logger(__name__)
) )
def command(course_session_id, save_as_file): def command(course_session_id, save_as_file):
# using the output from call_command was a bit cumbersome, so this is just a wrapper for the actual function # using the output from call_command was a bit cumbersome, so this is just a wrapper for the actual function
export_attendance([course_session_id, 14], save_as_file) export_attendance([course_session_id], save_as_file)

View File

@ -1,3 +1,4 @@
import typing
from datetime import datetime from datetime import datetime
from io import BytesIO from io import BytesIO
from itertools import groupby from itertools import groupby
@ -11,30 +12,35 @@ from vbv_lernwelt.course_session.models import CourseSessionAttendanceCourse
logger = structlog.get_logger(__name__) logger = structlog.get_logger(__name__)
def export_attendance(course_session_ids: list[str], save_as_file: bool, circles=None): def export_attendance(
course_session_ids: list[str], save_as_file: bool, circle_ids: list[int] = None
):
wb = Workbook() wb = Workbook()
# remove the first sheet is just easier than keeping track of the active sheet # remove the first sheet is just easier than keeping track of the active sheet
wb.remove(wb.active) wb.remove(wb.active)
# get attencdance courses for course sessions and circles cs_users = CourseSessionUser.objects.filter(
# get users for each course session course_session_id__in=course_session_ids, role=CourseSessionUser.Role.MEMBER
# set headers ).order_by("course_session", "user__last_name", "user__first_name")
# sheets group, cs or generation?
cs_users = CourseSessionUser.objects.filter(course_session_id__in=course_session_ids,
role=CourseSessionUser.Role.MEMBER).order_by("course_session",
"user__last_name",
"user__first_name")
attendance_courses = CourseSessionAttendanceCourse.objects.filter( attendance_courses = CourseSessionAttendanceCourse.objects.filter(
course_session_id__in=course_session_ids).order_by("course_session", "due_date") course_session_id__in=course_session_ids
).order_by("course_session", "due_date")
grouped_cs_users = {key: list(group) for key, group in grouped_cs_users = {
groupby(sorted(cs_users, key=lambda x: x.course_session.title), key: list(group)
key=lambda x: x.course_session.title)} for key, group in groupby(
grouped_attendance_course = {key: list(group) for key, group in sorted(cs_users, key=lambda x: x.course_session.title),
groupby(sorted(attendance_courses, key=lambda x: x.course_session.title), key=lambda x: x.course_session.title,
key=lambda x: x.course_session.title)} )
}
grouped_attendance_course = {
key: list(group)
for key, group in groupby(
sorted(attendance_courses, key=lambda x: x.course_session.title),
key=lambda x: x.course_session.title,
)
}
for course_session, cs_users in grouped_cs_users.items(): for course_session, cs_users in grouped_cs_users.items():
logger.debug( logger.debug(
@ -44,7 +50,13 @@ def export_attendance(course_session_ids: list[str], save_as_file: bool, circles
}, },
label="attendance_export", label="attendance_export",
) )
_create_sheet(wb, course_session, cs_users, grouped_attendance_course[course_session]) _create_sheet(
wb,
course_session,
cs_users,
grouped_attendance_course[course_session],
circle_ids,
)
if save_as_file: if save_as_file:
wb.save(make_export_filename()) wb.save(make_export_filename())
@ -56,8 +68,13 @@ def export_attendance(course_session_ids: list[str], save_as_file: bool, circles
return output.getvalue() return output.getvalue()
def _create_sheet(wb: Workbook, title: str, users: list[CourseSessionUser], def _create_sheet(
attendance_courses: list[CourseSessionAttendanceCourse]): wb: Workbook,
title: str,
users: list[CourseSessionUser],
attendance_courses: list[CourseSessionAttendanceCourse],
circle_ids: typing.Optional[list[int]],
):
sheet = wb.create_sheet(title=sanitize_sheet_name(title)) sheet = wb.create_sheet(title=sanitize_sheet_name(title))
if len(users) == 0: if len(users) == 0:
@ -74,11 +91,17 @@ def _create_sheet(wb: Workbook, title: str, users: list[CourseSessionUser],
col_idx = 5 col_idx = 5
attendance_data = {} attendance_data = {}
for course in attendance_courses: for course in attendance_courses:
course_title = course.get_circle().title circle = course.get_circle()
sheet.cell(row=1, column=col_idx, if circle_ids and circle.id not in circle_ids:
value=f"Anwesenheit {course_title} {course.due_date.start.strftime('%d.%m.%Y')}") continue
user_dict_map = {d['user_id']: d for d in course.attendance_user_list}
attendance_data[course_title] = user_dict_map sheet.cell(
row=1,
column=col_idx,
value=f"Anwesenheit {circle.title} {course.due_date.start.strftime('%d.%m.%Y')}",
)
user_dict_map = {d["user_id"]: d for d in course.attendance_user_list}
attendance_data[circle.title] = user_dict_map
col_idx += 1 col_idx += 1
@ -92,7 +115,11 @@ def _add_rows(sheet, users: list[CourseSessionUser], attendance_data):
sheet.cell(row=row_idx, column=1, value=user.user.first_name) sheet.cell(row=row_idx, column=1, value=user.user.first_name)
sheet.cell(row=row_idx, column=2, value=user.user.last_name) sheet.cell(row=row_idx, column=2, value=user.user.last_name)
sheet.cell(row=row_idx, column=3, value=user.user.email) sheet.cell(row=row_idx, column=3, value=user.user.email)
sheet.cell(row=row_idx, column=4, value=user.user.additional_json_data.get("Lehrvertragsnummer", "")) sheet.cell(
row=row_idx,
column=4,
value=user.user.additional_json_data.get("Lehrvertragsnummer", ""),
)
col_idx = 5 col_idx = 5
for key, user_dict_map in attendance_data.items(): for key, user_dict_map in attendance_data.items():

View File

@ -10,7 +10,10 @@ from openpyxl import Workbook
from vbv_lernwelt.core.models import User from vbv_lernwelt.core.models import User
from vbv_lernwelt.course.models import CourseCompletionStatus, CourseSession from vbv_lernwelt.course.models import CourseCompletionStatus, CourseSession
from vbv_lernwelt.course.services import mark_course_completion from vbv_lernwelt.course.services import mark_course_completion
from vbv_lernwelt.course_session.services.export import make_export_filename, sanitize_sheet_name from vbv_lernwelt.course_session.services.export import (
make_export_filename,
sanitize_sheet_name,
)
from vbv_lernwelt.feedback.models import FeedbackResponse from vbv_lernwelt.feedback.models import FeedbackResponse
from vbv_lernwelt.learnpath.models import ( from vbv_lernwelt.learnpath.models import (
LearningContentFeedbackUK, LearningContentFeedbackUK,