From ac620ab867a928fc15d87bef904546807147d52c Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Thu, 24 Jun 2021 21:18:31 +0200 Subject: [PATCH] workflows: allow Django templates in OpenDocument image references (#55361) --- tests/template-with-image-django-syntax.odt | Bin 0 -> 9294 bytes tests/test_workflows.py | 7 +++++-- wcs/wf/export_to_model.py | 17 +++++++++-------- 3 files changed, 14 insertions(+), 10 deletions(-) create mode 100644 tests/template-with-image-django-syntax.odt diff --git a/tests/template-with-image-django-syntax.odt b/tests/template-with-image-django-syntax.odt new file mode 100644 index 0000000000000000000000000000000000000000..db262a55e14a4fd3887a8457cb4e54d8b2c3a711 GIT binary patch literal 9294 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 literal 0 HcmV?d00001 diff --git a/tests/test_workflows.py b/tests/test_workflows.py index 6d4d2e50e..b5499bff6 100644 --- a/tests/test_workflows.py +++ b/tests/test_workflows.py @@ -3757,7 +3757,10 @@ def test_transform_to_pdf(): assert outstream.read(10).startswith(b'%PDF-') -def test_export_to_model_image(pub): +@pytest.mark.parametrize( + 'template_name', ['template-with-image.odt', 'template-with-image-django-syntax.odt'] +) +def test_export_to_model_image(pub, template_name): formdef = FormDef() formdef.name = 'baz' formdef.fields = [ @@ -3779,7 +3782,7 @@ def test_export_to_model_image(pub): item = ExportToModel() item.convert_to_pdf = False item.method = 'non-interactive' - template_filename = os.path.join(os.path.dirname(__file__), 'template-with-image.odt') + template_filename = os.path.join(os.path.dirname(__file__), template_name) with open(template_filename, 'rb') as fd: template = fd.read() upload = QuixoteUpload('/foo/template.odt', content_type='application/octet-stream') diff --git a/wcs/wf/export_to_model.py b/wcs/wf/export_to_model.py index f771d7f92..cfb27d270 100644 --- a/wcs/wf/export_to_model.py +++ b/wcs/wf/export_to_model.py @@ -587,17 +587,18 @@ class ExportToModel(WorkflowStatusItem): if node.tag == DRAW_FRAME: name = node.attrib.get(DRAW_NAME) - if not self.get_expression(name)['type'] == 'python': - continue # variable image - try: - variable_image = self.compute(name) - except Exception: - continue - if not hasattr(variable_image, 'get_content'): + pub = get_publisher() + with pub.complex_data(): + try: + variable_image = self.compute(name, allow_complex=True) + except Exception: + continue + complex_variable_image = get_publisher().get_cached_complex_data(variable_image) + if not hasattr(complex_variable_image, 'get_content'): continue image = [x for x in node if x.tag == DRAW_IMAGE][0] - new_images[image.attrib.get(XLINK_HREF)] = variable_image + new_images[image.attrib.get(XLINK_HREF)] = complex_variable_image for attr in ('text', 'tail'): if not getattr(node, attr):