HH/apps/organizations/admin.py
2026-04-09 13:46:34 +03:00

232 lines
7.9 KiB
Python

"""
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 '<span style="color: green;">✓ Yes</span>'
return '<span style="color: red;">✗ No</span>'
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)