HH/apps/projects/admin.py
2026-07-11 19:24:28 +03:00

119 lines
3.7 KiB
Python

"""
Projects admin
"""
from django.contrib import admin
from .models import QIProject, QIProjectTask, QIProjectTaskAttachment
class QIProjectTaskInline(admin.TabularInline):
"""Inline admin for QI project tasks"""
model = QIProjectTask
extra = 1
fields = ['order', 'title', 'assigned_to', 'status', 'due_date']
ordering = ['order']
@admin.register(QIProject)
class QIProjectAdmin(admin.ModelAdmin):
"""QI Project admin"""
list_display = [
'name', 'hospital', 'get_departments', 'project_lead',
'status', 'start_date', 'target_completion_date'
]
list_filter = ['status', 'hospital', 'departments', 'start_date']
search_fields = ['name', 'name_ar', 'description']
ordering = ['-created_at']
inlines = [QIProjectTaskInline]
filter_horizontal = ['team_members', 'related_actions', 'departments']
fieldsets = (
(None, {
'fields': ('name', 'name_ar', 'description')
}),
('Organization', {
'fields': ('hospital', 'departments')
}),
('Team', {
'fields': ('project_lead', 'team_members')
}),
('Status & Dates', {
'fields': ('status', 'start_date', 'target_completion_date', 'actual_completion_date')
}),
('Related Actions', {
'fields': ('related_actions',),
'classes': ('collapse',)
}),
('Outcomes', {
'fields': ('outcome_description', 'success_metrics'),
'classes': ('collapse',)
}),
('Metadata', {
'fields': ('metadata', 'created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
readonly_fields = ['created_at', 'updated_at']
def get_queryset(self, request):
qs = super().get_queryset(request)
return qs.select_related('hospital', 'project_lead').prefetch_related('departments')
@admin.display(description='Departments')
def get_departments(self, obj):
depts = list(obj.departments.all())
if not depts:
return ""
return ", ".join(d.name for d in depts)
@admin.register(QIProjectTask)
class QIProjectTaskAdmin(admin.ModelAdmin):
"""QI Project task admin"""
list_display = [
'project', 'title', 'assigned_to', 'status',
'due_date', 'completed_date'
]
list_filter = ['status', 'project', 'due_date']
search_fields = ['title', 'description', 'project__name']
ordering = ['project', 'order']
fieldsets = (
(None, {
'fields': ('project', 'title', 'description', 'order')
}),
('Assignment', {
'fields': ('assigned_to',)
}),
('Status & Dates', {
'fields': ('status', 'due_date', 'completed_date')
}),
('Reminders', {
'fields': ('reminder_sent_at', 'second_reminder_sent_at')
}),
('Metadata', {
'fields': ('created_at', 'updated_at')
}),
)
readonly_fields = ['created_at', 'updated_at', 'reminder_sent_at', 'second_reminder_sent_at']
def get_queryset(self, request):
qs = super().get_queryset(request)
return qs.select_related('project', 'assigned_to')
@admin.register(QIProjectTaskAttachment)
class QIProjectTaskAttachmentAdmin(admin.ModelAdmin):
"""QI Project task attachment admin"""
list_display = ['task', 'filename', 'file_size', 'uploaded_by', 'created_at']
list_filter = ['created_at']
search_fields = ['filename', 'description', 'task__title']
readonly_fields = ['filename', 'file_type', 'file_size', 'created_at', 'updated_at']
ordering = ['-created_at']
def get_queryset(self, request):
qs = super().get_queryset(request)
return qs.select_related('task', 'uploaded_by')