Projet

Général

Profil

0004-formdata-make-LinkedFormdataSubstitutionProxy-work-i.patch

Benjamin Dauvergne, 27 novembre 2019 23:58

Télécharger (3,89 ko)

Voir les différences:

Subject: [PATCH 4/5] formdata: make LinkedFormdataSubstitutionProxy work in
 pickle-lazy mode

To fixup with previous commit.
 wcs/formdata.py           |  2 ++
 wcs/wf/create_formdata.py | 41 +++++++++++++++++++++++++++------------
 2 files changed, 31 insertions(+), 12 deletions(-)
wcs/formdata.py
829 829
        from .qommon.substitution import CompatibilityNamesDict
830 830
        from wcs.variables import LazyFormData
831 831
        from wcs.workflows import AttachmentsSubstitutionProxy
832
        from wcs.wf.create_formdata import LinkedFormdataSubstitutionProxy
832 833
        variables = CompatibilityNamesDict({
833 834
            'form': LazyFormData(self),
834 835
            'attachments': AttachmentsSubstitutionProxy(self),
836
            'linked': LinkedFormdataSubstitutionProxy(self),
835 837
        })
836 838
        if self.formdef.category:
837 839
            variables.update(self.formdef.category.get_substitution_variables(minimal=minimal))
wcs/wf/create_formdata.py
110 110

  
111 111

  
112 112
class LazyLinkedFormData(object):
113
    __part = None
114

  
113 115
    def __init__(self, part):
114 116
        self.__part = part
115 117

  
......
131 133

  
132 134

  
133 135
class LinkedFormdataSubstitutionProxy(object):
134
    def __init__(self, parts):
135
        self.__parts = parts
136
        self.__formdatas = [(part.varname, part, LazyLinkedFormData(part)) for part in parts]
137
        self.__formdatas.reverse()
138
        self.__varnames = set(varname for varname, _1, _2 in self.__formdatas)
139
        self.__varname = None
136
    __varname = None
137

  
138
    def __init__(self, formdata):
139
        self.formdata = formdata
140

  
141
    @property
142
    def __parts(self):
143
        return [part for part in self.formdata.iter_evolution_parts()
144
                if isinstance(part, LinkedFormdataEvolutionPart)]
145

  
146
    @property
147
    def __formdatas(self):
148
        formdatas = [(part.varname, part, LazyLinkedFormData(part)) for part in self.__parts]
149
        formdatas.reverse()
150
        return formdatas
151

  
152
    @property
153
    def __varnames(self):
154
        return set(varname for varname, _1, _2 in self.__formdatas)
140 155

  
141 156
    def __iter__(self):
142
        for varname, part, formdata in self.__formdatas:
157
        for varname, part, formdata in self.__formdatas or []:
143 158
            if self.__varname is None or self.__varname == varname:
144 159
                yield formdata
145 160

  
......
147 162
        return list(self)[idx]
148 163

  
149 164
    def __getattr__(self, name):
150
        if self.__varname or name not in self.__varnames:
165
        if name.startswith('__'):
166
            raise AttributeError(name)
167

  
168
        if self.__varname or name not in (self.__varnames or []):
151 169
            try:
152 170
                first = self[0]
153
            except KeyError:
171
            except IndexError:
154 172
                raise AttributeError(name)
155 173
            return getattr(first, name)
156
        elif name in self.__varnames:
174
        elif name in (self.__varnames or []):
157 175
            new_sub = copy.copy(self)
158 176
            new_sub.varname = name
159 177
            return new_sub
......
193 211
    @classmethod
194 212
    def get_substitution_variables(cls, formdata):
195 213
        return {
196
            'linked': LinkedFormdataSubstitutionProxy(
197
                [part for part in formdata.iter_evolution_parts() if isinstance(part, LinkedFormdataEvolutionPart)]),
214
            'linked': LinkedFormdataSubstitutionProxy(formdata),
198 215
        }
199 216

  
200 217
    @property
201
-