[32788f42] Fix font encoding for PDF generation, compress empty slots in appointment list, adjust layout and checkbox positioning
This commit is contained in:
@@ -182,6 +182,7 @@ def generate_appointment_overview_pdf(raw_events: list, job_name: str, event_typ
|
||||
start_dt = datetime.datetime.fromisoformat(event['start_time'].replace('Z', '+00:00'))
|
||||
start_dt = start_dt.astimezone(ZoneInfo("Europe/Berlin"))
|
||||
|
||||
|
||||
num_children = ""
|
||||
has_consent = False
|
||||
for qa in event.get('questions_and_answers', []):
|
||||
@@ -189,11 +190,12 @@ def generate_appointment_overview_pdf(raw_events: list, job_name: str, event_typ
|
||||
a_text = qa.get('answer', '')
|
||||
if "wie viele kinder" in q_text:
|
||||
num_children = a_text
|
||||
elif "schöne bilder" in q_text and "website veröffentlichen" in q_text:
|
||||
if "ja, gerne" in a_text.lower():
|
||||
elif "veröffentlichen" in q_text or "bilder" in q_text:
|
||||
if "ja" in a_text.lower():
|
||||
has_consent = True
|
||||
|
||||
parsed_events.append({
|
||||
|
||||
"dt": start_dt,
|
||||
"name": event['invitee_name'],
|
||||
"children": num_children,
|
||||
@@ -211,6 +213,7 @@ def generate_appointment_overview_pdf(raw_events: list, job_name: str, event_typ
|
||||
min_dt = events[0]['dt']
|
||||
max_dt = events[-1]['dt']
|
||||
|
||||
|
||||
slots = []
|
||||
curr_dt = min_dt
|
||||
event_idx = 0
|
||||
@@ -230,7 +233,8 @@ def generate_appointment_overview_pdf(raw_events: list, job_name: str, event_typ
|
||||
"name": e['name'],
|
||||
"children": e['children'],
|
||||
"consent": e['consent'],
|
||||
"booked": True
|
||||
"booked": True,
|
||||
"dt": e['dt']
|
||||
})
|
||||
else:
|
||||
if curr_dt <= max_dt:
|
||||
@@ -239,12 +243,54 @@ def generate_appointment_overview_pdf(raw_events: list, job_name: str, event_typ
|
||||
"name": "",
|
||||
"children": "",
|
||||
"consent": False,
|
||||
"booked": False
|
||||
"booked": False,
|
||||
"dt": curr_dt
|
||||
})
|
||||
|
||||
curr_dt = next_dt
|
||||
|
||||
final_grouped[date_str] = slots
|
||||
# Compress empty slots if there are more than 2 in a row
|
||||
compressed_slots = []
|
||||
empty_streak = []
|
||||
|
||||
for slot in slots:
|
||||
if slot["booked"]:
|
||||
if len(empty_streak) > 2:
|
||||
start_time = empty_streak[0]["time_str"]
|
||||
end_dt = empty_streak[-1]["dt"] + datetime.timedelta(minutes=6)
|
||||
end_time = end_dt.strftime("%H:%M")
|
||||
compressed_slots.append({
|
||||
"is_compressed": True,
|
||||
"time_str": f"{start_time} - {end_time}",
|
||||
"name": "--- Freie Zeit / Pause ---",
|
||||
"children": "",
|
||||
"consent": False,
|
||||
"booked": False
|
||||
})
|
||||
else:
|
||||
compressed_slots.extend(empty_streak)
|
||||
empty_streak = []
|
||||
compressed_slots.append(slot)
|
||||
else:
|
||||
empty_streak.append(slot)
|
||||
|
||||
if len(empty_streak) > 2:
|
||||
start_time = empty_streak[0]["time_str"]
|
||||
end_dt = empty_streak[-1]["dt"] + datetime.timedelta(minutes=6)
|
||||
end_time = end_dt.strftime("%H:%M")
|
||||
compressed_slots.append({
|
||||
"is_compressed": True,
|
||||
"time_str": f"{start_time} - {end_time}",
|
||||
"name": "--- Freie Zeit / Pause ---",
|
||||
"children": "",
|
||||
"consent": False,
|
||||
"booked": False
|
||||
})
|
||||
else:
|
||||
compressed_slots.extend(empty_streak)
|
||||
|
||||
final_grouped[date_str] = compressed_slots
|
||||
|
||||
|
||||
template_dir = os.path.join(os.path.dirname(__file__), "templates")
|
||||
env = Environment(loader=FileSystemLoader(template_dir))
|
||||
@@ -582,9 +628,15 @@ async def generate_appointment_list(job_id: str, event_type_name: str, db: Sessi
|
||||
if not api_token:
|
||||
raise HTTPException(status_code=400, detail="Calendly API token missing.")
|
||||
|
||||
# 1. Fetch job name from DB
|
||||
job = db.query(DBJob).filter(DBJob.id == job_id).first()
|
||||
|
||||
# 1. Fetch job name from DB
|
||||
job = db.query(DBJob).filter(DBJob.id == job_id).first()
|
||||
job_name = job.name if job else f"Auftrag {job_id}"
|
||||
import re
|
||||
job_name_clean = re.sub(r'^JOB\d+\s*', '', job_name)
|
||||
|
||||
|
||||
# 2. Fetch raw Calendly events (no date range needed, defaults to +6 months)
|
||||
try:
|
||||
@@ -603,7 +655,7 @@ async def generate_appointment_list(job_id: str, event_type_name: str, db: Sessi
|
||||
output_path = os.path.join(temp_dir, output_name)
|
||||
|
||||
try:
|
||||
generate_appointment_overview_pdf(raw_events, job_name, event_type_name, output_path)
|
||||
generate_appointment_overview_pdf(raw_events, job_name_clean, event_type_name, output_path)
|
||||
return FileResponse(path=output_path, filename=output_name, media_type="application/pdf")
|
||||
except Exception as e:
|
||||
logger.error(f"Error generating appointment overview pdf: {e}")
|
||||
|
||||
Reference in New Issue
Block a user