From b07ed92fff72fc7a405c0b5a75a8534e641fc52d Mon Sep 17 00:00:00 2001 From: jortel Date: Tue, 17 Aug 2010 15:57:33 +0000 Subject: Fix building xsd types using the builder with mixed content (string w/ attributes). --- suds/builder.py | 19 ++++++++++++------- suds/xsd/sxbase.py | 6 ++++++ suds/xsd/sxbasic.py | 14 +++++++++++++- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/suds/builder.py b/suds/builder.py index 95f81c4..c2aad98 100644 --- a/suds/builder.py +++ b/suds/builder.py @@ -44,10 +44,10 @@ class Builder: else: type = name cls = type.name - if len(type): - data = Factory.object(cls) - else: + if type.mixed(): data = Factory.property(cls) + else: + data = Factory.object(cls) resolved = type.resolve() md = data.__metadata__ md.sxtype = resolved @@ -73,10 +73,15 @@ class Builder: value = [] else: if len(resolved) > 0: - value = Factory.object(resolved.name) - md = value.__metadata__ - md.sxtype = resolved - md.ordering = self.ordering(resolved) + if resolved.mixed(): + value = Factory.property(resolved.name) + md = value.__metadata__ + md.sxtype = resolved + else: + value = Factory.object(resolved.name) + md = value.__metadata__ + md.sxtype = resolved + md.ordering = self.ordering(resolved) setattr(data, type.name, value) if value is not None: data = value diff --git a/suds/xsd/sxbase.py b/suds/xsd/sxbase.py index 643a118..2577ffd 100644 --- a/suds/xsd/sxbase.py +++ b/suds/xsd/sxbase.py @@ -297,6 +297,12 @@ class SchemaObject(object): @rtype: boolean """ return False + + def mixed(self): + """ + Get whether this I{mixed} content. + """ + return False def find(self, qref, classes=()): """ diff --git a/suds/xsd/sxbasic.py b/suds/xsd/sxbasic.py index 0b536d2..2506e04 100644 --- a/suds/xsd/sxbasic.py +++ b/suds/xsd/sxbasic.py @@ -118,6 +118,12 @@ class Complex(SchemaObject): if c.extension(): return True return False + + def mixed(self): + for c in self.rawchildren: + if isinstance(c, SimpleContent) and c.mixed(): + return True + return False class Group(SchemaObject): @@ -195,6 +201,9 @@ class Simple(SchemaObject): if isinstance(child, Enumeration): return True return False + + def mixed(self): + return len(self) def description(self): return ('name',) @@ -340,6 +349,9 @@ class SimpleContent(SchemaObject): if c.restriction(): return True return False + + def mixed(self): + return len(self) class Enumeration(Content): @@ -470,7 +482,7 @@ class Extension(SchemaObject): def description(self): return ('ref',) - + class Import(SchemaObject): """ -- cgit v1.2.1