From e0325250727432c2de47d2136a8947c04d4e848e Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Fri, 17 May 2019 20:08:42 +0200 Subject: [PATCH 3/7] 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 abe91c6b..976cb7ca 100644 --- a/wcs/formdata.py +++ b/wcs/formdata.py @@ -1096,6 +1096,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 8b727365..c58ed70c 100644 --- a/wcs/formdef.py +++ b/wcs/formdef.py @@ -1609,10 +1609,9 @@ def clean_unused_files(publisher): (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 9f95350e..6b51b5bb 100644 --- a/wcs/wf/attachment.py +++ b/wcs/wf/attachment.py @@ -35,15 +35,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 43ac7956..9eddfba1 100644 --- a/wcs/workflows.py +++ b/wcs/workflows.py @@ -124,31 +124,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): @@ -158,10 +146,13 @@ class AttachmentsSubstitutionProxy(object): def __getattr__(self, name): if name.startswith('__'): raise AttributeError(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) @@ -1246,10 +1237,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.24.0