scheduler / utils /helpers.py
umangchaudhry's picture
Upload 31 files
0d04b76 verified
Raw
History Blame Contribute Delete
2.13 kB
"""
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"