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.
74 lines
3.5 KiB
74 lines
3.5 KiB
from django.urls import include, path
|
|
from django.views.decorators.cache import cache_page
|
|
from django.views.decorators.vary import vary_on_headers
|
|
from rest_framework.routers import SimpleRouter
|
|
|
|
from apps.library.views import (
|
|
CategoryListView,
|
|
PinnedBookCollectionListView,
|
|
MiddleBookCollectionListView,
|
|
BookListView,
|
|
BookDetailView,
|
|
AuthorListView,
|
|
AuthorDetailView,
|
|
AuthorBookListView,
|
|
DownloadedBooksListView,
|
|
BookDownloadCreateAPIView,
|
|
)
|
|
|
|
from functools import wraps
|
|
|
|
# Helper function to cache public views
|
|
def cached_view(view_func):
|
|
return cache_page(60 * 60 * 2, key_prefix='library_api')(vary_on_headers('Accept-Language')(view_func))
|
|
|
|
# Helper to conditionally cache list views (bypasses cache when is_bookmark=true)
|
|
def conditional_cached_view(timeout, key_prefix):
|
|
def decorator(view_func):
|
|
cached_func = cache_page(timeout, key_prefix=key_prefix)(vary_on_headers('Accept-Language')(view_func))
|
|
@wraps(view_func)
|
|
def _wrapped_view(request, *args, **kwargs):
|
|
is_bookmark = (request.GET.get('is_bookmark') or request.GET.get('is_bookmarked') or '').lower()
|
|
if is_bookmark in ('true', '1'):
|
|
return view_func(request, *args, **kwargs)
|
|
return cached_func(request, *args, **kwargs)
|
|
return _wrapped_view
|
|
return decorator
|
|
from apps.library.views_admin import (
|
|
AdminAuthorViewSet,
|
|
AdminBookViewSet,
|
|
AdminLibraryCategoryViewSet,
|
|
AdminLibraryCollectionViewSet,
|
|
DovodiAdminLibraryCategoryViewSet,
|
|
DovodiAdminLibraryCollectionViewSet,
|
|
)
|
|
|
|
admin_router = SimpleRouter()
|
|
admin_router.register(r'books', AdminBookViewSet, basename='admin-library-books')
|
|
admin_router.register(r'authors', AdminAuthorViewSet, basename='admin-library-authors')
|
|
admin_router.register(r'categories', AdminLibraryCategoryViewSet, basename='admin-library-categories')
|
|
admin_router.register(r'dovodi-categories', DovodiAdminLibraryCategoryViewSet, basename='admin-library-dovodi-categories')
|
|
admin_router.register(r'collections', AdminLibraryCollectionViewSet, basename='admin-library-collections')
|
|
admin_router.register(r'dovodi-collections', DovodiAdminLibraryCollectionViewSet, basename='admin-library-dovodi-collections')
|
|
|
|
dovodi_router = SimpleRouter()
|
|
dovodi_router.register(r'collections', DovodiAdminLibraryCollectionViewSet, basename='dovodi-library-collections')
|
|
|
|
# Hide admin viewsets from swagger
|
|
for prefix, viewset, basename in admin_router.registry:
|
|
viewset.swagger_schema = None
|
|
|
|
urlpatterns = [
|
|
path('admin/', include(admin_router.urls)),
|
|
path('dovodi/', include(dovodi_router.urls)),
|
|
path('categories/', cached_view(CategoryListView.as_view()), name='category-list'),
|
|
path('pinned-collections/', cached_view(PinnedBookCollectionListView.as_view()), name='pinned-collection-list'),
|
|
path('collections/', cached_view(MiddleBookCollectionListView.as_view()), name='collection-list'),
|
|
path('authors/', cached_view(AuthorListView.as_view()), name='author-list'),
|
|
path('authors/<str:slug>/', AuthorDetailView.as_view(), name='author-detail'),
|
|
path('authors/<str:slug>/books/', AuthorBookListView.as_view(), name='author-books'),
|
|
path('books/', conditional_cached_view(60 * 30, 'library_books')(BookListView.as_view()), name='book-list'),
|
|
path('books/<str:slug>/', BookDetailView.as_view(), name='book-detail'),
|
|
path('books/downloaded/', DownloadedBooksListView.as_view(), name='downloaded-books-list'),
|
|
path('books/download/', BookDownloadCreateAPIView.as_view(), name='book-download'),
|
|
]
|