|
19 | 19 | from django.shortcuts import get_object_or_404 |
20 | 20 | from django.db import transaction |
21 | 21 | from drf_spectacular.utils import extend_schema, extend_schema_view |
| 22 | +from django.contrib.auth.models import Permission |
| 23 | + |
22 | 24 |
|
23 | 25 | from main.utils import SpreadSheetContentNegotiation |
24 | 26 | from .admin_classes import RegionRestrictedAdmin |
@@ -723,8 +725,35 @@ class PerDocumentUploadViewSet(viewsets.ModelViewSet): |
723 | 725 | serializer_class = PerDocumentUploadSerializer |
724 | 726 | filterset_class = PerDocumentFilter |
725 | 727 | permission_classes = [permissions.IsAuthenticated, PerDocumentUploadPermission] |
726 | | - get_request_user_regions = RegionRestrictedAdmin.get_request_user_regions |
727 | | - get_filtered_queryset = RegionRestrictedAdmin.get_filtered_queryset |
| 728 | + |
| 729 | + def filter_per_queryset_by_user_access(self, user, queryset): |
| 730 | + if user.is_superuser or user.has_perm("api.per_core_admin"): |
| 731 | + return queryset |
| 732 | + # Check if country admin |
| 733 | + per_admin_country_id = [ |
| 734 | + codename.replace('per_country_admin_', '') |
| 735 | + for codename in Permission.objects.filter( |
| 736 | + group__user=user, |
| 737 | + codename__startswith='per_country_admin_', |
| 738 | + ).values_list('codename', flat=True) |
| 739 | + ] |
| 740 | + per_admin_region_id = [ |
| 741 | + codename.replace('per_region_admin_', '') |
| 742 | + for codename in Permission.objects.filter( |
| 743 | + group__user=user, |
| 744 | + codename__startswith='per_region_admin_', |
| 745 | + ).values_list('codename', flat=True) |
| 746 | + ] |
| 747 | + if len(per_admin_country_id) or len(per_admin_region_id): |
| 748 | + return queryset.filter( |
| 749 | + Q(created_by=user)| |
| 750 | + Q(country__in=per_admin_country_id) | |
| 751 | + Q(country__region__in=per_admin_region_id) |
| 752 | + ).distinct() |
| 753 | + # Normal access |
| 754 | + return queryset.filter(created_by=user) |
728 | 755 |
|
729 | 756 | def get_queryset(self): |
730 | | - return super().get_queryset().filter(created_by=self.request.user) |
| 757 | + queryset = super().get_queryset() |
| 758 | + user = self.request.user |
| 759 | + return self.filter_per_queryset_by_user_access(user, queryset) |
0 commit comments