Coverage for src/backend/InvenTree/InvenTree/helpers_api.py: 88%

14 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-07 17:47 +0000

1"""Helpers for InvenTrees way of using drf viewset.""" 

2 

3from rest_framework import mixins, routers, viewsets 

4 

5from InvenTree.api import BulkDeleteViewsetMixin 

6 

7 

8class RetrieveUpdateDestroyModelViewSet( 

9 mixins.RetrieveModelMixin, 

10 mixins.UpdateModelMixin, 

11 mixins.DestroyModelMixin, 

12 mixins.ListModelMixin, 

13 viewsets.GenericViewSet, 

14): 

15 """Viewset which provides 'retrieve', 'update', 'destroy' and 'list' actions.""" 

16 

17 

18class RetrieveDestroyModelViewSet( 

19 mixins.RetrieveModelMixin, 

20 mixins.DestroyModelMixin, 

21 mixins.ListModelMixin, 

22 viewsets.GenericViewSet, 

23): 

24 """Viewset which provides 'retrieve', 'destroy' and 'list' actions.""" 

25 

26 

27class InvenTreeApiRouter(routers.SimpleRouter): 

28 """Custom router which adds various specific functions. 

29 

30 Currently adds the following features: 

31 - support for bulk delete operations 

32 """ 

33 

34 def get_routes(self, viewset): 

35 """Override the default get_routes method to add bulk delete support.""" 

36 routes = super().get_routes(viewset) 

37 

38 if issubclass(viewset, BulkDeleteViewsetMixin): 

39 list_route = next( 

40 (route for route in routes if route.mapping.get('get') == 'list'), None 

41 ) 

42 list_route.mapping['delete'] = 'bulk_delete' 

43 

44 return routes 

45 

46 def get_default_basename(self, viewset): 

47 """Extract the default base name from the viewset.""" 

48 basename = super().get_default_basename(viewset) 

49 return 'api-' + basename