[32788f42] feat(list-generator): create React app and FastAPI backend for PDF list generation
This commit is contained in:
0
list-generator/backend/app/services/__init__.py
Normal file
0
list-generator/backend/app/services/__init__.py
Normal file
45
list-generator/backend/app/services/pdf_generator.py
Normal file
45
list-generator/backend/app/services/pdf_generator.py
Normal file
@@ -0,0 +1,45 @@
|
||||
import pandas as pd
|
||||
import os
|
||||
from jinja2 import Environment, FileSystemLoader
|
||||
from weasyprint import HTML
|
||||
import datetime
|
||||
|
||||
def generate_school_pdf(institution: str, date_info: str, list_type: str, students_csv_path: str, families_csv_path: str = None, output_dir: str = "/tmp") -> str:
|
||||
# Read CSV data
|
||||
df = pd.read_csv(students_csv_path, sep=";")
|
||||
# Clean column names
|
||||
df.columns = df.columns.str.strip()
|
||||
|
||||
# Group by class
|
||||
grouped = df.groupby("Klasse")
|
||||
class_data = []
|
||||
for class_name, group in grouped:
|
||||
students = group.to_dict("records")
|
||||
class_data.append({"name": class_name, "students": students})
|
||||
|
||||
# Prepare summary data
|
||||
class_counts = [{"name": c, "count": len(g)} for c, g in grouped]
|
||||
total_students = sum(c["count"] for c in class_counts)
|
||||
|
||||
# Setup Jinja2 environment
|
||||
template_dir = os.path.join(os.path.dirname(__file__), "..", "templates")
|
||||
env = Environment(loader=FileSystemLoader(template_dir))
|
||||
template = env.get_template("school_list.html")
|
||||
|
||||
# Render HTML
|
||||
current_time = datetime.datetime.now().strftime("%d.%m.%Y %H:%M Uhr")
|
||||
html_out = template.render(
|
||||
institution=institution,
|
||||
date_info=date_info,
|
||||
class_counts=class_counts,
|
||||
total_students=total_students,
|
||||
class_data=class_data,
|
||||
current_time=current_time
|
||||
)
|
||||
|
||||
# Generate PDF
|
||||
output_filename = f"Listen_{institution.replace( , _)}_{list_type}_{datetime.datetime.now().strftime(%Y-%m-%d_%H-%M)}.pdf"
|
||||
output_path = os.path.join(output_dir, output_filename)
|
||||
HTML(string=html_out).write_pdf(output_path)
|
||||
|
||||
return output_path
|
||||
Reference in New Issue
Block a user