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)