Skip to content

Commit 83edbe6

Browse files
committed
Fix url resolving in user/group role serializers
This also adds a corresponding PRN field. fixes pulp#6330
1 parent 240745e commit 83edbe6

File tree

3 files changed

+61
-22
lines changed

3 files changed

+61
-22
lines changed

CHANGES/6330.bugfix

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fixed a server error when listing user roles.

pulpcore/app/serializers/user.py

+56-19
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@
2424
PRNField,
2525
)
2626
from pulpcore.app.util import (
27-
get_viewset_for_model,
2827
get_request_without_query_params,
28+
get_url,
29+
get_prn,
30+
resolve_prn,
2931
)
3032

3133
User = get_user_model()
@@ -60,27 +62,42 @@ def to_internal_value(self, data):
6062
class ContentObjectField(serializers.CharField):
6163
"""Content object field"""
6264

63-
def to_representation(self, obj):
64-
content_object = getattr(obj, "content_object", None)
65-
if content_object:
66-
viewset = get_viewset_for_model(obj.content_object)
67-
65+
def to_representation(self, value):
66+
if value is None:
67+
return None
68+
else:
6869
request = get_request_without_query_params(self.context)
70+
return get_url(value, request=request)
6971

70-
serializer = viewset.serializer_class(obj.content_object, context={"request": request})
71-
return serializer.data.get("pulp_href")
72-
73-
def to_internal_value(self, data):
72+
def to_internal_value(self, value):
7473
# ... circular import ...
7574
from pulpcore.app.viewsets.base import NamedModelViewSet
7675

77-
if data is None:
78-
return {"content_object": None}
79-
try:
80-
obj = NamedModelViewSet.get_resource(data)
81-
except serializers.ValidationError:
82-
raise serializers.ValidationError(_("Invalid value: {}.").format(data))
83-
return {"content_object": obj}
76+
if value is None:
77+
return None
78+
else:
79+
try:
80+
obj = NamedModelViewSet.get_resource(value)
81+
except serializers.ValidationError:
82+
raise serializers.ValidationError(_("Invalid value: {}.").format(value))
83+
return obj
84+
85+
86+
class ContentObjectPRNField(serializers.CharField):
87+
"""Content object PRN field"""
88+
89+
def to_representation(self, value):
90+
if value is None:
91+
return None
92+
else:
93+
return get_prn(value)
94+
95+
def to_internal_value(self, value):
96+
if value is None:
97+
return None
98+
else:
99+
model, pk = resolve_prn(value)
100+
return model.objects.get(pk=pk)
84101

85102

86103
class UserGroupSerializer(serializers.ModelSerializer):
@@ -308,10 +325,19 @@ class UserRoleSerializer(ValidateRoleMixin, ModelSerializer, NestedHyperlinkedMo
308325
"pulp_href of the object for which role permissions should be asserted. "
309326
"If set to 'null', permissions will act on either domain or model-level."
310327
),
311-
source="*",
312328
allow_null=True,
313329
)
314330

331+
content_object_prn = ContentObjectPRNField(
332+
help_text=_(
333+
"prn of the object for which role permissions should be asserted. "
334+
"If set to 'null', permissions will act on either domain or model-level."
335+
),
336+
source="content_object",
337+
allow_null=True,
338+
required=False,
339+
)
340+
315341
domain = RelatedField(
316342
help_text=_(
317343
"Domain this role should be applied on, mutually exclusive with content_object."
@@ -343,6 +369,7 @@ class Meta:
343369
fields = ModelSerializer.Meta.fields + (
344370
"role",
345371
"content_object",
372+
"content_object_prn",
346373
"description",
347374
"permissions",
348375
"domain",
@@ -366,10 +393,19 @@ class GroupRoleSerializer(ValidateRoleMixin, ModelSerializer, NestedHyperlinkedM
366393
"pulp_href of the object for which role permissions should be asserted. "
367394
"If set to 'null', permissions will act on the model-level."
368395
),
369-
source="*",
370396
allow_null=True,
371397
)
372398

399+
content_object_prn = ContentObjectPRNField(
400+
help_text=_(
401+
"prn of the object for which role permissions should be asserted. "
402+
"If set to 'null', permissions will act on either domain or model-level."
403+
),
404+
source="content_object",
405+
allow_null=True,
406+
required=False,
407+
)
408+
373409
domain = RelatedField(
374410
help_text=_(
375411
"Domain this role should be applied on, mutually exclusive with content_object."
@@ -403,6 +439,7 @@ class Meta:
403439
fields = ModelSerializer.Meta.fields + (
404440
"role",
405441
"content_object",
442+
"content_object_prn",
406443
"description",
407444
"permissions",
408445
"domain",

pulpcore/app/util.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -66,18 +66,19 @@ def get_url(model, domain=None, request=None):
6666
str: The path component of the resource url
6767
"""
6868
kwargs = {}
69-
view_action = "list"
7069
if settings.DOMAIN_ENABLED:
7170
kwargs["pulp_domain"] = "default"
72-
if not domain and hasattr(model, "pulp_domain") and isinstance(model, model._meta.model):
71+
if not domain and hasattr(model, "pulp_domain") and isinstance(model, Model):
7372
kwargs["pulp_domain"] = model.pulp_domain.name
7473
elif isinstance(domain, models.Domain):
7574
kwargs["pulp_domain"] = domain.name
7675
elif isinstance(domain, str):
7776
kwargs["pulp_domain"] = domain
78-
if isinstance(model, model._meta.model):
77+
if isinstance(model, Model):
7978
view_action = "detail"
8079
kwargs["pk"] = model.pk
80+
else:
81+
view_action = "list"
8182

8283
return reverse(get_view_name_for_model(model, view_action), kwargs=kwargs, request=request)
8384

0 commit comments

Comments
 (0)