HH/apps/appreciation/admin.py
2026-01-01 16:44:42 +03:00

236 lines
5.5 KiB
Python

"""
Appreciation admin - Django admin interface for appreciation models
"""
from django.contrib import admin
from apps.appreciation.models import (
Appreciation,
AppreciationBadge,
AppreciationCategory,
AppreciationStats,
UserBadge,
)
@admin.register(AppreciationCategory)
class AppreciationCategoryAdmin(admin.ModelAdmin):
"""Admin interface for AppreciationCategory"""
list_display = [
'name_en',
'code',
'hospital',
'order',
'is_active',
]
list_filter = ['hospital', 'is_active']
search_fields = ['name_en', 'name_ar', 'code']
list_editable = ['order', 'is_active']
ordering = ['hospital', 'order', 'name_en']
@admin.register(Appreciation)
class AppreciationAdmin(admin.ModelAdmin):
"""Admin interface for Appreciation"""
list_display = [
'recipient_name_display',
'sender_display',
'category',
'status',
'visibility',
'hospital',
'sent_at',
'created_at',
]
list_filter = [
'status',
'visibility',
'hospital',
'category',
'is_anonymous',
'sent_at',
]
search_fields = [
'message_en',
'message_ar',
'sender__first_name',
'sender__last_name',
'sender__email',
]
date_hierarchy = 'sent_at'
readonly_fields = [
'created_at',
'updated_at',
'sent_at',
'acknowledged_at',
'notification_sent_at',
]
fieldsets = (
('Basic Information', {
'fields': (
'sender',
'hospital',
'department',
'category',
)
}),
('Recipient', {
'fields': (
'recipient_content_type',
'recipient_object_id',
)
}),
('Content', {
'fields': (
'message_en',
'message_ar',
)
}),
('Settings', {
'fields': (
'visibility',
'is_anonymous',
)
}),
('Status', {
'fields': (
'status',
'sent_at',
'acknowledged_at',
'notification_sent',
'notification_sent_at',
)
}),
('Metadata', {
'fields': (
'metadata',
)
}),
('Timestamps', {
'fields': (
'created_at',
'updated_at',
),
'classes': ('collapse',)
}),
)
def recipient_name_display(self, obj):
"""Display recipient name in list"""
try:
return str(obj.recipient)
except:
return "Unknown"
recipient_name_display.short_description = 'Recipient'
def sender_display(self, obj):
"""Display sender name in list"""
if obj.is_anonymous:
return "Anonymous"
if obj.sender:
return obj.sender.get_full_name()
return "System"
sender_display.short_description = 'Sender'
@admin.register(AppreciationBadge)
class AppreciationBadgeAdmin(admin.ModelAdmin):
"""Admin interface for AppreciationBadge"""
list_display = [
'name_en',
'code',
'criteria_type',
'criteria_value',
'hospital',
'order',
'is_active',
]
list_filter = [
'hospital',
'criteria_type',
'is_active',
]
search_fields = [
'name_en',
'name_ar',
'code',
'description_en',
]
list_editable = ['order', 'is_active']
ordering = ['hospital', 'order', 'name_en']
@admin.register(UserBadge)
class UserBadgeAdmin(admin.ModelAdmin):
"""Admin interface for UserBadge"""
list_display = [
'recipient_name_display',
'badge',
'earned_at',
'appreciation_count',
]
list_filter = [
'badge',
'earned_at',
]
search_fields = [
'badge__name_en',
'badge__name_ar',
]
date_hierarchy = 'earned_at'
readonly_fields = ['earned_at', 'created_at', 'updated_at']
def recipient_name_display(self, obj):
"""Display recipient name in list"""
try:
return str(obj.recipient)
except:
return "Unknown"
recipient_name_display.short_description = 'Recipient'
@admin.register(AppreciationStats)
class AppreciationStatsAdmin(admin.ModelAdmin):
"""Admin interface for AppreciationStats"""
list_display = [
'recipient_name_display',
'period_display',
'hospital',
'department',
'received_count',
'sent_count',
'acknowledged_count',
'hospital_rank',
'department_rank',
]
list_filter = [
'hospital',
'department',
'year',
'month',
]
search_fields = []
date_hierarchy = None
readonly_fields = [
'created_at',
'updated_at',
]
def recipient_name_display(self, obj):
"""Display recipient name in list"""
try:
return str(obj.recipient)
except:
return "Unknown"
recipient_name_display.short_description = 'Recipient'
def period_display(self, obj):
"""Display period in list"""
return f"{obj.year}-{obj.month:02d}"
period_display.short_description = 'Period'