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 |
|
-
|