From 14dc64234d669c67688178d54447d316790215e0 Mon Sep 17 00:00:00 2001 From: bolade Date: Fri, 3 Oct 2025 22:58:20 +0100 Subject: [PATCH] feat: Update patient name extraction and enhance page context generation in PageGenerator --- app/report_gen/page_1.html | 2 +- app/services/page_generator.py | 202 ++++++++++++++++++++++++++++----- 2 files changed, 177 insertions(+), 27 deletions(-) diff --git a/app/report_gen/page_1.html b/app/report_gen/page_1.html index ffd43fb..d7f2297 100644 --- a/app/report_gen/page_1.html +++ b/app/report_gen/page_1.html @@ -26,7 +26,7 @@

- {{ name|upper }} + {{ first_name|upper }}

{{ surname|upper }} diff --git a/app/services/page_generator.py b/app/services/page_generator.py index f2ecf01..9aeac10 100644 --- a/app/services/page_generator.py +++ b/app/services/page_generator.py @@ -1,5 +1,8 @@ +import datetime +import pandas as pd +import matplotlib.pyplot as plt class PageGenerator: - def __init__(self, pnoe_df, seca_df, spirometry_df, patient_info): + def __init__(self, pnoe_df: pd.DataFrame, seca_df: pd.DataFrame, spirometry_df: pd.DataFrame, patient_info: dict): self.pnoe_df = pnoe_df self.seca_df = seca_df self.spirometry_df = spirometry_df @@ -9,33 +12,180 @@ class PageGenerator: def page_1_context(self): # Extract patient information patient_name = self.patient_info.get("patient_name", "N/A") - age = self.patient_info.get("age", "N/A") - height = self.patient_info.get("height", "N/A") - weight = self.patient_info.get("weight", "N/A") - focus = self.patient_info.get("focus", "N/A") - session_id = self.patient_info.get("session_id", "N/A") - - # Extract PNOE data - pnoe_summary = self.pnoe_df.describe().to_dict() - - # Extract SECA data - seca_summary = self.seca_df.describe().to_dict() - - # Extract Spirometry data - spirometry_summary = self.spirometry_df.describe().to_dict() - context = { - "patient_name": patient_name, - "age": age, - "height": height, - "weight": weight, - "focus": focus, - "session_id": session_id, - "pnoe_summary": pnoe_summary, - "seca_summary": seca_summary, - "spirometry_summary": spirometry_summary, + "first_name": patient_name.split()[0] if patient_name else "N/A", + "surname": patient_name.split()[-1] if patient_name else "N/A", + "date": datetime.datetime.now().strftime("%B %d, %Y"), } return context - \ No newline at end of file + def page_3_context(self): + # Example: Extract detailed PNOE data for page 3 + pnoe_details = self.pnoe_df.head(10).to_dict(orient="records") + + context = { + "pnoe_details": pnoe_details, + } + + return context + + def page_4_context(self): + # Example: Extract detailed Spirometry data for page 4 + # Filter df_2 for Keirstyn Moran + patient_data = self.patient_info[self.patient_info['LastName'].str.contains('Moran', case=False, na=False)] + fat_percentage = patient_data['Adult_FMP'].iloc[0] + weight_kg = patient_data['Weight'].iloc[0] + lean_percentage = 100 - fat_percentage + + fat_mass_lbs = weight_kg * (fat_percentage / 100) * 2.20462 + lean_mass_lbs = weight_kg * (lean_percentage / 100) * 2.20462 + + total_weight = fat_mass_lbs + lean_mass_lbs + fat_percentage = (fat_mass_lbs / total_weight) * 100 + lean_percentage = (lean_mass_lbs / total_weight) * 100 + + sizes = [fat_percentage, lean_percentage] + colors = ['#fde3ac', '#ff9966'] # Light yellow/tan and orange from the image + + plt.figure(figsize=(8, 8)) + + wedges, texts, autotexts = plt.pie(sizes, autopct='', startangle=90, wedgeprops=dict(width=0.5, edgecolor='w'), colors=colors, labels=['', '']) # Remove default labels + + plt.text(-1, 1, f'Fat Mass ({fat_mass_lbs:.1f}lbs)\n{fat_percentage:.1f}%', + fontsize=14, fontweight='bold', ha='center', va='center', + bbox=dict(boxstyle="round,pad=0.3", facecolor='white', alpha=0.8)) + + plt.text(1, -1, f'Lean Mass ({lean_mass_lbs:.1f}lbs)\n{lean_percentage:.1f}%', + fontsize=14, fontweight='bold', ha='center', va='center', + bbox=dict(boxstyle="round,pad=0.3", facecolor='white', alpha=0.8)) + + plt.axis('equal') # Equal aspect ratio ensures that pie is drawn as a circle + spirometry_details = self.spirometry_df.head(10).to_dict(orient="records") + + context = { + "spirometry_details": spirometry_details, + } + + return context + + def page_5_context(self): + # Example: Summary and conclusions for page 5 + summary = { + "pnoe_summary": self.pnoe_df.describe().to_dict(), + "seca_summary": self.seca_df.describe().to_dict(), + "spirometry_summary": self.spirometry_df.describe().to_dict(), + } + + context = { + "summary": summary, + } + + return context + + def page_6_context(self): + # Example: Recommendations based on data for page 6 + recommendations = [ + "Increase cardiovascular training.", + "Incorporate strength training twice a week.", + "Monitor respiratory function regularly.", + ] + + context = { + "recommendations": recommendations, + } + + return context + + def page_7_context(self): + # Example: Additional notes or references for page 7 + notes = "This report is generated based on the provided data. Consult a healthcare professional for personalized advice." + + context = { + "notes": notes, + } + + return context + + def page_8_context(self): + # Example: Contact information and disclaimers for page 8 + contact_info = { + "clinic_name": "Health Clinic", + "address": "123 Wellness St, Healthy City, HC 12345", + "phone": "(123) 456-7890", + "email": "contact@healthclinic.com" + } + + context = { + "contact_info": contact_info, + } + + return context + + def page_9_context(self): + # Example: Graphs and visualizations for page 9 + graphs = [ + "graph1.png", + "graph2.png", + "graph3.png" + ] + + context = { + "graphs": graphs, + } + + return context + + def page_10_context(self): + # Example: Final remarks and next steps for page 10 + final_remarks = "Thank you for using our health assessment services. We look forward to assisting you in your health journey." + + context = { + "final_remarks": final_remarks, + } + + return context + + def page_11_context(self): + # Example: Additional resources and references for page 11 + resources = [ + {"title": "Healthy Living Guide", "link": "http://example.com/healthy-living"}, + {"title": "Exercise Tips", "link": "http://example.com/exercise-tips"}, + {"title": "Nutrition Advice", "link": "http://example.com/nutrition-advice"} + ] + + context = { + "resources": resources, + } + + return context + + def page_12_context(self): + # Example: Feedback and survey information for page 12 + feedback_info = "We value your feedback. Please visit http://example.com/feedback to share your experience." + + context = { + "feedback_info": feedback_info, + } + + return context + + def page_13_context(self): + # Example: Acknowledgments and credits for page 13 + acknowledgments = "This report was generated using data analysis techniques and the expertise of our medical team." + + context = { + "acknowledgments": acknowledgments, + } + + return context + + def page_18_context(self): + # Example: Legal disclaimers and terms for page 18 + legal_disclaimer = "This report is for informational purposes only and does not constitute medical advice." + + context = { + "legal_disclaimer": legal_disclaimer, + } + + return context \ No newline at end of file