xmlclass/xmlclass.py
changeset 85 fd17b0e0fd7e
parent 84 0369ad49e67f
child 86 4f1dbdb0bed2
equal deleted inserted replaced
84:0369ad49e67f 85:fd17b0e0fd7e
   550                             classmembers["set"+attrname] = generateSetMethod(attr, value_type)
   550                             classmembers["set"+attrname] = generateSetMethod(attr, value_type)
   551                         classmembers["get"+attrname] = generateGetMethod(attr)
   551                         classmembers["get"+attrname] = generateGetMethod(attr)
   552                 classmembers["__init__"] = generateInitMethod(bases, initialValues)
   552                 classmembers["__init__"] = generateInitMethod(bases, initialValues)
   553                 classmembers["loadXMLTree"] = generateLoadXMLTree(bases, members, self.ComputedClasses)
   553                 classmembers["loadXMLTree"] = generateLoadXMLTree(bases, members, self.ComputedClasses)
   554                 classmembers["generateXMLText"] = generateGenerateXMLText(bases, members)
   554                 classmembers["generateXMLText"] = generateGenerateXMLText(bases, members)
   555                 classmembers["getElementAttributes"] = generateGetElementAttributes(bases, members, self.ComputedClasses)
   555                 classmembers["getElementAttributes"] = generateGetElementAttributes(members, self.ComputedClasses)
       
   556                 classmembers["getElementInfos"] = generateGetElementInfos(members, self.ComputedClasses)
       
   557                 classmembers["setElementValue"] = generateSetElementValue(members)
   556                 classmembers["singleLineAttributes"] = True
   558                 classmembers["singleLineAttributes"] = True
   557                 
   559                 
   558                 self.ComputedClasses[classname] = classobj(classname, bases, classmembers)
   560                 self.ComputedClasses[classname] = classobj(classname, bases, classmembers)
   559 
   561 
   560     def MarkUsedClasses(self, classname):
   562     def MarkUsedClasses(self, classname):
   812         else:
   814         else:
   813             return first, text
   815             return first, text
   814     return generateXMLTextMethod
   816     return generateXMLTextMethod
   815 
   817 
   816 
   818 
   817 def generateGetElementAttributes(bases, members, classes):
   819 def generateGetElementAttributes(members, classes):
   818     def getElementAttributes(self):
   820     def getElementAttributes(self):
   819         attr_list = []
   821         attr_list = []
   820         for attr, values in members.items():
   822         for attr, values in members.items():
   821             if attr in ["order","choice_content","multichoice_content"]:
   823             if attr in ["order","choice_content","multichoice_content"]:
   822                 pass
   824                 pass
   833                     attr_params["value"] = getattr(self, attr, "")
   835                     attr_params["value"] = getattr(self, attr, "")
   834                     attr_params["type"] = values[0][4:]
   836                     attr_params["type"] = values[0][4:]
   835                 attr_list.append(attr_params)
   837                 attr_list.append(attr_params)
   836         return attr_list
   838         return attr_list
   837     return getElementAttributes
   839     return getElementAttributes
   838     
   840 
       
   841 def generateGetElementInfos(members, classes):
       
   842     def getElementInfos(self, name, path = None):
       
   843         attr_type = "element"
       
   844         value = None
       
   845         children = []
       
   846         if "enum" in members:
       
   847             attr_type = self.getValidValues()
       
   848             value = self.value
       
   849         elif "limit" in members:
       
   850             attr_type = {"min" : None, "max" : None}
       
   851             if "min" in members:
       
   852                 attr_type["min"] = members["min"]
       
   853             if "max" in members:
       
   854                 attr_type["max"] = members["max"]
       
   855             value = self.value
       
   856         elif path:
       
   857             if "choice_content" in members:
       
   858                 return self.content["value"].getElementInfos(self.content["name"], path)
       
   859             elif "multichoice_content" not in members:
       
   860                 parts = path.split(".", 1)
       
   861                 if parts[0] in members:
       
   862                     values = members[parts[0]]
       
   863                     if values[1] == "attribute" and len(parts) == 1:
       
   864                         attr = getattr(self, parts[0], None)
       
   865                         if attr != None:
       
   866                             if values[0].startswith("cls:"):
       
   867                                 return attr.getElementInfos(parts[0])
       
   868                             else:
       
   869                                 attr_type = values[0][4:]
       
   870                                 value = getattr(self, attr, "")
       
   871                     elif values[1] == "element":
       
   872                         attr = getattr(self, parts[0], None)
       
   873                         if attr != None:
       
   874                             if len(parts) == 1:
       
   875                                 return attr.getElementInfos(parts[0])
       
   876                             else:
       
   877                                 return attr.getElementInfos(parts[0], parts[1])
       
   878         else:
       
   879             for attr, values in members.items():
       
   880                 if attr == "order":
       
   881                     pass
       
   882                 elif attr == "choice_content":
       
   883                     attr_type = self.getChoices().items()
       
   884                     value = self.content["name"]
       
   885                     children.extend(self.content["value"].getElementInfos(self.content["name"])["children"])
       
   886                 elif attr == "multichoice_content":
       
   887                     for element_infos in self.content:
       
   888                         children.append(element_infos["value"].getElementInfos(element_infos["name"]))
       
   889                 elif values[1] == "attribute" and not values[0].startswith("cls:"):
       
   890                     children.append({"name" : attr, "value" : getattr(self, attr, ""), "type" : values[0][4:], "children" : []})
       
   891                 else:
       
   892                     element = getattr(self, attr, None)
       
   893                     if not element:
       
   894                         element = classes[values[0][4:]]()
       
   895                     children.append(element.getElementInfos(attr))
       
   896         return {"name" : name, "type" : attr_type, "value" : value, "children" : children}
       
   897     return getElementInfos
       
   898 
       
   899 def generateSetElementValue(members):
       
   900     def setElementValue(self, path, value):
       
   901         if "enum" in members or "limit" in members:
       
   902             if not path:
       
   903                 self.setValue(value)
       
   904         elif "choice_content" in members:
       
   905             if path:
       
   906                 self.content["value"].setElementValue(path, value)
       
   907             else:
       
   908                 self.addContent(value)
       
   909         else: 
       
   910             parts = path.split(".", 1)
       
   911             if parts[0] in members:
       
   912                 values = members[parts[0]]
       
   913                 if values[1] == "attribute" and len(parts) == 1:
       
   914                     attr = getattr(self, parts[0], None)
       
   915                     if attr != None:
       
   916                         if values[0].startswith("cls:"):
       
   917                             attr.setElementValue(None, value)
       
   918                         elif values[0][4:] == "boolean":
       
   919                             setattr(self, parts[0], value)
       
   920                         else:
       
   921                             setattr(self, parts[0], GetComputedValue(values[0], value))
       
   922                 elif values[1] == "element":
       
   923                     attr = getattr(self, parts[0], None)
       
   924                     if attr != None:
       
   925                         if len(parts) == 1:
       
   926                             attr.setElementValue(None, value)
       
   927                         else:
       
   928                             attr.setElementValue(parts[1], value)
       
   929     return setElementValue
       
   930 
   839 """
   931 """
   840 Methods that generates the different methods for setting and getting the attributes
   932 Methods that generates the different methods for setting and getting the attributes
   841 """
   933 """
   842 def generateInitMethod(bases, members):
   934 def generateInitMethod(bases, members):
   843     def initMethod(self):
   935     def initMethod(self):