# -*- coding: utf-8 -*-
'''
This module contains an opionated gateway for the crab webservice.
.. versionadded:: 0.3.0
'''
from __future__ import unicode_literals
import six
import logging
log = logging.getLogger(__name__)
from crabpy.client import crab_request
from suds import WebFault
from crabpy.gateway.exception import (
GatewayRuntimeException
)
from dogpile.cache import make_region
[docs]def crab_gateway_request(client, method, *args):
'''
Utility function that helps making requests to the CRAB service.
This is a specialised version of :func:`crabpy.client.crab_request` that
allows adding extra functionality for the calls made by the gateway.
:param client: A :class:`suds.client.Client` for the CRAB service.
:param string action: Which method to call, eg. `ListGewesten`
:returns: Result of the SOAP call.
'''
try:
return crab_request(client, method, *args)
except WebFault as wf:
err = GatewayRuntimeException(
'Could not execute request. Message from server:\n%s' % wf.fault['faultstring'],
wf
)
raise err
[docs]class CrabGateway(object):
'''
A gateway to the CRAB webservice.
'''
caches = {}
def __init__(self, client, **kwargs):
self.client = client
cache_regions = ['permanent', 'long', 'short']
for cr in cache_regions:
self.caches[cr] = make_region(key_mangler=str)
if 'cache_config' in kwargs:
for cr in cache_regions:
if ('%s.backend' % cr) in kwargs['cache_config']:
log.debug('Configuring %s region on CrabGateway', cr)
self.caches[cr].configure_from_config(
kwargs['cache_config'],
'%s.' % cr
)
[docs] def list_gewesten(self, sort=1):
'''
List all `gewesten` in Belgium.
:param integer sort: What field to sort on.
:rtype: A :class`list` of class: `Gewest`.
'''
def creator():
res = crab_gateway_request(self.client, 'ListGewesten', sort)
tmp = {}
for r in res.GewestItem:
if r.GewestId not in tmp:
tmp[r.GewestId] = {}
tmp[r.GewestId][r.TaalCodeGewestNaam] = r.GewestNaam
return[
Gewest(
k,
v
)for k, v in tmp.items()
]
if self.caches['permanent'].is_configured:
key = 'ListGewesten#%s' % sort
gewesten = self.caches['permanent'].get_or_create(key, creator)
else:
gewesten = creator()
for g in gewesten:
g.set_gateway(self)
return gewesten
[docs] def get_gewest_by_id(self, id):
'''
Get a `gewest` by id.
:param integer id: The id of a `gewest`.
:rtype: A :class:`Gewest`.
'''
def creator():
nl = crab_gateway_request(
self.client, 'GetGewestByGewestIdAndTaalCode', id, 'nl'
)
fr = crab_gateway_request(
self.client, 'GetGewestByGewestIdAndTaalCode', id, 'fr'
)
de = crab_gateway_request(
self.client, 'GetGewestByGewestIdAndTaalCode', id, 'de'
)
return Gewest(
nl.GewestId,
{
'nl': nl.GewestNaam,
'fr': fr.GewestNaam,
'de': de.GewestNaam
},
(nl.CenterX, nl.CenterY),
(nl.MinimumX, nl.MinimumY, nl.MaximumX, nl.MaximumY),
)
if self.caches['permanent'].is_configured:
key = 'GetGewestByGewestId#%s' % id
gewest = self.caches['long'].get_or_create(key, creator)
else:
gewest = creator()
gewest.set_gateway(self)
return gewest
[docs] def list_gemeenten(self, gewest=2, sort=1):
'''
List all `gemeenten` in a `gewest`.
:param gewest: The :class:`Gewest` for which the \
`gemeenten` are wanted.
:param integer sort: What field to sort on.
:rtype: A :class:`list` of :class:`Gemeente`.
'''
try:
gewest_id = gewest.id
except AttributeError:
gewest_id = gewest
gewest = self.get_gewest_by_id(gewest_id)
gewest.clear_gateway()
def creator():
res = crab_gateway_request(
self.client, 'ListGemeentenByGewestId', gewest_id, sort
)
return[
Gemeente(
r.GemeenteId,
r.GemeenteNaam,
r.NISGemeenteCode,
gewest
)for r in res.GemeenteItem if r.TaalCode == r.TaalCodeGemeenteNaam
]
if self.caches['permanent'].is_configured:
key = 'ListGemeentenByGewestId#%s#%s' % (gewest_id, sort)
gemeenten = self.caches['permanent'].get_or_create(key, creator)
else:
gemeenten = creator()
for g in gemeenten:
g.set_gateway(self)
return gemeenten
[docs] def get_gemeente_by_id(self, id):
'''
Retrieve a `gemeente` by the crab id.
:param integer id: The CRAB id of the gemeente.
:rtype: :class:`Gemeente`
'''
def creator():
res = crab_gateway_request(
self.client, 'GetGemeenteByGemeenteId', id
)
return Gemeente(
res.GemeenteId,
res.GemeenteNaam,
res.NisGemeenteCode,
Gewest(res.GewestId),
res.TaalCode,
(res.CenterX, res.CenterY),
(res.MinimumX, res.MinimumY, res.MaximumX, res.MaximumY),
Metadata(
res.BeginDatum,
res.BeginTijd,
self.get_bewerking(res.BeginBewerking),
self.get_organisatie(res.BeginOrganisatie)
)
)
if self.caches['long'].is_configured:
key = 'GetGemeenteByGemeenteId#%s' % id
gemeente = self.caches['long'].get_or_create(key, creator)
else:
gemeente = creator()
gemeente.set_gateway(self)
return gemeente
[docs] def get_gemeente_by_niscode(self, niscode):
'''
Retrieve a `gemeente` by the NIScode.
:param integer niscode: The NIScode of the gemeente.
:rtype: :class:`Gemeente`
'''
def creator():
res = crab_gateway_request(
self.client, 'GetGemeenteByNISGemeenteCode', niscode
)
return Gemeente(
res.GemeenteId,
res.GemeenteNaam,
res.NisGemeenteCode,
Gewest(res.GewestId),
res.TaalCode,
(res.CenterX, res.CenterY),
(res.MinimumX, res.MinimumY, res.MaximumX, res.MaximumY),
Metadata(
res.BeginDatum,
res.BeginTijd,
self.get_bewerking(res.BeginBewerking),
self.get_organisatie(res.BeginOrganisatie)
)
)
if self.caches['long'].is_configured:
key = 'GetGemeenteByNISGemeenteCode#%s' % niscode
gemeente = self.caches['long'].get_or_create(key, creator)
else:
gemeente = creator()
gemeente.set_gateway(self)
return gemeente
def _list_codeobject(self, function, sort, returnclass):
def creator():
res = crab_gateway_request(self.client, function, sort)
return[
globals()[returnclass](
r.Code,
r.Naam,
r.Definitie
)for r in res.CodeItem
]
if self.caches['permanent'].is_configured:
key = function+'#%s' % (sort)
return self.caches['permanent'].get_or_create(key, creator)
else:
return creator()
[docs] def list_talen(self, sort=1):
'''
List all `talen`.
:rtype: A :class:`list` of :class:`Taal`
'''
return self._list_codeobject('ListTalen', sort, 'Taal')
[docs] def list_bewerkingen(self, sort=1):
'''
List all `bewerkingen`.
:rtype: A :class:`list` of :class:`Bewerking`
'''
return self._list_codeobject(
'ListBewerkingen', sort, 'Bewerking'
)
[docs] def list_organisaties(self, sort=1):
'''
List all `organisaties`.
:rtype: A :class:`list` of :class:`Organisatie`
'''
return self._list_codeobject(
'ListOrganisaties', sort, 'Organisatie'
)
[docs] def list_aardsubadressen(self, sort=1):
'''
List all `aardsubadressen`.
:rtype: A :class:`list` of :class:`Aardsubadres`
'''
return self._list_codeobject(
'ListOrganisaties', sort, 'Aardsubadres'
)
[docs] def list_aardadressen(self, sort=1):
'''
List all `aardadressen`.
:rtype: A :class:`list` of :class:`Aardadres`
'''
return self._list_codeobject(
'ListAardAdressen', sort, 'Aardadres'
)
[docs] def list_aardgebouwen(self, sort=1):
'''
List all `aardgebouwen`.
:rtype: A :class:`list` of :class:`Aardgebouw`
'''
return self._list_codeobject(
'ListAardGebouwen', sort, 'Aardgebouw'
)
[docs] def list_aardwegobjecten(self, sort=1):
'''
List all `aardwegobjecten`.
:rtype: A :class:`list` of :class:`Aardwegobject`
'''
return self._list_codeobject(
'ListAardWegobjecten', sort, 'Aardwegobject'
)
[docs] def list_aardterreinobjecten(self, sort=1):
'''
List all `aardterreinobjecten`.
:rtype: A :class:`list` of :class:`Aardterreinobject`
'''
return self._list_codeobject(
'ListAardTerreinobjecten', sort, 'Aardterreinobject'
)
[docs] def list_statushuisnummers(self, sort=1):
'''
List all `statushuisnummers`.
:rtype: A :class:`list` of :class:`Statushuisnummer`
'''
return self._list_codeobject(
'ListStatusHuisnummers', sort, 'Statushuisnummer'
)
[docs] def list_statussubadressen(self, sort=1):
'''
List all `statussubadressen`.
:rtype: A :class:`list` of :class:`Statussubadres`
'''
return self._list_codeobject(
'ListStatusSubadressen', sort, 'Statussubadres'
)
[docs] def list_statusstraatnamen(self, sort=1):
'''
List all `statusstraatnamen`.
:rtype: A :class:`list` of :class:`Statusstraatnaam`
'''
return self._list_codeobject(
'ListStatusStraatnamen', sort, 'Statusstraatnaam'
)
[docs] def list_statuswegsegmenten(self, sort=1):
'''
List all `statuswegsegmenten`.
:rtype: A :class:`list` of :class:`Statuswegsegment`
'''
return self._list_codeobject(
'ListStatusWegsegmenten', sort, 'Statuswegsegment'
)
[docs] def list_geometriemethodewegsegmenten(self, sort=1):
'''
List all `geometriemethodewegsegmenten`.
:rtype: A :class:`list` of :class:`Geometriemethodewegsegment`
'''
return self._list_codeobject(
'ListGeometriemethodeWegsegmenten', sort,
'Geometriemethodewegsegment'
)
[docs] def list_statusgebouwen(self, sort=1):
'''
List all `statusgebouwen`.
:rtype: A :class:`list` of :class:`Statusgebouwen`
'''
return self._list_codeobject(
'ListStatusGebouwen', sort, 'Statusgebouw'
)
[docs] def list_geometriemethodegebouwen(self, sort=1):
'''
List all `geometriegebouwen`.
:rtype: A :class:`list` of :class:`Geometriegebouw`
'''
return self._list_codeobject(
'ListGeometriemethodeGebouwen', sort, 'Geometriemethodegebouw'
)
[docs] def list_herkomstadresposities(self, sort=1):
'''
List all `herkomstadresposities`.
:rtype: A :class:`list` of :class:`Herkomstadrespositie`
'''
return self._list_codeobject(
'ListHerkomstAdresposities', sort, 'Herkomstadrespositie'
)
[docs] def list_straten(self, gemeente, sort=1):
'''
List all `straten` in a `Gemeente`.
:param gemeente: The :class:`Gemeente` for which the \
`straten` are wanted.
:rtype: A :class:`list` of :class:`Straat`
'''
try:
id = gemeente.id
except AttributeError:
id = gemeente
def creator():
res = crab_gateway_request(
self.client, 'ListStraatnamenWithStatusByGemeenteId',
id, sort
)
return[
Straat(
r.StraatnaamId,
r.StraatnaamLabel,
id,
r.StatusStraatnaam
)for r in res.StraatnaamWithStatusItem
]
if self.caches['long'].is_configured:
key = 'ListStraatnamenWithStatusByGemeenteId#%s%s' % (id, sort)
straten = self.caches['long'].get_or_create(key, creator)
else:
straten = creator()
for s in straten:
s.set_gateway(self)
return straten
[docs] def get_straat_by_id(self, id):
'''
Retrieve a `straat` by the Id.
:param integer id: The id of the `straat`.
:rtype: :class:`Straat`
'''
def creator():
res = crab_gateway_request(
self.client, 'GetStraatnaamWithStatusByStraatnaamId', id
)
return Straat(
res.StraatnaamId,
res.StraatnaamLabel,
res.GemeenteId,
res.StatusStraatnaam,
res.Straatnaam,
res.TaalCode,
res.StraatnaamTweedeTaal,
res.TaalCodeTweedeTaal,
Metadata(
res.BeginDatum,
res.BeginTijd,
self.get_bewerking(res.BeginBewerking),
self.get_organisatie(res.BeginOrganisatie)
)
)
if self.caches['long'].is_configured:
key = 'GetStraatnaamWithStatusByStraatnaamId#%s' % (id)
straat = self.caches['long'].get_or_create(key, creator)
else:
straat = creator()
straat.set_gateway(self)
return straat
[docs] def list_huisnummers_by_straat(self, straat, sort=1):
'''
List all `huisnummers` in a `Straat`.
:param straat: The :class:`Straat` for which the \
`huisnummers` are wanted.
:rtype: A :class: `list` of :class:`Huisnummer`
'''
try:
id = straat.id
except AttributeError:
id = straat
def creator():
res = crab_gateway_request(
self.client, 'ListHuisnummersWithStatusByStraatnaamId',
id, sort
)
return[
Huisnummer(
r.HuisnummerId,
r.StatusHuisnummer,
r.Huisnummer,
id
) for r in res.HuisnummerWithStatusItem
]
if self.caches['short'].is_configured:
key = 'ListHuisnummersWithStatusByStraatnaamId#%s%s' % (id, sort)
huisnummers = self.caches['short'].get_or_create(key, creator)
else:
huisnummers = creator()
for h in huisnummers:
h.set_gateway(self)
return huisnummers
[docs] def get_huisnummer_by_id(self, id):
'''
Retrieve a `huisnummer` by the Id.
:param integer id: the Id of the `huisnummer`
:rtype: :class:`Huisnummer`
'''
def creator():
res = crab_gateway_request(
self.client, 'GetHuisnummerWithStatusByHuisnummerId', id
)
return Huisnummer(
res.HuisnummerId,
res.StatusHuisnummer,
res.Huisnummer,
res.StraatnaamId,
Metadata(
res.BeginDatum,
res.BeginTijd,
self.get_bewerking(res.BeginBewerking),
self.get_organisatie(res.BeginOrganisatie)
)
)
if self.caches['short'].is_configured:
key = 'GetHuisnummerWithStatusByHuisnummerId#%s' % (id)
huisnummer = self.caches['short'].get_or_create(key, creator)
else:
huisnummer = creator()
huisnummer.set_gateway(self)
return huisnummer
[docs] def get_huisnummer_by_nummer_and_straat(self, nummer, straat):
'''
Retrieve a `huisnummer` by the `nummer` and `straat`
:param integer nummer: The huisnummer of the 'huisnummer`
:param straat: The :class:`Straat` in which the `huisnummer` \
is situated.
:rtype: A :class:`Huisnummer`
'''
try:
straat_id = straat.id
except AttributeError:
straat_id = straat
def creator():
res = crab_gateway_request(
self.client, 'GetHuisnummerWithStatusByHuisnummer',
nummer, straat_id
)
return Huisnummer(
res.HuisnummerId,
res.StatusHuisnummer,
res.Huisnummer,
res.StraatnaamId,
Metadata(
res.BeginDatum,
res.BeginTijd,
self.get_bewerking(res.BeginBewerking),
self.get_organisatie(res.BeginOrganisatie)
)
)
if self.caches['short'].is_configured:
key = 'GetHuisnummerWithStatusByHuisnummer#%s%s' % (nummer, straat_id)
huisnummer = self.caches['short'].get_or_create(key, creator)
else:
huisnummer = creator()
huisnummer.set_gateway(self)
return huisnummer
[docs] def list_postkantons_by_gemeente(self, gemeente):
'''
List all `postkantons` in a :class:`Gemeente`
:param gemeente: The :class:`Gemeente` for which the \
`potkantons` are wanted.
:rtype: A :class:`list` of :class:`Postkanton`
'''
try:
id = gemeente.id
except AttributeError:
id = gemeente
def creator():
res = crab_gateway_request(
self.client, 'ListPostkantonsByGemeenteId', id
)
return[
Postkanton(
r.PostkantonCode
)for r in res.PostkantonItem
]
if self.caches['long'].is_configured:
key = 'ListPostkantonsByGemeenteId#%s' % (id)
postkantons = self.caches['long'].get_or_create(key, creator)
else:
postkantons = creator()
for r in postkantons:
r.set_gateway(self)
return postkantons
[docs] def get_postkanton_by_huisnummer(self, huisnummer):
'''
Retrieve a `postkanton` by the Huisnummer.
:param huisnummer: The :class:`Huisnummer` for which the `postkanton` \
is wanted.
:rtype: :class:`Postkanton`
'''
try:
id = huisnummer.id
except AttributeError:
id = huisnummer
def creator():
res = crab_gateway_request(
self.client, 'GetPostkantonByHuisnummerId', id
)
return Postkanton(
res.PostkantonCode
)
if self.caches['short'].is_configured:
key = 'GetPostkantonByHuisnummerId#%s' % (id)
postkanton = self.caches['short'].get_or_create(key, creator)
else:
postkanton = creator()
postkanton.set_gateway(self)
return postkanton
[docs] def get_wegobject_by_id(self, id):
'''
Retrieve a `Wegobject` by the Id.
:param integer id: the Id of the `Wegobject`
:rtype: :class:`Wegobject`
'''
def creator():
res = crab_gateway_request(
self.client, 'GetWegobjectByIdentificatorWegobject', id
)
return Wegobject(
res.IdentificatorWegobject,
res.AardWegobject,
(res.CenterX, res.CenterY),
(res.MinimumX, res.MinimumY, res.MaximumX, res.MaximumY),
Metadata(
res.BeginDatum,
res.BeginTijd,
self.get_bewerking(res.BeginBewerking),
self.get_organisatie(res.BeginOrganisatie)
)
)
if self.caches['short'].is_configured:
key = 'GetWegobjectByIdentificatorWegobject#%s' % (id)
wegobject = self.caches['short'].get_or_create(key, creator)
else:
wegobject = creator()
wegobject.set_gateway(self)
return wegobject
[docs] def list_wegobjecten_by_straat(self, straat):
'''
List all `wegobjecten` in a :class:`Straat`
:param straat: The :class:`Straat` for which the `wegobjecten` \
are wanted.
:rtype: A :class:`list` of :class:`Wegobject`
'''
try:
id = straat.id
except AttributeError:
id = straat
def creator():
res = crab_gateway_request(
self.client, 'ListWegobjectenByStraatnaamId', id
)
return [
Wegobject(
r.IdentificatorWegobject,
r.AardWegobject
)for r in res.WegobjectItem
]
if self.caches['short'].is_configured:
key = 'ListWegobjectenByStraatnaamId#%s' % (id)
wegobjecten = self.caches['short'].get_or_create(key, creator)
else:
wegobjecten = creator()
for r in wegobjecten:
r.set_gateway(self)
return wegobjecten
[docs] def get_wegsegment_by_id(self, id):
'''
Retrieve a `wegsegment` by the Id.
:param integer id: the Id of the `wegsegment`
:rtype: :class:`Wegsegment`
'''
def creator():
res = crab_gateway_request(
self.client,
'GetWegsegmentByIdentificatorWegsegment', id
)
return Wegsegment(
res.IdentificatorWegsegment,
res.StatusWegsegment,
res.GeometriemethodeWegsegment,
res.Geometrie,
Metadata(
res.BeginDatum,
res.BeginTijd,
self.get_bewerking(res.BeginBewerking),
self.get_organisatie(res.BeginOrganisatie)
)
)
if self.caches['short'].is_configured:
key = 'GetWegsegmentByIdentificatorWegsegment#%s' % (id)
wegsegment = self.caches['short'].get_or_create(key, creator)
else:
wegsegment = creator()
wegsegment.set_gateway(self)
return wegsegment
[docs] def list_wegsegmenten_by_straat(self, straat):
'''
List all `wegsegmenten` in a :class:`Straat`
:param straat: The :class:`Straat` for which the `wegsegmenten` \
are wanted.
:rtype: A :class:`list` of :class:`Wegsegment`
'''
try:
id = straat.id
except AttributeError:
id = straat
def creator():
res = crab_gateway_request(
self.client, 'ListWegsegmentenByStraatnaamId', id
)
return[
Wegsegment(
r.IdentificatorWegsegment,
r.StatusWegsegment
)for r in res.WegsegmentItem
]
if self.caches['short'].is_configured:
key = 'ListWegsegmentenByStraatnaamId#%s' % (id)
wegsegmenten = self.caches['short'].get_or_create(key, creator)
else:
wegsegmenten = creator()
for r in wegsegmenten:
r.set_gateway(self)
return wegsegmenten
[docs] def list_terreinobjecten_by_huisnummer(self, huisnummer):
'''
List all `terreinobjecten` for a :class:`Huisnummer`
:param huisnummer: The :class:`Huisnummer` for which the \
`terreinobjecten` are wanted.
:rtype: A :class:`list` of :class:`Terreinobject`
'''
try:
id = huisnummer.id
except AttributeError:
id = huisnummer
def creator():
res = crab_gateway_request(
self.client, 'ListTerreinobjectenByHuisnummerId', id
)
return[
Terreinobject(
r.IdentificatorTerreinobject,
r.AardTerreinobject
)for r in res.TerreinobjectItem
]
if self.caches['short'].is_configured:
key = 'ListTerreinobjectenByHuisnummerId#%s' % (id)
terreinobjecten = self.caches['short'].get_or_create(key, creator)
else:
terreinobjecten = creator()
for r in terreinobjecten:
r.set_gateway(self)
return terreinobjecten
[docs] def get_terreinobject_by_id(self, id):
'''
Retrieve a `Terreinobject` by the Id.
:param integer id: the Id of the `Terreinobject`
:rtype: :class:`Terreinobject`
'''
def creator():
res = crab_gateway_request(
self.client,
'GetTerreinobjectByIdentificatorTerreinobject', id
)
return Terreinobject(
res.IdentificatorTerreinobject,
res.AardTerreinobject,
(res.CenterX, res.CenterY),
(res.MinimumX, res.MinimumY, res.MaximumX, res.MaximumY),
Metadata(
res.BeginDatum,
res.BeginTijd,
self.get_bewerking(res.BeginBewerking),
self.get_organisatie(res.BeginOrganisatie)
)
)
if self.caches['short'].is_configured:
key = 'GetTerreinobjectByIdentificatorTerreinobject#%s' % (id)
terreinobject = self.caches['short'].get_or_create(key, creator)
else:
terreinobject = creator()
terreinobject.set_gateway(self)
return terreinobject
[docs] def list_percelen_by_huisnummer(self, huisnummer):
'''
List all `percelen` for a :class:`Huisnummer`
:param huisnummer: The :class:`Huisnummer` for which the \
`percelen` are wanted.
:rtype: A :class:`list` of :class:`Perceel`
'''
try:
id = huisnummer.id
except AttributeError:
id = huisnummer
def creator():
res = crab_gateway_request(
self.client, 'ListPercelenByHuisnummerId', id
)
return [
Perceel(
r.IdentificatorPerceel
)for r in res.PerceelItem
]
if self.caches['short'].is_configured:
key = 'ListPercelenByHuisnummerId#%s' % (id)
percelen = self.caches['short'].get_or_create(key, creator)
else:
percelen = creator()
for r in percelen:
r.set_gateway(self)
return percelen
[docs] def get_perceel_by_id(self, id):
'''
Retrieve a `Perceel` by the Id.
:param string id: the Id of the `Perceel`
:rtype: :class:`Perceel`
'''
def creator():
res = crab_gateway_request(
self.client, 'GetPerceelByIdentificatorPerceel', id
)
return Perceel(
res.IdentificatorPerceel,
(res.CenterX, res.CenterY),
Metadata(
res.BeginDatum,
res.BeginTijd,
self.get_bewerking(res.BeginBewerking),
self.get_organisatie(res.BeginOrganisatie)
)
)
if self.caches['short'].is_configured:
key = 'GetPerceelByIdentificatorPerceel#%s' % (id)
perceel = self.caches['short'].get_or_create(key, creator)
else:
perceel = creator()
perceel.set_gateway(self)
return perceel
[docs] def list_gebouwen_by_huisnummer(self, huisnummer):
'''
List all `gebouwen` for a :class:`Huisnummer`.
:param huisnummer: The :class:`Huisnummer` for which the \
`gebouwen` are wanted.
:rtype: A :class:`list` of :class:`Gebouw`
'''
try:
id = huisnummer.id
except AttributeError:
id = huisnummer
def creator():
res = crab_gateway_request(
self.client, 'ListGebouwenByHuisnummerId', id
)
return [
Gebouw(
r.IdentificatorGebouw,
r.AardGebouw,
r.StatusGebouw
)for r in res.GebouwItem
]
if self.caches['short'].is_configured:
key = 'ListGebouwenByHuisnummerId#%s' % (id)
gebouwen = self.caches['short'].get_or_create(key, creator)
else:
gebouwen = creator()
for r in gebouwen:
r.set_gateway(self)
return gebouwen
[docs] def get_gebouw_by_id(self, id):
'''
Retrieve a `Gebouw` by the Id.
:param integer id: the Id of the `Gebouw`
:rtype: :class:`Gebouw`
'''
def creator():
res = crab_gateway_request(
self.client, 'GetGebouwByIdentificatorGebouw', id
)
return Gebouw(
res.IdentificatorGebouw,
res.AardGebouw,
res.StatusGebouw,
res.GeometriemethodeGebouw,
res.Geometrie,
Metadata(
res.BeginDatum,
res.BeginTijd,
self.get_bewerking(res.BeginBewerking),
self.get_organisatie(res.BeginOrganisatie)
)
)
if self.caches['short'].is_configured:
key = 'GetGebouwByIdentificatorGebouw#%s' % (id)
gebouw = self.caches['short'].get_or_create(key, creator)
else:
gebouw = creator()
gebouw.set_gateway(self)
return gebouw
def get_bewerking(self, res):
r = self.list_bewerkingen()
for item in r:
if int(item.id) == int(res):
return item
def get_organisatie(self, res):
r = self.list_organisaties()
for item in r:
if int(item.id) == int(res):
return item
[docs]class GatewayObject(object):
'''
Abstract class for objects that are able to use a
:class:`crabpy.Gateway.CrabGateway` to find further information.
'''
gateway = None
'''
The :class:`crabpy.gateway.crab.CrabGateway` to use when making
further calls to the CRAB service.
'''
def __init__(self, **kwargs):
if 'gateway' in kwargs:
self.set_gateway(kwargs['gateway'])
[docs] def set_gateway(self, gateway):
'''
:param crabpy.gateway.crab.CrabGateway gateway: Gateway to use.
'''
self.gateway = gateway
[docs] def clear_gateway(self):
'''
Clear the currently set CrabGateway.
'''
self.gateway = None
[docs] def check_gateway(self):
'''
Check to see if a gateway was set on this object.
'''
if not self.gateway:
raise RuntimeError("There's no Gateway I can use")
if six.PY2:
def __str__(self):
return self.__unicode__().encode('utf-8')
else:
def __str__(self):
return self.__unicode__()
[docs]def check_lazy_load_gewest(f):
'''
Decorator function to lazy load a :class:`Gewest`.
'''
def wrapper(self):
gewest = self
attribute = 'namen' if f.__name__ == 'naam' else f.__name__
if (getattr(gewest, '_%s' % attribute, None) is None):
log.debug('Lazy loading Gewest %d', gewest.id)
gewest.check_gateway()
g = gewest.gateway.get_gewest_by_id(gewest.id)
gewest._namen = g._namen
gewest._centroid = g._centroid
gewest._bounding_box = g._bounding_box
return f(self)
return wrapper
[docs]class Gewest(GatewayObject):
'''
A large administrative unit in Belgium.
Belgium consists of 3 `gewesten`. Together they form the entire territory
of the country.
'''
def __init__(
self,
id,
namen=None,
centroid=None,
bounding_box=None,
**kwargs
):
self.id = int(id)
self._namen = namen
self._centroid = centroid
self._bounding_box = bounding_box
super(Gewest, self).__init__(**kwargs)
@property
@check_lazy_load_gewest
def naam(self):
return self._namen['nl']
@property
@check_lazy_load_gewest
def centroid(self):
return self._centroid
@property
@check_lazy_load_gewest
def bounding_box(self):
return self._bounding_box
@property
def gemeenten(self):
return self.gateway.list_gemeenten(self.id)
def __unicode__(self):
if self._namen is not None:
return "%s (%s)" % (self.naam, self.id)
else:
return "Gewest %s" % (self.id)
def __repr__(self):
return "Gewest(%s)" % (self.id)
[docs]def check_lazy_load_gemeente(f):
'''
Decorator function to lazy load a :class:`Gemeente`.
'''
def wrapper(*args):
gemeente = args[0]
if (
gemeente._centroid is None or gemeente._bounding_box is None
or gemeente._taal_id is None or gemeente._metadata is None
):
log.debug('Lazy loading Gemeente %d', gemeente.id)
gemeente.check_gateway()
g = gemeente.gateway.get_gemeente_by_id(gemeente.id)
gemeente._taal_id = g._taal_id
gemeente._centroid = g._centroid
gemeente._bounding_box = g._bounding_box
gemeente._metadata = g._metadata
return f(*args)
return wrapper
[docs]class Gemeente(GatewayObject):
'''
The smallest administrative unit in Belgium.
'''
def __init__(
self, id, naam, niscode, gewest,
taal=None, centroid=None,
bounding_box=None, metadata=None, **kwargs
):
self.id = int(id)
self.naam = naam
self.niscode = niscode
self.gewest = gewest
try:
self._taal_id = taal.id
self._taal = taal
except AttributeError:
self._taal_id = taal
self._taal = None
self._centroid = centroid
self._bounding_box = bounding_box
self._metadata = metadata
super(Gemeente, self).__init__(**kwargs)
[docs] def set_gateway(self, gateway):
'''
:param crabpy.gateway.crab.CrabGateway gateway: Gateway to use.
'''
self.gateway = gateway
self.gewest.set_gateway(gateway)
[docs] def clear_gateway(self):
'''
Clear the currently set CrabGateway.
'''
self.gateway = None
self.gewest.clear_gateway()
@property
@check_lazy_load_gemeente
def taal(self):
if self._taal is None:
talen = self.gateway.list_talen()
for taal in talen:
if taal.id == self._taal_id:
self._taal = taal
return self._taal
@property
@check_lazy_load_gemeente
def centroid(self):
return self._centroid
@property
@check_lazy_load_gemeente
def bounding_box(self):
return self._bounding_box
@property
@check_lazy_load_gemeente
def metadata(self):
return self._metadata
@property
def straten(self):
self.check_gateway()
return self.gateway.list_straten(self)
@property
def postkantons(self):
self.check_gateway()
return self.gateway.list_postkantons_by_gemeente(self.id)
def __unicode__(self):
return "%s (%s)" % (self.naam, self.id)
def __repr__(self):
return "Gemeente(%s, '%s', %s)" % (self.id, self.naam, self.niscode)
class Codelijst(GatewayObject):
def __init__(
self, id, naam, definitie, **kwargs
):
self.id = id
self.naam = naam
self.definitie = definitie
super(Codelijst, self).__init__(**kwargs)
def __unicode__(self):
return self.naam
[docs]class Taal(Codelijst):
'''
A language.
'''
def __repr__(self):
return "Taal('%s', '%s', '%s')" % (self.id, self.naam, self.definitie)
[docs]class Bewerking(Codelijst):
'''
An edit.
'''
def __repr__(self):
return "Bewerking(%s, '%s', '%s')" % (self.id, self.naam, self.definitie)
[docs]class Organisatie(Codelijst):
'''
An organisation that played a role in the genessis of an object.
'''
def __repr__(self):
return "Organisatie(%s, '%s', '%s')" % (self.id, self.naam, self.definitie)
[docs]class Aardsubadres(Codelijst):
'''
The nature of a subaddress.
'''
def __repr__(self):
return "Aardsubadres(%s, '%s', '%s')" % (self.id, self.naam, self.definitie)
[docs]class Aardadres(Codelijst):
'''
The nature of an address.
'''
def __repr__(self):
return "Aardadres(%s, '%s', '%s')" % (self.id, self.naam, self.definitie)
[docs]class Aardgebouw(Codelijst):
'''
The nature of a building.
'''
def __repr__(self):
return "Aardgebouw(%s, '%s', '%s')" % (self.id, self.naam, self.definitie)
[docs]class Aardwegobject(Codelijst):
'''
The nature of a `wegobject`.
'''
def __repr__(self):
return "Aardwegobject(%s, '%s', '%s')" % (self.id, self.naam, self.definitie)
[docs]class Aardterreinobject(Codelijst):
'''
The nature of a `terreinobject`.
'''
def __repr__(self):
return "Aardterreinobject(%s, '%s', '%s')" % (self.id, self.naam, self.definitie)
[docs]class Statushuisnummer(Codelijst):
'''
The current state of a `huisnummer`.
'''
def __repr__(self):
return "Statushuisnummer(%s, '%s', '%s')" % (self.id, self.naam, self.definitie)
[docs]class Statussubadres(Codelijst):
'''
The current state of a `subadres`.
'''
def __repr__(self):
return "Statussubadres(%s, '%s', '%s')" % (self.id, self.naam, self.definitie)
[docs]class Statusstraatnaam(Codelijst):
'''
The current state of a `straatnaam`.
'''
def __repr__(self):
return "Statusstraatnaam(%s, '%s', '%s')" % (self.id, self.naam, self.definitie)
[docs]class Statuswegsegment(Codelijst):
'''
The current state of a `wegsegment`.
'''
def __repr__(self):
return "Statuswegsegment(%s, '%s', '%s')" % (self.id, self.naam, self.definitie)
[docs]class Geometriemethodewegsegment(Codelijst):
'''
The geometry method of a :class:`Wegsegment`.
'''
def __repr__(self):
return "Geometriemethodewegsegment(%s, '%s', '%s')" % (self.id, self.naam, self.definitie)
[docs]class Statusgebouw(Codelijst):
'''
The current state of a :class:`Gebouw`.
'''
def __repr__(self):
return "Statusgebouw(%s, '%s', '%s')" % (self.id, self.naam, self.definitie)
[docs]class Geometriemethodegebouw(Codelijst):
'''
The geometry method of a :class:`Gebouw`.
'''
def __repr__(self):
return "Geometriemethodegebouw(%s, '%s', '%s')" % (self.id, self.naam, self.definitie)
[docs]class Herkomstadrespositie(Codelijst):
'''
The origin of an Adressposition.
'''
def __repr__(self):
return "Herkomstadrespositie(%s, '%s', '%s')" % (self.id, self.naam, self.definitie)
[docs]def check_lazy_load_straat(f):
'''
Decorator function to lazy load a :class:`Straat`.
'''
def wrapper(*args):
straat = args[0]
if (
straat._namen is None or straat._metadata is None
):
log.debug('Lazy loading Straat %d', straat.id)
straat.check_gateway()
s = straat.gateway.get_straat_by_id(straat.id)
straat._namen = s._namen
straat._metadata = s._metadata
return f(*args)
return wrapper
[docs]class Straat(GatewayObject):
'''
A street.
A street object is always located in one and exactly one :class:`Gemeente`.
'''
def __init__(
self, id, label, gemeente_id, status,
straatnaam=None, taalcode=None,
straatnaam2=None, taalcode2=None,
metadata=None, **kwargs
):
self.id = id
self.label = label
try:
self.status_id = status.id
self._status = status
except:
self.status_id = status
self._status = None
self._namen = ((straatnaam, taalcode), (straatnaam2, taalcode2))
self.gemeente_id = gemeente_id
self._metadata = metadata
super(Straat, self).__init__(**kwargs)
@property
@check_lazy_load_straat
def namen(self):
return self._namen
@property
def gemeente(self):
return self.gateway.get_gemeente_by_id(self.gemeente_id)
@property
def status(self):
if self._status is None:
res = self.gateway.list_statusstraatnamen()
for status in res:
if int(status.id) == int(self.status_id):
self._status = status
return self._status
@property
@check_lazy_load_straat
def metadata(self):
return self._metadata
@property
def huisnummers(self):
self.check_gateway()
return self.gateway.list_huisnummers_by_straat(self)
@property
@check_lazy_load_straat
def taal(self):
return self.gemeente.taal
@property
def wegobjecten(self):
self.check_gateway()
return self.gateway.list_wegobjecten_by_straat(self)
@property
def wegsegmenten(self):
self.check_gateway()
return self.gateway.list_wegsegmenten_by_straat(self)
def __unicode__(self):
return "%s (%s)" % (self.label, self.id)
def __repr__(self):
return "Straat(%s, '%s', %s, %s)" % (self.id, self.label, self.gemeente_id, self.status_id)
[docs]def check_lazy_load_huisnummer(f):
'''
Decorator function to lazy load a :class:`Huisnummer`.
'''
def wrapper(*args):
huisnummer = args[0]
if (
huisnummer._metadata is None
):
log.debug('Lazy loading Huisnummer %d', huisnummer.id)
huisnummer.check_gateway()
h = huisnummer.gateway.get_huisnummer_by_id(huisnummer.id)
huisnummer._metadata = h._metadata
return f(*args)
return wrapper
[docs]class Huisnummer(GatewayObject):
'''
A house number.
This is mainly a combination of a street and a house number.
'''
def __init__(
self, id, status, huisnummer, straat_id,
metadata=None, **kwargs
):
self.id = int(id)
try:
self.status_id = status.id
self._status = status
except AttributeError:
self.status_id = status
self._status = None
self.huisnummer = huisnummer
self.straat_id = straat_id
self._metadata = metadata
super(Huisnummer, self).__init__(**kwargs)
@property
def straat(self):
self.check_gateway()
return self.gateway.get_straat_by_id(self.straat_id)
@property
@check_lazy_load_huisnummer
def metadata(self):
return self._metadata
@property
def status(self):
if self._status is None:
res = self.gateway.list_statushuisnummers()
for status in res:
if int(status.id) == int(self.status_id):
self._status = status
return self._status
@property
def postkanton(self):
self.check_gateway()
return self.gateway.get_postkanton_by_huisnummer(self.id)
@property
def terreinobjecten(self):
return self.gateway.list_terreinobjecten_by_huisnummer(self.id)
@property
def percelen(self):
return self.gateway.list_percelen_by_huisnummer(self.id)
@property
def gebouwen(self):
return self.gateway.list_gebouwen_by_huisnummer(self.id)
def __unicode__(self):
return "%s (%s)" % (self.huisnummer, self.id)
def __repr__(self):
return "Huisnummer(%s, %s, '%s', %s)" % (self.id, self.status_id, self.huisnummer, self.straat_id)
[docs]class Postkanton(GatewayObject):
'''
A postal code.
Eg. postal code `9000` for the city of Ghent.
'''
def __init__(self, id, **kwargs):
self.id = int(id)
super(Postkanton, self).__init__(**kwargs)
def __unicode__(self):
return "Postkanton %s" % (self.id)
def __repr__(self):
return "Postkanton(%s)" % (self.id)
[docs]def check_lazy_load_wegobject(f):
'''
Decorator function to lazy load a :class:`Wegobject`.
'''
def wrapper(*args):
wegobject = args[0]
if (
wegobject._centroid is None or
wegobject._bounding_box is None or
wegobject._metadata is None
):
log.debug('Lazy loading Wegobject %d', wegobject.id)
wegobject.check_gateway()
w = wegobject.gateway.get_wegobject_by_id(wegobject.id)
wegobject._centroid = w._centroid
wegobject._bounding_box = w._bounding_box
wegobject._metadata = w._metadata
return f(*args)
return wrapper
class Wegobject(GatewayObject):
def __init__(
self, id, aard, centroid=None,
bounding_box=None, metadata=None, **kwargs
):
self.id = id
try:
self.aard_id = aard.id
self._aard = aard
except AttributeError:
self.aard_id = aard
self._aard = None
self._centroid = centroid
self._bounding_box = bounding_box
self._metadata = metadata
super(Wegobject, self).__init__(**kwargs)
@property
def aard(self):
if self._aard is None:
res = self.gateway.list_aardwegobjecten()
for aard in res:
if int(aard.id) == int(self.aard_id):
self._aard = aard
return self._aard
@property
@check_lazy_load_wegobject
def centroid(self):
return self._centroid
@property
@check_lazy_load_wegobject
def bounding_box(self):
return self._bounding_box
@property
@check_lazy_load_wegobject
def metadata(self):
return self._metadata
def __unicode__(self):
return "Wegobject %s" % (self.id)
def __repr__(self):
return "Wegobject(%s)" % (self.id)
[docs]def check_lazy_load_wegsegment(f):
'''
Decorator function to lazy load a :class:`Wegsegment`.
'''
def wrapper(*args):
wegsegment = args[0]
if (
wegsegment._methode_id is None or
wegsegment._geometrie is None or
wegsegment._metadata is None
):
log.debug('Lazy loading Wegsegment %d', wegsegment.id)
wegsegment.check_gateway()
w = wegsegment.gateway.get_wegsegment_by_id(wegsegment.id)
wegsegment._methode_id = w._methode_id
wegsegment._geometrie = w._geometrie
wegsegment._metadata = w._metadata
return f(*args)
return wrapper
class Wegsegment(GatewayObject):
def __init__(
self, id, status, methode=None,
geometrie=None, metadata=None, **kwargs
):
self.id = id
try:
self.status_id = status.id
self._status = status
except:
self.status_id = status
self._status = None
try:
self._methode_id = methode.id
self._methode = methode
except:
self._methode_id = methode
self._methode = None
self._geometrie = geometrie
self._metadata = metadata
super(Wegsegment, self).__init__(**kwargs)
@property
def status(self):
if self._status is None:
res = self.gateway.list_statuswegsegmenten()
for status in res:
if int(status.id) == int(self.status_id):
self._status = status
return self._status
@property
@check_lazy_load_wegsegment
def methode(self):
if self._methode is None:
res = self.gateway.list_geometriemethodewegsegmenten()
for methode in res:
if int(methode.id) == int(self._methode_id):
self._methode = methode
return self._methode
@property
@check_lazy_load_wegsegment
def geometrie(self):
return self._geometrie
@property
@check_lazy_load_wegsegment
def metadata(self):
return self._metadata
def __unicode__(self):
return "Wegsegment %s" % (self.id)
def __repr__(self):
return "Wegsegment(%s)" % (self.id)
[docs]def check_lazy_load_terreinobject(f):
'''
Decorator function to lazy load a :class:`Terreinobject`.
'''
def wrapper(*args):
terreinobject = args[0]
if (
terreinobject._centroid is None or
terreinobject._bounding_box is None or
terreinobject._metadata is None
):
log.debug('Lazy loading Terreinobject %s', terreinobject.id)
terreinobject.check_gateway()
t = terreinobject.gateway.get_terreinobject_by_id(terreinobject.id)
terreinobject._centroid = t._centroid
terreinobject._bounding_box = t._bounding_box
terreinobject._metadata = t._metadata
return f(*args)
return wrapper
[docs]class Terreinobject(GatewayObject):
'''
A cadastral parcel.
A :class:`Terreinobject` is somewhat different from a :class:`Perceel`
in the source of the data and the information provided. eg. A
`terreinobject` has a `centroid` and a `bounding box`, while a `perceel`
also has the centroid, but not the `bounding box`.
'''
def __init__(
self, id, aard, centroid=None,
bounding_box=None, metadata=None, **kwargs
):
self.id = id
try:
self.aard_id = aard.id
self._aard = aard
except AttributeError:
self.aard_id = aard
self._aard = None
self._centroid = centroid
self._metadata = metadata
self._bounding_box = bounding_box
super(Terreinobject, self).__init__(**kwargs)
@property
def aard(self):
if self._aard is None:
res = self.gateway.list_aardterreinobjecten()
for aard in res:
if int(aard.id) == int(self.aard_id):
self._aard = aard
return self._aard
@property
@check_lazy_load_terreinobject
def centroid(self):
return self._centroid
@property
@check_lazy_load_terreinobject
def bounding_box(self):
return self._bounding_box
@property
@check_lazy_load_terreinobject
def metadata(self):
return self._metadata
def __unicode__(self):
return "Terreinobject %s" % (self.id)
def __repr__(self):
return "Terreinobject(%s)" % (self.id)
[docs]def check_lazy_load_perceel(f):
'''
Decorator function to lazy load a :class:`Perceel`.
'''
def wrapper(*args):
perceel = args[0]
if perceel._centroid is None or perceel._metadata is None:
log.debug('Lazy loading Perceel %s', perceel.id)
perceel.check_gateway()
p = perceel.gateway.get_perceel_by_id(perceel.id)
perceel._centroid = p._centroid
perceel._metadata = p._metadata
return f(*args)
return wrapper
[docs]class Perceel(GatewayObject):
'''
A cadastral Parcel.
A :class:`Terreinobject` is somewhat different from a :class:`Perceel`
in the source of the data and the information provided. eg. A
`terreinobject` has a `centroid` and a `bounding box`, while a `perceel`
also has the centroid, but not the `bounding box`.
'''
def __init__(
self, id, centroid=None, metadata=None, **kwargs
):
self.id = id
self._centroid = centroid
self._metadata = metadata
super(Perceel, self).__init__(**kwargs)
@property
@check_lazy_load_perceel
def centroid(self):
return self._centroid
@property
@check_lazy_load_perceel
def metadata(self):
return self._metadata
def __unicode__(self):
return "Perceel %s" % (self.id)
def __repr__(self):
return "Perceel(%s)" % (self.id)
[docs]def check_lazy_load_gebouw(f):
'''
Decorator function to lazy load a :class:`Gebouw`.
'''
def wrapper(*args):
gebouw = args[0]
if (
gebouw._methode_id is None or gebouw._geometrie is None or
gebouw._metadata is None
):
log.debug('Lazy loading Gebouw %d', gebouw.id)
gebouw.check_gateway()
g = gebouw.gateway.get_gebouw_by_id(gebouw.id)
gebouw._methode_id = g._methode_id
gebouw._geometrie = g._geometrie
gebouw._metadata = g._metadata
return f(*args)
return wrapper
[docs]class Gebouw(GatewayObject):
'''
A building.
'''
def __init__(
self, id, aard, status,
methode=None, geometrie=None, metadata=None, **kwargs
):
self.id = int(id)
try:
self.aard_id = aard.id
self._aard = aard
except:
self.aard_id = aard
self._aard = None
try:
self.status_id = status.id
self._status = status
except:
self.status_id = status
self._status = None
try:
self._methode_id = methode.id
self._methode = methode
except:
self._methode_id = methode
self._methode = None
self._geometrie = geometrie
self._metadata = metadata
super(Gebouw, self).__init__(**kwargs)
@property
def aard(self):
if self._aard is None:
self.check_gateway()
res = self.gateway.list_aardgebouwen()
for aard in res:
if int(aard.id) == int(self.aard_id):
self._aard = aard
return self._aard
@property
def status(self):
if self._status is None:
self.check_gateway()
res = self.gateway.list_statusgebouwen()
for status in res:
if int(status.id) == int(self.status_id):
self._status = status
return self._status
@property
@check_lazy_load_gebouw
def methode(self):
if self._methode is None:
res = self.gateway.list_geometriemethodegebouwen()
for methode in res:
if int(methode.id) == int(self._methode_id):
self._methode = methode
return self._methode
@property
@check_lazy_load_gebouw
def geometrie(self):
return self._geometrie
@property
@check_lazy_load_gebouw
def metadata(self):
return self._metadata
def __unicode__(self):
return "Gebouw %s" % (self.id)
def __repr__(self):
return "Gebouw(%s)" % (self.id)