Browse Source

admin fields titles and side bars changed base on url

master
Mohsen Taba 5 months ago
parent
commit
08c96e904a
  1. 64
      config/settings/base.py
  2. 41
      utils/admin.py

64
config/settings/base.py

@ -314,12 +314,12 @@ LOGIN_REDIRECT_URL = reverse_lazy("admin.index")
###################################################################### ######################################################################
# Unfold # Unfold
###################################################################### ######################################################################
from utils.admin import admin_url_generator
from utils.admin import admin_url_generator , is_dovoodi_panel , is_main_panel
UNFOLD = { UNFOLD = {
"SITE_TITLE": _("Imam Jawad Admin"),
"SITE_HEADER": _("Imam Jawad Admin"),
"SITE_SUBHEADER": _("Imam Jawad Online School"),
# "SITE_TITLE": _("Imam Jawad Admin"),
# "SITE_HEADER": _("Imam Jawad Admin"),
# "SITE_SUBHEADER": _("Imam Jawad Online School"),
"SITE_DROPDOWN": [ "SITE_DROPDOWN": [
{ {
"icon": "diamond", "icon": "diamond",
@ -612,7 +612,7 @@ UNFOLD = {
"title": _("Students"), "title": _("Students"),
"icon": "school", "icon": "school",
"link": lambda request: admin_url_generator(request, "account_studentuser_changelist"), "link": lambda request: admin_url_generator(request, "account_studentuser_changelist"),
"permission": lambda request: request.user.is_staff,
"permission": is_main_panel,
}, },
] ]
@ -624,7 +624,7 @@ UNFOLD = {
"title": _("Professors"), "title": _("Professors"),
"icon": "person_book", "icon": "person_book",
"link": lambda request: admin_url_generator(request, "account_professoruser_changelist"), "link": lambda request: admin_url_generator(request, "account_professoruser_changelist"),
"permission": lambda request: request.user.is_staff,
"permission": is_main_panel,
}, },
] ]
@ -636,7 +636,7 @@ UNFOLD = {
"title": _("Calender"), "title": _("Calender"),
"icon": "calendar_today", "icon": "calendar_today",
"link": lambda request: admin_url_generator(request, "dobodbi_calendar_calendaroccasions_changelist"), "link": lambda request: admin_url_generator(request, "dobodbi_calendar_calendaroccasions_changelist"),
"permission": lambda request: request.user.is_staff,
"permission": is_dovoodi_panel,
}, },
], ],
}, },
@ -644,51 +644,61 @@ UNFOLD = {
"title": _("Courses"), "title": _("Courses"),
"collapsible": True, "collapsible": True,
"separator": True, "separator": True,
"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,
}, },
{ {
"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"), "title": _("Lessons"),
"icon": "menu_book", "icon": "menu_book",
"link": lambda request: admin_url_generator(request, "course_lesson_changelist"), "link": lambda request: admin_url_generator(request, "course_lesson_changelist"),
"permission":is_main_panel,
}, },
{ {
"title": _("Attachments"), "title": _("Attachments"),
"icon": "attach_file", "icon": "attach_file",
"link": lambda request: admin_url_generator(request, "course_attachment_changelist"), "link": lambda request: admin_url_generator(request, "course_attachment_changelist"),
"permission":is_main_panel,
}, },
{ {
"title": _("Glossary"), "title": _("Glossary"),
"icon": "book", "icon": "book",
"link": lambda request: admin_url_generator(request, "course_glossary_changelist"), "link": lambda request: admin_url_generator(request, "course_glossary_changelist"),
"permission":is_main_panel,
}, },
{ {
"title": _("Live Sessions"), "title": _("Live Sessions"),
"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"),
"permission":is_main_panel,
}, },
{ {
"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"),
"permission":is_main_panel,
}, },
{ {
"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"),
"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,
}, },
] ]
}, },
@ -696,16 +706,19 @@ UNFOLD = {
"title": _("Quizzes"), "title": _("Quizzes"),
"collapsible": True, "collapsible": True,
"separator": True, "separator": True,
"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,
}, },
{ {
"title": _("Quiz Participants"), "title": _("Quiz Participants"),
"icon": "group", "icon": "group",
"link": lambda request: admin_url_generator(request, "quiz_quizparticipant_changelist"), "link": lambda request: admin_url_generator(request, "quiz_quizparticipant_changelist"),
"permission":is_main_panel,
}, },
] ]
}, },
@ -718,6 +731,7 @@ UNFOLD = {
"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,
}, },
] ]
}, },
@ -725,21 +739,25 @@ UNFOLD = {
"title": _("Libraries"), "title": _("Libraries"),
"collapsible": True, "collapsible": True,
"separator": True, "separator": True,
"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,
}, },
{ {
"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,
}, },
{ {
"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,
}, },
] ]
}, },
@ -747,26 +765,31 @@ UNFOLD = {
"title": _("Videos"), "title": _("Videos"),
"collapsible": True, "collapsible": True,
"separator": True, "separator": True,
"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,
}, },
{ {
"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,
}, },
{ {
"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,
}, },
{ {
"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, # "active": lambda request: "video/videoplaylist" in request.path,
}, },
@ -776,16 +799,19 @@ UNFOLD = {
"title": _("Blog"), "title": _("Blog"),
"collapsible": True, "collapsible": True,
"separator": True, "separator": True,
"permission":is_main_panel,
"items": [ "items": [
{ {
"title": _("Comments"), "title": _("Comments"),
"icon": "comment", "icon": "comment",
"link": lambda request: admin_url_generator(request, "api_comment_changelist"), "link": lambda request: admin_url_generator(request, "api_comment_changelist"),
"permission":is_main_panel,
}, },
{ {
"title": _("Blogs"), "title": _("Blogs"),
"icon": "article", "icon": "article",
"link": lambda request: admin_url_generator(request, "blog_blog_changelist"), "link": lambda request: admin_url_generator(request, "blog_blog_changelist"),
"permission":is_main_panel,
}, },
] ]
}, },
@ -803,31 +829,37 @@ UNFOLD = {
"title": _("Articles"), "title": _("Articles"),
"collapsible": True, "collapsible": True,
"separator": True, "separator": True,
"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,
}, },
{ {
"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,
}, },
{ {
"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,
}, },
{ {
"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,
}, },
{ {
"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,
}, },
] ]
}, },
@ -835,36 +867,43 @@ UNFOLD = {
"title": _("Podcasts"), "title": _("Podcasts"),
"collapsible": True, "collapsible": True,
"separator": True, "separator": True,
"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,
}, },
{ {
"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,
}, },
{ {
"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,
}, },
{ {
"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,
}, },
{ {
"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,
}, },
{ {
"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,
}, },
] ]
}, },
@ -872,11 +911,13 @@ UNFOLD = {
"title": _("Chats"), "title": _("Chats"),
"collapsible": True, "collapsible": True,
"separator": True, "separator": True,
"permission":is_main_panel,
"items": [ "items": [
{ {
"title": _("Chat Rooms"), "title": _("Chat Rooms"),
"icon": "forum", "icon": "forum",
"link": lambda request: admin_url_generator(request, "chat_roommessage_changelist"), "link": lambda request: admin_url_generator(request, "chat_roommessage_changelist"),
"permission":is_main_panel,
}, },
# { # {
# "title": _("Chat Messages"), # "title": _("Chat Messages"),
@ -894,46 +935,55 @@ UNFOLD = {
"title": _("Hadis"), "title": _("Hadis"),
"collapsible": True, "collapsible": True,
"separator": True, "separator": True,
"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,
}, },
{ {
"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,
}, },
{ {
"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,
}, },
{ {
"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,
}, },
{ {
"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,
}, },
{ {
"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,
}, },
{ {
"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,
}, },
{ {
"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,
}, },
] ]
}, },

