Filter export by circles if present
This commit is contained in:
parent
296644ff22
commit
984513b3a2
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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():
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue