From 3a9e413d344dc883304b22e9cfe4bebbe3b2811a Mon Sep 17 00:00:00 2001 From: Tim Van Campenhout Date: Tue, 25 Apr 2023 13:43:10 +0200 Subject: [PATCH 1/7] #173 gemeente statisch gewest nisc --- crabpy_pyramid/renderers/adressenregister.py | 14 +++++++++----- crabpy_pyramid/tests/test_functional.py | 7 ++++--- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/crabpy_pyramid/renderers/adressenregister.py b/crabpy_pyramid/renderers/adressenregister.py index 3bc778c..e2c32b6 100644 --- a/crabpy_pyramid/renderers/adressenregister.py +++ b/crabpy_pyramid/renderers/adressenregister.py @@ -12,7 +12,7 @@ def list_gewesten_adapter(obj, request): Adapter for rendering a list of :class:`crabpy.gateway.adressenregister.Gewest` to json. """ - return {"id": obj.id, "naam": obj.naam} + return {"id": obj.id, "naam": obj.naam, "niscode": obj.niscode} def list_provincie_adapter(obj, request): @@ -46,7 +46,12 @@ def list_gemeente_adapter(obj, request): Adapter for rendering a list of :class:`crabpy.gateway.adressenregister.Gemeenten` to json. """ - return {"niscode": obj.niscode, "naam": obj.naam, "uri": obj.uri} + return { + "niscode": obj.niscode, + "naam": obj.naam, + "uri": obj.uri, + "provincie": {"niscode": obj.provincie_niscode} + } def list_straten_adapter(obj, request): @@ -118,6 +123,7 @@ def item_gewest_adapter(obj, request): """ return { "id": obj.id, + "niscode": obj.niscode, "naam": obj.naam, "centroid": obj.centroid, "bounding_box": obj.bounding_box, @@ -145,10 +151,8 @@ def item_gemeente_adapter(obj, request): """ return { "niscode": obj.niscode, - "uri": obj.uri, "naam": obj.naam(), - "taal": obj.taal, - "status": obj.status, + "provincie": {"niscode": obj.provincie_niscode}, } diff --git a/crabpy_pyramid/tests/test_functional.py b/crabpy_pyramid/tests/test_functional.py index da94f67..8f56284 100644 --- a/crabpy_pyramid/tests/test_functional.py +++ b/crabpy_pyramid/tests/test_functional.py @@ -421,9 +421,9 @@ def test_list_gewesten(self): self.assertCountEqual( res.json, [ - {"id": 1, "naam": "Brussels Hoofdstedelijk Gewest"}, - {"id": 2, "naam": "Vlaams Gewest"}, - {"id": 3, "naam": "Waals Gewest"}, + {"id": 1, "niscode": "4000", "naam": "Brussels Hoofdstedelijk Gewest"}, + {"id": 2, "niscode": "2000", "naam": "Vlaams Gewest"}, + {"id": 3, "niscode": "3000", "naam": "Waals Gewest"}, ], ) @@ -498,6 +498,7 @@ def test_list_gemeenten_by_provincie(self): "niscode": "11001", "naam": "Aartselaar", "uri": "https://data.vlaanderen.be/id/gemeente/11001", + "provincie": {"niscode": "10000"}, } ], ) From 7f8511530328870296f5f8c16baa03dc2d47caa7 Mon Sep 17 00:00:00 2001 From: Tim Van Campenhout Date: Wed, 3 May 2023 10:18:52 +0200 Subject: [PATCH 2/7] #173 review fix --- crabpy_pyramid/renderers/adressenregister.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crabpy_pyramid/renderers/adressenregister.py b/crabpy_pyramid/renderers/adressenregister.py index e2c32b6..ace6a21 100644 --- a/crabpy_pyramid/renderers/adressenregister.py +++ b/crabpy_pyramid/renderers/adressenregister.py @@ -49,7 +49,6 @@ def list_gemeente_adapter(obj, request): return { "niscode": obj.niscode, "naam": obj.naam, - "uri": obj.uri, "provincie": {"niscode": obj.provincie_niscode} } @@ -153,6 +152,7 @@ def item_gemeente_adapter(obj, request): "niscode": obj.niscode, "naam": obj.naam(), "provincie": {"niscode": obj.provincie_niscode}, + "gewest": {"niscode": obj.gewest.niscode} } From 5b241550c41b487cb3df77bf9d923800f82c7a04 Mon Sep 17 00:00:00 2001 From: Wouter Claeys Date: Wed, 3 May 2023 14:31:27 +0200 Subject: [PATCH 3/7] Update requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 213f730..49ba1bd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ # Tested and approved with these versions pyramid==2.0.0 -crabpy==1.0.0 +crabpy==1.1.0 pycountry==18.12.8 ; python_version < '3.0' pycountry==22.3.5 ; python_version >= '3.4' From e4024a7c159d7023843f18714b147c67f82f02ea Mon Sep 17 00:00:00 2001 From: Tim Van Campenhout Date: Thu, 4 May 2023 16:06:24 +0200 Subject: [PATCH 4/7] #175 exception handling + update crab --- crabpy_pyramid/__init__.py | 1 + crabpy_pyramid/renderers/adressenregister.py | 7 +- crabpy_pyramid/routes/adressenregister.py | 16 +- crabpy_pyramid/tests/test_functional.py | 500 ++++++++----------- crabpy_pyramid/views/adressenregister.py | 170 +++---- crabpy_pyramid/views/exceptions.py | 27 + requirements.txt | 2 +- 7 files changed, 344 insertions(+), 379 deletions(-) create mode 100644 crabpy_pyramid/views/exceptions.py diff --git a/crabpy_pyramid/__init__.py b/crabpy_pyramid/__init__.py index 6c2e05e..8ce1a46 100644 --- a/crabpy_pyramid/__init__.py +++ b/crabpy_pyramid/__init__.py @@ -334,6 +334,7 @@ def includeme(config): config.add_request_method(get_adressenregister, 'adressenregister_gateway') config.include('crabpy_pyramid.routes.adressenregister') config.scan('crabpy_pyramid.views.adressenregister') + config.scan("crabpy_pyramid.views.exceptions") def main(global_config, **settings): diff --git a/crabpy_pyramid/renderers/adressenregister.py b/crabpy_pyramid/renderers/adressenregister.py index ace6a21..5cce078 100644 --- a/crabpy_pyramid/renderers/adressenregister.py +++ b/crabpy_pyramid/renderers/adressenregister.py @@ -1,4 +1,3 @@ -import crabpy import pycountry from crabpy.gateway import adressenregister from pyramid.renderers import JSON @@ -24,7 +23,7 @@ def list_provincie_adapter(obj, request): "niscode": obj.niscode, "naam": obj.naam, "gewest": { - "id": obj.gewest, + "id": obj.gewest_niscode, }, } @@ -48,7 +47,7 @@ def list_gemeente_adapter(obj, request): """ return { "niscode": obj.niscode, - "naam": obj.naam, + "naam": obj.naam(), "provincie": {"niscode": obj.provincie_niscode} } @@ -138,7 +137,7 @@ def item_provincie_adapter(obj, request): "niscode": obj.niscode, "naam": obj.naam, "gewest": { - "id": obj.gewest, + "niscode": obj.gewest_niscode, }, } diff --git a/crabpy_pyramid/routes/adressenregister.py b/crabpy_pyramid/routes/adressenregister.py index d6c341b..b826ef9 100644 --- a/crabpy_pyramid/routes/adressenregister.py +++ b/crabpy_pyramid/routes/adressenregister.py @@ -7,24 +7,24 @@ def includeme(config): ) crabpy_pyramid.add_route( config, - "adressenregister_get_gewest_by_id", - "/adressenregister/gewesten/{gewest_id}", + "adressenregister_get_gewest_by_niscode", + "/adressenregister/gewesten/{gewest_niscode}", ) crabpy_pyramid.add_route( config, "adressenregister_list_provincies", - "/adressenregister/gewesten/{gewest_id}/provincies", + "/adressenregister/gewesten/{gewest_niscode}/provincies", ) crabpy_pyramid.add_route( config, "adressenregister_get_provincie", - "/adressenregister/provincies/{provincie_id}", + "/adressenregister/provincies/{provincie_niscode}", ) crabpy_pyramid.add_route( config, "adressenregister_list_deelgemeenten", - "/adressenregister/gewesten/{gewest_id}/deelgemeenten", + "/adressenregister/gewesten/{gewest_niscode}/deelgemeenten", ) crabpy_pyramid.add_route( config, @@ -34,18 +34,18 @@ def includeme(config): crabpy_pyramid.add_route( config, "adressenregister_get_deelgemeente_by_id", - "/adressenregister/deelgemeenten/{deelgemeente_id}", + "/adressenregister/deelgemeenten/{deelgemeente_niscode}", ) crabpy_pyramid.add_route( config, "adressenregister_list_gemeenten_by_provincie", - "/adressenregister/provincies/{provincie_id}/gemeenten", + "/adressenregister/provincies/{provincie_niscode}/gemeenten", ) crabpy_pyramid.add_route( config, "list_gemeenten_adressenregister", - "/adressenregister/gewesten/{gewest_id}/gemeenten", + "/adressenregister/gewesten/{gewest_niscode}/gemeenten", ) crabpy_pyramid.add_route( diff --git a/crabpy_pyramid/tests/test_functional.py b/crabpy_pyramid/tests/test_functional.py index 8f56284..8eeff8c 100644 --- a/crabpy_pyramid/tests/test_functional.py +++ b/crabpy_pyramid/tests/test_functional.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- -''' +""" Functional tests. .. versionadded:: 0.1.0 -''' +""" import os import shutil import unittest @@ -17,8 +17,6 @@ from crabpy_pyramid import main from crabpy_pyramid.tests.fixtures.adressenregister import adres from crabpy_pyramid.tests.fixtures.adressenregister import adressen -from crabpy_pyramid.tests.fixtures.adressenregister import gemeente -from crabpy_pyramid.tests.fixtures.adressenregister import gemeenten from crabpy_pyramid.tests.fixtures.adressenregister import perceel from crabpy_pyramid.tests.fixtures.adressenregister import percelen from crabpy_pyramid.tests.fixtures.adressenregister import postinfo_1000 @@ -29,57 +27,64 @@ def as_bool(value): - ''' + """ Cast a textual value from a config file to a boolean. Will convert 'true', 'True', '1', 't', 'T' or 'Yes' to `True`. All other values are considered to be `False`. - ''' - return value in ['true', 'True', '1', 't', 'T', 'Yes'] + """ + return value in ["true", "True", "1", "t", "T", "Yes"] def run_integration_tests(section): from testconfig import config + try: - return as_bool(config[section]['run_integration_tests']) + return as_bool(config[section]["run_integration_tests"]) except KeyError: # pragma NO COVER return False settings = { - 'crabpy.cache.file.root': os.path.join(os.path.dirname(__file__), 'dogpile_data'), - 'crabpy.capakey.cache_config.permanent.backend': 'dogpile.cache.dbm', - 'crabpy.capakey.cache_config.permanent.expiration_time': 604800, - 'crabpy.capakey.cache_config.permanent.arguments.filename': os.path.join(os.path.dirname(__file__), 'dogpile_data', 'capakey_permanent.dbm'), - 'crabpy.capakey.cache_config.long.backend': 'dogpile.cache.dbm', - 'crabpy.capakey.cache_config.long.expiration_time': 86400, - 'crabpy.capakey.cache_config.long.arguments.filename': os.path.join(os.path.dirname(__file__), 'dogpile_data', 'capakey_long.dbm'), - 'crabpy.capakey.cache_config.short.backend': 'dogpile.cache.dbm', - 'crabpy.capakey.cache_config.short.expiration_time': 3600, - 'crabpy.capakey.cache_config.short.arguments.filename': os.path.join(os.path.dirname(__file__), 'dogpile_data', 'capakey_short.dbm'), - 'crabpy.crab.include': True, - 'crabpy.crab.cache_config.permanent.backend': 'dogpile.cache.dbm', - 'crabpy.crab.cache_config.permanent.expiration_time': 604800, - 'crabpy.crab.cache_config.permanent.arguments.filename': os.path.join( - os.path.dirname(__file__), 'dogpile_data', 'crab_permanent.dbm'), - 'crabpy.crab.cache_config.long.backend': 'dogpile.cache.dbm', - 'crabpy.crab.cache_config.long.expiration_time': 86400, - 'crabpy.crab.cache_config.long.arguments.filename': os.path.join( - os.path.dirname(__file__), 'dogpile_data', 'crab_long.dbm'), - 'crabpy.crab.cache_config.short.backend': 'dogpile.cache.dbm', - 'crabpy.crab.cache_config.short.expiration_time': 3600, - 'crabpy.crab.cache_config.short.arguments.filename': os.path.join( - os.path.dirname(__file__), 'dogpile_data', 'crab_short.dbm'), - 'crabpy.adressenregister.include': True, - 'crabpy.adressenregister.base_url': 'https://api.basisregisters.vlaanderen.be', - 'crabpy.adressenregister.api_key': '33c6eb56-47cc-4723-8a69-3ad0b9cc3acd', + "crabpy.cache.file.root": os.path.join(os.path.dirname(__file__), "dogpile_data"), + "crabpy.capakey.cache_config.permanent.backend": "dogpile.cache.dbm", + "crabpy.capakey.cache_config.permanent.expiration_time": 604800, + "crabpy.capakey.cache_config.permanent.arguments.filename": os.path.join( + os.path.dirname(__file__), "dogpile_data", "capakey_permanent.dbm" + ), + "crabpy.capakey.cache_config.long.backend": "dogpile.cache.dbm", + "crabpy.capakey.cache_config.long.expiration_time": 86400, + "crabpy.capakey.cache_config.long.arguments.filename": os.path.join( + os.path.dirname(__file__), "dogpile_data", "capakey_long.dbm" + ), + "crabpy.capakey.cache_config.short.backend": "dogpile.cache.dbm", + "crabpy.capakey.cache_config.short.expiration_time": 3600, + "crabpy.capakey.cache_config.short.arguments.filename": os.path.join( + os.path.dirname(__file__), "dogpile_data", "capakey_short.dbm" + ), + "crabpy.crab.include": True, + "crabpy.crab.cache_config.permanent.backend": "dogpile.cache.dbm", + "crabpy.crab.cache_config.permanent.expiration_time": 604800, + "crabpy.crab.cache_config.permanent.arguments.filename": os.path.join( + os.path.dirname(__file__), "dogpile_data", "crab_permanent.dbm" + ), + "crabpy.crab.cache_config.long.backend": "dogpile.cache.dbm", + "crabpy.crab.cache_config.long.expiration_time": 86400, + "crabpy.crab.cache_config.long.arguments.filename": os.path.join( + os.path.dirname(__file__), "dogpile_data", "crab_long.dbm" + ), + "crabpy.crab.cache_config.short.backend": "dogpile.cache.dbm", + "crabpy.crab.cache_config.short.expiration_time": 3600, + "crabpy.crab.cache_config.short.arguments.filename": os.path.join( + os.path.dirname(__file__), "dogpile_data", "crab_short.dbm" + ), + "crabpy.adressenregister.include": True, + "crabpy.adressenregister.base_url": "https://api.basisregisters.vlaanderen.be", + "crabpy.adressenregister.api_key": "33c6eb56-47cc-4723-8a69-3ad0b9cc3acd", } def setUpModule(): - shutil.rmtree( - os.path.join(os.path.dirname(__file__), 'dogpile_data'), - True - ) + shutil.rmtree(os.path.join(os.path.dirname(__file__), "dogpile_data"), True) class FunctionalTests(unittest.TestCase): @@ -96,322 +101,315 @@ def tearDown(self): @unittest.skipUnless( - run_integration_tests('capakey'), - 'No CAPAKEY Integration tests required' + run_integration_tests("capakey"), "No CAPAKEY Integration tests required" ) class CapakeyFunctionalTests(FunctionalTests): def test_list_gemeenten(self): - res = self.testapp.get('/capakey/gemeenten') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/capakey/gemeenten") + self.assertEqual("200 OK", res.status) def test_get_gemeente_by_id(self): - res = self.testapp.get('/capakey/gemeenten/11001') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/capakey/gemeenten/11001") + self.assertEqual("200 OK", res.status) def test_get_gemeente_by_unexisting_id(self): - res = self.testapp.get('/capakey/gemeenten/1100', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/capakey/gemeenten/1100", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_kadastrale_afdelingen_by_gemeente(self): - res = self.testapp.get('/capakey/gemeenten/11001/afdelingen') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/capakey/gemeenten/11001/afdelingen") + self.assertEqual("200 OK", res.status) def test_list_kadastrale_afdelingen(self): - res = self.testapp.get('/capakey/afdelingen') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/capakey/afdelingen") + self.assertEqual("200 OK", res.status) def test_get_kadastrale_afdeling_by_id(self): - res = self.testapp.get('/capakey/afdelingen/11001') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/capakey/afdelingen/11001") + self.assertEqual("200 OK", res.status) def test_get_kadastrale_afdeling_by_unexisting_id(self): - res = self.testapp.get('/capakey/afdelingen/99999', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/capakey/afdelingen/99999", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_secties_by_afdeling(self): - res = self.testapp.get('/capakey/afdelingen/11001/secties') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/capakey/afdelingen/11001/secties") + self.assertEqual("200 OK", res.status) def test_get_sectie_by_id_and_afdeling(self): - res = self.testapp.get('/capakey/afdelingen/11001/secties/B') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/capakey/afdelingen/11001/secties/B") + self.assertEqual("200 OK", res.status) def test_get_sectie_by_unexisting_id_and_afdeling(self): - res = self.testapp.get( - '/capakey/afdelingen/11001/secties/Z', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/capakey/afdelingen/11001/secties/Z", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_percelen_by_sectie(self): - res = self.testapp.get('/capakey/afdelingen/11001/secties/B/percelen') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/capakey/afdelingen/11001/secties/B/percelen") + self.assertEqual("200 OK", res.status) def test_get_perceel_by_sectie_and_id(self): res = self.testapp.get( - '/capakey/afdelingen/11001/secties/B/percelen/0001/00S000') - self.assertEqual('200 OK', res.status) + "/capakey/afdelingen/11001/secties/B/percelen/0001/00S000" + ) + self.assertEqual("200 OK", res.status) def test_get_perceel_by_unexisting_sectie_and_id(self): res = self.testapp.get( - '/capakey/afdelingen/11001/secties/B/percelen/0000/00000', status=404) - self.assertEqual('404 Not Found', res.status) + "/capakey/afdelingen/11001/secties/B/percelen/0000/00000", status=404 + ) + self.assertEqual("404 Not Found", res.status) def test_get_perceel_by_capakey(self): - res = self.testapp.get('/capakey/percelen/11001B0001/00S000') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/capakey/percelen/11001B0001/00S000") + self.assertEqual("200 OK", res.status) def test_get_perceel_by_unexisting_capakey(self): - res = self.testapp.get( - '/capakey/percelen/99009X0009/00X000', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/capakey/percelen/99009X0009/00X000", status=404) + self.assertEqual("404 Not Found", res.status) def test_get_perceel_by_percid(self): - res = self.testapp.get('/capakey/percelen/11001_B_0001_S_000_00') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/capakey/percelen/11001_B_0001_S_000_00") + self.assertEqual("200 OK", res.status) def test_get_perceel_by_unexisting_percid(self): - res = self.testapp.get( - '/capakey/percelen/99009_X_0009_X_000_00', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/capakey/percelen/99009_X_0009_X_000_00", status=404) + self.assertEqual("404 Not Found", res.status) @unittest.skipUnless( - run_integration_tests('crab'), - 'No CRAB Integration tests required' + run_integration_tests("crab"), "No CRAB Integration tests required" ) class CrabFunctionalTests(FunctionalTests): def test_list_gewesten(self): - res = self.testapp.get('/crab/gewesten') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/gewesten") + self.assertEqual("200 OK", res.status) def test_get_gewest_by_id(self): - res = self.testapp.get('/crab/gewesten/2') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/gewesten/2") + self.assertEqual("200 OK", res.status) def test_get_gewest_by_unexisting_id(self): - res = self.testapp.get('/crab/gewesten/0', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/gewesten/0", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_provincies(self): - res = self.testapp.get('/crab/gewesten/2/provincies') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/gewesten/2/provincies") + self.assertEqual("200 OK", res.status) def test_get_provincie_by_id(self): - res = self.testapp.get('/crab/provincies/10000') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/provincies/10000") + self.assertEqual("200 OK", res.status) def test_get_provincie_by_unexisting_id(self): - res = self.testapp.get('/crab/provincies/00000', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/provincies/00000", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_gemeenten_by_provincie(self): - res = self.testapp.get('/crab/provincies/10000/gemeenten') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/provincies/10000/gemeenten") + self.assertEqual("200 OK", res.status) def test_list_gemeenten_crab(self): - res = self.testapp.get('/crab/gewesten/2/gemeenten') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/gewesten/2/gemeenten") + self.assertEqual("200 OK", res.status) def test_get_gemeente_crab_niscode(self): - res = self.testapp.get('/crab/gemeenten/11001') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/gemeenten/11001") + self.assertEqual("200 OK", res.status) def test_get_gemeente_crab_unexisting_niscode(self): - res = self.testapp.get('/crab/gemeenten/00000', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/gemeenten/00000", status=404) + self.assertEqual("404 Not Found", res.status) def test_get_gemeente_crab_id(self): - res = self.testapp.get('/crab/gemeenten/1') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/gemeenten/1") + self.assertEqual("200 OK", res.status) def test_get_gemeente_crab_unexisting_id(self): - res = self.testapp.get('/crab/gemeenten/0', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/gemeenten/0", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_deelgemeenten(self): - res = self.testapp.get('/crab/gewesten/2/deelgemeenten') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/gewesten/2/deelgemeenten") + self.assertEqual("200 OK", res.status) def test_list_deelgemeenten_wrong_gewest(self): - res = self.testapp.get('/crab/gewesten/1/deelgemeenten', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/gewesten/1/deelgemeenten", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_deelgemeenten_by_gemeente(self): - res = self.testapp.get('/crab/gemeenten/11001/deelgemeenten') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/gemeenten/11001/deelgemeenten") + self.assertEqual("200 OK", res.status) def test_list_deelgemeenten_by_unexisting_gemeente(self): - res = self.testapp.get( - '/crab/gemeenten/99999/deelgemeenten', status=404) - self.assertEqual('404 Not Found', res.status) - res = self.testapp.get( - '/crab/gemeenten/9999/deelgemeenten', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/gemeenten/99999/deelgemeenten", status=404) + self.assertEqual("404 Not Found", res.status) + res = self.testapp.get("/crab/gemeenten/9999/deelgemeenten", status=404) + self.assertEqual("404 Not Found", res.status) def test_get_deelgemeente_by_id(self): - res = self.testapp.get('/crab/deelgemeenten/45062A') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/deelgemeenten/45062A") + self.assertEqual("200 OK", res.status) def test_list_straten(self): - res = self.testapp.get('/crab/gemeenten/11001/straten') - self.assertIn('naam', res.json[0]) - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/gemeenten/11001/straten") + self.assertIn("naam", res.json[0]) + self.assertEqual("200 OK", res.status) def test_get_straat_by_id(self): - res = self.testapp.get('/crab/straten/1') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/straten/1") + self.assertEqual("200 OK", res.status) def test_get_straat_by_unexisting_id(self): - res = self.testapp.get('/crab/straten/0', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/straten/0", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_huisnummers(self): - res = self.testapp.get('/crab/straten/1/huisnummers') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/straten/1/huisnummers") + self.assertEqual("200 OK", res.status) def test_sort_huisnummers(self): - res = self.testapp.get('/crab/straten/1/huisnummers?sort=2') - self.assertEqual('200 OK', res.status) - nummers = [int(item['label']) for item in res.json] + res = self.testapp.get("/crab/straten/1/huisnummers?sort=2") + self.assertEqual("200 OK", res.status) + nummers = [int(item["label"]) for item in res.json] ascending = sorted(nummers) self.assertEqual(nummers, ascending) def test_get_huisnummer_by_straat_and_label(self): - res = self.testapp.get('/crab/straten/1/huisnummers/3') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/straten/1/huisnummers/3") + self.assertEqual("200 OK", res.status) def test_get_huisnummer_by_unexisting_straat_and_label(self): - res = self.testapp.get('/crab/straten/1/huisnummers/0', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/straten/1/huisnummers/0", status=404) + self.assertEqual("404 Not Found", res.status) def test_get_huisnummer_by_id(self): - res = self.testapp.get('/crab/huisnummers/1') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/huisnummers/1") + self.assertEqual("200 OK", res.status) def test_get_huisnummer_by_unexisting_id(self): - res = self.testapp.get('/crab/huisnummers/0', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/huisnummers/0", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_percelen(self): - res = self.testapp.get('/crab/huisnummers/1/percelen') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/huisnummers/1/percelen") + self.assertEqual("200 OK", res.status) def test_get_perceel_by_id(self): - res = self.testapp.get('/crab/percelen/31433D0011/00T016') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/percelen/31433D0011/00T016") + self.assertEqual("200 OK", res.status) def test_get_perceel_by_unexisting_id(self): - res = self.testapp.get('/crab/percelen/31433D0011/000000', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/percelen/31433D0011/000000", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_huisnummers_by_perceel(self): - res = self.testapp.get('/crab/percelen/31433D0011/00T016/huisnummers') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/percelen/31433D0011/00T016/huisnummers") + self.assertEqual("200 OK", res.status) def test_list_huisnummers_by_unexisting_perceel(self): res = self.testapp.get( - '/crab/percelen/31433D0011/000000/huisnummers', status=404) - self.assertEqual('404 Not Found', res.status) + "/crab/percelen/31433D0011/000000/huisnummers", status=404 + ) + self.assertEqual("404 Not Found", res.status) def test_list_gebouwen(self): - res = self.testapp.get('/crab/huisnummers/1/gebouwen') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/huisnummers/1/gebouwen") + self.assertEqual("200 OK", res.status) def test_get_gebouw_by_id(self): - res = self.testapp.get('/crab/gebouwen/1538575') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/gebouwen/1538575") + self.assertEqual("200 OK", res.status) def test_get_gebouw_by_unexisting_id(self): - res = self.testapp.get('/crab/gebouwen/99999999', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/gebouwen/99999999", status=404) + self.assertEqual("404 Not Found", res.status) def test_get_wegobject(self): - res = self.testapp.get('/crab/wegobjecten/53694755') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/wegobjecten/53694755") + self.assertEqual("200 OK", res.status) def test_get_unexisting_wegobject(self): - res = self.testapp.get('/crab/wegobjecten/00000000', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/wegobjecten/00000000", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_subadressen(self): - res = self.testapp.get('/crab/huisnummers/129462/subadressen') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/huisnummers/129462/subadressen") + self.assertEqual("200 OK", res.status) def test_get_subadressen_by_id(self): - res = self.testapp.get('/crab/subadressen/1120934') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/subadressen/1120934") + self.assertEqual("200 OK", res.status) def test_get_subadressen_by_unexisting_id(self): - res = self.testapp.get('/crab/subadressen/0000000', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/subadressen/0000000", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_postkantons_by_gemeente(self): - res = self.testapp.get('/crab/gemeenten/90/postkantons') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/gemeenten/90/postkantons") + self.assertEqual("200 OK", res.status) def test_list_adresposities_by_huisnummer(self): - res = self.testapp.get('/crab/huisnummers/145/adresposities') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/huisnummers/145/adresposities") + self.assertEqual("200 OK", res.status) def test_list_adresposities_by_subadres(self): - res = self.testapp.get('/crab/subadressen/145/adresposities') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/subadressen/145/adresposities") + self.assertEqual("200 OK", res.status) def test_get_adrespositie_by_id(self): - res = self.testapp.get('/crab/adresposities/137') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/adresposities/137") + self.assertEqual("200 OK", res.status) def test_get_adrespositie_by_unexisting_id(self): - res = self.testapp.get('/crab/adresposities/0', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/adresposities/0", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_landen(self): - res = self.testapp.get('/crab/landen') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/landen") + self.assertEqual("200 OK", res.status) def test_get_land_by_id(self): - res = self.testapp.get('/crab/landen/BE') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/landen/BE") + self.assertEqual("200 OK", res.status) def test_get_land_by_unexisting_id(self): - res = self.testapp.get('/crab/landen/MORDOR', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/landen/MORDOR", status=404) + self.assertEqual("404 Not Found", res.status) def test_get_postkanton_by_huisnummer(self): - res = self.testapp.get('/crab/huisnummers/5/postkanton') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/huisnummers/5/postkanton") + self.assertEqual("200 OK", res.status) def test_get_postkanton_by_huisnummer_unexisting(self): - res = self.testapp.get( - '/crab/huisnummers/99999999/postkanton', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/huisnummers/99999999/postkanton", status=404) + self.assertEqual("404 Not Found", res.status) @unittest.skipUnless( - run_integration_tests('crab'), - 'No CRAB Integration tests required' + run_integration_tests("crab"), "No CRAB Integration tests required" ) class HttpCachingFunctionalTests(FunctionalTests): def test_list_gewesten(self): - res = self.testapp.get('/crab/gewesten') - self.assertEqual('200 OK', res.status) - self.assertIn('ETag', res.headers) + res = self.testapp.get("/crab/gewesten") + self.assertEqual("200 OK", res.status) + self.assertIn("ETag", res.headers) def test_http_304_res(self): - res = self.testapp.get('/crab/gewesten') - self.assertEqual('200 OK', res.status) - etag = res.headers['Etag'] - res2 = self.testapp.get( - '/crab/gewesten', headers={'If-None-Match': etag}) - self.assertEqual('304 Not Modified', res2.status) + res = self.testapp.get("/crab/gewesten") + self.assertEqual("200 OK", res.status) + etag = res.headers["Etag"] + res2 = self.testapp.get("/crab/gewesten", headers={"If-None-Match": etag}) + self.assertEqual("304 Not Modified", res2.status) def test_list_gewesten_not_cached(self): - crabpy_pyramid.GENERATE_ETAG_ROUTE_NAMES.remove('list_gewesten') + crabpy_pyramid.GENERATE_ETAG_ROUTE_NAMES.remove("list_gewesten") try: - res = self.testapp.get('/crab/gewesten') - self.assertEqual('200 OK', res.status) - self.assertNotIn('ETag', res.headers) + res = self.testapp.get("/crab/gewesten") + self.assertEqual("200 OK", res.status) + self.assertNotIn("ETag", res.headers) finally: - crabpy_pyramid.GENERATE_ETAG_ROUTE_NAMES.add('list_gewesten') + crabpy_pyramid.GENERATE_ETAG_ROUTE_NAMES.add("list_gewesten") class AdressenRegisterFunctionalTests(FunctionalTests): @@ -421,14 +419,14 @@ def test_list_gewesten(self): self.assertCountEqual( res.json, [ - {"id": 1, "niscode": "4000", "naam": "Brussels Hoofdstedelijk Gewest"}, + {"id": 1, "niscode": "4000", "naam": "Brussels Hoofdstedelijk Gewest"}, {"id": 2, "niscode": "2000", "naam": "Vlaams Gewest"}, {"id": 3, "niscode": "3000", "naam": "Waals Gewest"}, ], ) - def test_get_gewest_by_id(self): - res = self.testapp.get("/adressenregister/gewesten/2") + def test_get_gewest_by_niscode(self): + res = self.testapp.get("/adressenregister/gewesten/2000") self.assertEqual("200 OK", res.status) self.assertDictEqual( res.json, @@ -437,6 +435,7 @@ def test_get_gewest_by_id(self): "centroid": [138165.09, 189297.53], "id": 2, "naam": "Vlaams Gewest", + "niscode": "2000", }, ) @@ -445,7 +444,7 @@ def test_get_gewest_by_unexisting_id(self): self.assertEqual("404 Not Found", res.status) def test_list_provincies(self): - res = self.testapp.get("/adressenregister/gewesten/2/provincies") + res = self.testapp.get("/adressenregister/gewesten/2000/provincies") self.assertEqual("200 OK", res.status) self.assertEqual(5, len(res.json)) @@ -453,7 +452,8 @@ def test_get_provincie_by_id(self): res = self.testapp.get("/adressenregister/provincies/10000") self.assertEqual("200 OK", res.status) self.assertDictEqual( - {"gewest": {"id": 2}, "naam": "Antwerpen", "niscode": "10000"}, res.json + {"gewest": {'niscode': '2000'}, "naam": "Antwerpen", "niscode": "10000"}, + res.json ) def test_get_provincie_by_unexisting_id(self): @@ -461,7 +461,7 @@ def test_get_provincie_by_unexisting_id(self): self.assertEqual("404 Not Found", res.status) def test_list_deelgemeenten(self): - res = self.testapp.get("/adressenregister/gewesten/2/deelgemeenten") + res = self.testapp.get("/adressenregister/gewesten/2000/deelgemeenten") self.assertEqual("200 OK", res.status) def test_list_deelgemeenten_wrong_gewest(self): @@ -483,96 +483,47 @@ def test_list_deelgemeenten_by_unexisting_gemeente(self): self.assertEqual("404 Not Found", res.status) def test_list_gemeenten_by_provincie(self): - with responses.RequestsMock() as rsps: - rsps.add( - method=rsps.GET, - json=gemeenten, - url="https://api.basisregisters.vlaanderen.be/v2/gemeenten?limit=500", - ) - res = self.testapp.get("/adressenregister/provincies/10000/gemeenten") + res = self.testapp.get("/adressenregister/provincies/10000/gemeenten") self.assertEqual("200 OK", res.status) - self.assertCountEqual( - res.json, - [ - { - "niscode": "11001", - "naam": "Aartselaar", - "uri": "https://data.vlaanderen.be/id/gemeente/11001", - "provincie": {"niscode": "10000"}, - } - ], + self.assertEqual(len(res.json), 69) + self.assertDictEqual( + {'naam': 'Aartselaar', 'niscode': '11001', 'provincie': {'niscode': '10000'}}, + res.json[0], ) def test_list_gemeenten_by_provincie_404(self): - with responses.RequestsMock() as rsps: - rsps.add( - method=rsps.GET, - status=404, - url="https://api.basisregisters.vlaanderen.be/v2/gemeenten?limit=500", - ) - res = self.testapp.get( - "/adressenregister/provincies/10000/gemeenten", status=404 - ) + res = self.testapp.get( + "/adressenregister/provincies/100000/gemeenten", status=404 + ) self.assertEqual("404 Not Found", res.status) def test_list_gemeenten_adressenregister(self): - with responses.RequestsMock() as rsps: - rsps.add( - method=rsps.GET, - json=gemeenten, - url="https://api.basisregisters.vlaanderen.be/v2/gemeenten?limit=500", - ) - res = self.testapp.get("/adressenregister/gewesten/2/gemeenten") + res = self.testapp.get("/adressenregister/gewesten/2000/gemeenten") self.assertEqual("200 OK", res.status) def test_list_gemeenten_adressenregister_404(self): - with responses.RequestsMock() as rsps: - rsps.add( - method=rsps.GET, - status=404, - url="https://api.basisregisters.vlaanderen.be/v2/gemeenten?limit=500", - ) - res = self.testapp.get("/adressenregister/gewesten/2/gemeenten", status=404) + res = self.testapp.get("/adressenregister/gewesten/20000/gemeenten", status=404) self.assertEqual("404 Not Found", res.status) def test_get_gemeente_adresregister_niscode(self): - with responses.RequestsMock() as rsps: - rsps.add( - method=rsps.GET, - json=gemeente, - url="https://api.basisregisters.vlaanderen.be/v2/gemeenten/11001", - ) - res = self.testapp.get("/adressenregister/gemeenten/11001") + res = self.testapp.get("/adressenregister/gemeenten/11001") self.assertEqual("200 OK", res.status) self.assertDictEqual( { + "gewest": {"niscode": "2000"}, "naam": "Aartselaar", "niscode": "11001", - "status": "inGebruik", - "taal": "nl", - "uri": "https://data.vlaanderen.be/id/gemeente/11001", + "provincie": {"niscode": "10000"}, }, res.json, ) def test_get_gemeente_crab_unexisting_niscode(self): - with responses.RequestsMock() as rsps: - rsps.add( - method=rsps.GET, - url="https://api.basisregisters.vlaanderen.be/v2/gemeenten/00000", - status=404, - ) - res = self.testapp.get("/adressenregister/gemeenten/00000", status=404) + res = self.testapp.get("/adressenregister/gemeenten/00000", status=404, ) self.assertEqual("404 Not Found", res.status) def test_list_straten(self): with responses.RequestsMock() as rsps: - rsps.add( - method=rsps.GET, - url="https://api.basisregisters.vlaanderen.be/v2/gemeenten/11001", - json=gemeente, - status=200, - ) rsps.add( method=rsps.GET, url="https://api.basisregisters.vlaanderen.be/v2/straatnamen?nisCode=11001&limit=500", @@ -600,15 +551,7 @@ def test_list_straten(self): self.assertEqual("200 OK", res.status) def test_list_straten_404(self): - with responses.RequestsMock() as rsps: - rsps.add( - method=rsps.GET, - url="https://api.basisregisters.vlaanderen.be/v2/gemeenten/11001", - status=404, - ) - res = self.testapp.get( - "/adressenregister/gemeenten/11001/straten", status=404 - ) + res = self.testapp.get("/adressenregister/gemeenten/110001/straten", status=404) self.assertEqual("404 Not Found", res.status) def test_get_straat_by_id(self): @@ -921,6 +864,7 @@ def test_adresregister_get_postinfo_by_postcode_404(self): rsps.add( method=rsps.GET, url="https://api.basisregisters.vlaanderen.be/v2/postinfo/1000", + headers={'accept': 'application/json'}, status=404, ) res = self.testapp.get("/adressenregister/postinfo/1000", status=404) diff --git a/crabpy_pyramid/views/adressenregister.py b/crabpy_pyramid/views/adressenregister.py index f39776d..2213683 100644 --- a/crabpy_pyramid/views/adressenregister.py +++ b/crabpy_pyramid/views/adressenregister.py @@ -2,7 +2,7 @@ import pycountry from crabpy.client import AdressenRegisterClientException -from crabpy.gateway.exception import GatewayResourceNotFoundException +from pyramid.httpexceptions import HTTPBadRequest from pyramid.httpexceptions import HTTPNotFound from pyramid.view import view_config @@ -12,6 +12,23 @@ log = logging.getLogger(__name__) +def handle_gateway_response(gateway_method, *args, **kwargs): + try: + result = gateway_method(*args, **kwargs) + if not result: + raise HTTPNotFound() + return result + except AdressenRegisterClientException as ae: + cause = ae.__cause__ + if hasattr(cause, "response"): + status_code = cause.response.status_code + if status_code == 404: + raise HTTPNotFound() + if status_code == 400: + detail = getattr(cause.response, "text", "") + raise HTTPBadRequest(detail=detail) + + @view_config( route_name="adressenregister_list_gewesten", renderer="adresreg_listjson", @@ -25,18 +42,15 @@ def list_gewesten(request): @view_config( - route_name="adressenregister_get_gewest_by_id", + route_name="adressenregister_get_gewest_by_niscode", renderer="adresreg_itemjson", accept="application/json", ) -def get_gewest_by_id(request): +def get_gewest_by_niscode(request): request = set_http_caching(request, "adressenregister", "long") Gateway = request.adressenregister_gateway() - gewest_id = int(request.matchdict.get("gewest_id")) - try: - return Gateway.get_gewest_by_id(gewest_id) - except GatewayResourceNotFoundException: - return HTTPNotFound() + gewest_niscode = request.matchdict.get("gewest_niscode") + return handle_gateway_response(Gateway.get_gewest_by_niscode, gewest_niscode) @view_config( @@ -47,8 +61,8 @@ def get_gewest_by_id(request): def list_provincies(request): request = set_http_caching(request, "adressenregister", "permanent") Gateway = request.adressenregister_gateway() - gewest_id = int(request.matchdict.get("gewest_id")) - provincies = Gateway.list_provincies(gewest_id) + gewest_niscode = request.matchdict.get("gewest_niscode") + provincies = handle_gateway_response(Gateway.list_provincies, gewest_niscode) return range_return(request, provincies) @@ -60,12 +74,9 @@ def list_provincies(request): def get_provincie(request): request = set_http_caching(request, "adressenregister", "permanent") Gateway = request.adressenregister_gateway() - provincie_id = int(request.matchdict.get("provincie_id")) - provincie = Gateway.get_provincie_by_id(provincie_id) - if provincie: - return provincie - else: - return HTTPNotFound() + provincie_niscode = request.matchdict.get("provincie_niscode") + + return handle_gateway_response(Gateway.get_provincie_by_niscode, provincie_niscode) @view_config( @@ -76,10 +87,11 @@ def get_provincie(request): def list_deelgemeenten(request): request = set_http_caching(request, "adressenregister", "permanent") Gateway = request.adressenregister_gateway() - gewest_id = int(request.matchdict.get("gewest_id")) - if gewest_id != 2: + gewest_niscode = request.matchdict.get("gewest_niscode") + if gewest_niscode != "2000": return HTTPNotFound() - deelgemeenten = Gateway.list_deelgemeenten(gewest_id) + deelgemeenten = handle_gateway_response(Gateway.list_deelgemeenten, gewest_niscode) + return range_return(request, deelgemeenten) @@ -92,11 +104,9 @@ def list_deelgemeenten_by_gemeente(request): request = set_http_caching(request, "adressenregister", "permanent") Gateway = request.adressenregister_gateway() gemeente_id = request.matchdict.get("niscode") - try: - gemeente = Gateway.get_gemeente_by_niscode(gemeente_id) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + gemeente = handle_gateway_response(Gateway.get_gemeente_by_niscode, gemeente_id) deelgemeenten = Gateway.list_deelgemeenten_by_gemeente(gemeente) + return range_return(request, deelgemeenten) @@ -108,11 +118,9 @@ def list_deelgemeenten_by_gemeente(request): def get_deelgemeente_by_id(request): request = set_http_caching(request, "adressenregister", "permanent") Gateway = request.adressenregister_gateway() - deelgemeente_id = request.matchdict.get("deelgemeente_id") - try: - return Gateway.get_deelgemeente_by_id(deelgemeente_id) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + deelgemeente_niscode = request.matchdict.get("deelgemeente_niscode") + + return handle_gateway_response(Gateway.get_deelgemeente_by_id, deelgemeente_niscode) @view_config( @@ -123,11 +131,11 @@ def get_deelgemeente_by_id(request): def list_gemeenten_by_provincie(request): request = set_http_caching(request, "adressenregister", "long") Gateway = request.adressenregister_gateway() - provincie_id = int(request.matchdict.get("provincie_id")) - try: - gemeenten = Gateway.list_gemeenten_by_provincie(provincie_id) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + provincie_id = request.matchdict.get("provincie_niscode") + gemeenten = handle_gateway_response( + Gateway.list_gemeenten_by_provincie, provincie_id + ) + return range_return(request, gemeenten) @@ -139,11 +147,9 @@ def list_gemeenten_by_provincie(request): def list_gemeenten_adressenregister(request): request = set_http_caching(request, "adressenregister", "long") Gateway = request.adressenregister_gateway() - gewest_id = request.matchdict.get("gewest_id") - try: - gemeenten = Gateway.list_gemeenten(gewest_id) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + gewest_niscode = request.matchdict.get("gewest_niscode") + gemeenten = handle_gateway_response(Gateway.list_gemeenten, gewest_niscode) + return range_return(request, gemeenten) @@ -155,11 +161,9 @@ def list_gemeenten_adressenregister(request): def get_gemeente_adressenregister(request): request = set_http_caching(request, "adressenregister", "long") Gateway = request.adressenregister_gateway() - gemeente_id = request.matchdict.get("niscode") - try: - return Gateway.get_gemeente_by_niscode(gemeente_id) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + gemeente_niscode = request.matchdict.get("niscode") + + return handle_gateway_response(Gateway.get_gemeente_by_niscode, gemeente_niscode) @view_config( @@ -170,11 +174,9 @@ def get_gemeente_adressenregister(request): def list_straten(request): request = set_http_caching(request, "adressenregister", "short") Gateway = request.adressenregister_gateway() - gemeente_id = request.matchdict.get("niscode") - try: - straten = Gateway.list_straten(gemeente_id) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + gemeente_niscode = request.matchdict.get("niscode") + straten = handle_gateway_response(Gateway.list_straten, gemeente_niscode) + return range_return(request, straten) @@ -187,10 +189,8 @@ def get_straat_by_id(request): request = set_http_caching(request, "adressenregister", "short") Gateway = request.adressenregister_gateway() straat_id = request.matchdict.get("straat_id") - try: - return Gateway.get_straat_by_id(straat_id) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + + return handle_gateway_response(Gateway.get_straat_by_id, straat_id) @view_config( @@ -202,10 +202,10 @@ def list_adressen_by_straat(request): request = set_http_caching(request, "adressenregister", "short") Gateway = request.adressenregister_gateway() straat_id = request.matchdict.get("straat_id") - try: - straten = Gateway.list_adressen_with_params(straatnaamObjectId=straat_id) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + straten = handle_gateway_response( + Gateway.list_adressen_with_params, straatnaamObjectId=straat_id + ) + return range_return(request, straten) @@ -219,12 +219,12 @@ def adressenregister_get_adres_by_straat_huisnummer(request): Gateway = request.adressenregister_gateway() straat_id = request.matchdict.get("straat_id") huisnummer = request.matchdict.get("huisnummer") - try: - adressen = Gateway.list_adressen_with_params( - straatnaamObjectId=straat_id, huisnummer=huisnummer - ) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + adressen = handle_gateway_response( + Gateway.list_adressen_with_params, + straatnaamObjectId=straat_id, + huisnummer=huisnummer, + ) + return range_return(request, adressen) @@ -239,12 +239,13 @@ def adressenregister_get_adres_by_straat_huisnummer_busnummer(request): straat_id = request.matchdict.get("straat_id") huisnummer = request.matchdict.get("huisnummer") busnummer = request.matchdict.get("busnummer") - try: - adressen = Gateway.list_adressen_with_params( - straatnaamObjectId=straat_id, huisnummer=huisnummer, busnummer=busnummer - ) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + adressen = handle_gateway_response( + Gateway.list_adressen_with_params, + straatnaamObjectId=straat_id, + huisnummer=huisnummer, + busnummer=busnummer, + ) + return range_return(request, adressen) @@ -257,10 +258,8 @@ def adressenregister_get_adres_by_id(request): request = set_http_caching(request, "adressenregister", "long") Gateway = request.adressenregister_gateway() adres_id = request.matchdict.get("adres_id") - try: - return Gateway.get_adres_by_id(adres_id) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + + return handle_gateway_response(Gateway.get_adres_by_id, adres_id) @view_config( @@ -272,10 +271,10 @@ def adressenregister_list_percelen_by_adres(request): request = set_http_caching(request, "adressenregister", "short") Gateway = request.adressenregister_gateway() adres_id = request.matchdict.get("adres_id") - try: - adressen = Gateway.list_percelen_with_params(adresObjectId=adres_id) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + adressen = handle_gateway_response( + Gateway.list_percelen_with_params, adresObjectId=adres_id + ) + return range_return(request, adressen) @@ -288,10 +287,7 @@ def adressenregister_get_perceel_by_id(request): request = set_http_caching(request, "adressenregister", "short") Gateway = request.adressenregister_gateway() perceel_id = request.matchdict.get("perceel_id") - try: - return Gateway.get_perceel_by_id(perceel_id=perceel_id) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + return handle_gateway_response(Gateway.get_perceel_by_id, perceel_id=perceel_id) @view_config( @@ -303,10 +299,10 @@ def adressenregister_list_postinfo_by_gemeente(request): request = set_http_caching(request, "adressenregister", "long") Gateway = request.adressenregister_gateway() gemeente_naam = request.matchdict.get("gemeente_naam") - try: - adressen = Gateway.get_postinfo_by_gemeentenaam(gemeente_naam) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + adressen = handle_gateway_response( + Gateway.get_postinfo_by_gemeentenaam, gemeente_naam + ) + return range_return(request, adressen) @@ -319,10 +315,8 @@ def adressenregister_get_postinfo_by_postcode(request): request = set_http_caching(request, "adressenregister", "long") Gateway = request.adressenregister_gateway() postcode = request.matchdict.get("postcode") - try: - return Gateway.get_postinfo_by_id(postcode) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + + return handle_gateway_response(Gateway.get_postinfo_by_id, postcode) @view_config( diff --git a/crabpy_pyramid/views/exceptions.py b/crabpy_pyramid/views/exceptions.py new file mode 100644 index 0000000..d222922 --- /dev/null +++ b/crabpy_pyramid/views/exceptions.py @@ -0,0 +1,27 @@ +import logging +import sys + +from crabpy.client import AdressenRegisterClientException +from pyramid.view import view_config + +LOGGER = logging.getLogger(__name__) + +@view_config( + context=AdressenRegisterClientException, + renderer="json", + accept="application/json" +) +def internal_server_error(exception, request): + LOGGER.exception(exception) + original_exception = exception.__cause__ + request.response.status_int = 500 + errors = [str(original_exception)] + if hasattr(original_exception, "response"): + if hasattr(original_exception.response, "text"): + errors.append(original_exception.response.text) + + return { + "message": "Er ging iets fout in de vraag naar adressenregister API.", + "Errors": errors + + } diff --git a/requirements.txt b/requirements.txt index 49ba1bd..b458566 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ # Tested and approved with these versions pyramid==2.0.0 -crabpy==1.1.0 +crabpy==1.2.1 pycountry==18.12.8 ; python_version < '3.0' pycountry==22.3.5 ; python_version >= '3.4' From 2fe87a2e332fbbb55f65ac0241f3fba1ee9922ce Mon Sep 17 00:00:00 2001 From: Tim Van Campenhout Date: Thu, 4 May 2023 17:17:50 +0200 Subject: [PATCH 5/7] #175 reraise AdressenRegisterClientException + test exception view --- crabpy_pyramid/tests/test_functional.py | 19 +++++++++++++++++++ crabpy_pyramid/views/adressenregister.py | 1 + crabpy_pyramid/views/exceptions.py | 3 --- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/crabpy_pyramid/tests/test_functional.py b/crabpy_pyramid/tests/test_functional.py index 8eeff8c..40861a8 100644 --- a/crabpy_pyramid/tests/test_functional.py +++ b/crabpy_pyramid/tests/test_functional.py @@ -674,6 +674,25 @@ def test_get_adres_by_straat_and_huisnummer_and_busnummer(self): res.json, ) + def test_error_other_then_404_400(self): + with responses.RequestsMock() as rsps: + rsps.add( + method=rsps.GET, + url="https://api.basisregisters.vlaanderen.be/v2/adressen/900746", + json=adres, + status=413, + ) + res = self.testapp.get("/adressenregister/adressen/900746", expect_errors=True) + self.assertEqual(500, res.status_code) + self.assertEqual(500, res.status_code) + self.assertEqual( + '{"message": "Er ging iets fout in de vraag naar adressenregister API.", ' + '"Errors": ["413 Client Error: Request Entity Too Large for url: ' + 'https://api.basisregisters.vlaanderen.be/v2/adressen/900746"]}', + res.text + ) + + def test_get_adres_by_straat_and_huisnummer_and_busnummer_404(self): with responses.RequestsMock() as rsps: adressen_response = deepcopy(adressen) diff --git a/crabpy_pyramid/views/adressenregister.py b/crabpy_pyramid/views/adressenregister.py index 2213683..7ce79d7 100644 --- a/crabpy_pyramid/views/adressenregister.py +++ b/crabpy_pyramid/views/adressenregister.py @@ -27,6 +27,7 @@ def handle_gateway_response(gateway_method, *args, **kwargs): if status_code == 400: detail = getattr(cause.response, "text", "") raise HTTPBadRequest(detail=detail) + raise ae @view_config( diff --git a/crabpy_pyramid/views/exceptions.py b/crabpy_pyramid/views/exceptions.py index d222922..f275850 100644 --- a/crabpy_pyramid/views/exceptions.py +++ b/crabpy_pyramid/views/exceptions.py @@ -16,9 +16,6 @@ def internal_server_error(exception, request): original_exception = exception.__cause__ request.response.status_int = 500 errors = [str(original_exception)] - if hasattr(original_exception, "response"): - if hasattr(original_exception.response, "text"): - errors.append(original_exception.response.text) return { "message": "Er ging iets fout in de vraag naar adressenregister API.", From 70a64d164241eeb3df24dc13b178013454d31ddb Mon Sep 17 00:00:00 2001 From: Tim Van Campenhout Date: Thu, 4 May 2023 17:27:08 +0200 Subject: [PATCH 6/7] #175 fix test maybe --- crabpy_pyramid/tests/test_functional.py | 7 ++----- requirements-dev.txt | 1 + 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/crabpy_pyramid/tests/test_functional.py b/crabpy_pyramid/tests/test_functional.py index 40861a8..c03a0e7 100644 --- a/crabpy_pyramid/tests/test_functional.py +++ b/crabpy_pyramid/tests/test_functional.py @@ -684,11 +684,8 @@ def test_error_other_then_404_400(self): ) res = self.testapp.get("/adressenregister/adressen/900746", expect_errors=True) self.assertEqual(500, res.status_code) - self.assertEqual(500, res.status_code) - self.assertEqual( - '{"message": "Er ging iets fout in de vraag naar adressenregister API.", ' - '"Errors": ["413 Client Error: Request Entity Too Large for url: ' - 'https://api.basisregisters.vlaanderen.be/v2/adressen/900746"]}', + self.assertIn( + "Er ging iets fout in de vraag naar adressenregister API.", res.text ) diff --git a/requirements-dev.txt b/requirements-dev.txt index b43ef59..2d63d8d 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -10,6 +10,7 @@ nose-testconfig==0.10 coverage==5.3 WebTest==2.0.35 responses==0.23.1 +requests==2.29.0 # Linting flake8==3.8.3 From ffb23f2a46396c383545b175729285eb59237ff4 Mon Sep 17 00:00:00 2001 From: Tim Van Campenhout Date: Thu, 4 May 2023 17:28:55 +0200 Subject: [PATCH 7/7] #175 fix test maybe --- requirements-dev.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements-dev.txt b/requirements-dev.txt index 2d63d8d..16a5684 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -11,6 +11,7 @@ coverage==5.3 WebTest==2.0.35 responses==0.23.1 requests==2.29.0 +urllib3==1.26.15 # Linting flake8==3.8.3