from django.urls import path, include from rest_framework.routers import SimpleRouter from .views.category import HadisCategorySectListView, HadisCategoryTreeView, CategoriesView, CategoriesBySectView, HadisCategorySelectBySectView, HadisCategorySelectBySectSourceView , HadisCategoryTreeNormalView ,test_deploy,debug_headers,HadisCategoryXMindView from .views.hadis import ( HadisCollectionListView, HadisListView, HadisBasicView, HadisDetailView, HadisSyncView, HadisTransmittersView, HadisCorrectionsView, CategoryHadisCorrectionsView, HadisMainListView, HadisFiltersView, HadisLayersView,PinnedHadisCollectionListView, HadisFiltersSyncAPIView, HadisCorrectionDetailView, HadisInterpretationDetailView, HadisInterpretsListView, HadisSourceDetailsView ) from .views.transmitter import ( TransmitterView ,TransmitterDetailView, TransmitterSyncView,TransmitterOpinionView, TransmitterOriginalTextView, TransmitterFiltersView, NarratorArgumentsListView , NarratorTeachersView, NarratorStudentsView, TransmitterOriginalTextDetailView ) from .views.reference import BookDetailView, BookReferencesView, BookReferenceSyncView, BookAttributeView, ReferenceExcerptsListView from .views.reference_v2 import BookReferenceV2DetailView, BookReferenceV2SyncView, BookReferenceV2ListView from .views.version import ContentReleaseSyncView, HadisDatabaseVersionView from .views.info import HadisInfoView from .views_admin import ( AdminHadisCategoryViewSet, AdminHadisViewSet, AdminHadisCorrectionViewSet, AdminCorrectionReferenceViewSet, AdminHadisInterpretationViewSet, AdminHadisStatusViewSet, AdminHadisTagViewSet, AdminHadisCollectionViewSet, AdminBookSubjectAreaViewSet, AdminBookTypeViewSet, AdminBookTagViewSet, AdminBookAuthorViewSet, AdminBookAttributeViewSet, AdminBookReferenceImageViewSet, AdminHadisReferenceImageViewSet, AdminBookReferenceDocumentViewSet, AdminBookReferenceViewSet, AdminTransmitterViewSet, AdminTransmitterReliabilityViewSet, DovodiBookSubjectAreaViewSet, DovodiBookTypeViewSet, DovodiNarratorLayerViewSet, DovodiTransmitterReliabilityViewSet, DovodiOpinionStatusViewSet, DovodiHadisSectViewSet, DovodiHadisCategoryViewSet, AdminCategoryQuranVerseViewSet, AdminHadisTransmitterViewSet, AdminTransmitterOpinionViewSet, AdminTransmitterOriginalTextViewSet, AdminBookEditionViewSet, AdminBookVolumeViewSet, AdminContentReleaseViewSet ) from .views.reference_v2 import BookAuthorListView, BookAuthorDetailView, AuthorReferencesListView, BookAuthorSyncView from utils.cache import smart_cached_view # Helper function to cache public views with smart invalidation and force-refresh support cached_view = smart_cached_view(60 * 60 * 2, key_prefix='hadis_api') admin_router = SimpleRouter() admin_router.register(r'hadises', AdminHadisViewSet, basename='admin-hadises') admin_router.register(r'categories', AdminHadisCategoryViewSet, basename='admin-hadis-categories') admin_router.register(r'quran-verses', AdminCategoryQuranVerseViewSet, basename='admin-category-quran-verses') admin_router.register(r'dovodi-sects', DovodiHadisSectViewSet, basename='dovodi-hadis-sects') admin_router.register(r'dovodi-categories', DovodiHadisCategoryViewSet, basename='dovodi-hadis-categories') admin_router.register(r'corrections', AdminHadisCorrectionViewSet, basename='admin-hadis-corrections') admin_router.register(r'correction-references', AdminCorrectionReferenceViewSet, basename='admin-correction-references') admin_router.register(r'interpretations', AdminHadisInterpretationViewSet, basename='admin-hadis-interpretations') admin_router.register(r'statuses', AdminHadisStatusViewSet, basename='admin-hadis-statuses') admin_router.register(r'tags', AdminHadisTagViewSet, basename='admin-hadis-tags') admin_router.register(r'collections', AdminHadisCollectionViewSet, basename='admin-hadis-collections') admin_router.register(r'references', AdminBookReferenceViewSet, basename='admin-book-references') admin_router.register(r'subject-areas', AdminBookSubjectAreaViewSet, basename='admin-book-subject-areas') admin_router.register(r'book-types', AdminBookTypeViewSet, basename='admin-book-types') admin_router.register(r'book-tags', AdminBookTagViewSet, basename='admin-book-tags') admin_router.register(r'dovodi-subject-areas', DovodiBookSubjectAreaViewSet, basename='dovodi-book-subject-areas') admin_router.register(r'dovodi-book-types', DovodiBookTypeViewSet, basename='dovodi-book-types') admin_router.register(r'book-authors', AdminBookAuthorViewSet, basename='admin-book-authors') admin_router.register(r'book-attributes', AdminBookAttributeViewSet, basename='admin-book-attributes') admin_router.register(r'book-images', AdminBookReferenceImageViewSet, basename='admin-book-images') admin_router.register(r'hadis-reference-images', AdminHadisReferenceImageViewSet, basename='admin-hadis-reference-images') admin_router.register(r'book-documents', AdminBookReferenceDocumentViewSet, basename='admin-book-documents') admin_router.register(r'transmitters', AdminTransmitterViewSet, basename='admin-transmitters') admin_router.register(r'transmitter-reliabilities', AdminTransmitterReliabilityViewSet, basename='admin-transmitter-reliabilities') admin_router.register(r'dovodi-narrator-layers', DovodiNarratorLayerViewSet, basename='dovodi-narrator-layers') admin_router.register(r'dovodi-transmitter-reliabilities', DovodiTransmitterReliabilityViewSet, basename='dovodi-transmitter-reliabilities') admin_router.register(r'dovodi-opinion-statuses', DovodiOpinionStatusViewSet, basename='dovodi-opinion-statuses') admin_router.register(r'hadis-transmitters', AdminHadisTransmitterViewSet, basename='admin-hadis-transmitters') admin_router.register(r'transmitter-opinions', AdminTransmitterOpinionViewSet, basename='admin-transmitter-opinions') admin_router.register(r'transmitter-original-texts', AdminTransmitterOriginalTextViewSet, basename='admin-transmitter-original-texts') admin_router.register(r'book-editions', AdminBookEditionViewSet, basename='admin-book-editions') admin_router.register(r'book-volumes', AdminBookVolumeViewSet, basename='admin-book-volumes') admin_router.register(r'content-version', AdminContentReleaseViewSet, basename='admin-content-version') # Hide admin viewsets from swagger for prefix, viewset, basename in admin_router.registry: viewset.swagger_schema = None urlpatterns = [ path('sync/authors/', cached_view(BookAuthorSyncView.as_view()), name='sync-author-list'), path('authors//references/', cached_view(AuthorReferencesListView.as_view()), name='author-references'), path('authors//', cached_view(BookAuthorDetailView.as_view()), name='author-detail'), path('authors/', cached_view(BookAuthorListView.as_view()), name='author-list'), # Admin endpoints path('admin/', include(admin_router.urls)), # Most specific first (with parameters) path('pinned-collections/', cached_view(PinnedHadisCollectionListView.as_view()), name='pinned-hadis-collection-list'), path('collections/', cached_view(HadisCollectionListView.as_view()), name='hadis-collection-list'), path('sync/sects/', cached_view(HadisCategorySectListView.as_view()), name='hadis-sect-list'), path('sync/categories/tree/', cached_view(HadisCategoryTreeView.as_view()), name='hadis-category-tree'), path('sync/hadis/', cached_view(HadisSyncView.as_view()), name='hadis-sync'), path('sync/narrators/', cached_view(TransmitterSyncView.as_view()), name='transmitter-sync'), path('sync/references/', cached_view(BookReferenceSyncView.as_view()), name='reference-sync'), path('v2/sync/references/', cached_view(BookReferenceV2SyncView.as_view()), name='reference-sync-v2'), path('sync/version/', ContentReleaseSyncView.as_view(), name='content-release-sync'), path('sync/database/', HadisDatabaseVersionView.as_view(), name='hadis-database-sync'), path('sync/filters/', cached_view(HadisFiltersSyncAPIView.as_view()), name='hadis-filters-sync'), path('info/', cached_view(HadisInfoView.as_view()), name='hadis-info'), # Category paths (more specific first) path('categories/tree/', cached_view(HadisCategoryTreeNormalView.as_view()), name='hadis-category-tree-normal'), path('categories////', cached_view(HadisCategorySelectBySectSourceView.as_view()), name='categories-tree-by-sect-source'), path('categories///', cached_view(HadisCategorySelectBySectView.as_view()), name='categories-tree-by-sect'), path('categories//', CategoriesBySectView.as_view(), name='categories-by-sect'), path('categories/', cached_view(CategoriesView.as_view()), name='categories'), # ← Least specific LAST # Hadis paths path('category//xmind/', HadisCategoryXMindView.as_view(), name='hadis-category-xmind'), # ← Must be before other category paths path('category//corrections/', CategoryHadisCorrectionsView.as_view(), name='category-hadis-corrections'), path('category//', HadisListView.as_view(), name='hadis-list'), path('arguments/filters/', cached_view(HadisFiltersView.as_view()), name='hadis-filters'), path('arguments/', HadisMainListView.as_view(), name='hadis-main-list'), # Narrator paths path('narrators/filters/', cached_view(TransmitterFiltersView.as_view()), name='narrator-filters'), path('narrators//teachers/', cached_view(NarratorTeachersView.as_view()), name='narrator-teachers'), path('narrators//students/', cached_view(NarratorStudentsView.as_view()), name='narrator-students'), path('narrators//arguments/', cached_view(NarratorArgumentsListView.as_view()), name='narrator-arguments'), path('narrators//opinions/', cached_view(TransmitterOpinionView.as_view()), name='narrator-opinions'), path('narrators//original_texts/', cached_view(TransmitterOriginalTextView.as_view()), name='narrator-original-texts'), path('narrators//', cached_view(TransmitterDetailView.as_view()), name='narrator-detail'), path('narrators/', cached_view(TransmitterView.as_view()), name='narrators'), # Reference paths path('v2/references//excerpts/', cached_view(ReferenceExcerptsListView.as_view()), name='reference-excerpts-v2'), path('v2/references//', cached_view(BookReferenceV2DetailView.as_view()), name='reference-detail-v2'), path('v2/references/', cached_view(BookReferenceV2ListView.as_view()), name='reference-list-v2'), path('references//excerpts/', cached_view(ReferenceExcerptsListView.as_view()), name='reference-excerpts'), path('references//', cached_view(BookDetailView.as_view()), name='reference-detail'), path('references/', cached_view(BookDetailView.as_view()), name='reference-detail-no-slash'), path('references/', cached_view(BookReferencesView.as_view()), name='references'), # Hadis detail paths (with slug, more specific) path('/source-details/', cached_view(HadisSourceDetailsView.as_view()), name='hadis-source-details'), path('/sources/', cached_view(HadisSourceDetailsView.as_view()), name='hadis-sources'), path('/detail/', HadisDetailView.as_view(), name='hadis-detail'), path('/transmitters/', cached_view(HadisTransmittersView.as_view()), name='hadis-transmitters'), path('/transmitters/layers/', cached_view(HadisLayersView.as_view()), name='hadis-layers'), path('/corrections/', HadisCorrectionsView.as_view(), name='hadis-corrections'), path('/interprets/', cached_view(HadisInterpretsListView.as_view()), name='hadis-interprets'), path('/', HadisBasicView.as_view(), name='hadis-basic'), # ← Least specific LAST # path('test/test-deploy',test_deploy , name='test'), # path('debug-headers',debug_headers , name='headers'), # Interpretation Detail Endpoint (تفسیر بر اساس آی‌دی) path('interpretations//', cached_view(HadisInterpretationDetailView.as_view()), name='interpretation-detail'), # Correction Detail Endpoint (تصحیح بر اساس اسلاگ) path('corrections//', HadisCorrectionDetailView.as_view(), name='correction-detail'), # Original Text Detail Endpoint (متن اصلی راوی بر اساس اسلاگ) path('original-texts//', cached_view(TransmitterOriginalTextDetailView.as_view()), name='original-text-detail'), ]