mirror of
https://github.com/IRBorisov/ConceptPortal.git
synced 2025-06-26 13:00:39 +03:00
Implement special data loading for admins
This commit is contained in:
parent
dcaf930570
commit
dc1024dce1
|
@ -29,7 +29,7 @@ class EndpointTester(APITestCase):
|
|||
self.client = APIClient()
|
||||
self.client.force_authenticate(user=self.user)
|
||||
|
||||
def toggle_staff(self, value: bool = True):
|
||||
def toggle_admin(self, value: bool = True):
|
||||
self.user.is_staff = value
|
||||
self.user.save()
|
||||
|
||||
|
|
|
@ -66,7 +66,7 @@ class TestLibraryViewset(EndpointTester):
|
|||
self.assertTrue(response.status_code in [status.HTTP_202_ACCEPTED, status.HTTP_204_NO_CONTENT])
|
||||
|
||||
self.assertForbidden(item=self.unowned.id)
|
||||
self.toggle_staff(True)
|
||||
self.toggle_admin(True)
|
||||
response = self.execute(item=self.unowned.id)
|
||||
self.assertTrue(response.status_code in [status.HTTP_202_ACCEPTED, status.HTTP_204_NO_CONTENT])
|
||||
|
||||
|
@ -111,6 +111,21 @@ class TestLibraryViewset(EndpointTester):
|
|||
self.assertFalse(response_contains(response, self.owned))
|
||||
|
||||
|
||||
@decl_endpoint('/api/library/all', method='get')
|
||||
def test_retrieve_all(self):
|
||||
self.toggle_admin(False)
|
||||
self.assertForbidden()
|
||||
self.toggle_admin(True)
|
||||
response = self.execute()
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
self.assertTrue(response_contains(response, self.common))
|
||||
self.assertTrue(response_contains(response, self.unowned))
|
||||
self.assertTrue(response_contains(response, self.owned))
|
||||
|
||||
self.logout()
|
||||
self.assertForbidden()
|
||||
|
||||
|
||||
@decl_endpoint('/api/library/active', method='get')
|
||||
def test_retrieve_subscribed(self):
|
||||
response = self.execute()
|
||||
|
|
|
@ -8,7 +8,8 @@ library_router.register('library', views.LibraryViewSet, 'Library')
|
|||
library_router.register('rsforms', views.RSFormViewSet, 'RSForm')
|
||||
|
||||
urlpatterns = [
|
||||
path('library/active', views.LibraryActiveView.as_view(), name='library'),
|
||||
path('library/active', views.LibraryActiveView.as_view()),
|
||||
path('library/all', views.LibraryAdminView.as_view()),
|
||||
path('library/templates', views.LibraryTemplatesView.as_view(), name='templates'),
|
||||
path('constituents/<int:pk>', views.ConstituentAPIView.as_view(), name='constituenta-detail'),
|
||||
path('rsforms/import-trs', views.TrsImportView.as_view()),
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
''' REST API: Endpoint processors. '''
|
||||
from .library import (
|
||||
LibraryActiveView,
|
||||
LibraryAdminView,
|
||||
LibraryTemplatesView,
|
||||
LibraryViewSet
|
||||
)
|
||||
|
|
|
@ -34,6 +34,17 @@ class LibraryActiveView(generics.ListAPIView):
|
|||
).distinct().order_by('-time_update')
|
||||
|
||||
|
||||
@extend_schema(tags=['Library'])
|
||||
@extend_schema_view()
|
||||
class LibraryAdminView(generics.ListAPIView):
|
||||
''' Endpoint: Get list of all library items. Admin only '''
|
||||
permission_classes = (permissions.IsAdminUser,)
|
||||
serializer_class = s.LibraryItemSerializer
|
||||
|
||||
def get_queryset(self):
|
||||
return m.LibraryItem.objects.all().order_by('-time_update')
|
||||
|
||||
|
||||
@extend_schema(tags=['Library'])
|
||||
@extend_schema_view()
|
||||
class LibraryTemplatesView(generics.ListAPIView):
|
||||
|
|
|
@ -192,6 +192,14 @@ export function getLibrary(request: FrontPull<ILibraryItem[]>) {
|
|||
});
|
||||
}
|
||||
|
||||
export function getAdminLibrary(request: FrontPull<ILibraryItem[]>) {
|
||||
AxiosGet({
|
||||
title: 'All LibraryItems list',
|
||||
endpoint: '/api/library/all',
|
||||
request: request
|
||||
});
|
||||
}
|
||||
|
||||
export function getTemplates(request: FrontPull<ILibraryItem[]>) {
|
||||
AxiosGet({
|
||||
title: 'Available LibraryItems list',
|
||||
|
|
|
@ -2,23 +2,25 @@
|
|||
|
||||
import { createContext, useCallback, useContext, useEffect, useState } from 'react';
|
||||
|
||||
import { ErrorData } from '@/components/info/InfoError';
|
||||
import { ILibraryItem } from '@/models/library';
|
||||
import { matchLibraryItem } from '@/models/libraryAPI';
|
||||
import { ILibraryFilter } from '@/models/miscellaneous';
|
||||
import { IRSForm, IRSFormCloneData, IRSFormCreateData, IRSFormData } from '@/models/rsform';
|
||||
import { RSFormLoader } from '@/models/RSFormLoader';
|
||||
import {
|
||||
DataCallback,
|
||||
deleteLibraryItem,
|
||||
getAdminLibrary,
|
||||
getLibrary,
|
||||
getRSFormDetails,
|
||||
getTemplates,
|
||||
postCloneLibraryItem,
|
||||
postNewRSForm
|
||||
} from '@/app/backendAPI';
|
||||
import { ErrorData } from '@/components/info/InfoError';
|
||||
import { ILibraryItem } from '@/models/library';
|
||||
import { matchLibraryItem } from '@/models/libraryAPI';
|
||||
import { ILibraryFilter } from '@/models/miscellaneous';
|
||||
import { IRSForm, IRSFormCloneData, IRSFormCreateData, IRSFormData } from '@/models/rsform';
|
||||
import { RSFormLoader } from '@/models/RSFormLoader';
|
||||
|
||||
import { useAuth } from './AuthContext';
|
||||
import { useConceptOptions } from './OptionsContext';
|
||||
|
||||
interface ILibraryContext {
|
||||
items: ILibraryItem[];
|
||||
|
@ -53,6 +55,7 @@ interface LibraryStateProps {
|
|||
|
||||
export const LibraryState = ({ children }: LibraryStateProps) => {
|
||||
const { user } = useAuth();
|
||||
const { adminMode } = useConceptOptions();
|
||||
|
||||
const [items, setItems] = useState<ILibraryItem[]>([]);
|
||||
const [templates, setTemplates] = useState<ILibraryItem[]>([]);
|
||||
|
@ -109,19 +112,36 @@ export const LibraryState = ({ children }: LibraryStateProps) => {
|
|||
[cachedTemplates]
|
||||
);
|
||||
|
||||
const reload = useCallback((callback?: () => void) => {
|
||||
setItems([]);
|
||||
setError(undefined);
|
||||
getLibrary({
|
||||
setLoading: setLoading,
|
||||
showError: true,
|
||||
onError: setError,
|
||||
onSuccess: newData => {
|
||||
setItems(newData);
|
||||
if (callback) callback();
|
||||
const reloadItems = useCallback(
|
||||
(callback?: () => void) => {
|
||||
setItems([]);
|
||||
setError(undefined);
|
||||
if (user?.is_staff && adminMode) {
|
||||
getAdminLibrary({
|
||||
setLoading: setLoading,
|
||||
showError: true,
|
||||
onError: setError,
|
||||
onSuccess: newData => {
|
||||
setItems(newData);
|
||||
if (callback) callback();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
getLibrary({
|
||||
setLoading: setLoading,
|
||||
showError: true,
|
||||
onError: setError,
|
||||
onSuccess: newData => {
|
||||
setItems(newData);
|
||||
if (callback) callback();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
[user, adminMode]
|
||||
);
|
||||
|
||||
const reloadTemplates = useCallback(() => {
|
||||
setTemplates([]);
|
||||
getTemplates({
|
||||
showError: true,
|
||||
|
@ -130,8 +150,12 @@ export const LibraryState = ({ children }: LibraryStateProps) => {
|
|||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
reload();
|
||||
}, [reload, user]);
|
||||
reloadItems();
|
||||
}, [reloadItems]);
|
||||
|
||||
useEffect(() => {
|
||||
reloadTemplates();
|
||||
}, [reloadTemplates]);
|
||||
|
||||
const localUpdateItem = useCallback(
|
||||
(data: ILibraryItem) => {
|
||||
|
@ -160,7 +184,7 @@ export const LibraryState = ({ children }: LibraryStateProps) => {
|
|||
setLoading: setProcessing,
|
||||
onError: setError,
|
||||
onSuccess: newSchema =>
|
||||
reload(() => {
|
||||
reloadItems(() => {
|
||||
if (user && !user.subscriptions.includes(newSchema.id)) {
|
||||
user.subscriptions.push(newSchema.id);
|
||||
}
|
||||
|
@ -168,7 +192,7 @@ export const LibraryState = ({ children }: LibraryStateProps) => {
|
|||
})
|
||||
});
|
||||
},
|
||||
[reload, user]
|
||||
[reloadItems, user]
|
||||
);
|
||||
|
||||
const destroyItem = useCallback(
|
||||
|
@ -179,7 +203,7 @@ export const LibraryState = ({ children }: LibraryStateProps) => {
|
|||
setLoading: setProcessing,
|
||||
onError: setError,
|
||||
onSuccess: () =>
|
||||
reload(() => {
|
||||
reloadItems(() => {
|
||||
if (user && user.subscriptions.includes(target)) {
|
||||
user.subscriptions.splice(
|
||||
user.subscriptions.findIndex(item => item === target),
|
||||
|
@ -190,7 +214,7 @@ export const LibraryState = ({ children }: LibraryStateProps) => {
|
|||
})
|
||||
});
|
||||
},
|
||||
[setError, reload, user]
|
||||
[setError, reloadItems, user]
|
||||
);
|
||||
|
||||
const cloneItem = useCallback(
|
||||
|
@ -205,7 +229,7 @@ export const LibraryState = ({ children }: LibraryStateProps) => {
|
|||
setLoading: setProcessing,
|
||||
onError: setError,
|
||||
onSuccess: newSchema =>
|
||||
reload(() => {
|
||||
reloadItems(() => {
|
||||
if (user && !user.subscriptions.includes(newSchema.id)) {
|
||||
user.subscriptions.push(newSchema.id);
|
||||
}
|
||||
|
@ -213,7 +237,7 @@ export const LibraryState = ({ children }: LibraryStateProps) => {
|
|||
})
|
||||
});
|
||||
},
|
||||
[reload, setError, user]
|
||||
[reloadItems, setError, user]
|
||||
);
|
||||
|
||||
return (
|
||||
|
|
Loading…
Reference in New Issue
Block a user