Beispiel #1
0
    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'
            ))
Beispiel #2
0
    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)
Beispiel #4
0
 def open_resource_page(self):
     QtGui.QDesktopServices.openUrl(
         QtCore.QUrl(self.brief_dataset.detail_url))
Beispiel #5
0
 def get_layer_styles_url_endpoint(self, layer_id: int):
     return QtCore.QUrl(f"{self.api_url}/datasets/{layer_id}/styles/")
Beispiel #6
0
 def get_layer_detail_url_endpoint(self, id_: int) -> QtCore.QUrl:
     return QtCore.QUrl(f"{self.api_url}/datasets/{id_}/")