Skip to content

Commit 9938ac8

Browse files
committed
Add typing to inform spectacular of field details
1 parent 2bf1cae commit 9938ac8

1 file changed

Lines changed: 18 additions & 7 deletions

File tree

ansible_base/rbac/api/serializers.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import logging
2+
from typing import TypedDict
23

34
from django.apps import apps
45
from django.core.exceptions import ObjectDoesNotExist
@@ -260,6 +261,16 @@ class RoleMetadataSerializer(serializers.Serializer):
260261
allowed_permissions = serializers.DictField(help_text=_('A List of permissions allowed for a role definition, given its content type.'))
261262

262263

264+
class RoleDefinitionSummary(TypedDict):
265+
name: str
266+
url: str
267+
268+
269+
class AssignmentSummary(TypedDict):
270+
type: str
271+
role_definition: RoleDefinitionSummary
272+
273+
263274
class AccessListMixin:
264275

265276
def _get_related(self, obj) -> dict[str, str]:
@@ -286,11 +297,11 @@ def _get_related(self, obj) -> dict[str, str]:
286297
return related_fields
287298

288299
@staticmethod
289-
def summarize_role_definition(role_definition):
300+
def summarize_role_definition(role_definition) -> RoleDefinitionSummary:
290301
return {"name": role_definition.name, "url": get_url_for_object(role_definition)}
291302

292303
@staticmethod
293-
def summarize_assignment_list(assignment_qs, obj_ct):
304+
def summarize_assignment_list(assignment_qs, obj_ct) -> list[AssignmentSummary]:
294305
assignment_list = []
295306
team_ct = DABContentType.objects.get_for_model(get_team_model())
296307
for assignment in assignment_qs.distinct():
@@ -306,7 +317,7 @@ def summarize_assignment_list(assignment_qs, obj_ct):
306317

307318
return assignment_list
308319

309-
def get_object_role_assignments(self, actor):
320+
def get_object_role_assignments(self, actor) -> list[AssignmentSummary]:
310321
obj = self.context.get("related_object")
311322
permission = self.context.get("permission")
312323
ct = self.context.get("content_type")
@@ -325,26 +336,26 @@ def get_url(self, obj) -> str:
325336
class UserAccessListMixin(AccessListMixin, serializers.ModelSerializer):
326337
"controller uses auth.User model so this needs to be as compatible as possible, thus ModelSerializer"
327338

328-
object_role_assignments = serializers.SerializerMethodField()
339+
object_role_assignments: list[AssignmentSummary] = serializers.SerializerMethodField()
329340
url = serializers.SerializerMethodField()
330341
related = serializers.SerializerMethodField('_get_related')
331342
_expected_fields = ['id', 'url', 'related', 'username', 'is_superuser', 'first_name', 'last_name', 'object_role_assignments']
332343

333344

334345
class TeamAccessListMixin(AccessListMixin, AbstractCommonModelSerializer):
335-
object_role_assignments = serializers.SerializerMethodField()
346+
object_role_assignments: list[AssignmentSummary] = serializers.SerializerMethodField()
336347
url = serializers.SerializerMethodField()
337348
related = serializers.SerializerMethodField('_get_related')
338349
_expected_fields = ['id', 'url', 'related', 'name', 'organization', 'object_role_assignments']
339350

340351

341352
class UserAccessAssignmentSerializer(RoleUserAssignmentSerializer):
342-
intermediary_roles = serializers.SerializerMethodField()
353+
intermediary_roles: list[AssignmentSummary] = serializers.SerializerMethodField()
343354

344355
class Meta(RoleUserAssignmentSerializer.Meta):
345356
fields = RoleUserAssignmentSerializer.Meta.fields + ['intermediary_roles']
346357

347-
def get_intermediary_roles(self, assignment):
358+
def get_intermediary_roles(self, assignment: RoleUserAssignment) -> list[AssignmentSummary]:
348359
team_ct = DABContentType.objects.get_for_model(get_team_model())
349360

350361
permission = self.context.get("permission")

0 commit comments

Comments
 (0)