ConfigTreeNode.py
changeset 1315 ff14a66bbd12
parent 1179 3e7bd88fcff7
child 1330 96b242e4c59d
equal deleted inserted replaced
1314:822d483197ad 1315:ff14a66bbd12
     7 - ... TODO : document
     7 - ... TODO : document
     8 """
     8 """
     9 
     9 
    10 import os,traceback,types
    10 import os,traceback,types
    11 import shutil
    11 import shutil
    12 from xml.dom import minidom
    12 from lxml import etree
    13 
    13 
    14 from xmlclass import GenerateClassesFromXSDstring
    14 from xmlclass import GenerateParserFromXSDstring
    15 from util.misc import GetClassImporter
    15 from util.misc import GetClassImporter
    16 
    16 
    17 from PLCControler import PLCControler, LOCATION_CONFNODE
    17 from PLCControler import PLCControler, LOCATION_CONFNODE
    18 from editors.ConfTreeNodeEditor import ConfTreeNodeEditor
    18 from editors.ConfTreeNodeEditor import ConfTreeNodeEditor
    19 
    19 
    20 _BaseParamsClass = GenerateClassesFromXSDstring("""<?xml version="1.0" encoding="ISO-8859-1" ?>
    20 _BaseParamsParser = GenerateParserFromXSDstring("""<?xml version="1.0" encoding="ISO-8859-1" ?>
    21         <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    21         <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    22           <xsd:element name="BaseParams">
    22           <xsd:element name="BaseParams">
    23             <xsd:complexType>
    23             <xsd:complexType>
    24               <xsd:attribute name="Name" type="xsd:string" use="optional" default="__unnamed__"/>
    24               <xsd:attribute name="Name" type="xsd:string" use="optional" default="__unnamed__"/>
    25               <xsd:attribute name="IEC_Channel" type="xsd:integer" use="required"/>
    25               <xsd:attribute name="IEC_Channel" type="xsd:integer" use="required"/>
    26               <xsd:attribute name="Enabled" type="xsd:boolean" use="optional" default="true"/>
    26               <xsd:attribute name="Enabled" type="xsd:boolean" use="optional" default="true"/>
    27             </xsd:complexType>
    27             </xsd:complexType>
    28           </xsd:element>
    28           </xsd:element>
    29         </xsd:schema>""")["BaseParams"]
    29         </xsd:schema>""")
    30 
    30 
    31 NameTypeSeparator = '@'
    31 NameTypeSeparator = '@'
    32 
    32 
    33 class ConfigTreeNode:
    33 class ConfigTreeNode:
    34     """
    34     """
    44     IconPath = None
    44     IconPath = None
    45     
    45     
    46     def _AddParamsMembers(self):
    46     def _AddParamsMembers(self):
    47         self.CTNParams = None
    47         self.CTNParams = None
    48         if self.XSD:
    48         if self.XSD:
    49             self.Classes = GenerateClassesFromXSDstring(self.XSD)
    49             self.Parser = GenerateParserFromXSDstring(self.XSD)
    50             Classes = [(name, XSDclass) for name, XSDclass in self.Classes.items() if XSDclass.IsBaseClass]
    50             obj = self.Parser.CreateRoot()
    51             if len(Classes) == 1:
    51             name = obj.getLocalTag()
    52                 name, XSDclass = Classes[0]
    52             self.CTNParams = (name, obj)
    53                 obj = XSDclass()
    53             setattr(self, name, obj)
    54                 self.CTNParams = (name, obj)
       
    55                 setattr(self, name, obj)
       
    56 
    54 
    57     def __init__(self):
    55     def __init__(self):
    58         # Create BaseParam 
    56         # Create BaseParam 
    59         self.BaseParams = _BaseParamsClass()
    57         self.BaseParams = _BaseParamsParser.CreateRoot()
    60         self.MandatoryParams = ("BaseParams", self.BaseParams)
    58         self.MandatoryParams = ("BaseParams", self.BaseParams)
    61         self._AddParamsMembers()
    59         self._AddParamsMembers()
    62         self.Children = {}
    60         self.Children = {}
    63         self._View = None
    61         self._View = None
    64         # copy ConfNodeMethods so that it can be later customized
    62         # copy ConfNodeMethods so that it can be later customized
   168                 os.mkdir(ctnpath)
   166                 os.mkdir(ctnpath)
   169     
   167     
   170             # generate XML for base XML parameters controller of the confnode
   168             # generate XML for base XML parameters controller of the confnode
   171             if self.MandatoryParams:
   169             if self.MandatoryParams:
   172                 BaseXMLFile = open(self.ConfNodeBaseXmlFilePath(),'w')
   170                 BaseXMLFile = open(self.ConfNodeBaseXmlFilePath(),'w')
   173                 BaseXMLFile.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
   171                 BaseXMLFile.write(etree.tostring(
   174                 BaseXMLFile.write(self.MandatoryParams[1].generateXMLText(self.MandatoryParams[0], 0).encode("utf-8"))
   172                     self.MandatoryParams[1], 
       
   173                     pretty_print=True, 
       
   174                     xml_declaration=True, 
       
   175                     encoding='utf-8'))
   175                 BaseXMLFile.close()
   176                 BaseXMLFile.close()
   176             
   177             
   177             # generate XML for XML parameters controller of the confnode
   178             # generate XML for XML parameters controller of the confnode
   178             if self.CTNParams:
   179             if self.CTNParams:
   179                 XMLFile = open(self.ConfNodeXmlFilePath(),'w')
   180                 XMLFile = open(self.ConfNodeXmlFilePath(),'w')
   180                 XMLFile.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
   181                 XMLFile.write(etree.tostring(
   181                 XMLFile.write(self.CTNParams[1].generateXMLText(self.CTNParams[0], 0).encode("utf-8"))
   182                     self.CTNParams[1], 
       
   183                     pretty_print=True, 
       
   184                     xml_declaration=True, 
       
   185                     encoding='utf-8'))
   182                 XMLFile.close()
   186                 XMLFile.close()
   183             
   187             
   184             # Call the confnode specific OnCTNSave method
   188             # Call the confnode specific OnCTNSave method
   185             result = self.OnCTNSave(from_project_path)
   189             result = self.OnCTNSave(from_project_path)
   186             if not result:
   190             if not result:
   579         
   583         
   580         # Get the base xml tree
   584         # Get the base xml tree
   581         if self.MandatoryParams:
   585         if self.MandatoryParams:
   582             try:
   586             try:
   583                 basexmlfile = open(self.ConfNodeBaseXmlFilePath(CTNName), 'r')
   587                 basexmlfile = open(self.ConfNodeBaseXmlFilePath(CTNName), 'r')
   584                 basetree = minidom.parse(basexmlfile)
   588                 self.BaseParams = etree.fromstring(
   585                 self.MandatoryParams[1].loadXMLTree(basetree.childNodes[0])
   589                     basexmlfile.read(), _BaseParamsParser)
       
   590                 self.MandatoryParams = ("BaseParams", self.BaseParams)
   586                 basexmlfile.close()
   591                 basexmlfile.close()
   587             except Exception, exc:
   592             except Exception, exc:
   588                 self.GetCTRoot().logger.write_error(_("Couldn't load confnode base parameters %s :\n %s") % (CTNName, unicode(exc)))
   593                 self.GetCTRoot().logger.write_error(_("Couldn't load confnode base parameters %s :\n %s") % (CTNName, unicode(exc)))
   589                 self.GetCTRoot().logger.write_error(traceback.format_exc())
   594                 self.GetCTRoot().logger.write_error(traceback.format_exc())
   590         
   595         
   591         # Get the xml tree
   596         # Get the xml tree
   592         if self.CTNParams:
   597         if self.CTNParams:
   593             try:
   598             try:
   594                 xmlfile = open(self.ConfNodeXmlFilePath(CTNName), 'r')
   599                 xmlfile = open(self.ConfNodeXmlFilePath(CTNName), 'r')
   595                 tree = minidom.parse(xmlfile)
   600                 obj = etree.fromstring(xmlfile.read(), self.Parser)
   596                 self.CTNParams[1].loadXMLTree(tree.childNodes[0])
   601                 name = obj.getLocalTag()
       
   602                 setattr(self, name, obj)
       
   603                 self.CTNParams = (name, obj)
   597                 xmlfile.close()
   604                 xmlfile.close()
   598             except Exception, exc:
   605             except Exception, exc:
   599                 self.GetCTRoot().logger.write_error(_("Couldn't load confnode parameters %s :\n %s") % (CTNName, unicode(exc)))
   606                 self.GetCTRoot().logger.write_error(_("Couldn't load confnode parameters %s :\n %s") % (CTNName, unicode(exc)))
   600                 self.GetCTRoot().logger.write_error(traceback.format_exc())
   607                 self.GetCTRoot().logger.write_error(traceback.format_exc())
   601         
   608