11from django .apps import apps
22from rest_framework import serializers
33
4- from ..models import DABContentType , DABPermission , RoleTeamAssignment , RoleUserAssignment
4+ from ..models import DABContentType , DABPermission , RoleDefinition , RoleTeamAssignment , RoleUserAssignment
55from ..remote import RemoteObject
66
77
@@ -21,13 +21,27 @@ class Meta:
2121 fields = ['api_slug' , 'codename' , 'content_type' , 'name' ]
2222
2323
24+ class ActorAnsibleIDField (serializers .Field ):
25+ def to_representation (self , actor ):
26+ return str (actor .resource .ansible_id )
27+
28+ def to_internal_value (self , data ):
29+ resource_cls = apps .get_model ('dab_resource_registry' , 'Resource' )
30+ try :
31+ resource = resource_cls .objects .get (ansible_id = data )
32+ except resource_cls .DoesNotExist :
33+ raise serializers .ValidationError (f"No { self .source } found with ansible_id={ data } " )
34+
35+ return resource .content_object
36+
37+
2438assignment_common_fields = ('created' , 'created_by_ansible_id' , 'object_id' , 'object_ansible_id' , 'content_type' , 'role_definition' )
2539
2640
2741class BaseAssignmentSerializer (serializers .ModelSerializer ):
2842 content_type = serializers .SlugRelatedField (read_only = True , slug_field = 'api_slug' )
29- role_definition = serializers .SlugRelatedField (read_only = True , slug_field = 'name' )
30- created_by_ansible_id = serializers . SerializerMethodField ( )
43+ role_definition = serializers .SlugRelatedField (slug_field = 'name' , queryset = RoleDefinition . objects . all () )
44+ created_by_ansible_id = ActorAnsibleIDField ( source = 'created_by' , required = False )
3145 object_ansible_id = serializers .SerializerMethodField ()
3246 # TODO: use the from_service to control what we sync back to
3347 from_service = serializers .CharField (write_only = True )
@@ -44,35 +58,25 @@ def get_object_ansible_id(self, obj):
4458 return None
4559
4660 def find_existing_assignment (self , queryset ):
47- actor_ansible_id = self .validated_data [f' { self .actor_field } _ansible_id' ]
61+ actor = self .validated_data [self .actor_field ]
4862 object_id = self .validated_data ['object_id' ]
4963 role_definition = self .validated_data ['role_definition' ]
50-
51- resource_cls = apps .get_model ('dab_resource_registry' , 'Resource' )
52- actor_resource = resource_cls .objects .get (ansible_id = actor_ansible_id )
53- actor = actor_resource .content_object
5464 return queryset .filter (object_id = object_id , role_definition = role_definition , ** {self .actor_field : actor }).first ()
5565
5666
5767class RoleUserAssignmentSerializer (BaseAssignmentSerializer ):
58- user_ansible_id = serializers . SerializerMethodField ( )
68+ user_ansible_id = ActorAnsibleIDField ( source = 'user' , required = True )
5969 actor_field = 'user'
6070
6171 class Meta :
6272 model = RoleUserAssignment
6373 fields = assignment_common_fields + ('user_ansible_id' ,)
6474
65- def get_user_ansible_id (self , obj ):
66- return str (obj .user .resource .ansible_id )
67-
6875
6976class RoleTeamAssignmentSerializer (BaseAssignmentSerializer ):
70- user_ansible_id = serializers . SerializerMethodField ( )
77+ team_ansible_id = ActorAnsibleIDField ( source = 'team' , required = True )
7178 actor_field = 'team'
7279
7380 class Meta :
7481 model = RoleTeamAssignment
7582 fields = assignment_common_fields + ('team_ansible_id' ,)
76-
77- def get_team_ansible_id (self , obj ):
78- return str (obj .team .resource .ansible_id )
0 commit comments