WIP: Add feedback export to file

This commit is contained in:
Christian Cueni 2024-02-28 07:50:31 +01:00
parent f8ef905f13
commit a3d65eb78d
3 changed files with 74 additions and 0 deletions

View File

@ -0,0 +1,74 @@
from datetime import datetime
from itertools import groupby
from operator import attrgetter
import djclick as click
import structlog
from openpyxl import Workbook
from vbv_lernwelt.feedback.models import FeedbackResponse
logger = structlog.get_logger(__name__)
VV_FEEDBACK_QUESTIONS = [
("satisfaction", "Zufriedenheit insgesamt"),
("goal_attainment", "Zielerreichung insgesamt"),
(
"proficiency",
"Wie beurteilst du deine Sicherheit bezüglichen den Themen nach dem Circle?",
),
("preparation_task_clarity", "Waren die Praxisaufträge klar und verständlich?"),
("would_recommend", "Würdest du den Circle weiterempfehlen?"),
("course_positive_feedback", "Was hat dir besonders gut gefallen?"),
("course_negative_feedback", "Wo siehst du Verbesserungspotential?"),
]
logger = structlog.get_logger(__name__)
@click.command()
@click.argument("course_session_id")
def command(course_session_id):
wb = Workbook()
wb.remove_sheet(wb.active)
# Create another sheet
feedbacks = FeedbackResponse.objects.filter(
course_session_id=course_session_id
).order_by("circle")
grouped_feedbacks = groupby(feedbacks, key=attrgetter("circle"))
for circle, group_feedbacks in grouped_feedbacks:
logger.debug(
"export_feedback_for_circle",
data={
"circle": circle.title,
"course_session_id": course_session_id,
"count": sum(1 for _ in group_feedbacks),
},
label="feedback_export",
)
create_sheet(wb, circle.title, group_feedbacks)
today_date = datetime.today().strftime("%Y-%m-%d")
# Set the filename with today's date
filename = f"feedback_export_{today_date}.xlsx"
wb.save("example.xlsx")
def create_sheet(wb: Workbook, title: str, data: list[FeedbackResponse]):
sheet = wb.create_sheet(title=title)
# add header
questions = [q[1] for q in VV_FEEDBACK_QUESTIONS]
for col_idx, title in enumerate(questions, start=2):
sheet.cell(row=1, column=col_idx, value=title)
add_rows(sheet, data)
return sheet
def add_rows(sheet, data):
for row_idx, feedback in enumerate(data, start=2):
for col_idx, question in enumerate(VV_FEEDBACK_QUESTIONS, start=2):
response = feedback.data.get(question[0], "")
sheet.cell(row=row_idx, column=col_idx, value=response)