From 4c2568805728d1c3bf47d26501ba0872b35d02e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Mon, 11 Feb 2019 17:04:59 +0100 Subject: [PATCH] formdata: handle form_tracking_code of unsaved data in lazy mode (#30536) --- tests/test_formdata.py | 18 ++++++++++++++++++ wcs/formdata.py | 8 ++++++-- wcs/variables.py | 8 +++++++- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/tests/test_formdata.py b/tests/test_formdata.py index 9f2cc2cf1..7cdaf8c91 100644 --- a/tests/test_formdata.py +++ b/tests/test_formdata.py @@ -715,6 +715,24 @@ def test_lazy_formdata(pub, variable_test_data): assert lazy_formdata.var.filefield.raw.base_filename == 'test.txt' assert lazy_formdata.var.filefield.raw.content_type == 'text/plain' + formdata = FormDef.select()[0].data_class() + lazy_formdata = LazyFormData(formdata) + assert lazy_formdata.tracking_code is None + formdata.data = {'future_tracking_code': 'CDCBGWQX'} + assert lazy_formdata.tracking_code == 'CDCBGWQX' + + formdata = FormDef.select()[0].data_class().select()[0] + lazy_formdata = LazyFormData(formdata) + assert lazy_formdata.tracking_code is None + + tracking_code = pub.tracking_code_class() + tracking_code.formdata = formdata + tracking_code.store() + formdata = FormDef.select()[0].data_class().get(formdata.id) + lazy_formdata = LazyFormData(formdata) + assert lazy_formdata.tracking_code == tracking_code.id + + def test_lazy_variables(pub, variable_test_data): formdata = FormDef.select()[0].data_class().select()[0] for mode in (None, 'lazy'): diff --git a/wcs/formdata.py b/wcs/formdata.py index 0ec50b9a6..0a8bfdf47 100644 --- a/wcs/formdata.py +++ b/wcs/formdata.py @@ -684,8 +684,12 @@ class FormData(StorableObject): if self.tracking_code: d['form_tracking_code'] = self.tracking_code - elif not self.status and self.data and 'future_tracking_code' in self.data: - d['form_tracking_code'] = self.data['future_tracking_code'] + elif not self.status and self.data: + if 'future_tracking_code' in self.data: + d['form_tracking_code'] = self.data['future_tracking_code'] + elif 'draft_formdata_id' in self.data: + formdata = self.formdef.data_class().get(self.data['draft_formdata_id']) + d['form_tracking_code'] = formdata.tracking_code d['form_submission_backoffice'] = self.backoffice_submission d['form_submission_channel'] = self.submission_channel diff --git a/wcs/variables.py b/wcs/variables.py index b5e5f57bb..78dafd41a 100644 --- a/wcs/variables.py +++ b/wcs/variables.py @@ -144,7 +144,13 @@ class LazyFormData(LazyFormDef): @property def tracking_code(self): - return self.formdata.tracking_code + formdata = self.formdata + if not formdata.status and formdata.data: + if 'future_tracking_code' in formdata.data: + return formdata.data['future_tracking_code'] + elif 'draft_formdata_id' in formdata.data: + formdata = formdata.formdef.data_class().get(formdata.data['draft_formdata_id']) + return formdata.tracking_code @property def submission_backoffice(self):