def write_record(self, result, esn, outputschema, queryables): ''' Return csw:SearchResults child as lxml.etree.Element ''' identifier = util.getqattr(result, self.context.md_core_model['mappings']['pycsw:Identifier']) typename = util.getqattr(result, self.context.md_core_model['mappings']['pycsw:Typename']) if esn == 'full' and typename == 'rim:RegistryObject': # dump record as is and exit return etree.fromstring(util.getqattr(result, queryables['pycsw:XML']['dbcol'])) if typename == 'csw:Record': # transform csw:Record -> rim:RegistryObject model mappings util.transform_mappings(queryables, self.repository['mappings']['csw:Record']) node = etree.Element(util.nspath_eval('rim:ExtrinsicObject', self.namespaces)) node.attrib[util.nspath_eval('xsi:schemaLocation', self.context.namespaces)] = \ '%s %s/csw/2.0.2/profiles/ebrim/1.0/csw-ebrim.xsd' % (self.namespaces['wrs'], self.ogc_schemas_base) node.attrib['id'] = identifier node.attrib['lid'] = identifier node.attrib['objectType'] = str(util.getqattr(result, self.context.md_core_model['mappings']['pycsw:Type'])) node.attrib['status'] = 'urn:oasis:names:tc:ebxml-regrep:StatusType:Submitted' etree.SubElement(node, util.nspath_eval('rim:VersionInfo', self.namespaces), versionName='') if esn == 'summary': etree.SubElement(node, util.nspath_eval('rim:ExternalIdentifier', self.namespaces), value=identifier, identificationScheme='foo', registryObject=str(util.getqattr(result, self.context.md_core_model['mappings']['pycsw:Relation'])), id=identifier) name = etree.SubElement(node, util.nspath_eval('rim:Name', self.namespaces)) etree.SubElement(name, util.nspath_eval('rim:LocalizedString', self.namespaces), value=unicode(util.getqattr(result, queryables['pycsw:Title']['dbcol']))) description = etree.SubElement(node, util.nspath_eval('rim:Description', self.namespaces)) etree.SubElement(description, util.nspath_eval('rim:LocalizedString', self.namespaces), value=unicode(util.getqattr(result, queryables['pycsw:Abstract']['dbcol']))) val = util.getqattr(result, self.context.md_core_model['mappings']['pycsw:BoundingBox']) bboxel = server.write_boundingbox(val) if bboxel is not None: bboxslot = etree.SubElement(node, util.nspath_eval('rim:Slot', self.namespaces), slotType='urn:ogc:def:dataType:ISO-19107:2003:GM_Envelope') valuelist = etree.SubElement(bboxslot, util.nspath_eval('rim:ValueList', self.namespaces)) value = etree.SubElement(valuelist, util.nspath_eval('rim:Value', self.namespaces)) value.append(bboxel) rkeywords = util.getqattr(result, self.context.md_core_model['mappings']['pycsw:Keywords']) if rkeywords is not None: subjectslot = etree.SubElement(node, util.nspath_eval('rim:Slot', self.namespaces), name='http://purl.org/dc/elements/1.1/subject') valuelist = etree.SubElement(subjectslot, util.nspath_eval('rim:ValueList', self.namespaces)) for keyword in rkeywords.split(','): etree.SubElement(valuelist, util.nspath_eval('rim:Value', self.namespaces)).text = keyword return node
def _write_record(self, recobj, queryables): """ replicate from original method. Only changes is the column separator in links is "\t" instead of "," """ if self.kvp["elementsetname"] == "brief": elname = "BriefRecord" elif self.kvp["elementsetname"] == "summary": elname = "SummaryRecord" else: elname = "Record" record = etree.Element(util.nspath_eval("csw:%s" % elname, self.context.namespaces)) if "elementname" in self.kvp and len(self.kvp["elementname"]) > 0: for elemname in self.kvp["elementname"]: if elemname.find("BoundingBox") != -1 or elemname.find("Envelope") != -1: bboxel = write_boundingbox( util.getqattr(recobj, self.context.md_core_model["mappings"]["pycsw:BoundingBox"]), self.context.namespaces, ) if bboxel is not None: record.append(bboxel) else: value = util.getqattr(recobj, queryables[elemname]["dbcol"]) if value: etree.SubElement(record, util.nspath_eval(elemname, self.context.namespaces)).text = value elif "elementsetname" in self.kvp: if ( self.kvp["elementsetname"] == "full" and util.getqattr(recobj, self.context.md_core_model["mappings"]["pycsw:Typename"]) == "csw:Record" and util.getqattr(recobj, self.context.md_core_model["mappings"]["pycsw:Schema"]) == "http://www.opengis.net/cat/csw/2.0.2" and util.getqattr(recobj, self.context.md_core_model["mappings"]["pycsw:Type"]) != "service" ): # dump record as is and exit return etree.fromstring( util.getqattr(recobj, self.context.md_core_model["mappings"]["pycsw:XML"]), self.context.parser ) etree.SubElement(record, util.nspath_eval("dc:identifier", self.context.namespaces)).text = util.getqattr( recobj, self.context.md_core_model["mappings"]["pycsw:Identifier"] ) for i in ["dc:title", "dc:type"]: val = util.getqattr(recobj, queryables[i]["dbcol"]) if not val: val = "" etree.SubElement(record, util.nspath_eval(i, self.context.namespaces)).text = val if self.kvp["elementsetname"] in ["summary", "full"]: # add summary elements keywords = util.getqattr(recobj, queryables["dc:subject"]["dbcol"]) if keywords is not None: for keyword in keywords.split(","): etree.SubElement(record, util.nspath_eval("dc:subject", self.context.namespaces)).text = keyword val = util.getqattr(recobj, queryables["dc:format"]["dbcol"]) if val: etree.SubElement(record, util.nspath_eval("dc:format", self.context.namespaces)).text = val # links rlinks = util.getqattr(recobj, self.context.md_core_model["mappings"]["pycsw:Links"]) if rlinks: links = rlinks.split("^") for link in links: linkset = link.split("\t") etree.SubElement( record, util.nspath_eval("dct:references", self.context.namespaces), scheme=linkset[2].replace('"', """), ).text = linkset[-1] for i in ["dc:relation", "dct:modified", "dct:abstract"]: val = util.getqattr(recobj, queryables[i]["dbcol"]) if val is not None: etree.SubElement(record, util.nspath_eval(i, self.context.namespaces)).text = val if self.kvp["elementsetname"] == "full": # add full elements for i in [ "dc:date", "dc:creator", "dc:publisher", "dc:contributor", "dc:source", "dc:language", "dc:rights", ]: val = util.getqattr(recobj, queryables[i]["dbcol"]) if val: etree.SubElement(record, util.nspath_eval(i, self.context.namespaces)).text = val # always write out ows:BoundingBox bboxel = write_boundingbox( getattr(recobj, self.context.md_core_model["mappings"]["pycsw:BoundingBox"]), self.context.namespaces ) if bboxel is not None: record.append(bboxel) return record