Marwan Alwali f31362093e update
2025-11-02 16:38:29 +03:00

200 lines
6.6 KiB
Python

"""
Django admin configuration for notifications app.
"""
from django.contrib import admin
from django.utils.translation import gettext_lazy as _
from .models import (
MessageTemplate,
Message,
NotificationPreference,
MessageLog,
Notification,
)
@admin.register(MessageTemplate)
class MessageTemplateAdmin(admin.ModelAdmin):
"""Admin interface for MessageTemplate model."""
list_display = ['code', 'name', 'channel', 'is_active', 'tenant']
list_filter = ['channel', 'is_active', 'tenant']
search_fields = ['code', 'name', 'body_en', 'body_ar']
readonly_fields = ['id', 'created_at', 'updated_at']
fieldsets = (
(None, {
'fields': ('code', 'name', 'channel', 'tenant', 'is_active')
}),
(_('Email Subject'), {
'fields': ('subject',),
'classes': ('collapse',)
}),
(_('Content (English)'), {
'fields': ('body_en',)
}),
(_('Content (Arabic)'), {
'fields': ('body_ar',),
'classes': ('collapse',)
}),
(_('Variables'), {
'fields': ('variables',),
'classes': ('collapse',)
}),
(_('Metadata'), {
'fields': ('id', 'created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
"""Admin interface for Message model."""
list_display = ['recipient', 'channel', 'status', 'sent_at', 'delivered_at', 'tenant']
list_filter = ['channel', 'status', 'tenant', 'sent_at', 'delivered_at']
search_fields = ['recipient', 'subject', 'body', 'provider_message_id']
readonly_fields = ['id', 'is_successful', 'can_retry', 'created_at', 'updated_at']
date_hierarchy = 'created_at'
fieldsets = (
(None, {
'fields': ('template', 'channel', 'tenant', 'status')
}),
(_('Recipient & Content'), {
'fields': ('recipient', 'subject', 'body')
}),
(_('Variables'), {
'fields': ('variables_used',),
'classes': ('collapse',)
}),
(_('Delivery Status'), {
'fields': ('sent_at', 'delivered_at', 'is_successful', 'can_retry', 'retry_count')
}),
(_('Provider Information'), {
'fields': ('provider_message_id', 'provider_response'),
'classes': ('collapse',)
}),
(_('Error Information'), {
'fields': ('error_message',),
'classes': ('collapse',)
}),
(_('Metadata'), {
'fields': ('id', 'created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
@admin.register(NotificationPreference)
class NotificationPreferenceAdmin(admin.ModelAdmin):
"""Admin interface for NotificationPreference model."""
list_display = ['patient', 'preferred_channel', 'preferred_language', 'sms_enabled',
'whatsapp_enabled', 'email_enabled']
list_filter = ['preferred_channel', 'preferred_language', 'sms_enabled', 'whatsapp_enabled',
'email_enabled']
search_fields = ['patient__mrn', 'patient__first_name_en', 'patient__last_name_en']
readonly_fields = ['id', 'created_at', 'updated_at']
fieldsets = (
(None, {
'fields': ('patient', 'preferred_channel', 'preferred_language')
}),
(_('Channel Preferences'), {
'fields': ('sms_enabled', 'whatsapp_enabled', 'email_enabled')
}),
(_('Notification Type Preferences'), {
'fields': ('appointment_reminders', 'appointment_confirmations', 'results_notifications',
'billing_notifications', 'marketing_communications')
}),
(_('Metadata'), {
'fields': ('id', 'created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
@admin.register(MessageLog)
class MessageLogAdmin(admin.ModelAdmin):
"""Admin interface for MessageLog model."""
list_display = ['message', 'event_type', 'created_at']
list_filter = ['event_type', 'created_at']
search_fields = ['message__recipient', 'message__provider_message_id']
readonly_fields = ['id', 'created_at', 'updated_at']
date_hierarchy = 'created_at'
fieldsets = (
(None, {
'fields': ('message', 'event_type')
}),
(_('Details'), {
'fields': ('details',),
'classes': ('collapse',)
}),
(_('Metadata'), {
'fields': ('id', 'created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
def has_add_permission(self, request):
"""Message logs should not be manually created."""
return False
def has_change_permission(self, request, obj=None):
"""Message logs should not be modified."""
return False
@admin.register(Notification)
class NotificationAdmin(admin.ModelAdmin):
"""Admin interface for Notification model."""
list_display = ['title', 'user', 'notification_type', 'is_read', 'created_at']
list_filter = ['notification_type', 'is_read', 'created_at', 'related_object_type']
search_fields = ['title', 'message', 'user__username', 'user__email']
readonly_fields = ['id', 'created_at', 'updated_at']
date_hierarchy = 'created_at'
fieldsets = (
(None, {
'fields': ('user', 'title', 'message', 'notification_type')
}),
(_('Read Status'), {
'fields': ('is_read', 'read_at')
}),
(_('Related Object'), {
'fields': ('related_object_type', 'related_object_id', 'action_url'),
'classes': ('collapse',)
}),
(_('Metadata'), {
'fields': ('id', 'created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
actions = ['mark_as_read', 'mark_as_unread']
def mark_as_read(self, request, queryset):
"""Mark selected notifications as read."""
from django.utils import timezone
updated = queryset.filter(is_read=False).update(
is_read=True,
read_at=timezone.now()
)
self.message_user(request, f'{updated} notification(s) marked as read.')
mark_as_read.short_description = _('Mark selected notifications as read')
def mark_as_unread(self, request, queryset):
"""Mark selected notifications as unread."""
updated = queryset.filter(is_read=True).update(
is_read=False,
read_at=None
)
self.message_user(request, f'{updated} notification(s) marked as unread.')
mark_as_unread.short_description = _('Mark selected notifications as unread')