Completed
Push — master ( b7e6d1...4d8241 )
by
unknown
01:17
created

View.check_erfgoedgemeente()   A

Complexity

Conditions 1

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
c 1
b 0
f 0
dl 0
loc 8
rs 9.4285
1
# -*- coding: utf-8 -*-
2
from pyramid.view import view_defaults, view_config
3
from oe_geoutils.utils import check_in_flanders, check_within_flanders, nearest_location
4
from pyramid.httpexceptions import HTTPBadRequest
5
import colander
6
import json
7
from pyramid.response import Response
8
9
10
class ValidationFailure(Exception):
11
    '''
12
    Custom Exception for data validation errors.
13
    '''
14
15
    def __init__(self, msg, errors):
16
        self.msg = msg
17
        self.errors = errors
18
19
20
@view_defaults(renderer='json', accept='application/json')
21
class View(object):
22
    def __init__(self, request):
23
        self.request = request
24
        self.request_LOCALE_ = 'nl'
25
26
    def _retrieve_json(self):
27
        if self.request.body and not self.request.body == '':
28
            return self.request.json_body
29
        else:
30
            raise HTTPBadRequest("request has no body")
31
32
    def validate_geojson(self, params):
33
        max_area = int(self.request.registry.settings.get('oe_geoutils.max_area', 8000))
34
        from oe_geoutils.validation.validators_contour import (
35
            GeometrieSchemaNode as geometrie_schema
36
        )
37
        try:
38
            return geometrie_schema(max_area).deserialize(params)
39
        except colander.Invalid as e:
40
            raise ValidationFailure(
41
                    'De geojson geometrie is niet geldig.',
42
                    e.asdict(translate=self.request.localizer.translate)
43
            )
44
45
    @view_config(route_name='nearest_address')
46
    def nearest_address(self):
47
        data = self._retrieve_json()
48
        geojson_input = self.validate_geojson(data)
49
        if check_in_flanders(geojson_input):
50
            crab_gateway = self.request.crab_gateway() if hasattr(self.request, 'crab_gateway') else None
51
            address = nearest_location(geojson_input, crab_gateway)
52
            if address is None:
53
                return {"found": False}
54
            return {"found": True, "address": address}
55
        else:
56
            raise ValidationFailure(
57
                    "De geojson geometrie is niet geldig.",
58
                    {"": "Geometrie ligt niet binnen Vlaanderen"}
59
            )
60
61
    @view_config(route_name='check_in_flanders')
62
    def check_in_flanders(self):
63
        data = self._retrieve_json()
64
        geojson_input = self.validate_geojson(data)
65
        return {'IntersectFlanders': check_in_flanders(geojson_input)}
66
67
    @view_config(route_name='check_within_flanders')
68
    def check_within_flanders(self):
69
        data = self._retrieve_json()
70
        geojson_input = self.validate_geojson(data)
71
        return {'WithinFlanders': check_within_flanders(geojson_input)}
72
73
    @view_config(route_name='gemeente')
74
    def gemeente_niscode(self):
75
        data = self._retrieve_json()
76
        geojson_input = self.validate_geojson(data)
77
        return self.request.registry.admin_grenzen_client.get_gemeente(geojson_input)
78
79
    @view_config(route_name='provincie')
80
    def provincie_niscode(self):
81
        data = self._retrieve_json()
82
        geojson_input = self.validate_geojson(data)
83
        return self.request.registry.admin_grenzen_client.get_provincie(geojson_input)
84
85
    @view_config(route_name='check_in_erfgoedgemeente')
86
    def check_erfgoedgemeente(self):
87
        data = self._retrieve_json()
88
        geojson_input = self.validate_geojson(data)
89
        erfgoedgemeenten_body = self.request.registry.admin_grenzen_client.check_erfgoedgemeenten(
90
            geojson_input, self.request.registry.settings['erfgoedgemeenten'])
91
        return Response(json.dumps(erfgoedgemeenten_body),
92
                        content_type='application/json', status=200)
93