Spaces:
Runtime error
Runtime error
| """ | |
| Shared utility functions — time formatting, address formatting, etc. | |
| """ | |
| from datetime import datetime, timedelta | |
| from core import settings_manager as settings | |
| def format_time(time_str: str) -> str: | |
| """Convert 'HH:MM' (24h) to '2:30 PM' (12h) format for display.""" | |
| t = datetime.strptime(time_str, "%H:%M") | |
| return t.strftime("%I:%M %p") #previously %-I | |
| def format_date(date_str: str) -> str: | |
| """Convert 'YYYY-MM-DD' to 'Friday, March 20, 2026' for display.""" | |
| d = datetime.strptime(date_str, "%Y-%m-%d") | |
| return d.strftime("%A, %B %d, %Y") #previously %-d | |
| def is_future_date(date_str: str, min_hours_ahead: int = 24) -> bool: | |
| """Check if a date string is at least min_hours_ahead in the future.""" | |
| target = datetime.strptime(date_str, "%Y-%m-%d") | |
| cutoff = datetime.now() + timedelta(hours=min_hours_ahead) | |
| return target >= cutoff | |
| def build_event_title(visit_level: int | str, patient_name: str, provider_name: str) -> str: | |
| """Build a Google Calendar event title. | |
| Format: '[Level X] PatientName — ProviderName' | |
| """ | |
| level_info = settings.get_visit_levels().get(visit_level, {}) | |
| label = level_info.get("label", f"Level {visit_level}") | |
| return f"[{label}] {patient_name} — {provider_name}" | |
| def build_event_description(patient: dict, provider: dict, visit_address: str) -> str: | |
| """Build a Google Calendar event description with contact info and address.""" | |
| lines = [ | |
| f"Patient: {patient.get('name', 'N/A')}", | |
| f"Patient Email: {patient.get('email', 'N/A')}", | |
| f"Provider: {provider.get('name', 'N/A')}", | |
| f"Provider Email: {provider.get('email', 'N/A')}", | |
| f"Visit Address: {visit_address}", | |
| ] | |
| if patient.get("notes"): | |
| lines.append(f"Notes: {patient['notes']}") | |
| return "\n".join(lines) | |
| def minutes_to_display(minutes: int) -> str: | |
| """Convert minutes to a readable string: '1h 15m' or '45m'.""" | |
| if minutes < 60: | |
| return f"{minutes}m" | |
| hours = minutes // 60 | |
| remaining = minutes % 60 | |
| if remaining == 0: | |
| return f"{hours}h" | |
| return f"{hours}h {remaining}m" | |