Skip to content

Commit f8a4270

Browse files
committed
OpenConceptLab/ocl_issues#1912 | Import result | responding with json/report/summary result | correcting serialization
1 parent fcb8ace commit f8a4270

File tree

5 files changed

+73
-34
lines changed

5 files changed

+73
-34
lines changed

core/collections/tests/tests.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -3164,7 +3164,8 @@ def test_post_200(self, index_expansion_concepts_task_mock):
31643164
'finished_at': None,
31653165
'runtime': None,
31663166
'summary': None,
3167-
'children': []
3167+
'children': [],
3168+
'result': None
31683169
}
31693170
)
31703171
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):
32023203
'finished_at': None,
32033204
'runtime': None,
32043205
'summary': None,
3205-
'children': []
3206+
'children': [],
3207+
'result': None
32063208
}
32073209
)
32083210
index_expansion_mappings_task_mock.apply_async.assert_called_once_with(

core/importers/tests.py

+24-10
Original file line numberDiff line numberDiff line change
@@ -1143,7 +1143,8 @@ def test_get_without_task_id(self, ):
11431143
'finished_at': None,
11441144
'runtime': None,
11451145
'summary': None,
1146-
'children': []
1146+
'children': [],
1147+
'result': None
11471148
}]
11481149
)
11491150

@@ -1168,7 +1169,8 @@ def test_get_without_task_id(self, ):
11681169
'finished_at': None,
11691170
'runtime': None,
11701171
'summary': None,
1171-
'children': []
1172+
'children': [],
1173+
'result': None
11721174
}, {
11731175
'id': task_id3,
11741176
'task': task_id3,
@@ -1181,7 +1183,8 @@ def test_get_without_task_id(self, ):
11811183
'finished_at': None,
11821184
'runtime': None,
11831185
'summary': None,
1184-
'children': []
1186+
'children': [],
1187+
'result': None
11851188
}], key= lambda x: x['id'])
11861189
)
11871190

@@ -1206,7 +1209,8 @@ def test_get_without_task_id(self, ):
12061209
'finished_at': None,
12071210
'runtime': None,
12081211
'summary': None,
1209-
'children': []
1212+
'children': [],
1213+
'result': None
12101214
}]
12111215
)
12121216

@@ -1254,7 +1258,12 @@ def test_get_task(self):
12541258
'finished_at': None,
12551259
'runtime': None,
12561260
'summary': None,
1257-
'children': []
1261+
'children': [],
1262+
'result': None,
1263+
'kwargs': None,
1264+
'error_message': None,
1265+
'traceback': None,
1266+
'retry': 0
12581267
})
12591268

12601269
def test_post_400(self):
@@ -1319,7 +1328,8 @@ def test_post_202(self, bulk_import_mock):
13191328
'finished_at': None,
13201329
'runtime': None,
13211330
'summary': None,
1322-
'children': []
1331+
'children': [],
1332+
'result': None
13231333
}
13241334
)
13251335
self.assertTrue(DEPRECATED_API_HEADER not in response)
@@ -1353,7 +1363,8 @@ def test_post_202(self, bulk_import_mock):
13531363
'finished_at': None,
13541364
'runtime': None,
13551365
'summary': None,
1356-
'children': []
1366+
'children': [],
1367+
'result': None
13571368
}
13581369
)
13591370
self.assertEqual(bulk_import_mock.apply_async.call_count, 2)
@@ -1386,7 +1397,8 @@ def test_post_202(self, bulk_import_mock):
13861397
'finished_at': None,
13871398
'runtime': None,
13881399
'summary': None,
1389-
'children': []
1400+
'children': [],
1401+
'result': None
13901402
}
13911403
)
13921404
self.assertEqual(bulk_import_mock.apply_async.call_count, 3)
@@ -1461,7 +1473,8 @@ def test_post_inline_parallel_202(self, bulk_import_mock):
14611473
'finished_at': None,
14621474
'runtime': None,
14631475
'summary': None,
1464-
'children': []
1476+
'children': [],
1477+
'result': None
14651478
})
14661479
self.assertTrue(DEPRECATED_API_HEADER in response)
14671480
self.assertEqual(response[DEPRECATED_API_HEADER], 'True')
@@ -1494,7 +1507,8 @@ def test_post_inline_202(self, bulk_import_mock):
14941507
'finished_at': None,
14951508
'runtime': None,
14961509
'summary': None,
1497-
'children': []
1510+
'children': [],
1511+
'result': None
14981512
})
14991513
self.assertEqual(bulk_import_mock.apply_async.call_count, 1)
15001514
self.assertEqual(bulk_import_mock.apply_async.call_args[0], (('{"key": "value"}', 'ocladmin', True),))

