def _get_instance( request: 'rest_framework.request.Request', xml: str, new_uuid: str, status: str, xform: XForm, defer_counting: bool = False, ) -> Instance: """ `defer_counting=False` will set a Python-only attribute of the same name on the *new* `Instance` if one is created. This will prevent `update_xform_submission_count()` from doing anything, which avoids locking any rows in `logger_xform` or `main_userprofile`. """ # check if its an edit submission old_uuid = get_deprecated_uuid_from_xml(xml) instances = Instance.objects.filter(uuid=old_uuid) if instances: # edits instance = instances[0] check_edit_submission_permissions(request, xform, instance) InstanceHistory.objects.create(xml=instance.xml, xform_instance=instance, uuid=old_uuid) instance.xml = xml instance._populate_xml_hash() instance.uuid = new_uuid instance.save() else: submitted_by = (request.user if request and request.user.is_authenticated else None) # new submission # Avoid `Instance.objects.create()` so that we can set a Python-only # attribute, `defer_counting`, before saving instance = Instance() instance.xml = xml instance.user = submitted_by instance.status = status instance.xform = xform if defer_counting: # Only set the attribute if requested, i.e. don't bother ever # setting it to `False` instance.defer_counting = True instance.save() return instance
def _get_instance(xml, new_uuid, submitted_by, status, xform, defer_counting=False): ''' `defer_counting=False` will set a Python-only attribute of the same name on the *new* `Instance` if one is created. This will prevent `update_xform_submission_count()` from doing anything, which avoids locking any rows in `logger_xform` or `main_userprofile`. ''' # check if its an edit submission old_uuid = get_deprecated_uuid_from_xml(xml) instances = Instance.objects.filter(uuid=old_uuid) if instances: # edits check_edit_submission_permissions(submitted_by, xform) instance = instances[0] InstanceHistory.objects.create(xml=instance.xml, xform_instance=instance, uuid=old_uuid) instance.xml = xml instance._populate_xml_hash() instance.uuid = new_uuid instance.save() else: # new submission # Avoid `Instance.objects.create()` so that we can set a Python-only # attribute, `defer_counting`, before saving instance = Instance() instance.xml = xml instance.user = submitted_by instance.status = status instance.xform = xform if defer_counting: # Only set the attribute if requested, i.e. don't bother ever # setting it to `False` instance.defer_counting = True instance.save() return instance
def _get_instance(xml, new_uuid, submitted_by, status, xform, defer_counting=False): ''' `defer_counting=False` will set a Python-only attribute of the same name on the *new* `Instance` if one is created. This will prevent `update_xform_submission_count()` from doing anything, which avoids locking any rows in `logger_xform` or `main_userprofile`. ''' # check if its an edit submission old_uuid = get_deprecated_uuid_from_xml(xml) instances = Instance.objects.filter(uuid=old_uuid) if instances: # edits check_edit_submission_permissions(submitted_by, xform) instance = instances[0] InstanceHistory.objects.create( xml=instance.xml, xform_instance=instance, uuid=old_uuid) instance.xml = xml instance._populate_xml_hash() instance.uuid = new_uuid instance.save() else: # new submission # Avoid `Instance.objects.create()` so that we can set a Python-only # attribute, `defer_counting`, before saving instance = Instance() instance.xml = xml instance.user = submitted_by instance.status = status instance.xform = xform if defer_counting: # Only set the attribute if requested, i.e. don't bother ever # setting it to `False` instance.defer_counting = True instance.save() return instance