Lung-Cancer-AI-Advisor / core /side_effects_github_handler.py
moazx's picture
Initial commit
2a8faae
raw
history blame
6.62 kB
"""
GitHub-enabled side effects handler
This module provides GitHub storage functionality for side effects reporting
"""
import os
import csv
from datetime import datetime
from typing import Dict, Any
import pytz
from .github_storage import get_github_storage
from .config import logger
def save_side_effect_report_to_github(extracted_data: Dict[str, Any]) -> str:
"""
Save the side effect report to GitHub repository with fallback to local storage.
Args:
extracted_data: Dictionary containing side effects report data
Returns:
Confirmation message string
"""
try:
# Ensure all fields have values (use 'NaN' for empty fields)
fieldnames = [
'timestamp', 'drug_name', 'side_effects', 'patient_age',
'patient_gender', 'dosage', 'duration', 'severity',
'outcome', 'additional_details', 'reporter_info', 'raw_input'
]
# Fill missing fields with 'NaN' and ensure proper data types
for field in fieldnames:
value = extracted_data.get(field, '')
if not value or value == '' or not str(value).strip():
extracted_data[field] = 'NaN'
else:
# Ensure the value is properly formatted
extracted_data[field] = str(value).strip()
# Save to GitHub repository
github_storage = get_github_storage()
success = github_storage.save_side_effects_report(extracted_data)
if not success:
# Fallback to local storage if GitHub fails
csv_filename = "side_effects_reports.csv"
csv_path = os.path.join(os.getcwd(), csv_filename)
file_exists = os.path.exists(csv_path)
with open(csv_path, 'a', newline='', encoding='utf-8') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
if not file_exists:
writer.writeheader()
writer.writerow(extracted_data)
storage_location = f"locally to {csv_filename} (GitHub upload failed)"
logger.warning("GitHub upload failed, saved locally as fallback")
else:
storage_location = "to GitHub cloud repository"
logger.info("Successfully saved side effects report to GitHub")
# Generate confirmation message
drug_name = extracted_data.get('drug_name', 'NaN')
side_effects = extracted_data.get('side_effects', 'NaN')
report_id = extracted_data['timestamp'].replace(':', '').replace('-', '').replace(' ', '_')
# Create a summary of provided vs missing information
provided_info = []
missing_info = []
info_fields = {
'drug_name': 'Drug/Medication',
'side_effects': 'Side Effects',
'patient_age': 'Patient Age',
'patient_gender': 'Patient Gender',
'dosage': 'Dosage',
'duration': 'Duration',
'severity': 'Severity',
'outcome': 'Outcome'
}
for field, display_name in info_fields.items():
value = extracted_data.get(field, 'NaN')
if value and value != 'NaN':
provided_info.append(f"- **{display_name}:** {value}")
else:
missing_info.append(display_name)
confirmation = f"""
**✅ Adverse Drug Reaction Report Saved**
**Report ID:** {report_id}
**Documented Information:**
{chr(10).join(provided_info) if provided_info else '- Basic side effect report recorded'}
**Pharmacovigilance Status:** Report successfully saved {storage_location} for regulatory review.
**Clinical Recommendations:**
- Monitor patient for symptom progression
- Consider dose adjustment or alternative therapy if appropriate
- Document in patient medical record
- Report serious reactions to pharmacovigilance authorities
How can I assist you further with clinical guidance for this case?
"""
return confirmation.strip()
except Exception as e:
logger.error(f"Error saving side effect report: {e}")
return f"Error saving side effect report: {str(e)}"
def get_side_effects_reports_from_github():
"""
Get all side effects reports from GitHub repository with local fallback.
Returns:
List of side effects reports
"""
try:
github_storage = get_github_storage()
reports = github_storage.get_side_effects_reports()
if reports:
logger.info(f"Retrieved {len(reports)} side effects reports from GitHub")
return reports
# Fallback to local file
csv_path = "side_effects_reports.csv"
if os.path.exists(csv_path):
import pandas as pd
df = pd.read_csv(csv_path)
reports = df.to_dict('records')
logger.info(f"Retrieved {len(reports)} side effects reports from local file (GitHub fallback)")
return reports
logger.info("No side effects reports found in GitHub or local storage")
return []
except Exception as e:
logger.error(f"Error retrieving side effects reports: {e}")
return []
def get_drug_reports_from_github(drug_name: str):
"""
Get side effects reports for a specific drug from GitHub repository.
Args:
drug_name: Name of the drug to filter reports
Returns:
List of reports for the specified drug
"""
try:
github_storage = get_github_storage()
reports = github_storage.get_drug_reports(drug_name)
if reports:
logger.info(f"Retrieved {len(reports)} reports for {drug_name} from GitHub")
return reports
# Fallback to local file
csv_path = "side_effects_reports.csv"
if os.path.exists(csv_path):
import pandas as pd
df = pd.read_csv(csv_path)
drug_reports = df[df['drug_name'].str.lower() == drug_name.lower()]
reports = drug_reports.to_dict('records')
logger.info(f"Retrieved {len(reports)} reports for {drug_name} from local file (GitHub fallback)")
return reports
logger.info(f"No reports found for {drug_name} in GitHub or local storage")
return []
except Exception as e:
logger.error(f"Error retrieving drug reports for {drug_name}: {e}")
return []