Source code for crabpy.gateway.crab

# -*- 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 math

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 = {} provincies = [ (10000, 'Antwerpen', 2), (20001, 'Vlaams-Brabant', 2), (30000, 'West-Vlaanderen', 2), (40000, 'Oost-Vlaanderen', 2), (70000, 'Limburg', 2), (20002, 'Waals-Brabant', 3), (50000, 'Henegouwen', 3), (60000, 'Luik', 3), (80000, 'Luxemburg', 3), (90000, 'Namen', 3) ] 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_provincies(self, gewest=2): ''' List all `provincies` in a `gewest`. :param gewest: The :class:`Gewest` for which the \ `provincies` are wanted. :param integer sort: What field to sort on. :rtype: A :class:`list` of :class:`Provincie`. ''' try: gewest_id = gewest.id except AttributeError: gewest_id = gewest def creator(): return [Provincie(p[0], p[1], Gewest(p[2])) for p in self.provincies if p[2] == gewest_id] if self.caches['permanent'].is_configured: key = 'ListProvinciesByGewestId#%s' % gewest_id provincies = self.caches['permanent'].get_or_create(key, creator) else: provincies = creator() for p in provincies: p.set_gateway(self) return provincies
[docs] def get_provincie_by_id(self, niscode): ''' Retrieve a `provincie` by the niscode. :param integer niscode: The niscode of the provincie. :rtype: :class:`Provincie` ''' def creator(): for p in self.provincies: if p[0] == niscode: return Provincie(p[0], p[1], Gewest(p[2])) if self.caches['permanent'].is_configured: key = 'GetProvincieByProvincieNiscode#%s' % niscode provincie = self.caches['permanent'].get_or_create(key, creator) else: provincie = creator() provincie.set_gateway(self) return provincie
[docs] def list_gemeenten_by_provincie(self, provincie, sort=2): ''' List all `gemeenten` in a `provincie`. :param provincie: The :class:`Provincie` for which the \ `gemeenten` are wanted. :param integer sort: What field to sort on. :rtype: A :class:`list` of :class:`Gemeente`. ''' try: provincie = self.get_provincie_by_id(provincie) except AttributeError: pass provincie.set_gateway(self) gewest = provincie.gewest def creator(): gewest_gemeenten = self.list_gemeenten(gewest.id) return[ Gemeente( r.id, r.naam, r.niscode, gewest )for r in gewest_gemeenten if str(r.niscode)[0] == str(provincie.niscode)[0] ] if self.caches['permanent'].is_configured: key = 'GetGemeenteByProvincieId#%s' % provincie.id gemeente = self.caches['long'].get_or_create(key, creator) else: gemeente = creator() for g in gemeente: g.set_gateway(self) return gemeente
[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 provincies(self): return self.gateway.list_provincies(self.id) @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]class Provincie(GatewayObject): ''' The largest administrative unit within a :class:`Gewest`. .. versionadded:: 0.4.0 ''' def __init__( self, niscode, naam, gewest, **kwargs ): self.id = self.niscode = int(niscode) self.naam = naam self.gewest = gewest
[docs] def set_gateway(self, gateway): ''' :param crabpy.gateway.crab.CrabGateway gateway: Gateway to use. ''' self.gateway = gateway self.gewest.gateway = gateway
[docs] def clear_gateway(self): ''' Clear the currently set CrabGateway. ''' self.gateway = None self.gewest.clear_gateway()
@property def gemeenten(self): self.check_gateway() return self.gateway.list_gemeenten_by_provincie(self.niscode) def __unicode__(self): return "%s (%s)" % (self.naam, self.niscode) def __repr__(self): return "Provincie(%s, '%s', Gewest(%s))" % (self.niscode, self.naam, self.gewest.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) @property def provincie(self): self.check_gateway() provincies = self.gateway.list_provincies(self.gewest) for p in provincies: if math.floor(self.niscode / 10000) == math.floor(p.niscode / 10000): return p 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) @property def bounding_box(self): weg = [x.geometrie for x in self.wegsegmenten] x = [] y = [] for a in weg: a = a.replace("LINESTRING (", "").replace(")", "") list = a.split(',') for z in list: temp = z.split() x.append(temp[0]) y.append(temp[1]) return [min(x), min(y), max(x), max(y)] 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 bounding_box(self): per = [x.bounding_box for x in self.terreinobjecten] mini = min(per) maxi = max(per) return [mini[0], mini[1], maxi[0], maxi[1]] @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)
[docs]class Metadata(GatewayObject): ''' Metadata about a `straat`, `huisnummer`, ... Some of the metadata available is the datum the object was created, the organisation that created it and the type of creation. ''' def __init__( self, begin_datum, begin_tijd, begin_bewerking, begin_organisatie, **kwargs ): self.begin_datum = str(begin_datum) self.begin_tijd = str(begin_tijd) try: self._begin_bewerking_id = begin_bewerking.id self._begin_bewerking = begin_bewerking except AttributeError: self._begin_bewerking_id = begin_bewerking self._begin_bewerking = None try: self._begin_organisatie_id = begin_organisatie.id self._begin_organisatie = begin_organisatie except AttributeError: self._begin_organisatie_id = begin_organisatie self._begin_organisatie = None super(Metadata, self).__init__(**kwargs) @property def begin_bewerking(self): if self._begin_bewerking is None: self.check_gateway() bewerkingen = self.gateway.list_bewerkingen() for bewerking in bewerkingen: if int(bewerking.id) == int(self._begin_bewerking_id): self._begin_bewerking = bewerking return self._begin_bewerking @property def begin_organisatie(self): if self._begin_organisatie is None: self.check_gateway() organisaties = self.gateway.list_organisaties() for organisatie in organisaties: if int(organisatie.id) == int(self._begin_organisatie_id): self._begin_organisatie = organisatie return self._begin_organisatie def __unicode__(self): return "Begin datum: %s" % (self.begin_datum)