diff --git a/core/collections/tests/tests.py b/core/collections/tests/tests.py index cbcb229b..9bd3400a 100644 --- a/core/collections/tests/tests.py +++ b/core/collections/tests/tests.py @@ -3164,7 +3164,8 @@ def test_post_200(self, index_expansion_concepts_task_mock): 'finished_at': None, 'runtime': None, 'summary': None, - 'children': [] + 'children': [], + 'result': None } ) index_expansion_concepts_task_mock.apply_async.assert_called_once_with( @@ -3202,7 +3203,8 @@ def test_post_200(self, index_expansion_mappings_task_mock): 'finished_at': None, 'runtime': None, 'summary': None, - 'children': [] + 'children': [], + 'result': None } ) index_expansion_mappings_task_mock.apply_async.assert_called_once_with( diff --git a/core/importers/tests.py b/core/importers/tests.py index 65abef7c..33b12458 100644 --- a/core/importers/tests.py +++ b/core/importers/tests.py @@ -1143,7 +1143,8 @@ def test_get_without_task_id(self, ): 'finished_at': None, 'runtime': None, 'summary': None, - 'children': [] + 'children': [], + 'result': None }] ) @@ -1168,7 +1169,8 @@ def test_get_without_task_id(self, ): 'finished_at': None, 'runtime': None, 'summary': None, - 'children': [] + 'children': [], + 'result': None }, { 'id': task_id3, 'task': task_id3, @@ -1181,7 +1183,8 @@ def test_get_without_task_id(self, ): 'finished_at': None, 'runtime': None, 'summary': None, - 'children': [] + 'children': [], + 'result': None }], key= lambda x: x['id']) ) @@ -1206,7 +1209,8 @@ def test_get_without_task_id(self, ): 'finished_at': None, 'runtime': None, 'summary': None, - 'children': [] + 'children': [], + 'result': None }] ) @@ -1254,7 +1258,12 @@ def test_get_task(self): 'finished_at': None, 'runtime': None, 'summary': None, - 'children': [] + 'children': [], + 'result': None, + 'kwargs': None, + 'error_message': None, + 'traceback': None, + 'retry': 0 }) def test_post_400(self): @@ -1319,7 +1328,8 @@ def test_post_202(self, bulk_import_mock): 'finished_at': None, 'runtime': None, 'summary': None, - 'children': [] + 'children': [], + 'result': None } ) self.assertTrue(DEPRECATED_API_HEADER not in response) @@ -1353,7 +1363,8 @@ def test_post_202(self, bulk_import_mock): 'finished_at': None, 'runtime': None, 'summary': None, - 'children': [] + 'children': [], + 'result': None } ) self.assertEqual(bulk_import_mock.apply_async.call_count, 2) @@ -1386,7 +1397,8 @@ def test_post_202(self, bulk_import_mock): 'finished_at': None, 'runtime': None, 'summary': None, - 'children': [] + 'children': [], + 'result': None } ) self.assertEqual(bulk_import_mock.apply_async.call_count, 3) @@ -1461,7 +1473,8 @@ def test_post_inline_parallel_202(self, bulk_import_mock): 'finished_at': None, 'runtime': None, 'summary': None, - 'children': [] + 'children': [], + 'result': None }) self.assertTrue(DEPRECATED_API_HEADER in response) self.assertEqual(response[DEPRECATED_API_HEADER], 'True') @@ -1494,7 +1507,8 @@ def test_post_inline_202(self, bulk_import_mock): 'finished_at': None, 'runtime': None, 'summary': None, - 'children': [] + 'children': [], + 'result': None }) self.assertEqual(bulk_import_mock.apply_async.call_count, 1) self.assertEqual(bulk_import_mock.apply_async.call_args[0], (('{"key": "value"}', 'ocladmin', True),)) diff --git a/core/importers/views.py b/core/importers/views.py index 157c2498..560c600c 100644 --- a/core/importers/views.py +++ b/core/importers/views.py @@ -65,7 +65,9 @@ def import_response(request, import_queue, data, threads=None, inline=False, dep class ImportRetrieveDestroyMixin(BaseAPIView): def get_serializer_class(self): - return TaskDetailSerializer if self.is_verbose() and self.request.GET.get('task') else TaskListSerializer + if self.request.GET.get('task'): + return TaskDetailSerializer + return TaskListSerializer @swagger_auto_schema( manual_parameters=[task_param, username_param, verbose_param], diff --git a/core/tasks/models.py b/core/tasks/models.py index 8e785751..2a3242ee 100644 --- a/core/tasks/models.py +++ b/core/tasks/models.py @@ -45,14 +45,30 @@ class Meta: children = ArrayField(models.TextField(), null=True, blank=True, default=list) @property - def json_result(self): + def result_all(self): if self.result: try: - return json.loads(json.dumps(ast.literal_eval(self.result))) + return json.loads(self.result) except Exception: # pylint: disable=broad-except - return self.result + try: + return json.loads(json.dumps(ast.literal_eval(self.result))) + except Exception: # pylint: disable=broad-except + return self.result return self.result + @property + def summary_result(self): + return get(self.result_all, 'detailed_summary') or self.summary + + @property + def report_result(self): + return get(self.result_all, 'report') or self.summary + + @property + def json_result(self): + result = self.result_all + return get(result, 'json') or result + def is_finished(self): return self.state in (SUCCESS, FAILURE) diff --git a/core/tasks/serializers.py b/core/tasks/serializers.py index 0ec82767..81b3eec8 100644 --- a/core/tasks/serializers.py +++ b/core/tasks/serializers.py @@ -8,11 +8,10 @@ class TaskBriefSerializer(ModelSerializer): task = CharField(source='id') queue = CharField(source='queue_name') - result = SerializerMethodField() class Meta: model = Task - fields = ('id', 'state', 'name', 'queue', 'username', 'task', 'result') + fields = ('id', 'state', 'name', 'queue', 'username', 'task') def __init__(self, *args, **kwargs): # pylint: disable=too-many-branches request = get(kwargs, 'context.request') @@ -20,25 +19,37 @@ def __init__(self, *args, **kwargs): # pylint: disable=too-many-branches self.view_kwargs = get(kwargs, 'context.view.kwargs', {}) self.query_params = params.dict() if params else {} - self.include_result = bool(self.query_params.get('result')) - if not self.include_result: - self.fields.pop('result', None) + self.result_type = self.query_params.get('result', None) or 'summary' super().__init__(*args, **kwargs) - def get_result(self, obj): - if self.include_result: - return obj.json_result - return None - class TaskListSerializer(TaskBriefSerializer): + result = SerializerMethodField() + + def __init__(self, *args, **kwargs): # pylint: disable=too-many-branches + request = get(kwargs, 'context.request') + params = get(request, 'query_params') + self.query_params = params.dict() if params else {} + self.result_type = self.query_params.get('result', None) or 'summary' + + super().__init__(*args, **kwargs) + class Meta: model = Task fields = TaskBriefSerializer.Meta.fields + ( - 'created_at', 'started_at', 'finished_at', 'runtime', 'summary', 'children' + 'created_at', 'started_at', 'finished_at', 'runtime', 'summary', 'children', 'result' ) + def get_result(self, obj): + if self.result_type == 'json': + return obj.json_result + if self.result_type == 'report': + return obj.report_result + if self.result_type == 'all': + return obj.result_all + return obj.summary_result + class TaskDetailSerializer(TaskListSerializer): class Meta: @@ -49,10 +60,4 @@ class Meta: class TaskResultSerializer(TaskDetailSerializer): - result = JSONField(read_only=True, source='json_result') - - class Meta: - model = Task - fields = TaskDetailSerializer.Meta.fields + ( - 'result', - ) + result = JSONField(read_only=True, source='result_all')