def describerecord(self, typename='csw:Record', format=outputformat): """ Construct and process DescribeRecord request Parameters ---------- - typename: the typename to describe (default is 'csw:Record') - format: the outputFormat (default is 'application/xml') """ # construct request nsmap = { 'csw' : ns.get_namespace('csw'), 'xsi' : ns.get_namespace('xsi'), } node0 = setrootelement('csw:DescribeRecord', nsmap) node0.set('outputFormat', format) node0.set('schemaLanguage',ns.get_namespace('xs2')) node0.set('service', self.service) node0.set('version', self.version) node0.set(nsp('xsi:schemaLocation'), schema_location) etree.SubElement(node0, nsp('csw:TypeName')).text = typename self.request = xml2string(etree.tostring(node0)) self._invoke()
def __init__(self, url, lang='en-US', version='2.0.2', timeout=10, skip_caps=False): """ Construct and process a GetCapabilities request Parameters ---------- - url: the URL of the CSW - lang: the language (default is 'en-US') - version: version (default is '2.0.2') - timeout: timeout in seconds - skip_caps: whether to skip GetCapabilities processing on init (default is False) """ self.url = url self.lang = lang self.version = version self.timeout = timeout self.service = 'CSW' self.exceptionreport = None if not skip_caps: # process GetCapabilities # construct request nsmap = { 'csw' : ns.get_namespace('csw'), 'ows' : ns.get_versioned_namespace('ows',_ows_version), 'xsi' : ns.get_namespace('xsi'), } node0 = setrootelement('csw:GetCapabilities', nsmap) node0.set('service', self.service) node0.set(nsp('xsi:schemaLocation'), schema_location) tmp = etree.SubElement(node0, nsp_ows('ows:AcceptVersions')) etree.SubElement(tmp, nsp_ows('ows:Version')).text = self.version tmp2 = etree.SubElement(node0, nsp_ows('ows:AcceptFormats')) etree.SubElement(tmp2, nsp_ows('ows:OutputFormat')).text = outputformat self.request = xml2string(etree.tostring(node0)) self._invoke() if self.exceptionreport is None: # ServiceIdentification val = self._exml.find(nsp_ows('ows:ServiceIdentification')) self.identification=ows.ServiceIdentification(val,ns.get_versioned_namespace('ows', _ows_version)) # ServiceProvider val = self._exml.find(nsp_ows('ows:ServiceProvider')) self.provider=ows.ServiceProvider(val) # ServiceOperations metadata op = self._exml.find(nsp_ows('ows:OperationsMetadata')) self.operations = ows.OperationsMetadata(op, ns.get_versioned_namespace('ows', _ows_version)).operations # FilterCapabilities val = self._exml.find(nsp('ogc:Filter_Capabilities')) self.filters=fes.FilterCapabilities(val)
def harvest(self, source, resourcetype, resourceformat=None, harvestinterval=None, responsehandler=None): """ Construct and process a Harvest request Parameters ---------- - source: a URI to harvest - resourcetype: namespace identifying the type of resource - resourceformat: MIME type of the resource - harvestinterval: frequency of harvesting, in ISO8601 - responsehandler: endpoint that CSW should responsd to with response """ # construct request node0 = setrootelement('csw:Harvest') node0.set('version', self.version) node0.set('service', self.service) node0.set(nsp('xsi:schemaLocation'), schema_location) etree.SubElement(node0, nsp('csw:Source')).text = source etree.SubElement(node0, nsp('csw:ResourceType')).text = resourcetype if resourceformat is not None: etree.SubElement(node0, nsp('csw:ResourceFormat')).text = resourceformat if harvestinterval is not None: etree.SubElement(node0, nsp('csw:HarvestInterval')).text = harvestinterval if responsehandler is not None: etree.SubElement(node0, nsp('csw:ResponseHandler')).text = responsehandler self.request = xml2string(etree.tostring(node0)) self._invoke() self.results = {} if self.exceptionreport is None: val = self._exml.find(nsp('csw:Acknowledgement')) if testXMLValue(val) is not None: ts = val.attrib.get('timeStamp') self.timestamp = testXMLValue(ts, True) id = val.find(nsp('csw:RequestId')) self.id = testXMLValue(id) else: self._parsetransactionsummary() self._parseinsertresult()
def getdomain(self, dname, dtype='parameter'): """ Construct and process a GetDomain request Parameters ---------- - dname: the value of the Parameter or Property to query - dtype: whether to query a parameter (parameter) or property (property) """ # construct request dtypename = 'ParameterName' nsmap = { 'csw' : ns.get_namespace('csw'), 'xsi' : ns.get_namespace('xsi'), } node0 = setrootelement('csw:GetDomain', nsmap) node0.set('service', self.service) node0.set('version', self.version) node0.set(nsp('xsi:schemaLocation'), schema_location) if dtype == 'property': dtypename = 'PropertyName' etree.SubElement(node0, nsp('csw:%s' % dtypename)).text = dname self.request = xml2string(etree.tostring(node0)) self._invoke() if self.exceptionreport is None: self.results = {} val = self._exml.find(nsp('csw:DomainValues')).attrib.get('type') self.results['type'] = testXMLValue(val, True) val = self._exml.find(nsp('csw:DomainValues/csw:%s' % dtypename)) self.results[dtype] = testXMLValue(val) # get the list of values associated with the Domain self.results['values'] = [] for f in self._exml.findall(nsp('csw:DomainValues/csw:ListOfValues/csw:Value')): self.results['values'].append(testXMLValue(f))
def getrecordbyid(self, id=[], esn='full', outputschema=None, format=outputformat): """ Construct and process a GetRecordById request Parameters ---------- - id: the list of Ids - esn: the ElementSetName 'full', 'brief' or 'summary' (default is 'full') - outputschema: the outputSchema (default is 'http://www.opengis.net/cat/csw/2.0.2') - format: the outputFormat (default is 'application/xml') """ if outputschema is None: outputschema = ns.get_namespace('csw') nsmap = { 'csw' : ns.get_namespace('csw'), 'xsi' : ns.get_namespace('xsi') } # construct request node0 = setrootelement('csw:GetRecordById', nsmap) node0.set('outputFormat', format) node0.set('outputSchema', outputschema) node0.set('service', self.service) node0.set('version', self.version) node0.set(nsp('xsi:schemaLocation'), schema_location) for i in id: etree.SubElement(node0, nsp('csw:Id')).text = i etree.SubElement(node0, nsp('csw:ElementSetName')).text = esn self.request = xml2string(etree.tostring(node0)) self._invoke() if self.exceptionreport is None: self.results = {} self.records = {} self._parserecords(outputschema, esn)
def transaction(self, ttype=None, typename='csw:Record', record=None, propertyname=None, propertyvalue=None, bbox=None, keywords=[], cql=None, identifier=None): """ Construct and process a Transaction request Parameters ---------- - ttype: the type of transaction 'insert, 'update', 'delete' - typename: the typename to describe (default is 'csw:Record') - record: the XML record to insert - propertyname: the RecordProperty/PropertyName to Filter against - propertyvalue: the RecordProperty Value to Filter against (for updates) - bbox: the bounding box of the spatial query in the form [minx,miny,maxx,maxy] - keywords: list of keywords - cql: common query language text. Note this overrides bbox, qtype, keywords - identifier: record identifier. Note this overrides bbox, qtype, keywords, cql """ # construct request node0 = setrootelement('csw:Transaction') node0.set('version', self.version) node0.set('service', self.service) node0.set(nsp('xsi:schemaLocation'), schema_location) validtransactions = ['insert', 'update', 'delete'] if ttype not in validtransactions: # invalid transaction raise RuntimeError, 'Invalid transaction \'%s\'.' % ttype node1 = etree.SubElement(node0, nsp('csw:%s' % ttype.capitalize())) if ttype != 'update': node1.set('typeName', typename) if ttype == 'insert': if record is None: raise RuntimeError, 'Nothing to insert.' node1.append(etree.fromstring(record)) if ttype == 'update': if record is not None: node1.append(etree.fromstring(record)) else: if propertyname is not None and propertyvalue is not None: node2 = etree.SubElement(node1, nsp('csw:RecordProperty')) etree.SubElement(node2, nsp('csw:Name')).text = propertyname etree.SubElement(node2, nsp('csw:Value')).text = propertyvalue self._setconstraint(node1, qtype, propertyname, keywords, bbox, cql, identifier) if ttype == 'delete': self._setconstraint(node1, None, propertyname, keywords, bbox, cql, identifier) self.request = xml2string(etree.tostring(node0)) self._invoke() self.results = {} if self.exceptionreport is None: self._parsetransactionsummary() self._parseinsertresult()
def getrecords(self, qtype=None, keywords=[], typenames='csw:Record', propertyname='csw:AnyText', bbox=None, esn='summary', sortby=None, outputschema=None, format=outputformat, startposition=0, maxrecords=10, cql=None, xml=None): """ Construct and process a GetRecords request Parameters ---------- - qtype: type of resource to query (i.e. service, dataset) - keywords: list of keywords - typenames: the typeNames to query against (default is csw:Record) - propertyname: the PropertyName to Filter against - bbox: the bounding box of the spatial query in the form [minx,miny,maxx,maxy] - esn: the ElementSetName 'full', 'brief' or 'summary' (default is 'summary') - sortby: property to sort results on (default is 'dc:title') - outputschema: the outputSchema (default is 'http://www.opengis.net/cat/csw/2.0.2') - format: the outputFormat (default is 'application/xml') - startposition: requests a slice of the result set, starting at this position (default is 0) - maxrecords: the maximum number of records to return. No records are returned if 0 (default is 10) - cql: common query language text. Note this overrides bbox, qtype, keywords - xml: raw XML request. Note this overrides all other options """ if outputschema is None: outputschema = ns.get_namespace('csw') if xml is not None: self.request = xml e=etree.fromstring(xml) val = e.find(nsp('csw:Query/csw:ElementSetName')) if val is not None: esn = testXMLValue(val) else: # construct request nsmap = { 'xsi' : ns.get_namespace('xsi'), 'ogc' : ns.get_namespace('ogc'), 'dif' : ns.get_namespace('dif'), 'ows' : ns.get_versioned_namespace('ows', _ows_version), 'fgdc': ns.get_namespace('fgdc'), 'gmd' : ns.get_namespace('gmd'), 'csw' : ns.get_namespace('csw') } node0 = setrootelement('csw:GetRecords', nsmap) node0.set('outputSchema', outputschema) node0.set('outputFormat', format) node0.set('version', self.version) node0.set('resultType', 'results') node0.set('service', self.service) if startposition > 0: node0.set('startPosition', str(startposition)) node0.set('maxRecords', str(maxrecords)) node0.set(nsp('xsi:schemaLocation'), schema_location) node1 = etree.SubElement(node0, nsp('csw:Query')) node1.set('typeNames', typenames) etree.SubElement(node1, nsp('csw:ElementSetName')).text = esn self._setconstraint(node1, qtype, propertyname, keywords, bbox, cql) if sortby is not None: fes.setsortby(node1, sortby) self.request = xml2string(etree.tostring(node0)) self._invoke() if self.exceptionreport is None: self.results = {} # process search results attributes val = self._exml.find(nsp('csw:SearchResults')).attrib.get('numberOfRecordsMatched') self.results['matches'] = int(testXMLValue(val, True)) val = self._exml.find(nsp('csw:SearchResults')).attrib.get('numberOfRecordsReturned') self.results['returned'] = int(testXMLValue(val, True)) val = self._exml.find(nsp('csw:SearchResults')).attrib.get('nextRecord') self.results['nextrecord'] = int(testXMLValue(val, True)) # process list of matching records self.records = {} self._parserecords(outputschema, esn)