|
|
""" |
|
|
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: |
|
|
|
|
|
fieldnames = [ |
|
|
'timestamp', 'drug_name', 'side_effects', 'patient_age', |
|
|
'patient_gender', 'dosage', 'duration', 'severity', |
|
|
'outcome', 'additional_details', 'reporter_info', 'raw_input' |
|
|
] |
|
|
|
|
|
|
|
|
for field in fieldnames: |
|
|
value = extracted_data.get(field, '') |
|
|
if not value or value == '' or not str(value).strip(): |
|
|
extracted_data[field] = 'NaN' |
|
|
else: |
|
|
|
|
|
extracted_data[field] = str(value).strip() |
|
|
|
|
|
|
|
|
github_storage = get_github_storage() |
|
|
success = github_storage.save_side_effects_report(extracted_data) |
|
|
|
|
|
if not success: |
|
|
|
|
|
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") |
|
|
|
|
|
|
|
|
drug_name = extracted_data.get('drug_name', 'NaN') |
|
|
side_effects = extracted_data.get('side_effects', 'NaN') |
|
|
report_id = extracted_data['timestamp'].replace(':', '').replace('-', '').replace(' ', '_') |
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
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 [] |
|
|
|