def __setitem__(self, key, val): if key == "__event": key = "_event" if key in assignOnce and key in self: raise DataModelError("The field '%s' is read only." % key) if type(val).__name__ == "Event": val = val.__dict__ if type(val) == dict: data = dictToXML(val, root="data", root_attrib={"id": key}) elif isinstance(val, list): data = etree.fromstring("<data id='%s' xmlns='' />" % key, parser=self.parser) data.append(deepcopy(val)) else: val = val if val is not None else "" key = key.lstrip("$") data = etree.fromstring("<data id='%s' xmlns=''>%s</data>" % (key, val), parser=self.parser) try: current = self.root.find("data[@id='%s']" % key) if current is not None: self.root.remove(current) self.root.append(data) except KeyError: raise DataModelError("You can't assign to the name '%s'." % key) except: self.logger.exception( "__setitem__ failed for key: %s and value: %s." % (key, val))