diff --git a/onadata/apps/api/tests/viewsets/test_xform_submission_viewset.py b/onadata/apps/api/tests/viewsets/test_xform_submission_viewset.py index d5ace9d464..3fd7a4077b 100644 --- a/onadata/apps/api/tests/viewsets/test_xform_submission_viewset.py +++ b/onadata/apps/api/tests/viewsets/test_xform_submission_viewset.py @@ -564,7 +564,8 @@ def test_rapidpro_post_submission(self): expected_xml = ( f"<{self.xform.survey.name} id=" "'transportation_2011_07_25'>orange" - f"") + f"\n\n uuid:{uuid}" + f"\n") self.assertEqual(instance.xml, expected_xml) self.assertEqual(self.xform.survey.name, 'data') diff --git a/onadata/libs/serializers/data_serializer.py b/onadata/libs/serializers/data_serializer.py index af3e3d93de..ad250e4b4d 100644 --- a/onadata/libs/serializers/data_serializer.py +++ b/onadata/libs/serializers/data_serializer.py @@ -42,12 +42,13 @@ def get_request_and_username(context): return (request, username) -def create_submission(request, username, data_dict, xform_id): +def create_submission( + request, username, data_dict, xform_id, gen_uuid: bool = False): """ Returns validated data object instances """ xml_string = dict2xform( - data_dict, xform_id, username=username) + data_dict, xform_id, username=username, gen_uuid=gen_uuid) xml_file = BytesIO(xml_string.encode('utf-8')) error, instance = safe_create_instance(username, xml_file, [], None, @@ -334,7 +335,8 @@ def create(self, validated_data): request, username = get_request_and_username(self.context) rapidpro_dict = query_list_to_dict(request.data.get('values')) instance = create_submission(request, username, rapidpro_dict, - validated_data['id_string']) + validated_data['id_string'], + gen_uuid=True) return instance @@ -352,7 +354,8 @@ def create(self, validated_data): instance_data_dict = { k: post_data[k].get('value') for k in post_data.keys()} instance = create_submission( - request, username, instance_data_dict, validated_data['id_string']) + request, username, instance_data_dict, + validated_data['id_string'], gen_uuid=True) return instance diff --git a/onadata/libs/utils/common_tools.py b/onadata/libs/utils/common_tools.py index 4f8faa37e8..8dd7c8a037 100644 --- a/onadata/libs/utils/common_tools.py +++ b/onadata/libs/utils/common_tools.py @@ -48,11 +48,11 @@ def get_boolean_value(str_var, default=None): return str_var if default else False -def get_uuid(): +def get_uuid(hex_only: bool = True): ''' Return UUID4 hex value ''' - return uuid.uuid4().hex + return uuid.uuid4().hex if hex_only else str(uuid.uuid4()) def report_exception(subject, info, exc_info=None): diff --git a/onadata/libs/utils/logger_tools.py b/onadata/libs/utils/logger_tools.py index fc33adf643..695f245500 100644 --- a/onadata/libs/utils/logger_tools.py +++ b/onadata/libs/utils/logger_tools.py @@ -47,7 +47,7 @@ from onadata.apps.viewer.models.parsed_instance import ParsedInstance from onadata.apps.viewer.signals import process_submission from onadata.libs.utils.common_tags import METADATA_FIELDS -from onadata.libs.utils.common_tools import report_exception +from onadata.libs.utils.common_tools import report_exception, get_uuid from onadata.libs.utils.model_tools import set_uuid from onadata.libs.utils.user_auth import get_user_default_project @@ -112,7 +112,7 @@ def _get_instance(xml, new_uuid, submitted_by, status, xform, checksum): return instance -def dict2xform(jsform, form_id, root=None, username=None): +def dict2xform(jsform, form_id, root=None, username=None, gen_uuid=False): """ Converts a dictionary containing submission data into an XML Submission for the appropriate form. @@ -143,6 +143,11 @@ def dict2xform(jsform, form_id, root=None, username=None): else: root = 'data' + if gen_uuid: + jsform['meta'] = { + 'instanceID': 'uuid:' + get_uuid(hex_only=False) + } + return "<{0} id='{1}'>{2}".format( root, form_id, dict2xml(jsform))