mirror of
https://github.com/ansible/awx.git
synced 2026-05-08 09:57:35 -02:30
Merge pull request #4912 from AlanCoding/as_mods
WFJT activity stream for org admins + other polishing
This commit is contained in:
@@ -83,6 +83,8 @@ SUMMARIZABLE_FK_FIELDS = {
|
|||||||
'network_credential': DEFAULT_SUMMARY_FIELDS + ('kind', 'net'),
|
'network_credential': DEFAULT_SUMMARY_FIELDS + ('kind', 'net'),
|
||||||
'job': DEFAULT_SUMMARY_FIELDS + ('status', 'failed', 'elapsed'),
|
'job': DEFAULT_SUMMARY_FIELDS + ('status', 'failed', 'elapsed'),
|
||||||
'job_template': DEFAULT_SUMMARY_FIELDS,
|
'job_template': DEFAULT_SUMMARY_FIELDS,
|
||||||
|
'workflow_job_template': DEFAULT_SUMMARY_FIELDS,
|
||||||
|
'workflow_job': DEFAULT_SUMMARY_FIELDS,
|
||||||
'schedule': DEFAULT_SUMMARY_FIELDS + ('next_run',),
|
'schedule': DEFAULT_SUMMARY_FIELDS + ('next_run',),
|
||||||
'unified_job_template': DEFAULT_SUMMARY_FIELDS + ('unified_job_type',),
|
'unified_job_template': DEFAULT_SUMMARY_FIELDS + ('unified_job_type',),
|
||||||
'last_job': DEFAULT_SUMMARY_FIELDS + ('finished', 'status', 'failed', 'license_error'),
|
'last_job': DEFAULT_SUMMARY_FIELDS + ('finished', 'status', 'failed', 'license_error'),
|
||||||
@@ -3000,10 +3002,14 @@ class ActivityStreamSerializer(BaseSerializer):
|
|||||||
for fk, __ in SUMMARIZABLE_FK_FIELDS.items():
|
for fk, __ in SUMMARIZABLE_FK_FIELDS.items():
|
||||||
if not hasattr(obj, fk):
|
if not hasattr(obj, fk):
|
||||||
continue
|
continue
|
||||||
allm2m = getattr(obj, fk).distinct()
|
allm2m = getattr(obj, fk).all()
|
||||||
if getattr(obj, fk).exists():
|
if getattr(obj, fk).exists():
|
||||||
rel[fk] = []
|
rel[fk] = []
|
||||||
|
id_list = []
|
||||||
for thisItem in allm2m:
|
for thisItem in allm2m:
|
||||||
|
if getattr(thisItem, 'id', None) in id_list:
|
||||||
|
continue
|
||||||
|
id_list.append(getattr(thisItem, 'id', None))
|
||||||
if fk == 'custom_inventory_script':
|
if fk == 'custom_inventory_script':
|
||||||
rel[fk].append(reverse('api:inventory_script_detail', args=(thisItem.id,)))
|
rel[fk].append(reverse('api:inventory_script_detail', args=(thisItem.id,)))
|
||||||
else:
|
else:
|
||||||
@@ -3019,7 +3025,7 @@ class ActivityStreamSerializer(BaseSerializer):
|
|||||||
try:
|
try:
|
||||||
if not hasattr(obj, fk):
|
if not hasattr(obj, fk):
|
||||||
continue
|
continue
|
||||||
allm2m = getattr(obj, fk).distinct()
|
allm2m = getattr(obj, fk).all()
|
||||||
if getattr(obj, fk).exists():
|
if getattr(obj, fk).exists():
|
||||||
summary_fields[fk] = []
|
summary_fields[fk] = []
|
||||||
for thisItem in allm2m:
|
for thisItem in allm2m:
|
||||||
@@ -3048,6 +3054,9 @@ class ActivityStreamSerializer(BaseSerializer):
|
|||||||
thisItemDict[field] = fval
|
thisItemDict[field] = fval
|
||||||
if fk == 'group':
|
if fk == 'group':
|
||||||
thisItemDict['inventory_id'] = getattr(thisItem, 'inventory_id', None)
|
thisItemDict['inventory_id'] = getattr(thisItem, 'inventory_id', None)
|
||||||
|
if thisItemDict.get('id', None):
|
||||||
|
if thisItemDict.get('id', None) in [obj_dict.get('id', None) for obj_dict in summary_fields[fk]]:
|
||||||
|
continue
|
||||||
summary_fields[fk].append(thisItemDict)
|
summary_fields[fk].append(thisItemDict)
|
||||||
except ObjectDoesNotExist:
|
except ObjectDoesNotExist:
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -3102,6 +3102,13 @@ class WorkflowJobTemplateActivityStreamList(WorkflowsEnforcementMixin, ActivityS
|
|||||||
relationship = 'activitystream_set'
|
relationship = 'activitystream_set'
|
||||||
new_in_310 = True
|
new_in_310 = True
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
parent = self.get_parent_object()
|
||||||
|
self.check_parent_access(parent)
|
||||||
|
qs = self.request.user.get_queryset(self.model)
|
||||||
|
return qs.filter(Q(workflow_job_template=parent) |
|
||||||
|
Q(workflow_job_template_node__workflow_job_template=parent))
|
||||||
|
|
||||||
|
|
||||||
class WorkflowJobList(WorkflowsEnforcementMixin, ListCreateAPIView):
|
class WorkflowJobList(WorkflowsEnforcementMixin, ListCreateAPIView):
|
||||||
|
|
||||||
|
|||||||
@@ -2102,11 +2102,12 @@ class ActivityStreamAccess(BaseAccess):
|
|||||||
- custom inventory scripts
|
- custom inventory scripts
|
||||||
'''
|
'''
|
||||||
qs = self.model.objects.all()
|
qs = self.model.objects.all()
|
||||||
qs = qs.select_related('actor')
|
|
||||||
qs = qs.prefetch_related('organization', 'user', 'inventory', 'host', 'group', 'inventory_source',
|
qs = qs.prefetch_related('organization', 'user', 'inventory', 'host', 'group', 'inventory_source',
|
||||||
'inventory_update', 'credential', 'team', 'project', 'project_update',
|
'inventory_update', 'credential', 'team', 'project', 'project_update',
|
||||||
'permission', 'job_template', 'job', 'ad_hoc_command',
|
'job_template', 'job', 'ad_hoc_command',
|
||||||
'notification_template', 'notification', 'label', 'role')
|
'notification_template', 'notification', 'label', 'role', 'actor',
|
||||||
|
'schedule', 'custom_inventory_script', 'unified_job_template',
|
||||||
|
'workflow_job_template', 'workflow_job')
|
||||||
if self.user.is_superuser or self.user.is_system_auditor:
|
if self.user.is_superuser or self.user.is_system_auditor:
|
||||||
return qs.all()
|
return qs.all()
|
||||||
|
|
||||||
@@ -2119,6 +2120,7 @@ class ActivityStreamAccess(BaseAccess):
|
|||||||
project_set = Project.accessible_objects(self.user, 'read_role')
|
project_set = Project.accessible_objects(self.user, 'read_role')
|
||||||
jt_set = JobTemplate.accessible_objects(self.user, 'read_role')
|
jt_set = JobTemplate.accessible_objects(self.user, 'read_role')
|
||||||
team_set = Team.accessible_objects(self.user, 'read_role')
|
team_set = Team.accessible_objects(self.user, 'read_role')
|
||||||
|
wfjt_set = WorkflowJobTemplate.accessible_objects(self.user, 'read_role')
|
||||||
|
|
||||||
return qs.filter(
|
return qs.filter(
|
||||||
Q(ad_hoc_command__inventory__in=inventory_set) |
|
Q(ad_hoc_command__inventory__in=inventory_set) |
|
||||||
@@ -2136,6 +2138,9 @@ class ActivityStreamAccess(BaseAccess):
|
|||||||
Q(project_update__project__in=project_set) |
|
Q(project_update__project__in=project_set) |
|
||||||
Q(job_template__in=jt_set) |
|
Q(job_template__in=jt_set) |
|
||||||
Q(job__job_template__in=jt_set) |
|
Q(job__job_template__in=jt_set) |
|
||||||
|
Q(workflow_job_template__in=wfjt_set) |
|
||||||
|
Q(workflow_job_template_node__workflow_job_template__in=wfjt_set) |
|
||||||
|
Q(workflow_job__workflow_job_template__in=wfjt_set) |
|
||||||
Q(notification_template__organization__in=auditing_orgs) |
|
Q(notification_template__organization__in=auditing_orgs) |
|
||||||
Q(notification__notification_template__organization__in=auditing_orgs) |
|
Q(notification__notification_template__organization__in=auditing_orgs) |
|
||||||
Q(label__organization__in=auditing_orgs) |
|
Q(label__organization__in=auditing_orgs) |
|
||||||
|
|||||||
@@ -479,14 +479,14 @@ try:
|
|||||||
|
|
||||||
job_template, _ = JobTemplate.objects.get_or_create(
|
job_template, _ = JobTemplate.objects.get_or_create(
|
||||||
name='%s Job Template %d Project %d' % (prefix, job_template_id, project_idx),
|
name='%s Job Template %d Project %d' % (prefix, job_template_id, project_idx),
|
||||||
inventory=inventory,
|
|
||||||
project=project,
|
|
||||||
credential=next(credential_gen),
|
|
||||||
defaults=dict(
|
defaults=dict(
|
||||||
|
inventory=inventory,
|
||||||
|
project=project,
|
||||||
|
credential=next(credential_gen),
|
||||||
created_by=next(creator_gen),
|
created_by=next(creator_gen),
|
||||||
modified_by=next(modifier_gen),
|
modified_by=next(modifier_gen),
|
||||||
playbook="debug.yml"),
|
playbook="debug.yml",
|
||||||
**extra_kwargs
|
**extra_kwargs)
|
||||||
)
|
)
|
||||||
job_template._is_new = _
|
job_template._is_new = _
|
||||||
job_templates.append(job_template)
|
job_templates.append(job_template)
|
||||||
|
|||||||
Reference in New Issue
Block a user