def testOgcApiHandler(self): """Test OGC API Handler""" project = QgsProject() project.read(unitTestDataPath('qgis_server') + '/test_project_api.qgs') request = QgsBufferServerRequest( 'http://server.qgis.org/wfs3/collections/testlayer%20èé/items?limit=-1' ) response = QgsBufferServerResponse() ctx = QgsServerApiContext('/services/api1', request, response, project, self.server.serverInterface()) h = Handler1() self.assertTrue( h.staticPath(ctx).endswith('/resources/server/api/ogc/static')) self.assertEqual(h.path(), QtCore.QRegularExpression("/handlerone")) self.assertEqual(h.description(), 'The first handler ever') self.assertEqual(h.operationId(), 'handlerOne') self.assertEqual(h.summary(), 'First of its name') self.assertEqual(h.linkTitle(), 'Handler One Link Title') self.assertEqual(h.linkType(), QgsServerOgcApi.data) with self.assertRaises(QgsServerApiBadRequestException) as ex: h.handleRequest(ctx) self.assertEqual(str(ex.exception), 'Missing required argument: \'value1\'') r = ctx.response() self.assertEqual(r.data(), '') with self.assertRaises(QgsServerApiBadRequestException) as ex: h.values(ctx) self.assertEqual(str(ex.exception), 'Missing required argument: \'value1\'') # Add handler to API and test for /api2 ctx = QgsServerApiContext('/services/api2', request, response, project, self.server.serverInterface()) api = QgsServerOgcApi(self.server.serverInterface(), '/api2', 'apitwo', 'a second api', '1.2') api.registerHandler(h) # Add a second handler (will be tested later) h2 = Handler2() api.registerHandler(h2) ctx.request().setUrl(QtCore.QUrl('http://www.qgis.org/services/api1')) with self.assertRaises(QgsServerApiBadRequestException) as ex: api.executeRequest(ctx) self.assertEqual( str(ex.exception), 'Requested URI does not match any registered API handler') ctx.request().setUrl(QtCore.QUrl('http://www.qgis.org/services/api2')) with self.assertRaises(QgsServerApiBadRequestException) as ex: api.executeRequest(ctx) self.assertEqual( str(ex.exception), 'Requested URI does not match any registered API handler') ctx.request().setUrl( QtCore.QUrl('http://www.qgis.org/services/api2/handlerone')) with self.assertRaises(QgsServerApiBadRequestException) as ex: api.executeRequest(ctx) self.assertEqual(str(ex.exception), 'Missing required argument: \'value1\'') ctx.request().setUrl( QtCore.QUrl( 'http://www.qgis.org/services/api2/handlerone?value1=not+a+double' )) with self.assertRaises(QgsServerApiBadRequestException) as ex: api.executeRequest(ctx) self.assertEqual( str(ex.exception), 'Argument \'value1\' could not be converted to Double') ctx.request().setUrl( QtCore.QUrl( 'http://www.qgis.org/services/api2/handlerone?value1=1.2345')) params = h.values(ctx) self.assertEqual(params, {'value1': 1.2345}) api.executeRequest(ctx) self.assertEqual( json.loads(bytes(ctx.response().data()))['value1'], 1.2345) # Test path fragments extraction ctx.request().setUrl( QtCore.QUrl( 'http://www.qgis.org/services/api2/handlertwo/00/555?value1=1.2345' )) params = h2.values(ctx) self.assertEqual(params, { 'code1': '00', 'value1': 1.2345, 'value2': None }) # Test string encoding ctx.request().setUrl( QtCore.QUrl( 'http://www.qgis.org/services/api2/handlertwo/00/555?value1=1.2345&value2=a%2Fstring%20some' )) params = h2.values(ctx) self.assertEqual(params, { 'code1': '00', 'value1': 1.2345, 'value2': 'a/string some' }) # Test links self.assertEqual( h2.href(ctx), 'http://www.qgis.org/services/api2/handlertwo/00/555?value1=1.2345&value2=a%2Fstring%20some' ) self.assertEqual( h2.href(ctx, '/extra'), 'http://www.qgis.org/services/api2/handlertwo/00/555/extra?value1=1.2345&value2=a%2Fstring%20some' ) self.assertEqual( h2.href(ctx, '/extra', 'json'), 'http://www.qgis.org/services/api2/handlertwo/00/555/extra.json?value1=1.2345&value2=a%2Fstring%20some' ) # Test template path self.assertTrue( h2.templatePath(ctx).endswith( '/resources/server/api/ogc/templates/services/api2/handlerTwo.html' ))
def test_append_path(self): path = QgsServerApiUtils.appendMapParameter('/wfs3', QtCore.QUrl('https://www.qgis.org/wfs3?MAP=/some/path')) self.assertEquals(path, '/wfs3?MAP=/some/path')
def search_thesaurus(self): """ Send request to the WORMS API """ network_manager = QtNetwork.QNetworkAccessManager(self) while self.wk_model.rowCount() > 0: self.wk_model.removeSpecificRow(self.wk_model.rowCount() - 1) name = self.name_edit.text() if name and len(name) > 0: request_name_url = 'https://www.marinespecies.org/rest/AphiaRecordsByName/{}'.format( name.replace(' ', '+')) request_name = QtNetwork.QNetworkRequest( qcore.QUrl(request_name_url)) reply_name = network_manager.get(request_name) def process_name_search(): if reply_name.attribute(QtNetwork.QNetworkRequest. HttpStatusCodeAttribute) > 200: return data = json.loads(str(reply_name.readAll(), 'utf-8')) for item in data: self.wk_model.addNewRow([ item['scientificname'], item['modified'].split('T')[0] ]) reply_name.finished.connect(process_name_search) vernacular = self.vernacular_edit.text() if vernacular and len(vernacular) > 0: request_vernacular_url = 'https://www.marinespecies.org/rest/AphiaRecordsByVernacular/{}'.format( vernacular.replace(' ', '+')) request_vernacular = QtNetwork.QNetworkRequest( qcore.QUrl(request_vernacular_url)) reply_vernacular = network_manager.get(request_vernacular) def process_vernacular_search(): if reply_vernacular.attribute(QtNetwork.QNetworkRequest. HttpStatusCodeAttribute) > 200: return data = json.loads(str(reply_vernacular.readAll(), 'utf-8')) for item in data: self.wk_model.addNewRow([ item['scientificname'], item['modified'].split('T')[0] ]) reply_vernacular.finished.connect(process_vernacular_search) identifier = self.identifier_edit.text() if identifier and len(identifier) > 0: request_identifier_url = 'https://www.marinespecies.org/rest/AphiaRecordByAphiaID/{}'.format( identifier.replace(' ', '+')) request_identifier = QtNetwork.QNetworkRequest( qcore.QUrl(request_identifier_url)) reply_identifier = network_manager.get(request_identifier) def process_identifier_search(): if reply_identifier.attribute(QtNetwork.QNetworkRequest. HttpStatusCodeAttribute) > 200: return data = json.loads(str(reply_identifier.readAll(), 'utf-8')) self.wk_model.addNewRow( [data['scientificname'], data['modified'].split('T')[0]]) reply_identifier.finished.connect(process_identifier_search)
def open_resource_page(self): QtGui.QDesktopServices.openUrl( QtCore.QUrl(self.brief_dataset.detail_url))
def get_layer_styles_url_endpoint(self, layer_id: int): return QtCore.QUrl(f"{self.api_url}/datasets/{layer_id}/styles/")
def get_layer_detail_url_endpoint(self, id_: int) -> QtCore.QUrl: return QtCore.QUrl(f"{self.api_url}/datasets/{id_}/")