Skip to content

Commit

Permalink
OpenConceptLab/ocl_issues#1912 | Import result | responding with json…
Browse files Browse the repository at this point in the history
…/report/summary result | correcting serialization
  • Loading branch information
snyaggarwal committed Aug 7, 2024
1 parent fcb8ace commit f8a4270
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 34 deletions.
6 changes: 4 additions & 2 deletions core/collections/tests/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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(
Expand Down
34 changes: 24 additions & 10 deletions core/importers/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -1143,7 +1143,8 @@ def test_get_without_task_id(self, ):
'finished_at': None,
'runtime': None,
'summary': None,
'children': []
'children': [],
'result': None
}]
)

Expand All @@ -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,
Expand All @@ -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'])
)

Expand All @@ -1206,7 +1209,8 @@ def test_get_without_task_id(self, ):
'finished_at': None,
'runtime': None,
'summary': None,
'children': []
'children': [],
'result': None
}]
)

Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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')
Expand Down Expand Up @@ -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),))
Expand Down
4 changes: 3 additions & 1 deletion core/importers/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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],
Expand Down
22 changes: 19 additions & 3 deletions core/tasks/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
41 changes: 23 additions & 18 deletions core/tasks/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,37 +8,48 @@
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')
params = get(request, 'query_params')
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:
Expand All @@ -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')

0 comments on commit f8a4270

Please sign in to comment.