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

163 lines
5.1 KiB
Python
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
Automatically fix field name references in views to match the new core.Patient model.
This script updates old field names to FHIR-aligned names.
"""
import os
import re
from pathlib import Path
# Field name mappings
FIELD_MAPPINGS = {
# Patient field name changes
r'\.first_name\b': '.given_name',
r'\.last_name\b': '.family_name',
r'\.date_of_birth\b': '.birth_date',
r'\.gender\b': '.administrative_gender',
# In filter/query contexts
r'first_name__': 'given_name__',
r'last_name__': 'family_name__',
r'date_of_birth__': 'birth_date__',
r'gender__': 'administrative_gender__',
# In field lists
r"'first_name'": "'given_name'",
r'"first_name"': '"given_name"',
r"'last_name'": "'family_name'",
r'"last_name"': '"family_name"',
r"'date_of_birth'": "'birth_date'",
r'"date_of_birth"': '"birth_date"',
r"'gender'": "'administrative_gender'",
r'"gender"': '"administrative_gender"',
}
# Model name changes
MODEL_MAPPINGS = {
r'from core\.models import AuditLogEntry': 'from core.models import AuditEvent',
r'AuditLogEntry\.objects': 'AuditEvent.objects',
r'AuditLogEntry\(': 'AuditEvent(',
# Import changes for PatientProfile
r'from patients\.models import PatientProfile': 'from core.models import Patient',
}
def fix_file(file_path):
"""Fix field references in a single file."""
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
original_content = content
changes_made = []
# Apply field mappings
for old_pattern, new_value in FIELD_MAPPINGS.items():
if re.search(old_pattern, content):
content = re.sub(old_pattern, new_value, content)
changes_made.append(f"{old_pattern}{new_value}")
# Apply model mappings
for old_pattern, new_value in MODEL_MAPPINGS.items():
if re.search(old_pattern, content):
content = re.sub(old_pattern, new_value, content)
changes_made.append(f"{old_pattern}{new_value}")
# Only write if changes were made
if content != original_content:
with open(file_path, 'w', encoding='utf-8') as f:
f.write(content)
return True, changes_made
return False, []
except Exception as e:
print(f"Error processing {file_path}: {e}")
return False, []
def fix_app(app_path, app_name):
"""Fix all Python files in an app."""
files_fixed = 0
total_changes = 0
print(f"\n📁 Processing {app_name}...")
# Process views.py
views_file = app_path / 'views.py'
if views_file.exists():
fixed, changes = fix_file(views_file)
if fixed:
files_fixed += 1
total_changes += len(changes)
print(f" ✓ Fixed {len(changes)} references in views.py")
# Process models.py
models_file = app_path / 'models.py'
if models_file.exists():
fixed, changes = fix_file(models_file)
if fixed:
files_fixed += 1
total_changes += len(changes)
print(f" ✓ Fixed {len(changes)} references in models.py")
# Process forms.py
forms_file = app_path / 'forms.py'
if forms_file.exists():
fixed, changes = fix_file(forms_file)
if fixed:
files_fixed += 1
total_changes += len(changes)
print(f" ✓ Fixed {len(changes)} references in forms.py")
# Process admin.py
admin_file = app_path / 'admin.py'
if admin_file.exists():
fixed, changes = fix_file(admin_file)
if fixed:
files_fixed += 1
total_changes += len(changes)
print(f" ✓ Fixed {len(changes)} references in admin.py")
if files_fixed == 0:
print(f" No changes needed")
return files_fixed, total_changes
def main():
"""Main function to fix all apps."""
project_root = Path(__file__).parent.parent
apps = [
'core', 'accounts', 'patients', 'emr', 'appointments',
'inpatients', 'pharmacy', 'laboratory', 'radiology',
'operating_theatre', 'billing', 'inventory', 'hr',
'analytics', 'communications', 'integration', 'quality',
'facility_management', 'blood_bank', 'insurance_approvals'
]
print("=" * 80)
print("Fixing Field References - Phase 4 Model Changes")
print("=" * 80)
total_files = 0
total_changes = 0
for app_name in apps:
app_path = project_root / app_name
if app_path.exists():
files, changes = fix_app(app_path, app_name)
total_files += files
total_changes += changes
print("\n" + "=" * 80)
print("Summary")
print("=" * 80)
print(f"✓ Fixed {total_files} files")
print(f"✓ Made {total_changes} changes")
print("\nAll field references have been updated to match the new core.Patient model!")
print("=" * 80)
if __name__ == '__main__':
main()