HH/apps/organizations/admin.py
2026-01-24 15:27:30 +03:00

184 lines
7.5 KiB
Python

"""
Organizations admin
"""
from django.contrib import admin
from .models import Department, Hospital, Organization, Patient, Staff
@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', 'license_number']
ordering = ['name']
fieldsets = (
(None, {'fields': ('name', 'name_ar', 'code')}),
('Contact Information', {'fields': ('address', 'city', 'phone', 'email', 'website')}),
('Details', {'fields': ('license_number', 'status', 'logo')}),
('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', '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', 'national_id', 'phone', 'primary_hospital', 'status']
list_filter = ['status', 'gender', 'primary_hospital', 'city']
search_fields = ['mrn', 'national_id', '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_queryset(self, request):
qs = super().get_queryset(request)
return qs.select_related('primary_hospital')