""" Organizations admin """ from django.contrib import admin from .models import Department, Hospital, Organization, Patient, Staff, Location, MainSection, SubSection @admin.register(Organization) class OrganizationAdmin(admin.ModelAdmin): """Organization admin""" list_display = ["name", "code", "city", "status", "created_at"] list_filter = ["status", "city"] search_fields = ["name", "name_ar", "code"] ordering = ["name"] fieldsets = ( (None, {"fields": ("name", "name_ar", "code")}), ("Contact Information", {"fields": ("address", "city", "phone", "email")}), ("Details", {"fields": ("status", "preferred_language")}), ("Metadata", {"fields": ("created_at", "updated_at")}), ) readonly_fields = ["created_at", "updated_at"] @admin.register(Hospital) class HospitalAdmin(admin.ModelAdmin): """Hospital admin""" list_display = ["name", "code", "city", "ceo", "status", "capacity", "created_at"] list_filter = ["status", "city"] search_fields = ["name", "name_ar", "code", "license_number"] ordering = ["name"] fieldsets = ( (None, {"fields": ("organization", "name", "name_ar", "code")}), ("Contact Information", {"fields": ("address", "city", "phone", "email")}), ("Executive Leadership", {"fields": ("ceo", "medical_director", "coo", "cfo")}), ("Details", {"fields": ("license_number", "capacity", "status")}), ("Metadata", {"fields": ("created_at", "updated_at")}), ) autocomplete_fields = ["organization", "ceo", "medical_director", "coo", "cfo"] readonly_fields = ["created_at", "updated_at"] @admin.register(Department) class DepartmentAdmin(admin.ModelAdmin): """Department admin""" list_display = ["name", "hospital", "code", "manager", "status", "created_at"] list_filter = ["status", "hospital"] search_fields = ["name", "name_ar", "code"] ordering = ["hospital", "name"] autocomplete_fields = ["hospital", "parent", "manager"] fieldsets = ( (None, {"fields": ("hospital", "name", "name_ar", "code")}), ("Hierarchy", {"fields": ("parent", "manager")}), ("Contact", {"fields": ("phone", "email", "location")}), ("Status", {"fields": ("status",)}), ("Metadata", {"fields": ("created_at", "updated_at")}), ) readonly_fields = ["created_at", "updated_at"] def get_queryset(self, request): qs = super().get_queryset(request) return qs.select_related("hospital", "manager", "parent") @admin.register(Staff) class StaffAdmin(admin.ModelAdmin): """Staff admin""" list_display = [ "__str__", "staff_type", "job_title", "employee_id", "hospital", "department", "email", "phone", "report_to", "country", "has_user_account", "status", ] list_filter = ["status", "hospital", "staff_type", "specialization", "gender", "country"] search_fields = [ "name", "first_name", "last_name", "first_name_ar", "last_name_ar", "employee_id", "license_number", "job_title", "phone", "department_name", "section", ] ordering = ["last_name", "first_name"] autocomplete_fields = ["hospital", "department", "user", "report_to"] actions = ["create_user_accounts", "send_credentials_emails"] fieldsets = ( (None, {"fields": ("name", "first_name", "last_name", "first_name_ar", "last_name_ar")}), ("Role", {"fields": ("staff_type", "job_title")}), ("Professional", {"fields": ("license_number", "specialization", "employee_id", "email", "phone")}), ( "Organization", {"fields": ("hospital", "department", "department_name", "section", "subsection", "location")}, ), ("Hierarchy", {"fields": ("report_to",)}), ("Personal Information", {"fields": ("country", "gender")}), ("Account", {"fields": ("user",)}), ("Status", {"fields": ("status",)}), ("Metadata", {"fields": ("created_at", "updated_at")}), ) readonly_fields = ["created_at", "updated_at"] def get_queryset(self, request): qs = super().get_queryset(request) return qs.select_related("hospital", "department", "user") def has_user_account(self, obj): """Display user account status""" if obj.user: return '✓ Yes' return '✗ No' has_user_account.short_description = "User Account" has_user_account.allow_tags = True def create_user_accounts(self, request, queryset): """Admin action to create user accounts for selected staff""" from .services import StaffService created = 0 failed = 0 for staff in queryset: if not staff.user and staff.email: try: role = StaffService.get_staff_type_role(staff.staff_type) user, was_created, password = StaffService.create_user_for_staff(staff, role=role, request=request) if was_created and password: StaffService.send_credentials_email(staff, password, request) created += 1 except Exception as e: failed += 1 self.message_user( request, f"Created {created} user accounts. Failed: {failed}", level="success" if failed == 0 else "warning" ) create_user_accounts.short_description = "Create user accounts for selected staff" def send_credentials_emails(self, request, queryset): """Admin action to send credential emails to selected staff""" from .services import StaffService sent = 0 failed = 0 for staff in queryset: if staff.user and staff.email: try: password = StaffService.generate_password() staff.user.set_password(password) staff.user.save() StaffService.send_credentials_email(staff, password, request) sent += 1 except Exception as e: failed += 1 self.message_user( request, f"Sent {sent} credential emails. Failed: {failed}", level="success" if failed == 0 else "warning" ) send_credentials_emails.short_description = "Send credential emails to selected staff" @admin.register(Patient) class PatientAdmin(admin.ModelAdmin): """Patient admin""" list_display = ["get_full_name", "mrn", "get_masked_national_id", "phone", "primary_hospital", "status"] list_filter = ["status", "gender", "primary_hospital", "city"] search_fields = [ "mrn", "national_id_hash", "first_name", "last_name", "first_name_ar", "last_name_ar", "phone", "email", ] ordering = ["last_name", "first_name"] autocomplete_fields = ["primary_hospital"] fieldsets = ( (None, {"fields": ("mrn", "national_id")}), ("Personal Information", {"fields": ("first_name", "last_name", "first_name_ar", "last_name_ar")}), ("Demographics", {"fields": ("date_of_birth", "gender")}), ("Contact", {"fields": ("phone", "email", "address", "city")}), ("Hospital", {"fields": ("primary_hospital",)}), ("Status", {"fields": ("status",)}), ("Metadata", {"fields": ("created_at", "updated_at")}), ) readonly_fields = ["created_at", "updated_at"] def get_masked_national_id(self, obj): return obj.get_masked_national_id() get_masked_national_id.short_description = "National ID" def get_queryset(self, request): qs = super().get_queryset(request) return qs.select_related("primary_hospital") admin.site.register(Location) admin.site.register(MainSection) admin.site.register(SubSection)