def response_csw2opensearch(self, element, cfg): """transform a CSW response into an OpenSearch response""" LOGGER.debug('RESPONSE: %s', util.xmltag_split(element.tag)) try: version = element.xpath('//@version')[0] except Exception as err: version = '3.0.0' self.exml = element self.cfg = cfg self.bind_url = util.bind_url(self.cfg.get('server', 'url')) if version == '2.0.2': return self._csw2_2_os() elif version == '3.0.0': return self._csw3_2_os()
def response_csw2opensearch(self, element, cfg): """transform a CSW response into an OpenSearch response""" root_tag = etree.QName(element).localname if root_tag == 'ExceptionReport': return element LOGGER.debug('RESPONSE: %s', root_tag) try: version = element.xpath('//@version')[0] except Exception as err: version = '3.0.0' self.exml = element self.cfg = cfg self.bind_url = util.bind_url(self.cfg.get('server', 'url')) if version == '2.0.2': return self._csw2_2_os() elif version == '3.0.0': return self._csw3_2_os()
def response_csw2opensearch(self, element, cfg): """transform a CSW response into an OpenSearch response""" root_tag = util.xmltag_split(element.tag) if root_tag == "ExceptionReport": return element LOGGER.debug("RESPONSE: %s", root_tag) try: version = element.xpath("//@version")[0] except Exception as err: version = "3.0.0" self.exml = element self.cfg = cfg self.bind_url = util.bind_url(self.cfg.get("server", "url")) if version == "2.0.2": return self._csw2_2_os() elif version == "3.0.0": return self._csw3_2_os()
def response(self, response, kvp, repository, server_url): """process OAI-PMH request""" mode = kvp.pop('mode', None) if 'config' in kvp: config_val = kvp.pop('config') url = '%smode=oaipmh' % util.bind_url(server_url) node = etree.Element(util.nspath_eval('oai:OAI-PMH', self.namespaces), nsmap=self.namespaces) node.set( util.nspath_eval('xsi:schemaLocation', self.namespaces), '%s http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd' % self.namespaces['oai']) LOGGER.info(etree.tostring(node)) etree.SubElement(node, util.nspath_eval( 'oai:responseDate', self.namespaces)).text = util.get_today_and_now() etree.SubElement(node, util.nspath_eval('oai:request', self.namespaces), attrib=kvp).text = url if 'verb' not in kvp: etree.SubElement( node, util.nspath_eval('oai:error', self.namespaces), code='badArgument').text = 'Missing \'verb\' parameter' return node if kvp['verb'] not in self.request_model.keys(): etree.SubElement( node, util.nspath_eval('oai:error', self.namespaces), code='badArgument').text = 'Unknown verb \'%s\'' % kvp['verb'] return node if util.xmltag_split(response.tag) == 'ExceptionReport': etree.SubElement(node, util.nspath_eval('oai:error', self.namespaces), code='badArgument').text = response.xpath( '//ows:ExceptionText|//ows20:ExceptionText', namespaces=self.context.namespaces)[0].text return node verb = kvp.pop('verb') if verb in ['GetRecord', 'ListIdentifiers', 'ListRecords']: if 'metadataprefix' not in kvp: etree.SubElement(node, util.nspath_eval('oai:error', self.namespaces), code='badArgument' ).text = 'Missing metadataPrefix parameter' return node elif kvp['metadataprefix'] not in self.metadata_formats.keys(): etree.SubElement(node, util.nspath_eval('oai:error', self.namespaces), code='badArgument' ).text = 'Invalid metadataPrefix parameter' return node for key, value in kvp.iteritems(): if key != 'mode' and key not in self.request_model[verb]: etree.SubElement( node, util.nspath_eval('oai:error', self.namespaces), code='badArgument').text = 'Illegal parameter \'%s\'' % key return node verbnode = etree.SubElement( node, util.nspath_eval('oai:%s' % verb, self.namespaces)) if verb == 'Identify': etree.SubElement( verbnode, util.nspath_eval('oai:repositoryName', self.namespaces)).text = self.config.get( 'metadata:main', 'identification_title') etree.SubElement(verbnode, util.nspath_eval('oai:baseURL', self.namespaces)).text = url etree.SubElement( verbnode, util.nspath_eval('oai:protocolVersion', self.namespaces)).text = '2.0' etree.SubElement( verbnode, util.nspath_eval('oai:adminEmail', self.namespaces)).text = self.config.get( 'metadata:main', 'contact_email') etree.SubElement( verbnode, util.nspath_eval( 'oai:earliestDatestamp', self.namespaces)).text = repository.query_insert('min') etree.SubElement( verbnode, util.nspath_eval('oai:deletedRecord', self.namespaces)).text = 'no' etree.SubElement( verbnode, util.nspath_eval( 'oai:granularity', self.namespaces)).text = 'YYYY-MM-DDThh:mm:ssZ' elif verb == 'ListSets': for key, value in self.metadata_sets.iteritems(): setnode = etree.SubElement( verbnode, util.nspath_eval('oai:set', self.namespaces)) etree.SubElement( setnode, util.nspath_eval('oai:setSpec', self.namespaces)).text = key etree.SubElement( setnode, util.nspath_eval('oai:setName', self.namespaces)).text = value[0] elif verb == 'ListMetadataFormats': for key, value in self.metadata_formats.iteritems(): mdfnode = etree.SubElement( verbnode, util.nspath_eval('oai:metadataFormat', self.namespaces)) etree.SubElement( mdfnode, util.nspath_eval('oai:metadataPrefix', self.namespaces)).text = key etree.SubElement( mdfnode, util.nspath_eval('oai:schema', self.namespaces)).text = value['schema'] etree.SubElement( mdfnode, util.nspath_eval( 'oai:metadataNamespace', self.namespaces)).text = value['namespace'] elif verb in ['GetRecord', 'ListIdentifiers', 'ListRecords']: if verb == 'GetRecord': # GetRecordById records = response.getchildren() else: # GetRecords records = response.getchildren()[1].getchildren() for child in records: recnode = etree.SubElement( verbnode, util.nspath_eval('oai:record', self.namespaces)) header = etree.SubElement( recnode, util.nspath_eval('oai:header', self.namespaces)) self._transform_element(header, response, 'oai:identifier') self._transform_element(header, response, 'oai:dateStamp') self._transform_element(header, response, 'oai:setSpec') if verb in ['GetRecord', 'ListRecords']: metadata = etree.SubElement( recnode, util.nspath_eval('oai:metadata', self.namespaces)) if 'metadataprefix' in kvp and kvp[ 'metadataprefix'] == 'oai_dc': child.tag = util.nspath_eval('oai_dc:dc', self.namespaces) metadata.append(child) if verb != 'GetRecord': complete_list_size = response.xpath( '//@numberOfRecordsMatched')[0] next_record = response.xpath('//@nextRecord')[0] cursor = str(int(complete_list_size) - int(next_record) - 1) resumption_token = etree.SubElement( verbnode, util.nspath_eval('oai:resumptionToken', self.namespaces), completeListSize=complete_list_size, cursor=cursor).text = next_record return node
def response(self, response, kvp, repository, server_url): """process OAI-PMH request""" mode = kvp.pop('mode', None) if 'config' in kvp: config_val = kvp.pop('config') url = '%smode=oaipmh' % util.bind_url(server_url) node = etree.Element(util.nspath_eval('oai:OAI-PMH', self.namespaces), nsmap=self.namespaces) node.set(util.nspath_eval('xsi:schemaLocation', self.namespaces), '%s http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd' % self.namespaces['oai']) LOGGER.info(etree.tostring(node)) etree.SubElement(node, util.nspath_eval('oai:responseDate', self.namespaces)).text = util.get_today_and_now() etree.SubElement(node, util.nspath_eval('oai:request', self.namespaces), attrib=kvp).text = url if 'verb' not in kvp: etree.SubElement(node, util.nspath_eval('oai:error', self.namespaces), code='badArgument').text = 'Missing \'verb\' parameter' return node if kvp['verb'] not in self.request_model.keys(): etree.SubElement(node, util.nspath_eval('oai:error', self.namespaces), code='badArgument').text = 'Unknown verb \'%s\'' % kvp['verb'] return node if util.xmltag_split(response.tag) == 'ExceptionReport': etree.SubElement(node, util.nspath_eval('oai:error', self.namespaces), code='badArgument').text = response.xpath('//ows:ExceptionText|//ows20:ExceptionText', namespaces=self.context.namespaces)[0].text return node verb = kvp.pop('verb') if verb in ['GetRecord', 'ListIdentifiers', 'ListRecords']: if 'metadataprefix' not in kvp: etree.SubElement(node, util.nspath_eval('oai:error', self.namespaces), code='badArgument').text = 'Missing metadataPrefix parameter' return node elif kvp['metadataprefix'] not in self.metadata_formats.keys(): etree.SubElement(node, util.nspath_eval('oai:error', self.namespaces), code='badArgument').text = 'Invalid metadataPrefix parameter' return node for key, value in kvp.items(): if key != 'mode' and key not in self.request_model[verb]: etree.SubElement(node, util.nspath_eval('oai:error', self.namespaces), code='badArgument').text = 'Illegal parameter \'%s\'' % key return node verbnode = etree.SubElement(node, util.nspath_eval('oai:%s' % verb, self.namespaces)) if verb == 'Identify': etree.SubElement(verbnode, util.nspath_eval('oai:repositoryName', self.namespaces)).text = self.config.get('metadata:main', 'identification_title') etree.SubElement(verbnode, util.nspath_eval('oai:baseURL', self.namespaces)).text = url etree.SubElement(verbnode, util.nspath_eval('oai:protocolVersion', self.namespaces)).text = '2.0' etree.SubElement(verbnode, util.nspath_eval('oai:adminEmail', self.namespaces)).text = self.config.get('metadata:main', 'contact_email') etree.SubElement(verbnode, util.nspath_eval('oai:earliestDatestamp', self.namespaces)).text = repository.query_insert('min') etree.SubElement(verbnode, util.nspath_eval('oai:deletedRecord', self.namespaces)).text = 'no' etree.SubElement(verbnode, util.nspath_eval('oai:granularity', self.namespaces)).text = 'YYYY-MM-DDThh:mm:ssZ' elif verb == 'ListSets': for key, value in self.metadata_sets.items(): setnode = etree.SubElement(verbnode, util.nspath_eval('oai:set', self.namespaces)) etree.SubElement(setnode, util.nspath_eval('oai:setSpec', self.namespaces)).text = key etree.SubElement(setnode, util.nspath_eval('oai:setName', self.namespaces)).text = value[0] elif verb == 'ListMetadataFormats': for key, value in self.metadata_formats.items(): mdfnode = etree.SubElement(verbnode, util.nspath_eval('oai:metadataFormat', self.namespaces)) etree.SubElement(mdfnode, util.nspath_eval('oai:metadataPrefix', self.namespaces)).text = key etree.SubElement(mdfnode, util.nspath_eval('oai:schema', self.namespaces)).text = value['schema'] etree.SubElement(mdfnode, util.nspath_eval('oai:metadataNamespace', self.namespaces)).text = value['namespace'] elif verb in ['GetRecord', 'ListIdentifiers', 'ListRecords']: if verb == 'GetRecord': # GetRecordById records = response.getchildren() else: # GetRecords records = response.getchildren()[1].getchildren() for child in records: recnode = etree.SubElement(verbnode, util.nspath_eval('oai:record', self.namespaces)) header = etree.SubElement(recnode, util.nspath_eval('oai:header', self.namespaces)) self._transform_element(header, response, 'oai:identifier') self._transform_element(header, response, 'oai:dateStamp') self._transform_element(header, response, 'oai:setSpec') if verb in ['GetRecord', 'ListRecords']: metadata = etree.SubElement(recnode, util.nspath_eval('oai:metadata', self.namespaces)) if 'metadataprefix' in kvp and kvp['metadataprefix'] == 'oai_dc': child.tag = util.nspath_eval('oai_dc:dc', self.namespaces) metadata.append(child) if verb != 'GetRecord': complete_list_size = response.xpath('//@numberOfRecordsMatched')[0] next_record = response.xpath('//@nextRecord')[0] cursor = str(int(complete_list_size) - int(next_record) - 1) resumption_token = etree.SubElement(verbnode, util.nspath_eval('oai:resumptionToken', self.namespaces), completeListSize=complete_list_size, cursor=cursor).text = next_record return node
def test_bind_url(url, expected): result = util.bind_url(url) assert result == expected
def write_record(self, result, esn, outputschema, queryables, caps=None): ''' Return csw:SearchResults child as lxml.etree.Element ''' typename = util.getqattr(result, self.context.md_core_model['mappings']['pycsw:Typename']) is_iso_anyway = False xml_blob = util.getqattr(result, self.context.md_core_model['mappings']['pycsw:XML']) if caps is None and xml_blob is not None and xml_blob.startswith('<gmd:MD_Metadata'): is_iso_anyway = True if (esn == 'full' and (typename == 'gmd:MD_Metadata' or is_iso_anyway)): # dump record as is and exit return etree.fromstring(xml_blob, self.context.parser) if typename == 'csw:Record': # transform csw:Record -> gmd:MD_Metadata model mappings util.transform_mappings(queryables, self.repository['mappings']['csw:Record']) node = etree.Element(util.nspath_eval('gmd:MD_Metadata', self.namespaces)) node.attrib[util.nspath_eval('xsi:schemaLocation', self.context.namespaces)] = \ '%s %s/csw/2.0.2/profiles/apiso/1.0.0/apiso.xsd' % (self.namespace, self.ogc_schemas_base) # identifier idval = util.getqattr(result, self.context.md_core_model['mappings']['pycsw:Identifier']) identifier = etree.SubElement(node, util.nspath_eval('gmd:fileIdentifier', self.namespaces)) etree.SubElement(identifier, util.nspath_eval('gco:CharacterString', self.namespaces)).text = idval if esn in ['summary', 'full']: # language val = util.getqattr(result, queryables['apiso:Language']['dbcol']) lang = etree.SubElement(node, util.nspath_eval('gmd:language', self.namespaces)) etree.SubElement(lang, util.nspath_eval('gco:CharacterString', self.namespaces)).text = val # hierarchyLevel mtype = util.getqattr(result, queryables['apiso:Type']['dbcol']) or None if mtype is not None: if mtype == 'http://purl.org/dc/dcmitype/Dataset': mtype = 'dataset' hierarchy = etree.SubElement(node, util.nspath_eval('gmd:hierarchyLevel', self.namespaces)) hierarchy.append(_write_codelist_element('gmd:MD_ScopeCode', mtype, self.namespaces)) if esn in ['summary', 'full']: # contact contact = etree.SubElement(node, util.nspath_eval('gmd:contact', self.namespaces)) if caps is not None: CI_resp = etree.SubElement(contact, util.nspath_eval('gmd:CI_ResponsibleParty', self.namespaces)) if hasattr(caps.provider.contact, 'name'): ind_name = etree.SubElement(CI_resp, util.nspath_eval('gmd:individualName', self.namespaces)) etree.SubElement(ind_name, util.nspath_eval('gco:CharacterString', self.namespaces)).text = caps.provider.contact.name if hasattr(caps.provider.contact, 'organization'): if caps.provider.contact.organization is not None: org_val = caps.provider.contact.organization else: org_val = caps.provider.name org_name = etree.SubElement(CI_resp, util.nspath_eval('gmd:organisationName', self.namespaces)) etree.SubElement(org_name, util.nspath_eval('gco:CharacterString', self.namespaces)).text = org_val if hasattr(caps.provider.contact, 'position'): pos_name = etree.SubElement(CI_resp, util.nspath_eval('gmd:positionName', self.namespaces)) etree.SubElement(pos_name, util.nspath_eval('gco:CharacterString', self.namespaces)).text = caps.provider.contact.position contact_info = etree.SubElement(CI_resp, util.nspath_eval('gmd:contactInfo', self.namespaces)) ci_contact = etree.SubElement(contact_info, util.nspath_eval('gmd:CI_Contact', self.namespaces)) if hasattr(caps.provider.contact, 'phone'): phone = etree.SubElement(ci_contact, util.nspath_eval('gmd:phone', self.namespaces)) ci_phone = etree.SubElement(phone, util.nspath_eval('gmd:CI_Telephone', self.namespaces)) voice = etree.SubElement(ci_phone, util.nspath_eval('gmd:voice', self.namespaces)) etree.SubElement(voice, util.nspath_eval('gco:CharacterString', self.namespaces)).text = caps.provider.contact.phone if hasattr(caps.provider.contact, 'fax'): fax = etree.SubElement(ci_phone, util.nspath_eval('gmd:facsimile', self.namespaces)) etree.SubElement(fax, util.nspath_eval('gco:CharacterString', self.namespaces)).text = caps.provider.contact.fax address = etree.SubElement(ci_contact, util.nspath_eval('gmd:address', self.namespaces)) ci_address = etree.SubElement(address, util.nspath_eval('gmd:CI_Address', self.namespaces)) if hasattr(caps.provider.contact, 'address'): delivery_point = etree.SubElement(ci_address, util.nspath_eval('gmd:deliveryPoint', self.namespaces)) etree.SubElement(delivery_point, util.nspath_eval('gco:CharacterString', self.namespaces)).text = caps.provider.contact.address if hasattr(caps.provider.contact, 'city'): city = etree.SubElement(ci_address, util.nspath_eval('gmd:city', self.namespaces)) etree.SubElement(city, util.nspath_eval('gco:CharacterString', self.namespaces)).text = caps.provider.contact.city if hasattr(caps.provider.contact, 'region'): admin_area = etree.SubElement(ci_address, util.nspath_eval('gmd:administrativeArea', self.namespaces)) etree.SubElement(admin_area, util.nspath_eval('gco:CharacterString', self.namespaces)).text = caps.provider.contact.region if hasattr(caps.provider.contact, 'postcode'): postal_code = etree.SubElement(ci_address, util.nspath_eval('gmd:postalCode', self.namespaces)) etree.SubElement(postal_code, util.nspath_eval('gco:CharacterString', self.namespaces)).text = caps.provider.contact.postcode if hasattr(caps.provider.contact, 'country'): country = etree.SubElement(ci_address, util.nspath_eval('gmd:country', self.namespaces)) etree.SubElement(country, util.nspath_eval('gco:CharacterString', self.namespaces)).text = caps.provider.contact.country if hasattr(caps.provider.contact, 'email'): email = etree.SubElement(ci_address, util.nspath_eval('gmd:electronicMailAddress', self.namespaces)) etree.SubElement(email, util.nspath_eval('gco:CharacterString', self.namespaces)).text = caps.provider.contact.email contact_url = None if hasattr(caps.provider, 'url'): contact_url = caps.provider.url if hasattr(caps.provider.contact, 'url') and caps.provider.contact.url is not None: contact_url = caps.provider.contact.url if contact_url is not None: online_resource = etree.SubElement(ci_contact, util.nspath_eval('gmd:onlineResource', self.namespaces)) gmd_linkage = etree.SubElement(online_resource, util.nspath_eval('gmd:linkage', self.namespaces)) etree.SubElement(gmd_linkage, util.nspath_eval('gmd:URL', self.namespaces)).text = contact_url if hasattr(caps.provider.contact, 'role'): role = etree.SubElement(CI_resp, util.nspath_eval('gmd:role', self.namespaces)) role_val = caps.provider.contact.role if role_val is None: role_val = 'pointOfContact' etree.SubElement(role, util.nspath_eval('gmd:CI_RoleCode', self.namespaces), codeListValue=role_val, codeList='%s#CI_RoleCode' % CODELIST).text = role_val else: val = util.getqattr(result, queryables['apiso:OrganisationName']['dbcol']) if val: CI_resp = etree.SubElement(contact, util.nspath_eval('gmd:CI_ResponsibleParty', self.namespaces)) org_name = etree.SubElement(CI_resp, util.nspath_eval('gmd:organisationName', self.namespaces)) etree.SubElement(org_name, util.nspath_eval('gco:CharacterString', self.namespaces)).text = val # date val = util.getqattr(result, queryables['apiso:Modified']['dbcol']) date = etree.SubElement(node, util.nspath_eval('gmd:dateStamp', self.namespaces)) if val and val.find('T') != -1: dateel = 'gco:DateTime' else: dateel = 'gco:Date' etree.SubElement(date, util.nspath_eval(dateel, self.namespaces)).text = val metadatastandardname = 'ISO19115' metadatastandardversion = '2003/Cor.1:2006' if mtype == 'service': metadatastandardname = 'ISO19119' metadatastandardversion = '2005/PDAM 1' # metadata standard name standard = etree.SubElement(node, util.nspath_eval('gmd:metadataStandardName', self.namespaces)) etree.SubElement(standard, util.nspath_eval('gco:CharacterString', self.namespaces)).text = metadatastandardname # metadata standard version standardver = etree.SubElement(node, util.nspath_eval('gmd:metadataStandardVersion', self.namespaces)) etree.SubElement(standardver, util.nspath_eval('gco:CharacterString', self.namespaces)).text = metadatastandardversion # title val = util.getqattr(result, queryables['apiso:Title']['dbcol']) or '' identification = etree.SubElement(node, util.nspath_eval('gmd:identificationInfo', self.namespaces)) if mtype == 'service': restagname = 'srv:SV_ServiceIdentification' else: restagname = 'gmd:MD_DataIdentification' resident = etree.SubElement(identification, util.nspath_eval(restagname, self.namespaces), id=idval) tmp2 = etree.SubElement(resident, util.nspath_eval('gmd:citation', self.namespaces)) tmp3 = etree.SubElement(tmp2, util.nspath_eval('gmd:CI_Citation', self.namespaces)) tmp4 = etree.SubElement(tmp3, util.nspath_eval('gmd:title', self.namespaces)) etree.SubElement(tmp4, util.nspath_eval('gco:CharacterString', self.namespaces)).text = val # creation date val = util.getqattr(result, queryables['apiso:CreationDate']['dbcol']) if val is not None: tmp3.append(_write_date(val, 'creation', self.namespaces)) # publication date val = util.getqattr(result, queryables['apiso:PublicationDate']['dbcol']) if val is not None: tmp3.append(_write_date(val, 'publication', self.namespaces)) # revision date val = util.getqattr(result, queryables['apiso:RevisionDate']['dbcol']) if val is not None: tmp3.append(_write_date(val, 'revision', self.namespaces)) if esn in ['summary', 'full']: # abstract val = util.getqattr(result, queryables['apiso:Abstract']['dbcol']) or '' tmp = etree.SubElement(resident, util.nspath_eval('gmd:abstract', self.namespaces)) etree.SubElement(tmp, util.nspath_eval('gco:CharacterString', self.namespaces)).text = val # keywords kw = util.getqattr(result, queryables['apiso:Subject']['dbcol']) if kw is not None: md_keywords = etree.SubElement(resident, util.nspath_eval('gmd:descriptiveKeywords', self.namespaces)) md_keywords.append(write_keywords(kw, self.namespaces)) # spatial resolution val = util.getqattr(result, queryables['apiso:Denominator']['dbcol']) if val: tmp = etree.SubElement(resident, util.nspath_eval('gmd:spatialResolution', self.namespaces)) tmp2 = etree.SubElement(tmp, util.nspath_eval('gmd:MD_Resolution', self.namespaces)) tmp3 = etree.SubElement(tmp2, util.nspath_eval('gmd:equivalentScale', self.namespaces)) tmp4 = etree.SubElement(tmp3, util.nspath_eval('gmd:MD_RepresentativeFraction', self.namespaces)) tmp5 = etree.SubElement(tmp4, util.nspath_eval('gmd:denominator', self.namespaces)) etree.SubElement(tmp5, util.nspath_eval('gco:Integer', self.namespaces)).text = str(val) # resource language val = util.getqattr(result, queryables['apiso:ResourceLanguage']['dbcol']) tmp = etree.SubElement(resident, util.nspath_eval('gmd:language', self.namespaces)) etree.SubElement(tmp, util.nspath_eval('gco:CharacterString', self.namespaces)).text = val # topic category val = util.getqattr(result, queryables['apiso:TopicCategory']['dbcol']) if val: for v in val.split(','): tmp = etree.SubElement(resident, util.nspath_eval('gmd:topicCategory', self.namespaces)) etree.SubElement(tmp, util.nspath_eval('gmd:MD_TopicCategoryCode', self.namespaces)).text = val # bbox extent val = util.getqattr(result, queryables['apiso:BoundingBox']['dbcol']) bboxel = write_extent(val, self.namespaces) if bboxel is not None and mtype != 'service': resident.append(bboxel) # service identification if mtype == 'service': # service type # service type version val = util.getqattr(result, queryables['apiso:ServiceType']['dbcol']) val2 = util.getqattr(result, queryables['apiso:ServiceTypeVersion']['dbcol']) if val is not None: tmp = etree.SubElement(resident, util.nspath_eval('srv:serviceType', self.namespaces)) etree.SubElement(tmp, util.nspath_eval('gco:LocalName', self.namespaces)).text = val tmp = etree.SubElement(resident, util.nspath_eval('srv:serviceTypeVersion', self.namespaces)) etree.SubElement(tmp, util.nspath_eval('gco:CharacterString', self.namespaces)).text = val2 kw = util.getqattr(result, queryables['apiso:Subject']['dbcol']) if kw is not None: srv_keywords = etree.SubElement(resident, util.nspath_eval('srv:keywords', self.namespaces)) srv_keywords.append(write_keywords(kw, self.namespaces)) if bboxel is not None: bboxel.tag = util.nspath_eval('srv:extent', self.namespaces) resident.append(bboxel) val = util.getqattr(result, queryables['apiso:CouplingType']['dbcol']) if val is not None: couplingtype = etree.SubElement(resident, util.nspath_eval('srv:couplingType', self.namespaces)) etree.SubElement(couplingtype, util.nspath_eval('srv:SV_CouplingType', self.namespaces), codeListValue=val, codeList='%s#SV_CouplingType' % CODELIST).text = val if esn in ['summary', 'full']: # all service resources as coupled resources coupledresources = util.getqattr(result, queryables['apiso:OperatesOn']['dbcol']) operations = util.getqattr(result, queryables['apiso:Operation']['dbcol']) if coupledresources: for val2 in coupledresources.split(','): coupledres = etree.SubElement(resident, util.nspath_eval('srv:coupledResource', self.namespaces)) svcoupledres = etree.SubElement(coupledres, util.nspath_eval('srv:SV_CoupledResource', self.namespaces)) opname = etree.SubElement(svcoupledres, util.nspath_eval('srv:operationName', self.namespaces)) etree.SubElement(opname, util.nspath_eval('gco:CharacterString', self.namespaces)).text = _get_resource_opname(operations) sid = etree.SubElement(svcoupledres, util.nspath_eval('srv:identifier', self.namespaces)) etree.SubElement(sid, util.nspath_eval('gco:CharacterString', self.namespaces)).text = val2 # service operations if operations: for i in operations.split(','): oper = etree.SubElement(resident, util.nspath_eval('srv:containsOperations', self.namespaces)) tmp = etree.SubElement(oper, util.nspath_eval('srv:SV_OperationMetadata', self.namespaces)) tmp2 = etree.SubElement(tmp, util.nspath_eval('srv:operationName', self.namespaces)) etree.SubElement(tmp2, util.nspath_eval('gco:CharacterString', self.namespaces)).text = i tmp3 = etree.SubElement(tmp, util.nspath_eval('srv:DCP', self.namespaces)) etree.SubElement(tmp3, util.nspath_eval('srv:DCPList', self.namespaces), codeList='%s#DCPList' % CODELIST, codeListValue='HTTPGet').text = 'HTTPGet' tmp4 = etree.SubElement(tmp, util.nspath_eval('srv:DCP', self.namespaces)) etree.SubElement(tmp4, util.nspath_eval('srv:DCPList', self.namespaces), codeList='%s#DCPList' % CODELIST, codeListValue='HTTPPost').text = 'HTTPPost' connectpoint = etree.SubElement(tmp, util.nspath_eval('srv:connectPoint', self.namespaces)) onlineres = etree.SubElement(connectpoint, util.nspath_eval('gmd:CI_OnlineResource', self.namespaces)) linkage = etree.SubElement(onlineres, util.nspath_eval('gmd:linkage', self.namespaces)) etree.SubElement(linkage, util.nspath_eval('gmd:URL', self.namespaces)).text = util.getqattr(result, self.context.md_core_model['mappings']['pycsw:Source']) # operates on resource(s) if coupledresources: for i in coupledresources.split(','): operates_on = etree.SubElement(resident, util.nspath_eval('srv:operatesOn', self.namespaces), uuidref=i) operates_on.attrib[util.nspath_eval('xlink:href', self.namespaces)] = '%sservice=CSW&version=2.0.2&request=GetRecordById&outputschema=http://www.isotc211.org/2005/gmd&id=%s-%s' % (util.bind_url(self.url), idval, i) rlinks = util.getqattr(result, self.context.md_core_model['mappings']['pycsw:Links']) if rlinks: distinfo = etree.SubElement(node, util.nspath_eval('gmd:distributionInfo', self.namespaces)) distinfo2 = etree.SubElement(distinfo, util.nspath_eval('gmd:MD_Distribution', self.namespaces)) transopts = etree.SubElement(distinfo2, util.nspath_eval('gmd:transferOptions', self.namespaces)) dtransopts = etree.SubElement(transopts, util.nspath_eval('gmd:MD_DigitalTransferOptions', self.namespaces)) for link in rlinks.split('^'): linkset = link.split(',') online = etree.SubElement(dtransopts, util.nspath_eval('gmd:onLine', self.namespaces)) online2 = etree.SubElement(online, util.nspath_eval('gmd:CI_OnlineResource', self.namespaces)) linkage = etree.SubElement(online2, util.nspath_eval('gmd:linkage', self.namespaces)) etree.SubElement(linkage, util.nspath_eval('gmd:URL', self.namespaces)).text = linkset[-1] protocol = etree.SubElement(online2, util.nspath_eval('gmd:protocol', self.namespaces)) etree.SubElement(protocol, util.nspath_eval('gco:CharacterString', self.namespaces)).text = linkset[2] name = etree.SubElement(online2, util.nspath_eval('gmd:name', self.namespaces)) etree.SubElement(name, util.nspath_eval('gco:CharacterString', self.namespaces)).text = linkset[0] desc = etree.SubElement(online2, util.nspath_eval('gmd:description', self.namespaces)) etree.SubElement(desc, util.nspath_eval('gco:CharacterString', self.namespaces)).text = linkset[1] return node
def get_extendedcapabilities(self): ''' Add child to ows:OperationsMetadata Element ''' if self.inspire_config is not None: ex_caps = etree.Element( util.nspath_eval('inspire_ds:ExtendedCapabilities', self.inspire_namespaces)) ex_caps.attrib[util.nspath_eval('xsi:schemaLocation', self.context.namespaces)] = \ '%s %s/inspire_ds.xsd' % \ (self.inspire_namespaces['inspire_ds'], self.inspire_namespaces['inspire_ds']) # Resource Locator res_loc = etree.SubElement(ex_caps, util.nspath_eval('inspire_common:ResourceLocator', self.inspire_namespaces)) etree.SubElement(res_loc, util.nspath_eval('inspire_common:URL', self.inspire_namespaces)).text = '%sservice=CSW&version=2.0.2&request=GetCapabilities' % (util.bind_url(self.url)) etree.SubElement(res_loc, util.nspath_eval('inspire_common:MediaType', self.inspire_namespaces)).text = 'application/xml' # Resource Type etree.SubElement(ex_caps, util.nspath_eval('inspire_common:ResourceType', self.inspire_namespaces)).text = 'service' # Temporal Reference temp_ref = etree.SubElement(ex_caps, util.nspath_eval('inspire_common:TemporalReference', self.inspire_namespaces)) temp_extent = etree.SubElement(temp_ref, util.nspath_eval('inspire_common:TemporalExtent', self.inspire_namespaces)) val = self.inspire_config['temp_extent'].split('/') if len(val) == 1: etree.SubElement(temp_extent, util.nspath_eval('inspire_common:IndividualDate', self.inspire_namespaces)).text = val[0] else: interval_dates = etree.SubElement(temp_extent, util.nspath_eval('inspire_common:IntervalOfDates', self.inspire_namespaces)) etree.SubElement(interval_dates, util.nspath_eval('inspire_common:StartingDate', self.inspire_namespaces)).text = val[0] etree.SubElement(interval_dates, util.nspath_eval('inspire_common:EndDate', self.inspire_namespaces)).text = val[1] # Conformity - service cfm = etree.SubElement(ex_caps, util.nspath_eval('inspire_common:Conformity', self.inspire_namespaces)) spec = etree.SubElement(cfm, util.nspath_eval('inspire_common:Specification', self.inspire_namespaces)) spec.attrib[util.nspath_eval('xsi:type', self.context.namespaces)] = 'inspire_common:citationInspireInteroperabilityRegulation_eng' etree.SubElement(spec, util.nspath_eval('inspire_common:Title', self.inspire_namespaces)).text = 'COMMISSION REGULATION (EU) No 1089/2010 of 23 November 2010 implementing Directive 2007/2/EC of the European Parliament and of the Council as regards interoperability of spatial data sets and services' etree.SubElement(spec, util.nspath_eval('inspire_common:DateOfPublication', self.inspire_namespaces)).text = '2010-12-08' etree.SubElement(spec, util.nspath_eval('inspire_common:URI', self.inspire_namespaces)).text = 'OJ:L:2010:323:0011:0102:EN:PDF' spec_loc = etree.SubElement(spec, util.nspath_eval('inspire_common:ResourceLocator', self.inspire_namespaces)) etree.SubElement(spec_loc, util.nspath_eval('inspire_common:URL', self.inspire_namespaces)).text = 'http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=OJ:L:2010:323:0011:0102:EN:PDF' etree.SubElement(spec_loc, util.nspath_eval('inspire_common:MediaType', self.inspire_namespaces)).text = 'application/pdf' spec = etree.SubElement(cfm, util.nspath_eval('inspire_common:Degree', self.inspire_namespaces)).text = self.inspire_config['conformity_service'] # Metadata Point of Contact poc = etree.SubElement(ex_caps, util.nspath_eval('inspire_common:MetadataPointOfContact', self.inspire_namespaces)) etree.SubElement(poc, util.nspath_eval('inspire_common:OrganisationName', self.inspire_namespaces)).text = self.inspire_config['contact_name'] etree.SubElement(poc, util.nspath_eval('inspire_common:EmailAddress', self.inspire_namespaces)).text = self.inspire_config['contact_email'] # Metadata Date etree.SubElement(ex_caps, util.nspath_eval('inspire_common:MetadataDate', self.inspire_namespaces)).text = self.inspire_config['date'] # Spatial Data Service Type etree.SubElement(ex_caps, util.nspath_eval('inspire_common:SpatialDataServiceType', self.inspire_namespaces)).text = 'discovery' # Mandatory Keyword mkey = etree.SubElement(ex_caps, util.nspath_eval('inspire_common:MandatoryKeyword', self.inspire_namespaces)) mkey.attrib[util.nspath_eval('xsi:type', self.context.namespaces)] = 'inspire_common:classificationOfSpatialDataService' etree.SubElement(mkey, util.nspath_eval('inspire_common:KeywordValue', self.inspire_namespaces)).text = 'infoCatalogueService' # Gemet Keywords for gkw in self.inspire_config['gemet_keywords'].split(','): gkey = etree.SubElement(ex_caps, util.nspath_eval('inspire_common:Keyword', self.inspire_namespaces)) gkey.attrib[util.nspath_eval('xsi:type', self.context.namespaces)] = 'inspire_common:inspireTheme_eng' ocv = etree.SubElement(gkey, util.nspath_eval('inspire_common:OriginatingControlledVocabulary', self.inspire_namespaces)) etree.SubElement(ocv, util.nspath_eval('inspire_common:Title', self.inspire_namespaces)).text = 'GEMET - INSPIRE themes' etree.SubElement(ocv, util.nspath_eval('inspire_common:DateOfPublication', self.inspire_namespaces)).text = '2008-06-01' etree.SubElement(gkey, util.nspath_eval('inspire_common:KeywordValue', self.inspire_namespaces)).text = gkw # Languages slang = etree.SubElement(ex_caps, util.nspath_eval('inspire_common:SupportedLanguages', self.inspire_namespaces)) dlang = etree.SubElement(slang, util.nspath_eval('inspire_common:DefaultLanguage', self.inspire_namespaces)) etree.SubElement(dlang, util.nspath_eval('inspire_common:Language', self.inspire_namespaces)).text = self.inspire_config['default_language'] for l in self.inspire_config['languages_supported'].split(','): lang = etree.SubElement(slang, util.nspath_eval('inspire_common:SupportedLanguage', self.inspire_namespaces)) etree.SubElement(lang, util.nspath_eval('inspire_common:Language', self.inspire_namespaces)).text = l clang = etree.SubElement(ex_caps, util.nspath_eval('inspire_common:ResponseLanguage', self.inspire_namespaces)) etree.SubElement(clang, util.nspath_eval('inspire_common:Language', self.inspire_namespaces)).text = self.inspire_config['current_language'] return ex_caps