Skip to content

Commit 9189ac9

Browse files
authored
fix: handle case sensitivity for "Settings" sheet name with explicit error TASK-1353 (#5417)
### 📣 Summary Improved error handling for case-sensitive "Settings" sheet names. ### 📖 Description This update addresses an issue where a sheet named "Settings" with uppercase or mixed case letters causes unexpected behavior. An explicit error message is now raised to alert users of the case sensitivity, ensuring they can resolve the issue easily.
1 parent 9ca76e1 commit 9189ac9

File tree

3 files changed

+49
-12
lines changed

3 files changed

+49
-12
lines changed

kpi/mixins/xls_exportable.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@
1414

1515

1616
class XlsExportableMixin:
17-
def ordered_xlsform_content(self,
18-
kobo_specific_types=False,
19-
append=None):
17+
def ordered_xlsform_content(self, kobo_specific_types=False, append=None):
2018
# currently, this method depends on "FormpackXLSFormUtilsMixin"
2119
content = copy.deepcopy(self.content)
2220
if append:

kpi/serializers/v2/deployment.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
# coding: utf-8
21
from django.conf import settings
32
from pyxform.errors import PyXFormError
43
from rest_framework import serializers
4+
from xlsxwriter.exceptions import DuplicateWorksheetName
55

66
from .asset import AssetSerializer
77

@@ -16,8 +16,9 @@ class DeploymentSerializer(serializers.Serializer):
1616
def _raise_unless_current_version(asset, validated_data):
1717
# Stop if the requester attempts to deploy any version of the asset
1818
# except the current one
19-
if 'version_id' in validated_data and \
20-
validated_data['version_id'] != str(asset.version_id):
19+
if 'version_id' in validated_data and validated_data[
20+
'version_id'
21+
] != str(asset.version_id):
2122
raise NotImplementedError(
2223
'Only the current version_id can be deployed')
2324

@@ -35,8 +36,8 @@ def create(self, validated_data):
3536
# 'deployed' boolean value
3637
try:
3738
asset.deploy(backend=backend_id, active=validated_data.get('active', False))
38-
except PyXFormError as e:
39-
raise serializers.ValidationError({'error': (f'ODK Validation Error: {e}')})
39+
except (DuplicateWorksheetName, PyXFormError) as e:
40+
raise serializers.ValidationError({'error': str(e)})
4041
return asset.deployment
4142

4243
def update(self, instance, validated_data):

kpi/tests/api/v2/test_api_assets.py

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1862,10 +1862,48 @@ def test_asset_deployment_validation_error(self):
18621862
self.assertEqual(deploy_response.status_code, status.HTTP_400_BAD_REQUEST)
18631863
self.assertEqual(
18641864
deploy_response.data['error'],
1865-
(
1866-
'ODK Validation Error: '
1867-
"The survey element named 'Enter_an_int_number' has no label or hint."
1868-
),
1865+
"The survey element named 'Enter_an_int_number' has no label or hint.",
1866+
)
1867+
1868+
def test_asset_deployment_with_sheet_name_Settings(self): # noqa
1869+
content = {
1870+
'schema': '1',
1871+
'survey': [
1872+
{
1873+
'name': 'Enter_a_float_number',
1874+
'type': 'decimal',
1875+
'label': ['Enter a float number'],
1876+
'required': False,
1877+
},
1878+
],
1879+
'choices': [],
1880+
'settings': {},
1881+
'Settings': [], # simulate sheet name called `Settings` on import
1882+
}
1883+
assets_url = reverse(self._get_endpoint('asset-list'))
1884+
asset_response = self.client.post(
1885+
assets_url,
1886+
{'content': content, 'asset_type': 'survey'},
1887+
format='json',
1888+
)
1889+
asset = Asset.objects.get(uid=asset_response.data.get('uid'))
1890+
1891+
deployment_url = reverse(
1892+
self._get_endpoint('asset-deployment'), kwargs={'uid': asset.uid}
1893+
)
1894+
1895+
deploy_response = self.client.post(
1896+
deployment_url,
1897+
{
1898+
'backend': 'mock',
1899+
'active': True,
1900+
},
1901+
)
1902+
1903+
assert deploy_response.status_code == status.HTTP_400_BAD_REQUEST
1904+
assert (
1905+
"Sheetname 'Settings', with case ignored, is already in use"
1906+
in deploy_response.data['error']
18691907
)
18701908

18711909
@patch('kpi.views.v2.asset.ProjectHistoryLog.create_from_deployment_request')

0 commit comments

Comments
 (0)