from django.contrib import admin
from django.utils.translation import gettext_lazy as _
from unfold.admin import ModelAdmin
from unfold.decorators import display, action
from django.utils.html import format_html
from django.urls import reverse
from apps.bookmark.models import Bookmark
from apps.bookmark.models import Rate
from utils.admin import project_admin_site , dovoodi_admin_site
class BookmarkAdmin(ModelAdmin):
list_display = ('user', 'display_service', 'content_id', 'status', 'created_at')
list_filter = ('service', 'status', 'created_at')
search_fields = ('user__username', 'user__email', 'content_id')
readonly_fields = ('created_at', 'updated_at')
list_per_page = 20
date_hierarchy = 'created_at'
list_filter_submit = True
warn_unsaved_form = True
change_form_show_cancel_button = True
@display(description=_('Service'))
def display_service(self, obj):
service_colors = {
'library': 'primary',
'podcast': 'success',
'hadith': 'warning',
'video': 'danger'
}
color = service_colors.get(obj.service, 'secondary')
return format_html(
'{}',
color,
obj.get_service_display()
)
fieldsets = (
(None, {
'fields': ('user', 'service', 'content_id')
}),
(_('Status'), {
'fields': ('status',)
}),
(_('Timestamps'), {
'fields': ('created_at', 'updated_at')
}),
)
@action(description=_("View Content"))
def view_content(self, request, obj):
"""
Action to view the related content based on service type
"""
service = obj.service
content_id = obj.content_id
if service == 'library':
url = reverse('admin:library_book_change', args=[content_id])
elif service == 'podcast':
url = reverse('admin:podcast_podcast_change', args=[content_id])
elif service == 'hadith':
url = reverse('admin:hadith_hadith_change', args=[content_id])
elif service == 'video':
url = reverse('admin:video_video_change', args=[content_id])
else:
return None
return url
class RateAdmin(ModelAdmin):
list_display = ('user', 'display_service', 'content_id', 'display_rate', 'status', 'created_at')
list_filter = ('service', 'rate', 'status', 'created_at')
search_fields = ('user__username', 'user__email', 'content_id')
readonly_fields = ('created_at', 'updated_at')
list_per_page = 20
date_hierarchy = 'created_at'
list_filter_submit = True
warn_unsaved_form = True
change_form_show_cancel_button = True
@display(description=_('Service'))
def display_service(self, obj):
service_colors = {
'library': 'primary',
'podcast': 'success',
'hadith': 'warning',
'video': 'danger'
}
color = service_colors.get(obj.service, 'secondary')
return format_html(
'{}',
color,
obj.get_service_display()
)
@display(description=_('Rate'))
def display_rate(self, obj):
# Display stars based on rate value
stars = '★' * obj.rate + '☆' * (5 - obj.rate)
color = 'warning' # Yellow color for stars
return format_html(
'{}',
color,
stars
)
fieldsets = (
(None, {
'fields': ('user', 'service', 'content_id', 'rate')
}),
(_('Status'), {
'fields': ('status',)
}),
(_('Timestamps'), {
'fields': ('created_at', 'updated_at')
}),
)
@action(description=_("View Content"))
def view_content(self, request, obj):
"""
Action to view the related content based on service type
"""
service = obj.service
content_id = obj.content_id
if service == 'library':
url = reverse('admin:library_book_change', args=[content_id])
elif service == 'podcast':
url = reverse('admin:podcast_podcast_change', args=[content_id])
elif service == 'hadith':
url = reverse('admin:hadith_hadith_change', args=[content_id])
elif service == 'video':
url = reverse('admin:video_video_change', args=[content_id])
else:
return None
return url
# Register with dovoodi admin site
dovoodi_admin_site.register(Bookmark, BookmarkAdmin)
dovoodi_admin_site.register(Rate, RateAdmin)