From 093431df3f440c93bfc99308e5ee0e67b6022c6f Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Wed, 27 Nov 2019 23:56:28 +0100 Subject: [PATCH 5/7] formdata: make LinkedFormdataSubstitutionProxy work in pickle-lazy mode To fixup with previous commit. --- wcs/formdata.py | 3 +++ wcs/wf/create_formdata.py | 44 ++++++++++++++++++++++++++++----------- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/wcs/formdata.py b/wcs/formdata.py index 976cb7ca..4189f7f6 100644 --- a/wcs/formdata.py +++ b/wcs/formdata.py @@ -819,6 +819,7 @@ class FormData(StorableObject): lazy = self.get_substitution_variables() del lazy['form'] del lazy['attachments'] + del lazy['linked'] d.update(lazy) d = copy.deepcopy(d) @@ -830,9 +831,11 @@ class FormData(StorableObject): from .qommon.substitution import CompatibilityNamesDict from wcs.variables import LazyFormData from wcs.workflows import AttachmentsSubstitutionProxy + from wcs.wf.create_formdata import LinkedFormdataSubstitutionProxy variables = CompatibilityNamesDict({ 'form': LazyFormData(self), 'attachments': AttachmentsSubstitutionProxy(self), + 'linked': LinkedFormdataSubstitutionProxy(self), }) if self.formdef.category: variables.update(self.formdef.category.get_substitution_variables(minimal=minimal)) diff --git a/wcs/wf/create_formdata.py b/wcs/wf/create_formdata.py index f5e653b4..d2a68080 100644 --- a/wcs/wf/create_formdata.py +++ b/wcs/wf/create_formdata.py @@ -110,10 +110,15 @@ class MappingsWidget(WidgetListAsTable): class LazyLinkedFormData(object): + __part = None + def __init__(self, part): self.__part = part def __getattr__(self, name): + if name.startswith('__'): + raise AttributeError(name) + formdata = self.__part.formdata if formdata is not None: return getattr(LazyFormData(self.__part.formdata), name) @@ -131,15 +136,28 @@ class LazyLinkedFormData(object): class LinkedFormdataSubstitutionProxy(object): - def __init__(self, parts): - self.__parts = parts - self.__formdatas = [(part.varname, part, LazyLinkedFormData(part)) for part in parts] - self.__formdatas.reverse() - self.__varnames = set(varname for varname, _1, _2 in self.__formdatas) - self.__varname = None + __varname = None + + def __init__(self, formdata): + self.formdata = formdata + + @property + def __parts(self): + return [part for part in self.formdata.iter_evolution_parts() + if isinstance(part, LinkedFormdataEvolutionPart)] + + @property + def __formdatas(self): + formdatas = [(part.varname, part, LazyLinkedFormData(part)) for part in self.__parts] + formdatas.reverse() + return formdatas + + @property + def __varnames(self): + return set(varname for varname, _1, _2 in self.__formdatas) def __iter__(self): - for varname, part, formdata in self.__formdatas: + for varname, part, formdata in self.__formdatas or []: if self.__varname is None or self.__varname == varname: yield formdata @@ -147,13 +165,16 @@ class LinkedFormdataSubstitutionProxy(object): return list(self)[idx] def __getattr__(self, name): - if self.__varname or name not in self.__varnames: + if name.startswith('__'): + raise AttributeError(name) + + if self.__varname or name not in (self.__varnames or []): try: first = self[0] - except KeyError: + except IndexError: raise AttributeError(name) return getattr(first, name) - elif name in self.__varnames: + elif name in (self.__varnames or []): new_sub = copy.copy(self) new_sub.varname = name return new_sub @@ -193,8 +214,7 @@ class LinkedFormdataEvolutionPart(object): @classmethod def get_substitution_variables(cls, formdata): return { - 'linked': LinkedFormdataSubstitutionProxy( - [part for part in formdata.iter_evolution_parts() if isinstance(part, LinkedFormdataEvolutionPart)]), + 'linked': LinkedFormdataSubstitutionProxy(formdata), } @property -- 2.24.0