Skip to content

Commit

Permalink
refactor code
Browse files Browse the repository at this point in the history
  • Loading branch information
kelvin-muchiri committed Sep 25, 2023
1 parent e36bc50 commit b5d13a2
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 7 deletions.
8 changes: 4 additions & 4 deletions onadata/apps/api/tests/viewsets/test_xform_viewset.py
Original file line number Diff line number Diff line change
Expand Up @@ -5748,7 +5748,7 @@ def test_form_valid(self):
response = self.view(request, pk=sys.maxsize)
self.assertEqual(response.status_code, 404)

@patch("onadata.apps.api.viewsets.xform_viewset.regenerate_form_instance_json")
@patch("onadata.apps.api.viewsets.xform_viewset.tasks.regenerate_form_instance_json")
def test_regenerates_instance_json(self, mock_regenerate):
"""Json data for form submissions is regenerated
Expand All @@ -5764,7 +5764,7 @@ def test_regenerates_instance_json(self, mock_regenerate):
mock_regenerate.apply_async.assert_called_once_with(args=[self.xform.pk])
self.assertEqual(cache.get(self.cache_key), task_id)

@patch("onadata.apps.api.viewsets.xform_viewset.regenerate_form_instance_json")
@patch("onadata.apps.api.viewsets.xform_viewset.tasks.regenerate_form_instance_json")
def test_regenerates_instance_json_no_duplicate_work(self, mock_regenerate):
"""If a regeneration finished successfully, we do not run it again"""
self.xform.is_instance_json_regenerated = True
Expand All @@ -5780,7 +5780,7 @@ def _mock_get_task_meta_failure(self) -> dict[str, str]:
return {"status": "FAILURE"}

@patch.object(AsyncResult, "_get_task_meta", _mock_get_task_meta_failure)
@patch("onadata.apps.api.viewsets.xform_viewset.regenerate_form_instance_json")
@patch("onadata.apps.api.viewsets.xform_viewset.tasks.regenerate_form_instance_json")
def test_task_state_failed(self, mock_regenerate):
"""We regenerate if old celery task failed"""
old_task_id = "796dc413-e6ea-42b8-b658-e4ac9e22b02b"
Expand All @@ -5799,7 +5799,7 @@ def _mock_get_task_meta_non_failure(self) -> dict[str, str]:
return {"status": "FOO"}

@patch.object(AsyncResult, "_get_task_meta", _mock_get_task_meta_non_failure)
@patch("onadata.apps.api.viewsets.xform_viewset.regenerate_form_instance_json")
@patch("onadata.apps.api.viewsets.xform_viewset.tasks.regenerate_form_instance_json")
def test_task_state_not_failed(self, mock_regenerate):
"""We do not regenerate if last celery task is in a state other than FAILURE
Expand Down
8 changes: 5 additions & 3 deletions onadata/apps/api/viewsets/xform_viewset.py
Original file line number Diff line number Diff line change
Expand Up @@ -1029,9 +1029,9 @@ def regenerate_instance_json(self, request, *args, **kwargs):
return Response({"status": "SUCCESS"})

cache_key = f"{XFORM_REGENERATE_INSTANCE_JSON_TASK}{xform.pk}"
cached_task_id: str = cache.get(cache_key)
cached_task_id: str | None = cache.get(cache_key)

if cached_task_id and tasks.get_async_status(cached_task_id)['JOB_STATUS'] != "FAILURE":
if cached_task_id and AsyncResult(cached_task_id).state.upper() != "FAILURE":
# FAILURE is the only state that should trigger regeneration if
# a regeneration had earlier been triggered
return Response({"status": "STARTED"})
Expand All @@ -1042,7 +1042,9 @@ def regenerate_instance_json(self, request, *args, **kwargs):
# If after 1 day you create an AsyncResult, the status will be PENDING.
# We therefore set the cache timeout to 1 day same as the Celery backend result
# expiry timeout
result: AsyncResult = tasks.regenerate_form_instance_json.apply_async(args=[xform.pk])
result: AsyncResult = tasks.regenerate_form_instance_json.apply_async(
args=[xform.pk]
)
cache.set(
cache_key,
result.task_id,
Expand Down

0 comments on commit b5d13a2

Please sign in to comment.