Projet

Général

Profil

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

Benjamin Dauvergne, 28 novembre 2019 01:55

Télécharger (4,38 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           |  3 +++
 wcs/wf/create_formdata.py | 44 ++++++++++++++++++++++++++++-----------
 2 files changed, 35 insertions(+), 12 deletions(-)
wcs/formdata.py
818 818
        lazy = self.get_substitution_variables()
819 819
        del lazy['form']
820 820
        del lazy['attachments']
821
        del lazy['linked']
821 822
        d.update(lazy)
822 823

  
823 824
        d = copy.deepcopy(d)
......
829 830
        from .qommon.substitution import CompatibilityNamesDict
830 831
        from wcs.variables import LazyFormData
831 832
        from wcs.workflows import AttachmentsSubstitutionProxy
833
        from wcs.wf.create_formdata import LinkedFormdataSubstitutionProxy
832 834
        variables = CompatibilityNamesDict({
833 835
            'form': LazyFormData(self),
834 836
            'attachments': AttachmentsSubstitutionProxy(self),
837
            'linked': LinkedFormdataSubstitutionProxy(self),
835 838
        })
836 839
        if self.formdef.category:
837 840
            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

  
116 118
    def __getattr__(self, name):
119
        if name.startswith('__'):
120
            raise AttributeError(name)
121

  
117 122
        formdata = self.__part.formdata
118 123
        if formdata is not None:
119 124
            return getattr(LazyFormData(self.__part.formdata), name)
......
131 136

  
132 137

  
133 138
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
139
    __varname = None
140

  
141
    def __init__(self, formdata):
142
        self.formdata = formdata
143

  
144
    @property
145
    def __parts(self):
146
        return [part for part in self.formdata.iter_evolution_parts()
147
                if isinstance(part, LinkedFormdataEvolutionPart)]
148

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

  
155
    @property
156
    def __varnames(self):
157
        return set(varname for varname, _1, _2 in self.__formdatas)
140 158

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

  
......
147 165
        return list(self)[idx]
148 166

  
149 167
    def __getattr__(self, name):
150
        if self.__varname or name not in self.__varnames:
168
        if name.startswith('__'):
169
            raise AttributeError(name)
170

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

  
200 220
    @property
201
-