diff --git a/awx/api/serializers.py b/awx/api/serializers.py index e5da287c1e..c76c75839f 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -9,7 +9,7 @@ import operator import re import six import urllib -from collections import defaultdict, OrderedDict +from collections import OrderedDict from datetime import timedelta # OAuth2 @@ -1474,23 +1474,11 @@ class ProjectUpdateDetailSerializer(ProjectUpdateSerializer): def get_host_status_counts(self, obj): try: - event_data = obj.project_update_events.only('event_data').get(event='playbook_on_stats').event_data + counts = obj.project_update_events.only('event_data').get(event='playbook_on_stats').get_host_status_counts() except ProjectUpdateEvent.DoesNotExist: - event_data = {} + counts = {} - host_status = {} - host_status_keys = ['skipped', 'ok', 'changed', 'failures', 'dark'] - - for key in host_status_keys: - for host in event_data.get(key, {}): - host_status[host] = key - - host_status_counts = defaultdict(lambda: 0) - - for value in host_status.values(): - host_status_counts[value] += 1 - - return host_status_counts + return counts class ProjectUpdateListSerializer(ProjectUpdateSerializer, UnifiedJobListSerializer): @@ -3271,23 +3259,11 @@ class JobDetailSerializer(JobSerializer): def get_host_status_counts(self, obj): try: - event_data = obj.job_events.only('event_data').get(event='playbook_on_stats').event_data + counts = obj.job_events.only('event_data').get(event='playbook_on_stats').get_host_status_counts() except JobEvent.DoesNotExist: - event_data = {} + counts = {} - host_status = {} - host_status_keys = ['skipped', 'ok', 'changed', 'failures', 'dark'] - - for key in host_status_keys: - for host in event_data.get(key, {}): - host_status[host] = key - - host_status_counts = defaultdict(lambda: 0) - - for value in host_status.values(): - host_status_counts[value] += 1 - - return host_status_counts + return counts class JobCancelSerializer(BaseSerializer): diff --git a/awx/main/models/events.py b/awx/main/models/events.py index a6e2c67c74..8b8637d8f2 100644 --- a/awx/main/models/events.py +++ b/awx/main/models/events.py @@ -1,5 +1,6 @@ import datetime import logging +from collections import defaultdict from django.conf import settings from django.db import models, DatabaseError @@ -39,6 +40,21 @@ def sanitize_event_keys(kwargs, valid_keys): kwargs[key] = Truncator(kwargs[key]).chars(1024) +def create_host_status_counts(event_data): + host_status = {} + host_status_keys = ['skipped', 'ok', 'changed', 'failures', 'dark'] + + for key in host_status_keys: + for host in event_data.get(key, {}): + host_status[host] = key + + host_status_counts = defaultdict(lambda: 0) + + for value in host_status.values(): + host_status_counts[value] += 1 + + return dict(host_status_counts) + class BasePlaybookEvent(CreatedModifiedModel): ''' @@ -194,6 +210,9 @@ class BasePlaybookEvent(CreatedModifiedModel): def event_level(self): return self.LEVEL_FOR_EVENT.get(self.event, 0) + def get_host_status_counts(self): + return create_host_status_counts(getattr(self, 'event_data', {})) + def get_event_display2(self): msg = self.get_event_display() if self.event == 'playbook_on_play_start':