from django.conf import settings from rest_framework.request import Request from assets.pagination import AssetPaginationBase from perms.models import UserAssetGrantedTreeNodeRelation from common.utils import get_logger logger = get_logger(__name__) class GrantedAssetPaginationBase(AssetPaginationBase): _user: object def init_attrs(self, queryset, request: Request, view=None): super().init_attrs(queryset, request, view) self._user = view.user class NodePermedAssetPagination(GrantedAssetPaginationBase): def get_count_from_nodes(self, queryset): node = getattr(self._view, 'pagination_node', None) if node: logger.debug(f'Hit node.assets_amount[{node.assets_amount}] -> ' f'{self._request.get_full_path()}') return node.assets_amount else: logger.warn(f'Not hit node.assets_amount[{node}] because {self._view} ' f'not has `pagination_node` -> {self._request.get_full_path()}') return None class AllPermedAssetPagination(GrantedAssetPaginationBase): def get_count_from_nodes(self, queryset): if settings.PERM_SINGLE_ASSET_TO_UNGROUP_NODE: return None values = UserAssetGrantedTreeNodeRelation.objects.filter( user=self._user, node_parent_key='' ).values_list('node_assets_amount', flat=True) if not values: return None assets_amount = sum(values) logger.debug(f'Hit all assets amount {assets_amount} -> {self._request.get_full_path()}') return assets_amount