1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 """
18 The I{builder} module provides an wsdl/xsd defined types factory
19 """
20
21 from logging import getLogger
22 from suds import *
23 from suds.sudsobject import Factory
24
25 log = getLogger(__name__)
26
27
29 """ Builder used to construct an object for types defined in the schema """
30
32 """
33 @param resolver: A schema object name resolver.
34 @type resolver: L{resolver.Resolver}
35 """
36 self.resolver = resolver
37
62
63 - def process(self, data, type, history):
64 """ process the specified type then process its children """
65 if type in history:
66 return
67 if type.enum():
68 return
69 history.append(type)
70 resolved = type.resolve()
71 value = None
72 if type.unbounded():
73 value = []
74 else:
75 if len(resolved) > 0:
76 if resolved.mixed():
77 value = Factory.property(resolved.name)
78 md = value.__metadata__
79 md.sxtype = resolved
80 else:
81 value = Factory.object(resolved.name)
82 md = value.__metadata__
83 md.sxtype = resolved
84 md.ordering = self.ordering(resolved)
85 setattr(data, type.name, value)
86 if value is not None:
87 data = value
88 if not isinstance(data, list):
89 self.add_attributes(data, resolved)
90 for child, ancestry in resolved.children():
91 if self.skip_child(child, ancestry):
92 continue
93 self.process(data, child, history[:])
94
96 """ add required attributes """
97 for attr, ancestry in type.attributes():
98 name = '_%s' % attr.name
99 value = attr.get_default()
100 setattr(data, name, value)
101
103 """ get whether or not to skip the specified child """
104 if child.any(): return True
105 for x in ancestry:
106 if x.choice():
107 return True
108 return False
109
121