core/importers/views.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,9 @@ def import_response(request, import_queue, data, threads=None, inline=False, dep
6565

6666
class ImportRetrieveDestroyMixin(BaseAPIView):
6767
def get_serializer_class(self):
68-
return TaskDetailSerializer if self.is_verbose() and self.request.GET.get('task') else TaskListSerializer
68+
if self.request.GET.get('task'):
69+
return TaskDetailSerializer
70+
return TaskListSerializer
6971

7072
@swagger_auto_schema(
7173
manual_parameters=[task_param, username_param, verbose_param],

core/tasks/models.py

+19-3
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,30 @@ class Meta:
4545
children = ArrayField(models.TextField(), null=True, blank=True, default=list)
4646

4747
@property
48-
def json_result(self):
48+
def result_all(self):
4949
if self.result:
5050
try:
51-
return json.loads(json.dumps(ast.literal_eval(self.result)))
51+
return json.loads(self.result)
5252
except Exception: # pylint: disable=broad-except
53-
return self.result
53+
try:
54+
return json.loads(json.dumps(ast.literal_eval(self.result)))
55+
except Exception: # pylint: disable=broad-except
56+
return self.result
5457
return self.result
5558

59+
@property
60+
def summary_result(self):
61+
return get(self.result_all, 'detailed_summary') or self.summary
62+
63+
@property
64+
def report_result(self):
65+
return get(self.result_all, 'report') or self.summary
66+
67+
@property
68+
def json_result(self):
69+
result = self.result_all
70+
return get(result, 'json') or result
71+
5672
def is_finished(self):
5773
return self.state in (SUCCESS, FAILURE)
5874

core/tasks/serializers.py

+23-18
Original file line numberDiff line numberDiff line change
@@ -8,37 +8,48 @@
88
class TaskBriefSerializer(ModelSerializer):
99
task = CharField(source='id')
1010
queue = CharField(source='queue_name')
11-
result = SerializerMethodField()
1211

1312
class Meta:
1413
model = Task
15-
fields = ('id', 'state', 'name', 'queue', 'username', 'task', 'result')
14+
fields = ('id', 'state', 'name', 'queue', 'username', 'task')
1615

1716
def __init__(self, *args, **kwargs): # pylint: disable=too-many-branches
1817
request = get(kwargs, 'context.request')
1918
params = get(request, 'query_params')
2019
self.view_kwargs = get(kwargs, 'context.view.kwargs', {})
2120

2221
self.query_params = params.dict() if params else {}
23-
self.include_result = bool(self.query_params.get('result'))
24-
if not self.include_result:
25-
self.fields.pop('result', None)
22+
self.result_type = self.query_params.get('result', None) or 'summary'
2623

2724
super().__init__(*args, **kwargs)
2825

29-
def get_result(self, obj):
30-
if self.include_result:
31-
return obj.json_result
32-
return None
33-
3426

3527
class TaskListSerializer(TaskBriefSerializer):
28+
result = SerializerMethodField()
29+
30+
def __init__(self, *args, **kwargs): # pylint: disable=too-many-branches
31+
request = get(kwargs, 'context.request')
32+
params = get(request, 'query_params')
33+
self.query_params = params.dict() if params else {}
34+
self.result_type = self.query_params.get('result', None) or 'summary'
35+
36+
super().__init__(*args, **kwargs)
37+
3638
class Meta:
3739
model = Task
3840
fields = TaskBriefSerializer.Meta.fields + (
39-
'created_at', 'started_at', 'finished_at', 'runtime', 'summary', 'children'
41+
'created_at', 'started_at', 'finished_at', 'runtime', 'summary', 'children', 'result'
4042
)
4143

44+
def get_result(self, obj):
45+
if self.result_type == 'json':
46+
return obj.json_result
47+
if self.result_type == 'report':
48+
return obj.report_result
49+
if self.result_type == 'all':
50+
return obj.result_all
51+
return obj.summary_result
52+
4253

4354
class TaskDetailSerializer(TaskListSerializer):
4455
class Meta:
@@ -49,10 +60,4 @@ class Meta:
4960

5061

5162
class TaskResultSerializer(TaskDetailSerializer):
52-
result = JSONField(read_only=True, source='json_result')
53-
54-
class Meta:
55-
model = Task
56-
fields = TaskDetailSerializer.Meta.fields + (
57-
'result',
58-
)
63+
result = JSONField(read_only=True, source='result_all')

0 commit comments

Comments
 (0)