41
utils/admin.py

@ -17,27 +17,37 @@ from unfold.sites import UnfoldAdminSite
# 1. Helper Functions # 1. Helper Functions
# --------------------------------------------------------- # ---------------------------------------------------------
def is_dovoodi_panel(request):
"""
Returns True if the user is accessing the Dovoodi admin panel.
Checks if '/dovoodi/' exists anywhere in the path to handle i18n prefixes
(e.g., /en/dovoodi/admin, /fa/dovoodi/admin).
"""
return '/dovoodi/' in request.path
def is_main_panel(request):
"""Returns True if the user is accessing the Main (Imam Javad) admin panel."""
return not is_dovoodi_panel(request)
def admin_url_generator(request, url_name): def admin_url_generator(request, url_name):
""" """
Dynamically generates admin URLs based on the current active panel. Dynamically generates admin URLs based on the current active panel.
Usage in settings.py: lambda request: admin_url_generator(request, "app_model_changelist") Usage in settings.py: lambda request: admin_url_generator(request, "app_model_changelist")
""" """
# 1. Determine the current namespace based on the URL path
if request.path.startswith('/en/dovoodi/') or request.path.startswith('/dovoodi/'):
# 1. Determine the current namespace using the robust check
if is_dovoodi_panel(request):
namespace = 'dovoodi_admin' namespace = 'dovoodi_admin'
else: else:
# Default to the main admin # Default to the main admin
namespace = 'imam_javad_admin' namespace = 'imam_javad_admin'
# 2. Construct the view name (e.g., "imam_javad_admin:account_user_changelist")
# 2. Construct the view name
full_view_name = f"{namespace}:{url_name}" full_view_name = f"{namespace}:{url_name}"
# 3. Resolve the URL # 3. Resolve the URL
try: try:
return reverse(full_view_name) return reverse(full_view_name)
except Exception: except Exception:
# If the model isn't registered in this specific admin, return a dead link
# to prevent the whole page from crashing.
return "#" return "#"
def dashboard_callback(request, context): def dashboard_callback(request, context):
@ -78,6 +88,7 @@ class FormulaAdminSite(UnfoldAdminSite):
site_header = "Imam Javad Admin" site_header = "Imam Javad Admin"
site_title = "Imam Javad" site_title = "Imam Javad"
index_title = "System Administration" index_title = "System Administration"
site_subheader = "Imam Javad School"
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
@ -89,6 +100,7 @@ class DovoodiAdminSite(UnfoldAdminSite):
site_header = "Dovoodi Admin" site_header = "Dovoodi Admin"
site_title = "Dovoodi" site_title = "Dovoodi"
index_title = "System Administration" index_title = "System Administration"
site_subheader = "Dovodbi Application"
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
@ -100,11 +112,16 @@ class AdminSitePlaceholder(UnfoldAdminSite):
"""Placeholder that behaves like an admin site until Django is fully loaded""" """Placeholder that behaves like an admin site until Django is fully loaded"""
def __init__(self, site_class, name): def __init__(self, site_class, name):
# Initialize with minimal setup to avoid circular imports
# 1. Store config for lazy loading
self._site_class = site_class self._site_class = site_class
self._name = name self._name = name
self._real_instance = None self._real_instance = None
# Don't call super().__init__() here to avoid circular imports
# 2. THE FIX: Copy visual attributes immediately so Templates see them!
self.site_header = getattr(site_class, 'site_header', 'Django Admin')
self.site_title = getattr(site_class, 'site_title', 'Django Site')
self.index_title = getattr(site_class, 'index_title', 'Site Administration')
self.site_subheader = getattr(site_class, 'site_subheader', '')
def _get_real_instance(self): def _get_real_instance(self):
if self._real_instance is None: if self._real_instance is None:
@ -117,6 +134,16 @@ class AdminSitePlaceholder(UnfoldAdminSite):
def __call__(self, *args, **kwargs): def __call__(self, *args, **kwargs):
return self._get_real_instance()(*args, **kwargs) return self._get_real_instance()(*args, **kwargs)
def get_urls(self):
return self._get_real_instance().get_urls()
@property
def urls(self):
return self._get_real_instance().urls
def each_context(self, request):
return self._get_real_instance().each_context(request)
# Create placeholder instances # Create placeholder instances
project_admin_site = AdminSitePlaceholder(FormulaAdminSite, 'imam_javad_admin') project_admin_site = AdminSitePlaceholder(FormulaAdminSite, 'imam_javad_admin')
dovoodi_admin_site = AdminSitePlaceholder(DovoodiAdminSite, 'dovoodi_admin') dovoodi_admin_site = AdminSitePlaceholder(DovoodiAdminSite, 'dovoodi_admin')

Loading…
Cancel
Save