From 5a4451ddd4f96d69306fdfc3d1670b0690263b26 Mon Sep 17 00:00:00 2001 From: Guoqiang Zhang Date: Sun, 1 Jul 2018 15:33:54 -0400 Subject: [PATCH] Fix serializers of unified_jobs & ad_hoc_commands to avoid special exceptions --- awx/api/serializers.py | 17 ++++++++++------- awx/main/access.py | 33 ++++++++++++++++++--------------- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 2dde811429..0b0e9e3f29 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -375,7 +375,10 @@ class BaseSerializer(serializers.ModelSerializer): isinstance(obj, Project)): continue - fkval = getattr(obj, fk, None) + try: + fkval = getattr(obj, fk, None) + except ObjectDoesNotExist: + continue if fkval is None: continue if fkval == obj: @@ -3430,10 +3433,10 @@ class AdHocCommandSerializer(UnifiedJobSerializer): def get_related(self, obj): res = super(AdHocCommandSerializer, self).get_related(obj) - if obj.inventory: - res['inventory'] = self.reverse('api:inventory_detail', kwargs={'pk': obj.inventory.pk}) - if obj.credential: - res['credential'] = self.reverse('api:credential_detail', kwargs={'pk': obj.credential.pk}) + if obj.inventory_id: + res['inventory'] = self.reverse('api:inventory_detail', kwargs={'pk': obj.inventory_id}) + if obj.credential_id: + res['credential'] = self.reverse('api:credential_detail', kwargs={'pk': obj.credential_id}) res.update(dict( events = self.reverse('api:ad_hoc_command_ad_hoc_command_events_list', kwargs={'pk': obj.pk}), activity_stream = self.reverse('api:ad_hoc_command_activity_stream_list', kwargs={'pk': obj.pk}), @@ -3445,9 +3448,9 @@ class AdHocCommandSerializer(UnifiedJobSerializer): def to_representation(self, obj): ret = super(AdHocCommandSerializer, self).to_representation(obj) - if 'inventory' in ret and not obj.inventory: + if 'inventory' in ret and not obj.inventory_id: ret['inventory'] = None - if 'credential' in ret and not obj.credential: + if 'credential' in ret and not obj.credential_id: ret['credential'] = None # For the UI, only module_name is returned for name, instead of the # longer module name + module_args format. diff --git a/awx/main/access.py b/awx/main/access.py index afb983bec6..93f94489a6 100644 --- a/awx/main/access.py +++ b/awx/main/access.py @@ -391,21 +391,24 @@ class BaseAccess(object): return user_capabilities def get_method_capability(self, method, obj, parent_obj): - if method in ['change']: # 3 args - return self.can_change(obj, {}) - elif method in ['delete', 'run_ad_hoc_commands', 'copy']: - access_method = getattr(self, "can_%s" % method) - return access_method(obj) - elif method in ['start']: - return self.can_start(obj, validate_license=False) - elif method in ['attach', 'unattach']: # parent/sub-object call - access_method = getattr(self, "can_%s" % method) - if type(parent_obj) == Team: - relationship = 'parents' - parent_obj = parent_obj.member_role - else: - relationship = 'members' - return access_method(obj, parent_obj, relationship, skip_sub_obj_read_check=True, data={}) + try: + if method in ['change']: # 3 args + return self.can_change(obj, {}) + elif method in ['delete', 'run_ad_hoc_commands', 'copy']: + access_method = getattr(self, "can_%s" % method) + return access_method(obj) + elif method in ['start']: + return self.can_start(obj, validate_license=False) + elif method in ['attach', 'unattach']: # parent/sub-object call + access_method = getattr(self, "can_%s" % method) + if type(parent_obj) == Team: + relationship = 'parents' + parent_obj = parent_obj.member_role + else: + relationship = 'members' + return access_method(obj, parent_obj, relationship, skip_sub_obj_read_check=True, data={}) + except (ParseError, ObjectDoesNotExist): + return False return False