Skip to content

Commit 1d95465

Browse files
committed
refine the code
Signed-off-by: tdruez <tdruez@aboutcode.org>
1 parent 12f1205 commit 1d95465

3 files changed

Lines changed: 30 additions & 25 deletions

File tree

dje/api.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -411,18 +411,19 @@ def get_queryset(self):
411411

412412
# Support for `many=True`
413413
serializer_field = self.parent if isinstance(self.parent, ManyRelatedField) else self
414-
415-
model_class = serializer_field.parent.Meta.model
416-
field_name = serializer_field.source
417-
field = model_class._meta.get_field(field_name)
418414
user = self.context["request"].user
419415

420-
if not queryset:
421-
manager = field.related_model.objects
422-
if is_secured(manager):
423-
queryset = manager.get_queryset(user=user)
424-
else:
425-
queryset = manager.all()
416+
if not queryset or self.scope_content_type:
417+
model_class = serializer_field.parent.Meta.model
418+
field_name = serializer_field.source
419+
field = model_class._meta.get_field(field_name)
420+
421+
if not queryset:
422+
manager = field.related_model.objects
423+
if is_secured(manager):
424+
queryset = manager.get_queryset(user=user)
425+
else:
426+
queryset = manager.all()
426427

427428
queryset = queryset.scope(user.dataspace)
428429

dje/api_permissions.py

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
# See https://aboutcode.org for more information about AboutCode FOSS projects.
77
#
88

9+
910
from django.contrib.auth import get_user_model
1011
from django.core.exceptions import ObjectDoesNotExist
1112

@@ -20,6 +21,8 @@
2021
from rest_framework.decorators import action
2122
from rest_framework.response import Response
2223

24+
from dje.api import DataspacedSlugRelatedField
25+
2326
User = get_user_model()
2427

2528

@@ -49,16 +52,11 @@ class ObjectPermissionSerializer(serializers.Serializer):
4952
"""
5053
Generic serializer for representing or updating object-level permissions.
5154
Accepts:
52-
- user: user ID
55+
- user: username
5356
- permissions: list of permission codenames
5457
"""
5558

56-
# TODO: Scope by dataspace, see DataspacedSlugRelatedField
57-
user = serializers.SlugRelatedField(
58-
queryset=User.objects.all(),
59-
slug_field="username",
60-
)
61-
# user = DataspacedSlugRelatedField(slug_field="username")
59+
user = DataspacedSlugRelatedField(queryset=User.objects.all(), slug_field="username")
6260
permissions = serializers.ListField(child=serializers.CharField(), allow_empty=False)
6361

6462
class Meta:
@@ -101,12 +99,11 @@ def manage_permissions(self, request, *args, **kwargs):
10199
Manage object-level permissions for this object.
102100
103101
- GET: List users and their permissions.
104-
- POST: Assign permissions to a user. Provide `user` ID and `permissions` list.
105-
- DELETE: Remove permissions from a user. Provide `user` ID and `permissions`
106-
list.
102+
- POST: Assign permissions to a user. Provide `user` and `permissions` list.
103+
- DELETE: Remove permissions from a user. Provide `user` and `permissions` list.
107104
"""
108105
obj = self.get_object()
109-
serializer_context = {"object": obj}
106+
serializer_context = {**self.get_serializer_context(), "object": obj}
110107

111108
if request.method == "GET":
112109
users_with_perms = get_users_with_perms(obj, attach_perms=True)
@@ -128,8 +125,8 @@ def manage_permissions(self, request, *args, **kwargs):
128125
for perm in perms:
129126
try:
130127
assign_perm(perm, user, obj)
131-
except ObjectDoesNotExist as e:
132-
errors.append(f"Cannot assign permission '{perm}': {str(e)}")
128+
except ObjectDoesNotExist:
129+
errors.append(f"Cannot assign permission '{perm}' due to an internal error.")
133130

134131
if errors:
135132
return Response({"errors": errors}, status=status.HTTP_400_BAD_REQUEST)
@@ -141,8 +138,8 @@ def manage_permissions(self, request, *args, **kwargs):
141138
for perm in perms:
142139
try:
143140
remove_perm(perm, user, obj)
144-
except ObjectDoesNotExist as e:
145-
errors.append(f"Cannot remove permission '{perm}': {str(e)}")
141+
except ObjectDoesNotExist:
142+
errors.append(f"Cannot assign permission '{perm}' due to an internal error.")
146143

147144
if errors:
148145
return Response({"errors": errors}, status=status.HTTP_400_BAD_REQUEST)

product_portfolio/tests/test_api.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -650,6 +650,13 @@ def test_api_product_endpoint_manage_permissions_action(self):
650650
self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code)
651651
self.assertIn("errors", response.data)
652652

653+
# User from another dataspace is rejected (dataspace scoping)
654+
other_dataspace_user = create_user("other_ds_user", self.alternate_dataspace)
655+
data = {"user": other_dataspace_user.username, "permissions": ["view_product"]}
656+
response = self.client.post(url, data, format="json")
657+
self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code)
658+
self.assertIn("errors", response.data)
659+
653660

654661
class ProductRelatedAPITestCase(TestCase):
655662
def setUp(self):

0 commit comments

Comments
 (0)