@ -205,7 +205,6 @@ THUMBNAIL_ALIASES = {
LANGUAGES = [
LANGUAGES = [
( ' en ' , _ ( ' English ' ) ) ,
( ' en ' , _ ( ' English ' ) ) ,
( ' fa ' , _ ( ' Persian ' ) ) ,
( ' ru ' , _ ( ' Russia ' ) ) ,
( ' ru ' , _ ( ' Russia ' ) ) ,
]
]
LOCALE_PATHS = [
LOCALE_PATHS = [
@ -323,6 +322,22 @@ LOGIN_REDIRECT_URL = reverse_lazy("home")
######################################################################
######################################################################
from utils.admin import admin_url_generator , is_dovoodi_panel , is_main_panel
from utils.admin import admin_url_generator , is_dovoodi_panel , is_main_panel
# --- ENHANCED DYNAMIC BADGE FUNCTION ---
def get_pending_certificates_badge ( request ) :
try :
from apps.certificate.models import Certificate
qs = Certificate . objects . filter ( status = ' pending ' )
# If user is a professor (not staff/admin), only show their pending certificates
if request . user . is_authenticated and not request . user . is_staff and not getattr ( request . user , ' is_superuser ' , False ) :
qs = qs . filter ( course__professor = request . user )
count = qs . count ( )
return str ( count ) if count > 0 else None
except Exception as e :
print ( f " Badge Error: {e} " ) # Fails safely in terminal if DB isn't migrated yet
return None
UNFOLD = {
UNFOLD = {
# "SITE_TITLE": _("Imam Jawad Admin"),
# "SITE_TITLE": _("Imam Jawad Admin"),
# "SITE_HEADER": _("Imam Jawad Admin"),
# "SITE_HEADER": _("Imam Jawad Admin"),
@ -341,6 +356,7 @@ UNFOLD = {
# ],
# ],
" SITE_SYMBOL " : " settings " ,
" SITE_SYMBOL " : " settings " ,
" ALLOW_UNICODE_SLUGS " : True ,
" SHOW_HISTORY " : True ,
" SHOW_HISTORY " : True ,
" SHOW_LANGUAGES " : True ,
" SHOW_LANGUAGES " : True ,
" ENVIRONMENT " : " utils.environment_callback " ,
" ENVIRONMENT " : " utils.environment_callback " ,
@ -359,7 +375,7 @@ UNFOLD = {
# - FormulaAdminSite: پالت سبز برای امام جواد
# - FormulaAdminSite: پالت سبز برای امام جواد
# - DovoodiAdminSite: پالت آبی-تیره برای داوودی (مطابق فرانت)
# - DovoodiAdminSite: پالت آبی-تیره برای داوودی (مطابق فرانت)
" STYLES " : [
" STYLES " : [
# lambda request: static("css/styles.css") ,
lambda request : static ( " css/styles.css " ) ,
] ,
] ,
" SCRIPTS " : [
" SCRIPTS " : [
# lambda request: static("js/chart.min.js"),
# lambda request: static("js/chart.min.js"),
@ -470,19 +486,19 @@ UNFOLD = {
" title " : _ ( " Course Lessons " ) ,
" title " : _ ( " Course Lessons " ) ,
" icon " : " menu_book " ,
" icon " : " menu_book " ,
" link " : lambda request : admin_url_generator ( request , " course_courselesson_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " course_courselesson_changelist " ) ,
" active " : lambda request : request . path . startswith ( str ( lambda request : admin_url_generator ( request , " course_courselesson_changelist " ) ) ) ,
" active " : lambda request : request . path . startswith ( admin_url_generator ( request , " course_courselesson_changelist " ) ) ,
} ,
} ,
{
{
" title " : _ ( " Course Attachments " ) ,
" title " : _ ( " Course Attachments " ) ,
" icon " : " attach_file " ,
" icon " : " attach_file " ,
" link " : lambda request : admin_url_generator ( request , " course_courseattachment_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " course_courseattachment_changelist " ) ,
" active " : lambda request : request . path . startswith ( str ( lambda request : admin_url_generator ( request , " course_courseattachment_changelist " ) ) ) ,
" active " : lambda request : request . path . startswith ( admin_url_generator ( request , " course_courseattachment_changelist " ) ) ,
} ,
} ,
{
{
" title " : _ ( " Course Glossary " ) ,
" title " : _ ( " Course Glossary " ) ,
" icon " : " book " ,
" icon " : " book " ,
" link " : lambda request : admin_url_generator ( request , " course_courseglossary_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " course_courseglossary_changelist " ) ,
" active " : lambda request : request . path . startswith ( str ( lambda request : admin_url_generator ( request , " course_courseglossary_changelist " ) ) ) ,
" active " : lambda request : request . path . startswith ( admin_url_generator ( request , " course_courseglossary_changelist " ) ) ,
} ,
} ,
] ,
] ,
@ -496,22 +512,22 @@ UNFOLD = {
] ,
] ,
" items " : [
" items " : [
{
{
" title " : _ ( " Course Online s" ) ,
" title " : _ ( " Live Session s" ) ,
" icon " : " video_call " ,
" icon " : " video_call " ,
" link " : lambda request : admin_url_generator ( request , " course_courselivesession_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " course_courselivesession_changelist " ) ,
" active " : lambda request : request . path . startswith ( str ( lambda request : admin_url_generator ( request , " course_courselivesession_changelist " ) ) ) ,
" active " : lambda request : request . path . startswith ( admin_url_generator ( request , " course_courselivesession_changelist " ) ) ,
} ,
} ,
{
{
" title " : _ ( " Session Users " ) ,
" title " : _ ( " Session Users " ) ,
" icon " : " groups " ,
" icon " : " groups " ,
" link " : lambda request : admin_url_generator ( request , " course_livesessionuser_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " course_livesessionuser_changelist " ) ,
" active " : lambda request : request . path . startswith ( str ( lambda request : admin_url_generator ( request , " course_livesessionuser_changelist " ) ) ) ,
" active " : lambda request : request . path . startswith ( admin_url_generator ( request , " course_livesessionuser_changelist " ) ) ,
} ,
} ,
{
{
" title " : _ ( " Session Recordings " ) ,
" title " : _ ( " Session Recordings " ) ,
" icon " : " play_circle " ,
" icon " : " play_circle " ,
" link " : lambda request : admin_url_generator ( request , " course_livesessionrecording_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " course_livesessionrecording_changelist " ) ,
" active " : lambda request : request . path . startswith ( str ( lambda request : admin_url_generator ( request , " course_livesessionrecording_changelist " ) ) ) ,
" active " : lambda request : request . path . startswith ( admin_url_generator ( request , " course_livesessionrecording_changelist " ) ) ,
} ,
} ,
] ,
] ,
} ,
} ,
@ -533,25 +549,55 @@ UNFOLD = {
} ,
} ,
] ,
] ,
} ,
} ,
{
" page " : " quizzes " ,
" models " : [
" quiz.quiz " ,
" quiz.quizparticipant "
] ,
" items " : [
{
" title " : _ ( " Quizzes " ) ,
" icon " : " quiz " ,
" link " : lambda request : admin_url_generator ( request , " quiz_quiz_changelist " ) ,
" active " : lambda request : request . path . startswith ( admin_url_generator ( request , " quiz_quiz_changelist " ) ) ,
} ,
{
" title " : _ ( " Quiz Participants " ) ,
" icon " : " group " ,
" link " : lambda request : admin_url_generator ( request , " quiz_quizparticipant_changelist " ) ,
" active " : lambda request : request . path . startswith ( admin_url_generator ( request , " quiz_quizparticipant_changelist " ) ) ,
} ,
] ,
} ,
] ,
] ,
" SIDEBAR " : {
" SIDEBAR " : {
" show_search " : True ,
" show_search " : True ,
" show_all_applications " : True ,
" show_all_applications " : True ,
" navigation " : [
" navigation " : [
# --- 1. OVERVIEW ---
{
{
" title " : _ ( " " ) ,
" title " : _ ( " " ) ,
" separator " : True ,
" collapsible " : True ,
" separator " : False ,
" items " : [
" items " : [
{
{
" title " : _ ( " Dashboard " ) ,
" title " : _ ( " Dashboard " ) ,
" icon " : " dashboard " ,
" icon " : " dashboard " ,
" link " : lambda request : admin_url_generator ( request , " index " ) ,
" link " : lambda request : admin_url_generator ( request , " index " ) ,
} ,
} ,
{
" title " : _ ( " Calender " ) ,
" icon " : " calendar_today " ,
" link " : lambda request : admin_url_generator ( request , " dobodbi_calendar_calendaroccasions_changelist " ) ,
" permission " : is_dovoodi_panel ,
} ,
] ,
] ,
} ,
} ,
# --- 2. USER MANAGEMENT ---
{
{
" title " : _ ( " " ) ,
" title " : _ ( " " ) ,
" separator " : True ,
" items " : [
" items " : [
{
{
" title " : _ ( " Authentication " ) ,
" title " : _ ( " Authentication " ) ,
@ -559,172 +605,117 @@ UNFOLD = {
" link " : lambda request : admin_url_generator ( request , " auth_group_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " auth_group_changelist " ) ,
" permission " : lambda request : request . user . is_staff ,
" permission " : lambda request : request . user . is_staff ,
} ,
} ,
] ,
} ,
{
" title " : _ ( " " ) ,
" items " : [
{
{
" title " : _ ( " Users " ) ,
" icon " : " person " ,
" title " : _ ( " All Users " ) ,
" icon " : " people " ,
" link " : lambda request : admin_url_generator ( request , " account_user_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " account_user_changelist " ) ,
" permission " : lambda request : request . user . is_staff ,
" permission " : lambda request : request . user . is_staff ,
} ,
} ,
] ,
} ,
{
" title " : _ ( " " ) ,
" items " : [
{
{
" title " : _ ( " Students " ) ,
" title " : _ ( " Students " ) ,
" icon " : " school " ,
" icon " : " face " ,
" link " : lambda request : admin_url_generator ( request , " account_studentuser_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " account_studentuser_changelist " ) ,
" permission " : is_main_panel ,
" permission " : is_main_panel ,
} ,
]
} ,
{
" title " : _ ( " " ) ,
" items " : [
{
} ,
{
" title " : _ ( " Professors " ) ,
" title " : _ ( " Professors " ) ,
" icon " : " person_book " ,
" icon " : " history_edu " ,
" link " : lambda request : admin_url_generator ( request , " account_professoruser_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " account_professoruser_changelist " ) ,
" permission " : is_main_panel ,
" permission " : is_main_panel ,
} ,
]
} ,
{
" title " : _ ( " " ) ,
" items " : [
{
" title " : _ ( " Calender " ) ,
" icon " : " calendar_today " ,
" link " : lambda request : admin_url_generator ( request , " dobodbi_calendar_calendaroccasions_changelist " ) ,
" permission " : is_dovoodi_panel ,
} ,
} ,
] ,
] ,
} ,
} ,
# --- 3. ACADEMICS (Collapsible) ---
{
{
" title " : _ ( " Courses " ) ,
" title " : _ ( " Courses " ) ,
" collapsible " : True ,
" collapsible " : True ,
" separator " : True ,
" separator " : True ,
" permission " : is_main_panel ,
" permission " : is_main_panel ,
" items " : [
" items " : [
{
{
" title " : _ ( " Categories " ) ,
" title " : _ ( " Categories " ) ,
" icon " : " category " ,
" icon " : " category " ,
" link " : lambda request : admin_url_generator ( request , " course_coursecategory_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " course_coursecategory_changelist " ) ,
" permission " : is_main_panel ,
" permission " : is_main_panel ,
} ,
} ,
{
{
" title " : _ ( " Courses " ) ,
" title " : _ ( " Courses " ) ,
" icon " : " school " ,
" icon " : " school " ,
" link " : lambda request : admin_url_generator ( request , " course_course_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " course_course_changelist " ) ,
" permission " : is_main_panel ,
} ,
{
" title " : _ ( " Lessons " ) ,
" icon " : " menu_book " ,
" link " : lambda request : admin_url_generator ( request , " course_lesson_changelist " ) ,
" permission " : is_main_panel ,
} ,
{
" title " : _ ( " Attachments " ) ,
" icon " : " attach_file " ,
" link " : lambda request : admin_url_generator ( request , " course_attachment_changelist " ) ,
" permission " : is_main_panel ,
} ,
{
" title " : _ ( " Glossary " ) ,
" icon " : " book " ,
" link " : lambda request : admin_url_generator ( request , " course_glossary_changelist " ) ,
" permission " : is_main_panel ,
" permission " : is_main_panel ,
} ,
} ,
{
{
" title " : _ ( " Live Sessions " ) ,
" title " : _ ( " Live Sessions " ) ,
" icon " : " video_call " ,
" icon " : " video_camera_front " ,
" link " : lambda request : admin_url_generator ( request , " course_courselivesession_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " course_courselivesession_changelist " ) ,
" permission " : is_main_panel ,
} ,
{
" title " : _ ( " Session Users " ) ,
" icon " : " groups " ,
" link " : lambda request : admin_url_generator ( request , " course_livesessionuser_changelist " ) ,
" permission " : is_main_panel ,
} ,
{
" title " : _ ( " Session Recordings " ) ,
" icon " : " play_circle " ,
" link " : lambda request : admin_url_generator ( request , " course_livesessionrecording_changelist " ) ,
" permission " : is_main_panel ,
" permission " : is_main_panel ,
} ,
} ,
{
{
" title " : _ ( " Certificates " ) ,
" title " : _ ( " Certificates " ) ,
" icon " : " workspace_premium " ,
" icon " : " workspace_premium " ,
" link " : lambda request : admin_url_generator ( request , " certificate_certificate_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " certificate_certificate_changelist " ) ,
" permission " : is_main_panel ,
" permission " : is_main_panel ,
" badge " : " utils.admin.get_pending_certificates_badge " ,
} ,
} ,
]
]
} ,
} ,
# --- 4. ASSESSMENTS ---
{
{
" title " : _ ( " Quizzes " ) ,
" collapsible " : True ,
" title " : _ ( " " ) ,
" separator " : True ,
" separator " : True ,
" permission " : is_main_panel ,
" permission " : is_main_panel ,
" items " : [
" items " : [
{
{
" title " : _ ( " Quizzes " ) ,
" title " : _ ( " Quizzes " ) ,
" icon " : " quiz " ,
" icon " : " quiz " ,
" link " : lambda request : admin_url_generator ( request , " quiz_quiz_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " quiz_quiz_changelist " ) ,
" permission " : is_main_panel ,
" permission " : is_main_panel ,
} ,
} ,
{
" title " : _ ( " Quiz Participants " ) ,
" icon " : " group " ,
" link " : lambda request : admin_url_generator ( request , " quiz_quizparticipant_changelist " ) ,
" permission " : is_main_panel ,
} ,
]
} ,
{
" title " : _ ( " Transactions " ) ,
" collapsible " : True ,
" separator " : True ,
" items " : [
{
{
" title " : _ ( " Transactions " ) ,
" title " : _ ( " Transactions " ) ,
" icon " : " payments " ,
" icon " : " payments " ,
" link " : lambda request : admin_url_generator ( request , " transaction_transactionparticipant_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " transaction_transactionparticipant_changelist " ) ,
" permission " : is_main_panel ,
" permission " : is_main_panel ,
} ,
{
" title " : _ ( " Chat Rooms " ) ,
" icon " : " forum " ,
" link " : lambda request : admin_url_generator ( request , " chat_roommessage_changelist " ) ,
" permission " : is_main_panel ,
} ,
{
" title " : _ ( " Blogs " ) ,
" icon " : " article " ,
" link " : lambda request : admin_url_generator ( request , " blog_blog_changelist " ) ,
" permission " : is_main_panel ,
} ,
} ,
]
]
} ,
} ,
# --- DOVOODI SECTIONS ---
{
{
" title " : _ ( " Libraries " ) ,
" title " : _ ( " Libraries " ) ,
" collapsible " : True ,
" collapsible " : True ,
" separator " : True ,
" separator " : True ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
" items " : [
" items " : [
{
{
" title " : _ ( " Books " ) ,
" title " : _ ( " Books " ) ,
" icon " : " menu_book " ,
" icon " : " menu_book " ,
" link " : lambda request : admin_url_generator ( request , " library_book_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " library_book_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
{
{
" title " : _ ( " Categories " ) ,
" title " : _ ( " Categories " ) ,
" icon " : " category " ,
" icon " : " category " ,
" link " : lambda request : admin_url_generator ( request , " library_category_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " library_category_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
{
{
" title " : _ ( " Collections " ) ,
" title " : _ ( " Collections " ) ,
" icon " : " view_module " ,
" icon " : " view_module " ,
" link " : lambda request : admin_url_generator ( request , " library_pinnedbookcollection_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " library_pinnedbookcollection_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
]
]
} ,
} ,
@ -732,53 +723,31 @@ UNFOLD = {
" title " : _ ( " Videos " ) ,
" title " : _ ( " Videos " ) ,
" collapsible " : True ,
" collapsible " : True ,
" separator " : True ,
" separator " : True ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
" items " : [
" items " : [
{
{
" title " : _ ( " Videos " ) ,
" title " : _ ( " Videos " ) ,
" icon " : " live_tv " ,
" icon " : " live_tv " ,
" link " : lambda request : admin_url_generator ( request , " video_video_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " video_video_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
{
{
" title " : _ ( " Categories " ) ,
" title " : _ ( " Categories " ) ,
" icon " : " category " ,
" icon " : " category " ,
" link " : lambda request : admin_url_generator ( request , " video_videocategory_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " video_videocategory_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
{
{
" title " : _ ( " Collections " ) ,
" title " : _ ( " Collections " ) ,
" icon " : " view_module " ,
" icon " : " view_module " ,
" link " : lambda request : admin_url_generator ( request , " video_pinnedvideocollection_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " video_pinnedvideocollection_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
{
{
" title " : _ ( " Playlists " ) ,
" title " : _ ( " Playlists " ) ,
" icon " : " playlist_play " ,
" icon " : " playlist_play " ,
" link " : lambda request : admin_url_generator ( request , " video_videoplaylist_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " video_videoplaylist_changelist " ) ,
" permission " : is_dovoodi_panel ,
# "active": lambda request: "video/videoplaylist" in request.path,
} ,
]
} ,
{
" title " : _ ( " Blog " ) ,
" collapsible " : True ,
" separator " : True ,
" permission " : is_main_panel ,
" items " : [
{
" title " : _ ( " Comments " ) ,
" icon " : " comment " ,
" link " : lambda request : admin_url_generator ( request , " api_comment_changelist " ) ,
" permission " : is_main_panel ,
} ,
{
" title " : _ ( " Blogs " ) ,
" icon " : " article " ,
" link " : lambda request : admin_url_generator ( request , " blog_blog_changelist " ) ,
" permission " : is_main_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
]
]
} ,
} ,
@ -786,37 +755,37 @@ UNFOLD = {
" title " : _ ( " Articles " ) ,
" title " : _ ( " Articles " ) ,
" collapsible " : True ,
" collapsible " : True ,
" separator " : True ,
" separator " : True ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
" items " : [
" items " : [
{
{
" title " : _ ( " Articles " ) ,
" title " : _ ( " Articles " ) ,
" icon " : " article " ,
" icon " : " article " ,
" link " : lambda request : admin_url_generator ( request , " article_article_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " article_article_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
{
{
" title " : _ ( " Categories " ) ,
" title " : _ ( " Categories " ) ,
" icon " : " category " ,
" icon " : " category " ,
" link " : lambda request : admin_url_generator ( request , " article_articlecategory_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " article_articlecategory_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
{
{
" title " : _ ( " Pinned Collections " ) ,
" title " : _ ( " Pinned Collections " ) ,
" icon " : " collections_bookmark " ,
" icon " : " collections_bookmark " ,
" link " : lambda request : admin_url_generator ( request , " article_pinnedarticlecollection_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " article_pinnedarticlecollection_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
{
{
" title " : _ ( " Regular Collections " ) ,
" title " : _ ( " Regular Collections " ) ,
" icon " : " view_module " ,
" icon " : " view_module " ,
" link " : lambda request : admin_url_generator ( request , " article_middlearticlecollection_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " article_middlearticlecollection_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
{
{
" title " : _ ( " Article Contents " ) ,
" title " : _ ( " Article Contents " ) ,
" icon " : " text_snippet " ,
" icon " : " text_snippet " ,
" link " : lambda request : admin_url_generator ( request , " article_articlecontent_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " article_articlecontent_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
]
]
} ,
} ,
@ -824,181 +793,129 @@ UNFOLD = {
" title " : _ ( " Podcasts " ) ,
" title " : _ ( " Podcasts " ) ,
" collapsible " : True ,
" collapsible " : True ,
" separator " : True ,
" separator " : True ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
" items " : [
" items " : [
{
{
" title " : _ ( " Podcasts " ) ,
" title " : _ ( " Podcasts " ) ,
" icon " : " headset " ,
" icon " : " headset " ,
" link " : lambda request : admin_url_generator ( request , " podcast_podcast_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " podcast_podcast_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
{
{
" title " : _ ( " Categories " ) ,
" title " : _ ( " Categories " ) ,
" icon " : " category " ,
" icon " : " category " ,
" link " : lambda request : admin_url_generator ( request , " podcast_podcastcategory_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " podcast_podcastcategory_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
{
{
" title " : _ ( " Pinned Collections " ) ,
" title " : _ ( " Pinned Collections " ) ,
" icon " : " collections_bookmark " ,
" icon " : " collections_bookmark " ,
" link " : lambda request : admin_url_generator ( request , " podcast_pinnedpodcastcollection_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " podcast_pinnedpodcastcollection_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
{
{
" title " : _ ( " Regular Collections " ) ,
" title " : _ ( " Regular Collections " ) ,
" icon " : " view_module " ,
" icon " : " view_module " ,
" link " : lambda request : admin_url_generator ( request , " podcast_middlepodcastcollection_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " podcast_middlepodcastcollection_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
{
{
" title " : _ ( " Playlists " ) ,
" title " : _ ( " Playlists " ) ,
" icon " : " playlist_play " ,
" icon " : " playlist_play " ,
" link " : lambda request : admin_url_generator ( request , " podcast_podcastplaylist_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " podcast_podcastplaylist_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
{
{
" title " : _ ( " User Playlists " ) ,
" title " : _ ( " User Playlists " ) ,
" icon " : " person_add " ,
" icon " : " person_add " ,
" link " : lambda request : admin_url_generator ( request , " podcast_userplaylist_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " podcast_userplaylist_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
]
]
} ,
} ,
{
" title " : _ ( " Chats " ) ,
" collapsible " : True ,
" separator " : True ,
" permission " : is_main_panel ,
" items " : [
{
" title " : _ ( " Chat Rooms " ) ,
" icon " : " forum " ,
" link " : lambda request : admin_url_generator ( request , " chat_roommessage_changelist " ) ,
" permission " : is_main_panel ,
} ,
# {
# "title": _("Chat Messages"),
# "icon": "chat",
# "link": lambda request: admin_url_generator(request, "apps_chat_chatmessage_changelist"),
# },
# {
# "title": _("Read Status"),
# "icon": "mark_chat_read",
# "link": lambda request: admin_url_generator(request, "apps_chat_messagereadstatus_changelist"),
# },
]
} ,
{
{
" title " : _ ( " Hadis " ) ,
" title " : _ ( " Hadis " ) ,
" collapsible " : True ,
" collapsible " : True ,
" separator " : True ,
" separator " : True ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
" items " : [
" items " : [
{
{
" title " : _ ( " Hadis Sects " ) ,
" title " : _ ( " Hadis Sects " ) ,
" icon " : " account_tree " ,
" icon " : " account_tree " ,
" link " : lambda request : admin_url_generator ( request , " hadis_hadissect_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " hadis_hadissect_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
{
{
" title " : _ ( " Hadis Categories " ) ,
" title " : _ ( " Hadis Categories " ) ,
" icon " : " category " ,
" icon " : " category " ,
" link " : lambda request : admin_url_generator ( request , " hadis_hadiscategory_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " hadis_hadiscategory_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
{
{
" title " : _ ( " Hadis " ) ,
" title " : _ ( " Hadis " ) ,
" icon " : " format_quote " ,
" icon " : " format_quote " ,
" link " : lambda request : admin_url_generator ( request , " hadis_hadis_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " hadis_hadis_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
{
{
" title " : _ ( " Hadis References " ) ,
" title " : _ ( " Hadis References " ) ,
" icon " : " link " ,
" icon " : " link " ,
" link " : lambda request : admin_url_generator ( request , " hadis_hadisreference_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " hadis_hadisreference_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
{
{
" title " : _ ( " Hadis Tags " ) ,
" title " : _ ( " Hadis Tags " ) ,
" icon " : " label " ,
" icon " : " label " ,
" link " : lambda request : admin_url_generator ( request , " hadis_hadistag_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " hadis_hadistag_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
{
{
" title " : _ ( " Hadis Status " ) ,
" title " : _ ( " Hadis Status " ) ,
" icon " : " flag " ,
" icon " : " flag " ,
" link " : lambda request : admin_url_generator ( request , " hadis_hadisstatus_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " hadis_hadisstatus_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
{
{
" title " : _ ( " Transmitters " ) ,
" title " : _ ( " Transmitters " ) ,
" icon " : " person " ,
" icon " : " person " ,
" link " : lambda request : admin_url_generator ( request , " hadis_transmitters_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " hadis_transmitters_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
{
{
" title " : _ ( " Hadis Transmitters " ) ,
" title " : _ ( " Hadis Transmitters " ) ,
" icon " : " group " ,
" icon " : " group " ,
" link " : lambda request : admin_url_generator ( request , " hadis_hadistransmitter_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " hadis_hadistransmitter_changelist " ) ,
" permission " : is_dovoodi_panel ,
" permission " : is_dovoodi_panel ,
} ,
} ,
]
]
} ,
} ,
# --- 7. SYSTEM SETTINGS ---
{
{
" title " : _ ( " " ) ,
" title " : _ ( " System Settings " ) ,
" separator " : True ,
" items " : [
" items " : [
{
{
" title " : _ ( " App Versions " ) ,
" title " : _ ( " App Versions " ) ,
" icon " : " system_update " ,
" icon " : " system_update " ,
" link " : lambda request : admin_url_generator ( request , " api_appversion_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " api_appversion_changelist " ) ,
} ,
} ,
] ,
} ,
{
" title " : " " ,
" items " : [
{
{
" title " : _ ( " Global Preferences " ) ,
" title " : _ ( " Global Preferences " ) ,
" icon " : " settings " ,
" icon " : " tune " ,
" link " : lambda request : admin_url_generator ( request , " dynamic_preferences_globalpreferencemodel_changelist " ) ,
" link " : lambda request : admin_url_generator ( request , " dynamic_preferences_globalpreferencemodel_changelist " ) ,
} ,
} ,
# You can add more preference sections here
] ,
] ,
} ,
} ,
# "STYLES": [
# lambda request: static("css/styles.css"),
# ],
# "SCRIPTS": [
# lambda request: static("js/scripts.js"),
# ],
] ,
] ,
} ,
}
}
}
UNFOLD_STUDIO_DEFAULT_FRAGMENT = " color-schemes "
UNFOLD_STUDIO_DEFAULT_FRAGMENT = " color-schemes "
UNFOLD_STUDIO_PERMISSION = lambda request : request . user . is_authenticated
UNFOLD_STUDIO_PERMISSION = lambda request : request . user . is_authenticated
PLAUSIBLE_DOMAIN = env ( " PLAUSIBLE_DOMAIN " )
PLAUSIBLE_DOMAIN = env ( " PLAUSIBLE_DOMAIN " )
# uncomment it just to check if redis caches and signals works fine locally
# CACHES = {
# 'default': {
# "BACKEND": "django_redis.cache.RedisCache",
# "LOCATION": "redis://127.0.0.1:6379/1",
# "OPTIONS": {
# "CLIENT_CLASS": "django_redis.client.DefaultClient",
# }
# },
# 'memory': {
# 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
# 'LOCATION': 'unique-snowflake',
# 'TIMEOUT': 5000,
# },
# }
sentry_sdk . init (
sentry_sdk . init (
dsn = " https://31aaeeb3a42f9a8c1b26272a0cb8ad3e@o4507991743725568.ingest.us.sentry.io/4511127356768256 " ,
dsn = " https://31aaeeb3a42f9a8c1b26272a0cb8ad3e@o4507991743725568.ingest.us.sentry.io/4511127356768256 " ,
# Add data like request headers and IP for users,
# see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info
send_default_pii = True ,
send_default_pii = True ,
)
)