HH/apps/integrations/management/commands/setup_his_integration.py
2026-03-09 16:10:24 +03:00

128 lines
4.6 KiB
Python

"""
Management command to set up HIS integration configuration.
Usage:
python manage.py setup_his_integration --name "HIS Production" --url "https://his.hospital.com/api"
Options:
--name Configuration name
--url HIS API URL
--api-key API key for authentication
--hospital Hospital ID to associate with this config
"""
from django.core.management.base import BaseCommand
from apps.integrations.models import IntegrationConfig, SourceSystem
from apps.organizations.models import Hospital
class Command(BaseCommand):
help = 'Set up HIS integration configuration'
def add_arguments(self, parser):
parser.add_argument(
'--name',
type=str,
required=True,
help='Configuration name (e.g., "HIS Production")'
)
parser.add_argument(
'--url',
type=str,
required=True,
help='HIS API URL (e.g., "https://his.hospital.com/api/patients")'
)
parser.add_argument(
'--api-key',
type=str,
help='API key for authentication'
)
parser.add_argument(
'--hospital',
type=str,
help='Hospital code to associate with this config'
)
parser.add_argument(
'--active',
action='store_true',
default=True,
help='Set configuration as active (default: True)'
)
parser.add_argument(
'--force',
action='store_true',
help='Update existing configuration with same name'
)
def handle(self, *args, **options):
name = options['name']
url = options['url']
api_key = options.get('api_key')
hospital_code = options.get('hospital')
is_active = options['active']
force = options.get('force')
self.stdout.write(self.style.MIGRATE_HEADING('=' * 70))
self.stdout.write(self.style.MIGRATE_HEADING('HIS Integration Setup'))
self.stdout.write(self.style.MIGRATE_HEADING('=' * 70))
# Check for existing configuration
existing = IntegrationConfig.objects.filter(name=name).first()
if existing and not force:
self.stdout.write(
self.style.ERROR(f'Configuration "{name}" already exists. Use --force to update.')
)
return
# Build config JSON
config_json = {}
if hospital_code:
hospital = Hospital.objects.filter(code=hospital_code).first()
if hospital:
config_json['hospital_id'] = str(hospital.id)
config_json['hospital_code'] = hospital_code
self.stdout.write(f'Associated with hospital: {hospital.name}')
else:
self.stdout.write(
self.style.WARNING(f'Hospital with code "{hospital_code}" not found')
)
# Create or update configuration
if existing:
existing.api_url = url
if api_key:
existing.api_key = api_key
existing.is_active = is_active
existing.config_json.update(config_json)
existing.save()
config = existing
action = 'Updated'
else:
config = IntegrationConfig.objects.create(
name=name,
source_system=SourceSystem.HIS,
api_url=url,
api_key=api_key or '',
is_active=is_active,
config_json=config_json
)
action = 'Created'
self.stdout.write(self.style.SUCCESS(f'\n{action} configuration:'))
self.stdout.write(f' Name: {config.name}')
self.stdout.write(f' Source: {config.get_source_system_display()}')
self.stdout.write(f' API URL: {config.api_url}')
self.stdout.write(f' API Key: {"✓ Set" if config.api_key else "✗ Not set"}')
self.stdout.write(f' Active: {"Yes" if config.is_active else "No"}')
self.stdout.write(self.style.MIGRATE_HEADING('\n' + '=' * 70))
self.stdout.write('Next steps:')
self.stdout.write('1. Test the connection:')
self.stdout.write(f' python manage.py test_his_connection --config "{config.name}"')
self.stdout.write('2. Manually fetch surveys:')
self.stdout.write(' python manage.py fetch_his_surveys --test')
self.stdout.write('3. The automated task will run every 5 minutes via Celery Beat')
self.stdout.write('=' * 70)