From 580bf7f63a0e8120efd6510d458da7a7cfb79359 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Fri, 17 May 2019 20:08:42 +0200 Subject: [PATCH 2/3] formdata: ease iteration of evolutions parts (#33186) --- wcs/formdata.py | 5 +++++ wcs/formdef.py | 7 +++---- wcs/wf/attachment.py | 16 +++++++--------- wcs/workflows.py | 41 ++++++++++++++++------------------------- 4 files changed, 31 insertions(+), 38 deletions(-) diff --git a/wcs/formdata.py b/wcs/formdata.py index 4e9d55f9..4ab2671a 100644 --- a/wcs/formdata.py +++ b/wcs/formdata.py @@ -1095,6 +1095,11 @@ class FormData(StorableObject): field.feed_session(self.data.get(field.id), self.data.get('%s_display' % field.id)) + def iter_evolution_parts(self): + for evo in self.evolution or []: + for part in evo.parts or []: + yield part + def __getattr__(self, attr): try: return self.__dict__[attr] diff --git a/wcs/formdef.py b/wcs/formdef.py index 74f8ad43..db00d337 100644 --- a/wcs/formdef.py +++ b/wcs/formdef.py @@ -1604,10 +1604,9 @@ def clean_unused_files(publisher): for field_data in (formdata.data or {}).values() + (formdata.workflow_data or {}).values(): if is_upload(field_data): yield field_data.get_filename() - for evolution in (formdata.evolution or []): - for part in (evolution.parts or []): - if is_attachment(part): - yield part.filename + for part in formdata.iter_evolution_parts(): + if is_attachment(part): + yield part.filename for user in publisher.user_class.select(): for field_data in (user.form_data or {}).values(): if is_upload(field_data): diff --git a/wcs/wf/attachment.py b/wcs/wf/attachment.py index fd835859..07166194 100644 --- a/wcs/wf/attachment.py +++ b/wcs/wf/attachment.py @@ -34,15 +34,13 @@ def lookup_wf_attachment(self, filename): else: file_reference = None - for evo in self.formdata.evolution: - if evo.parts: - for p in evo.parts: - if not isinstance(p, AttachmentEvolutionPart): - continue - if file_reference and os.path.basename(p.filename) != file_reference: - continue - if p.base_filename == filename: - return p + for p in self.formdata.iter_evolution_parts(): + if not isinstance(p, AttachmentEvolutionPart): + continue + if file_reference and os.path.basename(p.filename) != file_reference: + continue + if p.base_filename == filename: + return p def form_attachment(self): diff --git a/wcs/workflows.py b/wcs/workflows.py index dcc360ed..6091e250 100644 --- a/wcs/workflows.py +++ b/wcs/workflows.py @@ -121,31 +121,19 @@ class AttachmentSubstitutionProxy(object): class NamedAttachmentsSubstitutionProxy(object): - def __init__(self, formdata, varname): + def __init__(self, formdata, parts): self.formdata = formdata - self.varname = varname - - def get_attachments(self): - attachments = [] - for evo in self.formdata.evolution or []: - for part in evo.parts or []: - if not isinstance(part, AttachmentEvolutionPart): - continue - if part.varname != self.varname: - continue - attachments.append(part) - attachments.reverse() - return attachments + self.parts = parts[:] + self.parts.reverse() def __len__(self): - return len(self.get_attachments()) + return len(self.parts) def __getattr__(self, name): return getattr(self[0], name) def __getitem__(self, i): - attachment = self.get_attachments()[i] - return AttachmentSubstitutionProxy(self.formdata, attachment) + return AttachmentSubstitutionProxy(self.formdata, self.parts[i]) class AttachmentsSubstitutionProxy(object): @@ -153,10 +141,13 @@ class AttachmentsSubstitutionProxy(object): self.formdata = formdata def __getattr__(self, name): - for evo in self.formdata.evolution or []: - for part in evo.parts or []: - if getattr(part, 'varname', None) == name: - return NamedAttachmentsSubstitutionProxy(self.formdata, name) + def has_varname_attachment(part): + return isinstance(part, AttachmentEvolutionPart) and getattr(part, 'varname', None) == name + + parts = [part for part in self.formdata.iter_evolution_parts() + if has_varname_attachment(part)] + if parts: + return NamedAttachmentsSubstitutionProxy(self.formdata, parts) raise AttributeError(name) @@ -1242,10 +1233,10 @@ class WorkflowGlobalActionTimeoutTrigger(WorkflowGlobalActionTrigger): get_publisher().substitutions.feed(formdata) seen_triggers = [] - for evolution in formdata.evolution: - for part in evolution.parts or []: - if isinstance(part, WorkflowGlobalActionTimeoutTriggerMarker): - seen_triggers.append(part.timeout_id) + for part in formdata.iter_evolution_parts(): + if not isinstance(part, WorkflowGlobalActionTimeoutTriggerMarker): + continue + seen_triggers.append(part.timeout_id) for action, trigger in triggers: if trigger.id in seen_triggers: -- 2.23.0