#!/usr/bin/env python3 """ Script to update all templates to use language-aware patient names and LTR phone numbers. """ import os import re from pathlib import Path def update_template_file(filepath): """Update a single template file with the new template tags.""" with open(filepath, 'r', encoding='utf-8') as f: content = f.read() original_content = content changes_made = [] # Check if file already loads patient_tags has_patient_tags = '{% load patient_tags %}' in content or "{% load patient_tags %}" in content # Check if file needs patient_tags (has patient references) needs_patient_tags = ( 'patient.full_name_en' in content or 'patient.first_name_en' in content or 'patient.last_name_en' in content or 'patient.first_name' in content or 'patient.last_name' in content or 'patient.phone' in content or 'patient.phone_number' in content ) if not needs_patient_tags: return False, [] # Add {% load patient_tags %} after {% load i18n %} if not present if not has_patient_tags: # Find {% load i18n ... %} and add patient_tags to it load_i18n_pattern = r'({% load i18n[^%]*%})' match = re.search(load_i18n_pattern, content) if match: # Add patient_tags to existing load statement old_load = match.group(1) new_load = old_load.replace('%}', ' patient_tags %}') content = content.replace(old_load, new_load, 1) changes_made.append("Added patient_tags to load statement") else: # Add new load statement at the beginning if content.startswith('{% extends'): # Add after extends lines = content.split('\n') for i, line in enumerate(lines): if '{% extends' in line: lines.insert(i + 1, '{% load patient_tags %}') break content = '\n'.join(lines) changes_made.append("Added {% load patient_tags %} after extends") # Replace patient.full_name_en with {% patient_name patient %} pattern1 = r'\{\{\s*patient\.full_name_en\s*\}\}' if re.search(pattern1, content): content = re.sub(pattern1, '{% patient_name patient %}', content) changes_made.append("Replaced patient.full_name_en") # Replace variations like appointment.patient.full_name_en, encounter.patient.full_name_en, etc. pattern2 = r'\{\{\s*(\w+)\.patient\.full_name_en\s*\}\}' matches = re.findall(pattern2, content) if matches: content = re.sub(pattern2, r'{% patient_name \1.patient %}', content) changes_made.append(f"Replaced {len(set(matches))} variations of *.patient.full_name_en") # Replace {{ patient.first_name_en }} {{ patient.last_name_en }} with {% patient_name patient %} pattern3 = r'\{\{\s*patient\.first_name_en\s*\}\}\s*\{\{\s*patient\.last_name_en\s*\}\}' if re.search(pattern3, content): content = re.sub(pattern3, '{% patient_name patient %}', content) changes_made.append("Replaced patient.first_name_en patient.last_name_en combination") # Replace variations like {{ appointment.patient.first_name_en }} {{ appointment.patient.last_name_en }} pattern4 = r'\{\{\s*(\w+)\.patient\.first_name_en\s*\}\}\s*\{\{\s*\1\.patient\.last_name_en\s*\}\}' matches = re.findall(pattern4, content) if matches: content = re.sub(pattern4, r'{% patient_name \1.patient %}', content) changes_made.append(f"Replaced {len(set(matches))} variations of first_name_en last_name_en") # Replace {{ patient.first_name }} {{ patient.last_name }} (without _en) pattern5 = r'\{\{\s*patient\.first_name\s*\}\}\s*\{\{\s*patient\.last_name\s*\}\}' if re.search(pattern5, content): content = re.sub(pattern5, '{% patient_name patient %}', content) changes_made.append("Replaced patient.first_name patient.last_name combination") # Replace variations like {{ encounter.patient.first_name }} {{ encounter.patient.last_name }} pattern6 = r'\{\{\s*(\w+)\.patient\.first_name\s*\}\}\s*\{\{\s*\1\.patient\.last_name\s*\}\}' matches = re.findall(pattern6, content) if matches: content = re.sub(pattern6, r'{% patient_name \1.patient %}', content) changes_made.append(f"Replaced {len(set(matches))} variations of first_name last_name") # Replace phone numbers with LTR filter # Pattern: {{ patient.phone }} pattern7 = r'\{\{\s*patient\.phone\s*\}\}' if re.search(pattern7, content): content = re.sub(pattern7, '{{ patient.phone|ltr }}', content) changes_made.append("Added LTR filter to patient.phone") # Pattern: {{ patient.phone_number }} pattern8 = r'\{\{\s*patient\.phone_number\s*\}\}' if re.search(pattern8, content): content = re.sub(pattern8, '{{ patient.phone_number|ltr }}', content) changes_made.append("Added LTR filter to patient.phone_number") # Pattern: {{ *.patient.phone }} pattern9 = r'\{\{\s*(\w+)\.patient\.phone\s*\}\}' matches = re.findall(pattern9, content) if matches: content = re.sub(pattern9, r'{{ \1.patient.phone|ltr }}', content) changes_made.append(f"Added LTR filter to {len(set(matches))} variations of *.patient.phone") # Pattern: {{ *.patient.phone_number }} pattern10 = r'\{\{\s*(\w+)\.patient\.phone_number\s*\}\}' matches = re.findall(pattern10, content) if matches: content = re.sub(pattern10, r'{{ \1.patient.phone_number|ltr }}', content) changes_made.append(f"Added LTR filter to {len(set(matches))} variations of *.patient.phone_number") # Only write if changes were made if content != original_content: with open(filepath, 'w', encoding='utf-8') as f: f.write(content) return True, changes_made return False, [] def main(): """Main function to process all template files.""" templates_dir = Path('templates') if not templates_dir.exists(): print("Error: templates directory not found") return # Find all HTML files html_files = list(templates_dir.rglob('*.html')) print(f"Found {len(html_files)} HTML template files") print("=" * 80) updated_count = 0 skipped_count = 0 for filepath in html_files: updated, changes = update_template_file(filepath) if updated: updated_count += 1 print(f"\n✓ Updated: {filepath}") for change in changes: print(f" - {change}") else: skipped_count += 1 print("\n" + "=" * 80) print(f"Summary:") print(f" Updated: {updated_count} files") print(f" Skipped: {skipped_count} files") print(f" Total: {len(html_files)} files") if __name__ == '__main__': main()