ValidationFailure   A
last analyzed

Complexity

Total Complexity 1

Size/Duplication

Total Lines 8
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 8
rs 10
wmc 1

1 Method

Rating   Name   Duplication   Size   Complexity  
A __init__() 0 3 1
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
        try:
64
            check_getijdezone = int(self.request.params.get('check_getijdezone', 0))
65
        except ValueError:
66
            raise HTTPBadRequest(
67
                detail='Request parameter "getijdezone" moet een numerieke waarde zijn (0 of 1).')
68
        data = self._retrieve_json()
69
        geojson_input = self.validate_geojson(data)
70
        return {'IntersectFlanders': check_in_flanders(geojson_input, check_getijdezone)}
71
72
    @view_config(route_name='check_within_flanders')
73
    def check_within_flanders(self):
74
        try:
75
            tolerance = int(self.request.params.get('tolerance', 10))
76
        except ValueError:
77
            raise HTTPBadRequest(detail='Request parameter "tolerance" moet een numerieke waarde zijn.')
78
        data = self._retrieve_json()
79
        geojson_input = self.validate_geojson(data)
80
        return {'WithinFlanders': check_within_flanders(geojson_input, tolerance)}
81
82
    @view_config(route_name='gemeente')
83
    def gemeente_niscode(self):
84
        data = self._retrieve_json()
85
        geojson_input = self.validate_geojson(data)
86
        return self.request.registry.admin_grenzen_client.get_gemeente(geojson_input)
87
88
    @view_config(route_name='provincie')
89
    def provincie_niscode(self):
90
        data = self._retrieve_json()
91
        geojson_input = self.validate_geojson(data)
92
        return self.request.registry.admin_grenzen_client.get_provincie(geojson_input)
93
94
    @view_config(route_name='check_in_erfgoedgemeente')
95
    def check_erfgoedgemeente(self):
96
        data = self._retrieve_json()
97
        geojson_input = self.validate_geojson(data)
98
        erfgoedgemeenten_body = self.request.registry.admin_grenzen_client.check_erfgoedgemeenten(
99
            geojson_input, self.request.registry.settings['erfgoedgemeenten'])
100
        return Response(json.dumps(erfgoedgemeenten_body),
101
                        content_type='application/json', status=200, charset='utf-8')
102