- elif value == None:
- continue
-
- # ToDO remove maxOccurs hack after bug 177 is fixed
- if attr == "maxOccurs" and value == -1:
- value = "unbounded"
-
- if isinstance(value, bool):
- if value == True:
- value = "true"
- else:
- value = "false"
-
- attrNameSpacePrefix = ''
- if hasattr(obj, '__xmlattrnamespaces__'):
-## print "marshal: found __xmlattrnamespaces__"
- for nameSpaceKey, nameSpaceAttributes in getattr(obj, '__xmlattrnamespaces__').items():
- if nameSpaceKey == nameSpacePrefix[:-1]: # Don't need to specify attribute namespace if it is the same as it selement
- continue
- if attr in nameSpaceAttributes:
- attrNameSpacePrefix = nameSpaceKey + ':'
- break
-## if attr.startswith('_'):
-## attr = attr[1:]
- if (hasattr(obj, "__xmlrename__") and attr in obj.__xmlrename__):
-## print "marshal: found __xmlrename__ (and its attribute)"
- attr = obj.__xmlrename__[attr]
-
- objattrs += ' %s%s="%s"' % (attrNameSpacePrefix, attr, value)
-## print "marshal: new objattrs is: ", objattrs
-
- objtype = type(obj)
- if isinstance(obj, NoneType):
- #print "marshal: skipping an element with no type"
- return ''
-# return '%s<%s objtype="None"/>%s' % (prefix, elementName, newline)
- elif isinstance(obj, bool):
- xmlString = '%s<%s objtype="bool">%s</%s>%s' % (prefix, elementName, obj, elementName, newline)
- #print "marshal: returning a bool element: \n", xmlString
- return xmlString
- elif isinstance(obj, int):
- xmlString = '''%s<%s objtype="int">%s</%s>%s''' % (prefix, elementName, str(obj), elementName, newline)
- #print "marshal: returning a int element: \n", xmlString
- return xmlString
- elif isinstance(obj, long):
- xmlString = '%s<%s objtype="long">%s</%s>%s' % (prefix, elementName, str(obj), elementName, newline)
- #print "marshal: returning a long element: \n", xmlString
- return xmlString
- elif isinstance(obj, float):
- xmlString = '%s<%s objtype="float">%s</%s>%s' % (prefix, elementName, str(obj), elementName, newline)
- #print "marshal: returning a float element: \n", xmlString
- return xmlString
- elif isinstance(obj, basestring):
- xmlString = '''%s<%s>%s</%s>%s''' % (prefix, elementName, saxutils.escape(obj), elementName, newline)
- #print "marshal: returning a str element: \n", xmlString
- return xmlString
-## elif isinstance(obj, unicode):
-## return '''%s<%s>%s</%s>%s''' % (prefix, elementName, obj, elementName, newline)
- elif isinstance(obj, list):
- if len(obj) < 1:
- #print "marshal: skipping an empty list"
- return ''
- xmlString = '%s<%s objtype="list">%s' % (prefix, elementName, newline)
- for item in obj:
- xmlString += marshal(item, nameSpaces=nameSpaces, indent=indent+increment, knownTypes=knownTypes)
- xmlString += '%s</%s>%s' % (prefix, elementName, newline)
- #print "marshal: returning a list element: \n", xmlString
- return xmlString
- elif isinstance(obj, tuple):
- if len(obj) < 1:
- #print "marshal: skipping an empty tuple"
- return ''
- xmlString = '%s<%s objtype="list" mutable="false">%s' % (prefix, elementName, newline)
- for item in obj:
- xmlString += marshal(item, nameSpaces=nameSpaces, indent=indent+increment, knownTypes=knownTypes)
- xmlString += '%s</%s>%s' % (prefix, elementName, newline)
- #print "marshal: returning a tuple element: \n", xmlString
- return xmlString
- elif isinstance(obj, dict):
- xmlString = '%s<%s objtype="dict">%s' % (prefix, elementName, newline)
- subprefix = prefix + ' '*increment
- subindent = indent + 2*increment
- for key, val in obj.iteritems():
- xmlString += "%s<key>%s%s%s</key>%s%s<value>%s%s%s</value>%s" \
- % (subprefix, newline, marshal(key, indent=subindent, knownTypes=knownTypes), subprefix, newline, subprefix, newline, marshal(val, nameSpaces=nameSpaces, indent=subindent, knownTypes=knownTypes), subprefix, newline)
- xmlString += '%s</%s>%s' % (prefix, elementName, newline)
- #print "marshal: returning a dict element: \n", xmlString
- return xmlString
- else:
- moduleName = obj.__class__.__module__
- if (moduleName == "activegrid.model.schema"):
-## print "marshal: found an activegrid.model.schema class element"
- xmlString = '%s<%s%s%s' % (prefix, elementName, nameSpaceAttrs, objattrs)
+
+ # ToDO remove maxOccurs hack after bug 177 is fixed
+ if attr == "maxOccurs" and value == -1:
+ value = "unbounded"
+
+ if isinstance(value, bool):
+ if value == True:
+ value = "true"
+ else:
+ value = "false"
+ else:
+ value = objutils.toDiffableRepr(value)
+
+ objattrs += ' %s%s="%s"' % (attrNameSpacePrefix, attr, saxutils.escape(value))
+ ## print "marshal: new objattrs is: ", objattrs
+ if (obj == None):
+ xmlString = [""]
+ elif isinstance(obj, bool):
+ objTypeStr = self._genObjTypeStr("bool")
+ xmlString = ['%s<%s%s>%s</%s>%s' % (prefix, elementName, objTypeStr, obj, elementName, newline)]
+ elif isinstance(obj, int):
+ objTypeStr = self._genObjTypeStr("int")
+ xmlString = ['%s<%s%s>%s</%s>%s' % (prefix, elementName, objTypeStr, str(obj), elementName, newline)]
+ elif isinstance(obj, long):
+ objTypeStr = self._genObjTypeStr("long")
+ xmlString = ['%s<%s%s>%s</%s>%s' % (prefix, elementName, objTypeStr, str(obj), elementName, newline)]
+ elif isinstance(obj, float):
+ objTypeStr = self._genObjTypeStr("float")
+ xmlString = ['%s<%s%s>%s</%s>%s' % (prefix, elementName, objTypeStr, str(obj), elementName, newline)]
+ elif isinstance(obj, unicode): # have to check before basestring - unicode is instance of base string
+ xmlString = ['%s<%s>%s</%s>%s' % (prefix, elementName, saxutils.escape(obj.encode()), elementName, newline)]
+ elif isinstance(obj, basestring):
+ xmlString = ['%s<%s>%s</%s>%s' % (prefix, elementName, saxutils.escape(obj), elementName, newline)]
+ elif isinstance(obj, list):
+ if len(obj) < 1:
+ xmlString = ""
+ else:
+ objTypeStr = self._genObjTypeStr("list")
+ xmlString = ['%s<%s%s>%s' % (prefix, elementName, objTypeStr, newline)]
+ for item in obj:
+ xmlString.extend(self._marshal(item, indent=indent+increment))
+ xmlString.append("%s</%s>%s" % (prefix, elementName, newline))
+ elif isinstance(obj, tuple):
+ if len(obj) < 1:
+ xmlString = ""
+ else:
+ objTypeStr = self._genObjTypeStr("list")
+ xmlString = ['%s<%s%s mutable="false">%s' % (prefix, elementName, objTypeStr, newline)]
+ for item in obj:
+ xmlString.extend(self._marshal(item, indent=indent+increment))
+ xmlString.append("%s</%s>%s" % (prefix, elementName, newline))
+ elif isinstance(obj, dict):
+ objTypeStr = self._genObjTypeStr("dict")
+ xmlString = ['%s<%s%s>%s' % (prefix, elementName, objTypeStr, newline)]
+ subprefix = prefix + " "*increment
+ subindent = indent + 2*increment
+ keys = obj.keys()
+ keys.sort()
+ for key in keys:
+ xmlString.append("%s<%s>%s" % (subprefix, DICT_ITEM_NAME, newline))
+ xmlString.extend(self._marshal(key, elementName=DICT_ITEM_KEY_NAME, indent=subindent))
+ xmlString.extend(self._marshal(obj[key], elementName=DICT_ITEM_VALUE_NAME, indent=subindent))
+ xmlString.append("%s</%s>%s" % (subprefix, DICT_ITEM_NAME, newline))
+ xmlString.append("%s</%s>%s" % (prefix, elementName, newline))
+ elif hasattr(obj, "__xmlcontent__"):
+ contentValue = getattr(obj, obj.__xmlcontent__)
+ if contentValue == None:
+ contentValue = ''
+ else:
+ contentValue = saxutils.escape(contentValue)
+ xmlString = ["%s<%s%s%s>%s</%s>%s" % (prefix, elementName, nameSpaceAttrs, objattrs, contentValue, elementName, newline)]