128 lines
4.8 KiB
Python
128 lines
4.8 KiB
Python
"""
|
|
Management command to create a default organization and assign orphaned hospitals
|
|
"""
|
|
from django.core.management.base import BaseCommand
|
|
from django.db import transaction
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from apps.organizations.models import Organization, Hospital
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = 'Create a default organization and assign hospitals without organization'
|
|
|
|
def add_arguments(self, parser):
|
|
parser.add_argument(
|
|
'--name',
|
|
type=str,
|
|
default='Default Healthcare Organization',
|
|
help='Name of the default organization to create'
|
|
)
|
|
parser.add_argument(
|
|
'--code',
|
|
type=str,
|
|
default='DEFAULT',
|
|
help='Code of the default organization'
|
|
)
|
|
parser.add_argument(
|
|
'--force',
|
|
action='store_true',
|
|
help='Force reassignment even if hospital already has an organization'
|
|
)
|
|
parser.add_argument(
|
|
'--dry-run',
|
|
action='store_true',
|
|
help='Show what would be done without making changes'
|
|
)
|
|
|
|
def handle(self, *args, **options):
|
|
name = options['name']
|
|
code = options['code']
|
|
force = options['force']
|
|
dry_run = options['dry_run']
|
|
|
|
self.stdout.write(f"\n{'='*60}")
|
|
self.stdout.write(f"Organization Assignment Script")
|
|
self.stdout.write(f"{'='*60}\n")
|
|
|
|
with transaction.atomic():
|
|
# Get or create default organization
|
|
org, created = Organization.objects.get_or_create(
|
|
code=code,
|
|
defaults={
|
|
'name': name,
|
|
'name_ar': name, # Use same name for Arabic
|
|
'status': 'active'
|
|
}
|
|
)
|
|
|
|
if created:
|
|
self.stdout.write(
|
|
self.style.SUCCESS(f"✓ Created organization: {org.name} ({org.code})")
|
|
)
|
|
else:
|
|
self.stdout.write(
|
|
self.style.SUCCESS(f"✓ Found existing organization: {org.name} ({org.code})")
|
|
)
|
|
|
|
# Find hospitals without organization
|
|
if force:
|
|
hospitals_to_assign = Hospital.objects.all()
|
|
self.stdout.write(
|
|
self.style.WARNING(f"\nForce mode: Will assign ALL hospitals")
|
|
)
|
|
else:
|
|
hospitals_to_assign = Hospital.objects.filter(organization__isnull=True)
|
|
count = hospitals_to_assign.count()
|
|
self.stdout.write(
|
|
self.style.SUCCESS(f"\nFound {count} hospitals without organization")
|
|
)
|
|
|
|
if not hospitals_to_assign.exists():
|
|
self.stdout.write(
|
|
self.style.SUCCESS("\n✓ All hospitals already have organizations assigned")
|
|
)
|
|
return
|
|
|
|
# Display hospitals to be assigned
|
|
self.stdout.write("\nHospitals to assign:")
|
|
for i, hospital in enumerate(hospitals_to_assign, 1):
|
|
org_name = hospital.organization.name if hospital.organization else "None"
|
|
self.stdout.write(
|
|
f" {i}. {hospital.name} (Code: {hospital.code}) - Current: {org_name}"
|
|
)
|
|
|
|
if dry_run:
|
|
self.stdout.write("\n" + "="*60)
|
|
self.stdout.write(
|
|
self.style.WARNING("DRY RUN: No changes were made")
|
|
)
|
|
self.stdout.write("="*60 + "\n")
|
|
return
|
|
|
|
# Confirm assignment
|
|
if not force:
|
|
confirm = input(f"\nAssign {hospitals_to_assign.count()} hospital(s) to '{org.name}'? (yes/no): ")
|
|
if confirm.lower() not in ['yes', 'y']:
|
|
self.stdout.write(self.style.ERROR("\n✓ Operation cancelled"))
|
|
return
|
|
|
|
# Assign hospitals to organization
|
|
count = hospitals_to_assign.update(organization=org)
|
|
self.stdout.write(
|
|
self.style.SUCCESS(f"\n✓ Successfully assigned {count} hospital(s) to '{org.name}'")
|
|
)
|
|
|
|
# Summary
|
|
self.stdout.write("\n" + "="*60)
|
|
self.stdout.write("Summary:")
|
|
self.stdout.write(f" Organization: {org.name} ({org.code})")
|
|
self.stdout.write(f" Hospitals assigned: {count}")
|
|
self.stdout.write(f" Total hospitals in organization: {org.hospitals.count()}")
|
|
self.stdout.write("="*60 + "\n")
|
|
|
|
if dry_run:
|
|
self.stdout.write(self.style.WARNING("\nDry run completed - no changes applied\n"))
|
|
else:
|
|
self.stdout.write(self.style.SUCCESS("\nOrganization assignment completed successfully!\n"))
|