hospital-management/tools/populate_all_data.py
Marwan Alwali 263292f6be update
2025-11-04 00:50:06 +03:00

209 lines
7.6 KiB
Python

#!/usr/bin/env python3
"""
Master orchestrator for Saudi healthcare data generation.
Runs all data generators in the correct dependency order.
"""
import os
import sys
import argparse
from datetime import datetime
# Add current directory to path for imports
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from data_utils.base import DataGenerationOrchestrator
from data_utils.helpers import validate_dependencies
def create_orchestrator():
"""Create and configure the data generation orchestrator"""
orchestrator = DataGenerationOrchestrator()
# Import and register all generators
try:
from core_data import SaudiCoreDataGenerator
orchestrator.register_generator('core', SaudiCoreDataGenerator)
except ImportError:
print("Warning: core_data.py not found or not refactored yet")
try:
from accounts_data import SaudiAccountsDataGenerator
orchestrator.register_generator('accounts', SaudiAccountsDataGenerator)
except ImportError:
print("Warning: accounts_data.py not found or not refactored yet")
try:
from hr_data import SaudiHRDataGenerator
orchestrator.register_generator('hr', SaudiHRDataGenerator)
except ImportError:
print("Warning: hr_data.py not found or not refactored yet")
try:
from patients_data import SaudiPatientsDataGenerator
orchestrator.register_generator('patients', SaudiPatientsDataGenerator)
except ImportError:
print("Warning: patients_data.py not found or not refactored yet")
try:
from emr_data import SaudiEMRDataGenerator
orchestrator.register_generator('emr', SaudiEMRDataGenerator)
except ImportError:
print("Warning: emr_data.py not found or not refactored yet")
try:
from lab_data import SaudiLabDataGenerator
orchestrator.register_generator('lab', SaudiLabDataGenerator)
except ImportError:
print("Warning: lab_data.py not found or not refactored yet")
try:
from radiology_data import SaudiRadiologyDataGenerator
orchestrator.register_generator('radiology', SaudiRadiologyDataGenerator)
except ImportError:
print("Warning: radiology_data.py not found or not refactored yet")
try:
from pharmacy_data import SaudiPharmacyDataGenerator
orchestrator.register_generator('pharmacy', SaudiPharmacyDataGenerator)
except ImportError:
print("Warning: pharmacy_data.py not found or not refactored yet")
try:
from appointments_data import SaudiAppointmentsDataGenerator
orchestrator.register_generator('appointments', SaudiAppointmentsDataGenerator)
except ImportError:
print("Warning: appointments_data.py not found or not refactored yet")
try:
from billing_data import SaudiBillingDataGenerator
orchestrator.register_generator('billing', SaudiBillingDataGenerator)
except ImportError:
print("Warning: billing_data.py not found or not refactored yet")
try:
from inpatients_data import SaudiInpatientsDataGenerator
orchestrator.register_generator('inpatients', SaudiInpatientsDataGenerator)
except ImportError:
print("Warning: inpatients_data.py not found or not refactored yet")
try:
from inventory_data import SaudiInventoryDataGenerator
orchestrator.register_generator('inventory', SaudiInventoryDataGenerator)
except ImportError:
print("Warning: inventory_data.py not found or not refactored yet")
# Facility management uses management command
try:
from facility_management.management.commands.seed_facility import Command as FacilityCommand
orchestrator.register_generator('facility_management', FacilityCommand)
except ImportError:
print("Warning: facility_management command not available")
return orchestrator
def main():
"""Main function to run data generation"""
parser = argparse.ArgumentParser(description='Generate Saudi healthcare test data')
parser.add_argument('--generators', nargs='*',
help='Specific generators to run (default: all in dependency order)')
parser.add_argument('--list-generators', action='store_true',
help='List available generators and exit')
parser.add_argument('--show-plan', action='store_true',
help='Show execution plan and exit')
parser.add_argument('--validate-only', action='store_true',
help='Validate dependencies and exit')
parser.add_argument('--tenant-id', type=int,
help='Tenant ID to generate data for (default: all active tenants)')
parser.add_argument('--tenant-slug', type=str,
help='Tenant slug to generate data for')
parser.add_argument('--skip-validation', action='store_true',
help='Skip dependency validation')
args = parser.parse_args()
print("🏥 Saudi Healthcare Data Generation Orchestrator")
print("=" * 55)
# Create orchestrator
orchestrator = create_orchestrator()
# List generators if requested
if args.list_generators:
print("\n📋 Available Generators:")
for gen in orchestrator.get_available_generators():
print(f" - {gen}")
return
# Show execution plan if requested
if args.show_plan:
generators_to_run = args.generators or orchestrator.execution_order
plan = orchestrator.get_execution_plan(generators_to_run)
print("\n📋 Execution Plan:")
for item in plan:
deps = ', '.join(item['dependencies']) if item['dependencies'] else 'None'
print(f" {item['name']} ({item['class']})")
print(f" Dependencies: {deps}")
return
# Validate dependencies
if not args.skip_validation:
try:
deps = validate_dependencies()
print(f"✅ Dependencies validated: {deps['tenants']} tenants, {deps['users']} users")
except ValueError as e:
print(f"❌ Dependency validation failed: {e}")
return
# Validate only if requested
if args.validate_only:
print("✅ Validation complete - all dependencies satisfied")
return
# Determine generators to run
generators_to_run = args.generators or orchestrator.execution_order
# Prepare kwargs for generators
generator_kwargs = {}
if args.tenant_id:
generator_kwargs['tenant_id'] = args.tenant_id
if args.tenant_slug:
generator_kwargs['tenant_slug'] = args.tenant_slug
# Run generators
start_time = datetime.now()
print(f"\n🚀 Starting data generation at {start_time}")
print(f"📦 Generators to run: {', '.join(generators_to_run)}")
results = orchestrator.run_all(generators_to_run, **generator_kwargs)
# Print summary
end_time = datetime.now()
duration = end_time - start_time
print(f"\n🎉 Data generation completed at {end_time}")
print(f"⏱️ Total duration: {duration}")
if results:
print(f"\n📊 Generation Summary:")
total_created = 0
for generator_name, result in results.items():
if isinstance(result, dict):
count = sum(result.values()) if all(isinstance(v, int) for v in result.values()) else len(result)
print(f" {generator_name}: {count} records")
total_created += count
else:
print(f" {generator_name}: {result}")
print(f"\n💡 Total records created: {total_created}")
else:
print("\n⚠️ No data was generated")
print("\n✅ Saudi healthcare data generation orchestrator completed successfully!")
if __name__ == "__main__":
main()