Changeset 5212 for ndgCommon/trunk


Ignore:
Timestamp:
21/04/09 15:12:22 (10 years ago)
Author:
cbyrom
Message:

Adjust the Atom and MolesEntity? data models to store their data
internally, 'as is' - and to escape/unescape XML unfriendly characters
on data export/import. Adjust templates and inputs processing to
cope with this change - which allows the input of most characters
without problem (NB, old method caused unfriendly errors when illegal
characters were detected).

Location:
ndgCommon/trunk/ndg/common/src/models
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • ndgCommon/trunk/ndg/common/src/models/Atom.py

    r5192 r5212  
    7575         
    7676    def fromETElement(self, personTag): 
    77         self.name = personTag.findtext('{%s}name' %self.ns_fullname) or "" 
    78         self.role = personTag.findtext('{%s}role' %self.ns_fullname) or "" 
    79         self.uri = personTag.findtext('{%s}%s' %(self.ns_fullname, self.uriTagName)) or "" 
     77        self.name = unescape(personTag.findtext('{%s}name' %self.ns_fullname) or "") 
     78        self.role = unescape(personTag.findtext('{%s}role' %self.ns_fullname) or "") 
     79        self.uri = unescape(personTag.findtext('{%s}%s' %(self.ns_fullname, self.uriTagName)) or "") 
    8080        logging.debug("Added name: '%s', role: '%s', %s: '%s'" \ 
    8181                      %(self.name, self.role, self.uriTagName, self.uri)) 
     
    9090        if self.name: 
    9191            name = ET.SubElement(author, prefix + "name") 
    92             name.text = self.name 
     92            name.text = escape(self.name) 
    9393         
    9494        if self.uri: 
    9595            uri = ET.SubElement(author, prefix + self.uriTagName) 
    96             uri.text = self.uri 
     96            uri.text = escape(self.uri) 
    9797         
    9898        if self.role: 
    9999            role = ET.SubElement(author, prefix + "role") 
    100             role.text = self.role 
     100            role.text = escape(self.role) 
    101101 
    102102        return author 
     
    136136        # remove any url quoting when reading in from XML - to avoid need for 
    137137        # correction on display 
    138         self.href = linkTag.attrib.get('href') or "" 
    139         if self.href: 
    140             self.href = unescape(self.href) 
    141         self.rel = linkTag.attrib.get('rel') or "" 
    142         if self.rel: 
    143             self.rel = unescape(self.rel) 
    144         self.title = linkTag.attrib.get('title') or "" 
     138        self.href = unescape(linkTag.attrib.get('href') or "") 
     139        self.rel = unescape(linkTag.attrib.get('rel') or "") 
     140        self.title = unescape(linkTag.attrib.get('title') or "") 
    145141 
    146142    def toXML(self): 
     
    149145        link = ET.Element("link") 
    150146        link.attrib["href"] = escape(self.href) 
    151         link.attrib["title"] = self.title 
     147        link.attrib["title"] = escape(self.title) 
    152148        link.attrib["rel"] = escape(self.rel) 
    153149        return link 
     
    222218         
    223219    def fromETElement(self, linkTag): 
    224         self.term = linkTag.attrib.get('term') or "" 
    225         if self.term: 
    226             self.term = unescape(self.term) 
    227         self.label = linkTag.attrib.get('label') or "" 
    228         if self.label: 
    229             self.label = unescape(self.label) 
    230         self.scheme = linkTag.attrib.get('scheme') or "" 
    231         if self.scheme: 
    232             self.scheme = unescape(self.scheme) 
     220        self.term = unescape(linkTag.attrib.get('term') or "") 
     221        self.label = unescape(linkTag.attrib.get('label') or "") 
     222        self.scheme = unescape(linkTag.attrib.get('scheme') or "") 
    233223 
    234224    def toXML(self): 
     
    342332        if xmlString: 
    343333            self.fromString(xmlString) 
    344              
    345             # NB, the string may override inputs values on the moles entity - so 
    346             # reapply these here 
    347             if inputs: 
    348                 self.ME.__dict__.update(inputs) 
    349  
     334 
     335        # retain old title, in case it has changed - NB, this will be done by applying 
     336        # the inputs dict - and might require other atoms to be updated 
     337        self.oldTitle = self.title 
     338             
    350339        # if inputs passed in as dict, add these now 
    351340        if inputs: 
    352341            logging.info("Adding info to atom from input dict") 
    353342            logging.debug(inputs) 
     343             
     344            # avoid the initial case being caught - i.e. when there is no title at all 
     345            if inputs.has_key('title'): 
     346                newTitle = inputs.get('title') 
     347                if not self.title: 
     348                    self.oldTitle = newTitle 
     349                     
    354350            self.__dict__.update(inputs) 
     351            self.ME.__dict__.update(inputs) 
    355352             
    356353            # NB, this doesn't trigger the Summary Property, so do this 
     
    630627        id.text = self.atomID 
    631628        title = ET.SubElement(root, "title") 
    632         title.text = self.title 
     629        title.text = escape(self.title) 
    633630        self._linksToXML(root) 
    634631 
     
    684681        temporalRange = ET.SubElement(root, "moles:temporalRange") 
    685682        if self.t1: 
    686             temporalRange.text = self.t1 
     683            temporalRange.text = escape(self.t1) 
    687684            if self.t2: 
    688                 temporalRange.text += "/" + self.t2 
     685                temporalRange.text += "/" + escape(self.t2) 
    689686 
    690687        # add spatial range data, if available 
     
    700697        summaryString = "" 
    701698        for summary_line in self.summary: 
    702             summaryString += summary_line + "\n" 
     699            summaryString += escape(summary_line) + "\n" 
    703700 
    704701        return summaryString 
     702 
    705703 
    706704    def __setSummary(self, summary): 
     
    708706        self.summary = [] 
    709707        for summary_line in summary.split('\n'): 
    710             self.summary.append(summary_line)#utilities.escapeSpecialCharacters(summary_line)) 
     708            self.summary.append(unescape(summary_line))#utilities.escapeSpecialCharacters(summary_line)) 
    711709             
    712710    Summary = property(fset=__setSummary, fget=__getSummary, doc="Atom summary") 
     
    748746        if title: 
    749747            logging.debug("Adding title data") 
    750             self.title = title 
     748            self.title = unescape(title) 
    751749 
    752750        summary = tree.findtext('{%s}summary' %ndgObject.ATOM_NS) 
     
    794792            else: 
    795793                logging.debug("No file data - adding contents of element instead") 
    796                 div = contentTag.findtext('{%s}div'%ndgObject.ATOM_NS)#XHTML_NS) 
     794                divEl = contentTag.find('{%s}div'%ndgObject.ATOM_NS)#XHTML_NS) 
     795                div = divEl.text 
     796                 
     797                # NB, this can contain xhtml, so check for children 
     798                for child in divEl.getchildren(): 
     799                    div += ET.tostring(child) 
     800                     
    797801                self.Content = div 
    798802         
     
    801805            logging.debug("Adding temporal range data") 
    802806            timeData = range.split('/') 
    803             self.t1 = timeData[0] 
     807            self.t1 = unescape(timeData[0]) 
    804808            if len(timeData) > 1: 
    805                 self.t2 = timeData[1] 
     809                self.t2 = unescape(timeData[1]) 
    806810         
    807811        where = tree.find('{%s}where' %ndgObject.GEOSS_NS) 
     
    813817                minBBox = minBBox[0] 
    814818                spatialData = minBBox.text.split() 
    815                 self.minX = spatialData[0] 
     819                self.minX = unescape(spatialData[0]) 
    816820                if len(spatialData) > 1: 
    817                     self.minY = spatialData[1] 
     821                    self.minY = unescape(spatialData[1]) 
    818822             
    819823            maxBBox = where.findall('.//{%s}upperCorner' %ndgObject.GML_NS) 
     
    822826                logging.debug("Adding max spatial range data") 
    823827                spatialData = maxBBox.text.split() 
    824                 self.maxX = spatialData[0] 
     828                self.maxX = unescape(spatialData[0]) 
    825829                if len(spatialData) > 1: 
    826                     self.maxY = spatialData[1] 
     830                    self.maxY = unescape(spatialData[1]) 
    827831                 
    828832        publishedDate = tree.findtext('{%s}published' %ndgObject.ATOM_NS) 
     
    979983        envelope = ET.SubElement(bbox, "gml:Envelope") 
    980984        lc = ET.SubElement(envelope, "gml:lowerCorner") 
    981         lc.text = str(self.minX) + " " + str(self.minY) 
     985        lc.text = escape(str(self.minX) + " " + str(self.minY)) 
    982986        uc = ET.SubElement(envelope, "gml:upperCorner") 
    983         uc.text = str(self.maxX) + " " + str(self.maxY) 
     987        uc.text = escape(str(self.maxX) + " " + str(self.maxY)) 
    984988 
    985989         
  • ndgCommon/trunk/ndg/common/src/models/MolesEntity.py

    r5177 r5212  
    55''' 
    66from xml.etree import cElementTree as ET 
     7from xml.sax.saxutils import escape, unescape 
    78import logging, datetime, re 
    89from ndg.common.src.lib.utilities import escapeSpecialCharacters 
     
    7879        molesISO = ET.SubElement(molesEntity, "moles:molesISO") 
    7980        datasetLanguage = ET.SubElement(molesISO, "moles:datasetLanguage") 
    80         datasetLanguage.text = self.datasetLanguage 
     81        datasetLanguage.text = escape(self.datasetLanguage) 
    8182        metadataLanguage = ET.SubElement(molesISO, "moles:metadataLanguage") 
    82         metadataLanguage.text = self.metadataLanguage 
     83        metadataLanguage.text = escape(self.metadataLanguage) 
    8384 
    8485        if self.responsibleParties: 
     
    9091        if self.updateFrequency: 
    9192            updateFrequencyEl = ET.SubElement(molesISO, "moles:updateFrequency") 
    92             updateFrequencyEl.text = self.updateFrequency 
     93            updateFrequencyEl.text = escape(self.updateFrequency) 
    9394 
    9495        if self.lineage: 
    9596            lineageEl = ET.SubElement(molesISO, "moles:lineage") 
    96             lineageEl.text = self.lineage 
     97            lineageEl.text = escape(self.lineage) 
    9798 
    9899        if self.quality: 
    99100            qualityEl = ET.SubElement(molesISO, "moles:quality") 
    100             qualityEl.text = self.quality 
     101            qualityEl.text = escape(self.quality) 
    101102 
    102103        if self.spatialResolution: 
    103104            srEl = ET.SubElement(molesISO, "moles:spatialResolution") 
    104             srEl.text = self.spatialResolution 
     105            srEl.text = escape(self.spatialResolution) 
    105106 
    106107        if self.verticalExtent: 
    107108            veEl = ET.SubElement(molesISO, "moles:verticalExtent") 
    108             veEl.text = self.verticalExtent 
     109            veEl.text = escape(self.verticalExtent) 
    109110 
    110111        if self.abbreviation: 
    111112            logging.info("Adding abbreviation element") 
    112113            abbreviationElement = ET.SubElement(molesISO, "moles:abbreviation") 
    113             abbreviationElement.text = self.abbreviation 
     114            abbreviationElement.text = escape(self.abbreviation) 
    114115 
    115116        if self.providerID: 
    116117            logging.info("Adding providerID element") 
    117118            subElement = ET.SubElement(molesISO, "moles:providerID") 
    118             subElement.text = self.providerID 
     119            subElement.text = escape(self.providerID) 
    119120             
    120121        # if there's a created date already defined, use this, otherwise assume this is the creation point 
     
    145146            self.responsibleParties.append(author) 
    146147                 
    147         self.abbreviation = tree.findtext('{%s}molesISO/{%s}abbreviation' \ 
    148                                           %(ndgObject.MOLES_NS, ndgObject.MOLES_NS)) or "" 
    149  
    150         self.providerID = tree.findtext('{%s}molesISO/{%s}providerID' \ 
    151                                         %(ndgObject.MOLES_NS, ndgObject.MOLES_NS)) or "" 
    152  
    153         self.datasetLanguage = tree.findtext('{%s}molesISO/{%s}datasetLanguage' \ 
    154                                              %(ndgObject.MOLES_NS, ndgObject.MOLES_NS)) or "" 
    155         self.metadataLanguage = tree.findtext('{%s}molesISO/{%s}metadataLanguage' \ 
    156                                               %(ndgObject.MOLES_NS, ndgObject.MOLES_NS)) or "" 
    157         self.updateFrequency = tree.findtext('{%s}molesISO/{%s}updateFrequency' \ 
    158                                               %(ndgObject.MOLES_NS, ndgObject.MOLES_NS)) or "" 
    159         self.lineage = tree.findtext('{%s}molesISO/{%s}lineage' \ 
    160                                      %(ndgObject.MOLES_NS, ndgObject.MOLES_NS)) or "" 
    161         self.quality = tree.findtext('{%s}molesISO/{%s}quality' \ 
    162                                      %(ndgObject.MOLES_NS, ndgObject.MOLES_NS)) or "" 
    163         self.spatialResolution = tree.findtext('{%s}molesISO/{%s}spatialResolution' \ 
    164                                      %(ndgObject.MOLES_NS, ndgObject.MOLES_NS)) or "" 
    165         self.verticalExtent = tree.findtext('{%s}molesISO/{%s}verticalExtent' \ 
    166                                      %(ndgObject.MOLES_NS, ndgObject.MOLES_NS)) or "" 
     148        self.abbreviation = unescape(tree.findtext('{%s}molesISO/{%s}abbreviation' \ 
     149                                          %(ndgObject.MOLES_NS, ndgObject.MOLES_NS)) or "") 
     150 
     151        self.providerID = unescape(tree.findtext('{%s}molesISO/{%s}providerID' \ 
     152                                        %(ndgObject.MOLES_NS, ndgObject.MOLES_NS)) or "") 
     153 
     154        self.datasetLanguage = unescape(tree.findtext('{%s}molesISO/{%s}datasetLanguage' \ 
     155                                             %(ndgObject.MOLES_NS, ndgObject.MOLES_NS)) or "") 
     156 
     157        self.metadataLanguage = unescape(tree.findtext('{%s}molesISO/{%s}metadataLanguage' \ 
     158                                              %(ndgObject.MOLES_NS, ndgObject.MOLES_NS)) or "") 
     159         
     160        self.updateFrequency = unescape(tree.findtext('{%s}molesISO/{%s}updateFrequency' \ 
     161                                              %(ndgObject.MOLES_NS, ndgObject.MOLES_NS)) or "") 
     162 
     163        self.lineage = unescape(tree.findtext('{%s}molesISO/{%s}lineage' \ 
     164                                     %(ndgObject.MOLES_NS, ndgObject.MOLES_NS)) or "") 
     165         
     166        self.quality = unescape(tree.findtext('{%s}molesISO/{%s}quality' \ 
     167                                     %(ndgObject.MOLES_NS, ndgObject.MOLES_NS)) or "") 
     168         
     169        self.spatialResolution = unescape(tree.findtext('{%s}molesISO/{%s}spatialResolution' \ 
     170                                     %(ndgObject.MOLES_NS, ndgObject.MOLES_NS)) or "") 
     171         
     172        self.verticalExtent = unescape(tree.findtext('{%s}molesISO/{%s}verticalExtent' \ 
     173                                     %(ndgObject.MOLES_NS, ndgObject.MOLES_NS)) or "") 
    167174 
    168175        createdDate = tree.findtext('{%s}molesISO/{%s}created' \ 
Note: See TracChangeset for help on using the changeset viewer.