fix(api): permissions for teams

!16
This commit is contained in:
2024-06-01 22:07:13 +09:30
parent e7c535c48d
commit 09cc1db665
2 changed files with 90 additions and 16 deletions

View File

@ -42,6 +42,16 @@ class TeamSerializer(TeamSerializerBase):
return request.build_absolute_uri(reverse('API:_api_team_permission', args=[team.organization_id,team.id]))
def validate(self, data):
"""
Check that start is before finish.
"""
data['organization_id'] = self._context['view'].kwargs['organization_id']
return data
url = serializers.SerializerMethodField('team_url')
def team_url(self, obj):
@ -62,7 +72,8 @@ class TeamSerializer(TeamSerializerBase):
'url',
)
read_only_fields = [
'permissions'
'permissions',
'url'
]
@ -90,15 +101,17 @@ class OrganizationSerializer(serializers.ModelSerializer):
view_name="API:_api_organization", format="html"
)
teams = serializers.SerializerMethodField('get_url')
team_url = serializers.SerializerMethodField('get_url')
def get_url(self, obj):
request = self.context.get('request')
team = Team.objects.get(pk=obj.id)
team = Team.objects.filter(pk=obj.id)
return request.build_absolute_uri(reverse('API:_api_organization_teams', args=[team.organization_id]))
return request.build_absolute_uri(reverse('API:_api_organization_teams', args=[obj.id]))
teams = TeamSerializerBase(source='team_set', many=True, read_only=False)
view_name="API:_api_organization"
@ -110,4 +123,5 @@ class OrganizationSerializer(serializers.ModelSerializer):
"name",
'teams',
'url',
'team_url',
)

View File

@ -15,18 +15,24 @@ class OrganizationPermissionAPI(DjangoObjectPermissions, OrganizationMixin):
def has_permission(self, request, view):
self.request = request
return True
return self.permission_check(request, view)
def has_object_permission(self, request, view, obj):
return self.permission_check(request, view, obj)
def permission_check(self, request, view, obj=None) -> bool:
self.request = request
self.obj = obj
if hasattr(view, 'queryset'):
if view.queryset.model._meta:
self.obj = view.queryset.model
self.view = view
if obj and not self.obj:
self.obj = obj
method = self.request.method.lower()
@ -49,26 +55,61 @@ class OrganizationPermissionAPI(DjangoObjectPermissions, OrganizationMixin):
elif method == 'delete':
action = 'delete'
else:
action = 'view'
object_organization = None
permission = self.obj._meta.app_label + '.' + action + '_' + self.obj._meta.model_name
self.permission_required = [ permission ]
if not self.has_organization_permission() and not request.user.is_superuser:
if view:
if 'organization_id' in view.kwargs:
if view.kwargs['organization_id']:
object_organization = view.kwargs['organization_id']
if 'pk' in view.kwargs:
if not object_organization and view.queryset.model._meta.model_name == 'organization' and view.kwargs['pk']:
object_organization = view.kwargs['pk']
if obj:
if hasattr(self, 'obj') and not id:
if isinstance(self.obj, type):
boo = self.obj.organization.get_object()
if self.obj.get_organization():
object_organization = self.obj.get_organization().id
if self.obj.is_global:
object_organization = 0
if not self.has_organization_permission(object_organization) and not request.user.is_superuser:
return False
return True
class OrganizationList(generics.ListCreateAPIView):
permission_classes = [OrganizationPermissionAPI]
permission_classes = [
OrganizationPermissionAPI
]
queryset = Organization.objects.all()
lookup_field = 'pk'
@ -82,9 +123,11 @@ class OrganizationList(generics.ListCreateAPIView):
class OrganizationDetail(generics.RetrieveUpdateDestroyAPIView):
permission_classes = [OrganizationPermissionAPI]
permission_classes = [
OrganizationPermissionAPI
]
queryset = Organization.objects.filter()
queryset = Organization.objects.all()
lookup_field = 'pk'
serializer_class = OrganizationSerializer
@ -95,9 +138,15 @@ class OrganizationDetail(generics.RetrieveUpdateDestroyAPIView):
class TeamList(generics.ListCreateAPIView):
queryset = Team.objects.filter()
permission_classes = [
OrganizationPermissionAPI
]
queryset = Team.objects.all()
serializer_class = TeamSerializer
def get_queryset(self):
self.queryset = Team.objects.filter(organization=self.kwargs['organization_id'])
@ -111,14 +160,25 @@ class TeamList(generics.ListCreateAPIView):
class TeamDetail(generics.RetrieveUpdateDestroyAPIView):
permission_classes = [
OrganizationPermissionAPI
]
queryset = Team.objects.all()
serializer_class = TeamSerializer
lookup_field = 'group_ptr_id'
class TeamPermissionDetail(routers.APIRootView):
# temp disabled until permission checker updated
# permission_classes = [
# OrganizationPermissionAPI
# ]
def get(self, request, *args, **kwargs):