Skip to content

Commit 59e16ee

Browse files
authored
Merge pull request #4033 from kobotoolbox/3734-use-latest-deployed-asset-version-submission-edit
Use latest deployed version of the form for submission edits
2 parents fdfcae7 + 1aea0ad commit 59e16ee

File tree

2 files changed

+86
-10
lines changed

2 files changed

+86
-10
lines changed

kpi/tests/api/v2/test_api_submissions.py

Lines changed: 78 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -863,7 +863,8 @@ def test_get_legacy_edit_link_submission_as_owner(self):
863863
assert response.status_code == status.HTTP_200_OK
864864

865865
expected_response = {
866-
'url': f"{settings.ENKETO_URL}/edit/{self.submission['_uuid']}"
866+
'url': f"{settings.ENKETO_URL}/edit/{self.submission['_uuid']}",
867+
'version_uid': self.asset.latest_deployed_version.uid,
867868
}
868869
assert response.data == expected_response
869870

@@ -886,7 +887,8 @@ def test_get_edit_link_submission_as_owner(self):
886887
response = self.client.get(self.submission_url, {'format': 'json'})
887888
assert response.status_code == status.HTTP_200_OK
888889
expected_response = {
889-
'url': f"{settings.ENKETO_URL}/edit/{self.submission['_uuid']}"
890+
'url': f"{settings.ENKETO_URL}/edit/{self.submission['_uuid']}",
891+
'version_uid': self.asset.latest_deployed_version.uid,
890892
}
891893
self.assertEqual(response.data, expected_response)
892894

@@ -1002,8 +1004,10 @@ def test_get_edit_link_with_partial_perms_as_anotheruser(self):
10021004

10031005
response = self.client.get(url, {'format': 'json'})
10041006
self.assertEqual(response.status_code, status.HTTP_200_OK)
1005-
url = f"{settings.ENKETO_URL}/edit/{submission['_uuid']}"
1006-
expected_response = {'url': url}
1007+
expected_response = {
1008+
'url': f"{settings.ENKETO_URL}/edit/{submission['_uuid']}",
1009+
'version_uid': self.asset.latest_deployed_version.uid,
1010+
}
10071011
self.assertEqual(response.data, expected_response)
10081012

10091013
@responses.activate
@@ -1118,6 +1122,70 @@ def test_get_multiple_edit_links_and_attempt_submit_edits(self):
11181122
with pytest.raises(KeyError) as e:
11191123
res = self.client.post(url)
11201124

1125+
@responses.activate
1126+
def test_get_edit_link_submission_with_latest_asset_deployment(self):
1127+
"""
1128+
Check that the submission edit is using the asset version associated
1129+
with the latest **deployed** version.
1130+
"""
1131+
original_versions_count = self.asset.asset_versions.count()
1132+
original_deployed_versions_count = self.asset.deployed_versions.count()
1133+
original_deployed_version_uid = self.asset.latest_deployed_version.uid
1134+
1135+
ee_url = (
1136+
f'{settings.ENKETO_URL}/{settings.ENKETO_EDIT_INSTANCE_ENDPOINT}'
1137+
)
1138+
# Mock Enketo response
1139+
responses.add_callback(
1140+
responses.POST,
1141+
ee_url,
1142+
callback=enketo_edit_instance_response,
1143+
content_type='application/json',
1144+
)
1145+
1146+
# make a change to the asset content but don't redeploy yet
1147+
self.asset.content['survey'].append(
1148+
{
1149+
'type': 'note',
1150+
'name': 'n',
1151+
'label': 'A new note',
1152+
}
1153+
)
1154+
self.asset.save()
1155+
assert self.asset.asset_versions.count() == original_versions_count + 1
1156+
assert (
1157+
self.asset.deployed_versions.count()
1158+
== original_deployed_versions_count
1159+
)
1160+
1161+
# ensure that the latest deployed version is used for the edit, even if
1162+
# there's a new asset version
1163+
response = self.client.get(self.submission_url, {'format': 'json'})
1164+
assert response.status_code == status.HTTP_200_OK
1165+
expected_response = {
1166+
'url': f"{settings.ENKETO_URL}/edit/{self.submission['_uuid']}",
1167+
'version_uid': original_deployed_version_uid,
1168+
}
1169+
assert response.data == expected_response
1170+
1171+
# redeploy the asset to create a new deployment version
1172+
self.asset.deploy(active=True)
1173+
self.asset.save()
1174+
assert self.asset.asset_versions.count() == original_versions_count + 2
1175+
assert (
1176+
self.asset.deployed_versions.count()
1177+
== original_deployed_versions_count + 1
1178+
)
1179+
1180+
# ensure that the newly deployed version is used for editing
1181+
response = self.client.get(self.submission_url, {'format': 'json'})
1182+
assert response.status_code == status.HTTP_200_OK
1183+
expected_response = {
1184+
'url': f"{settings.ENKETO_URL}/edit/{self.submission['_uuid']}",
1185+
'version_uid': self.asset.latest_deployed_version.uid,
1186+
}
1187+
assert response.data == expected_response
1188+
11211189

11221190
class SubmissionViewApiTests(BaseSubmissionTestCase):
11231191

@@ -1153,7 +1221,8 @@ def test_get_view_link_submission_as_owner(self):
11531221
assert response.status_code == status.HTTP_200_OK
11541222

11551223
expected_response = {
1156-
'url': f"{settings.ENKETO_URL}/view/{self.submission['_uuid']}"
1224+
'url': f"{settings.ENKETO_URL}/view/{self.submission['_uuid']}",
1225+
'version_uid': self.asset.latest_deployed_version.uid,
11571226
}
11581227
assert response.data == expected_response
11591228

@@ -1256,8 +1325,10 @@ def test_get_view_link_with_partial_perms_as_anotheruser(self):
12561325

12571326
response = self.client.get(url, {'format': 'json'})
12581327
self.assertEqual(response.status_code, status.HTTP_200_OK)
1259-
url = f"{settings.ENKETO_URL}/view/{submission['_uuid']}"
1260-
expected_response = {'url': url}
1328+
expected_response = {
1329+
'url': f"{settings.ENKETO_URL}/view/{submission['_uuid']}",
1330+
'version_uid': self.asset.latest_deployed_version.uid,
1331+
}
12611332
self.assertEqual(response.data, expected_response)
12621333

12631334

kpi/views/v2/data.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -622,8 +622,8 @@ def _get_enketo_link(
622622
# )
623623
# version_uid = list(submissions_stream)[0][INFERRED_VERSION_ID_KEY]
624624

625-
# Let's use the latest version uid temporarily
626-
version_uid = self.asset.latest_version.uid
625+
# Let's use the latest **deployed** version uid temporarily
626+
version_uid = self.asset.latest_deployed_version.uid
627627

628628
# Retrieve the XML root node name from the submission. The instance's
629629
# root node name specified in the form XML (i.e. the first child of
@@ -687,4 +687,9 @@ def _get_enketo_link(
687687
json_response = response.json()
688688
enketo_url = json_response.get(f'{action_}_url')
689689

690-
return Response({'url': enketo_url})
690+
return Response(
691+
{
692+
'url': enketo_url,
693+
'version_uid': version_uid,
694+
}
695+
)

0 commit comments

Comments
 (0)