예제 #1
0
파일: ebrim.py 프로젝트: amercader/pycsw
    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
예제 #2
0
파일: ebrim.py 프로젝트: drwelby/pycsw
    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
예제 #3
0
    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