200 lines
6.6 KiB
Python
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')
|