You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
4.7 KiB
143 lines
4.7 KiB
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(
|
|
'<span class="badge badge-{}">{}</span>',
|
|
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(
|
|
'<span class="badge badge-{}">{}</span>',
|
|
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(
|
|
'<span style="color: var(--bs-{});">{}</span>',
|
|
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)
|