LanguagesCrud.get_language()   A
last analyzed

Complexity

Conditions 2

Size

Total Lines 16
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 9
dl 0
loc 16
rs 9.95
c 0
b 0
f 0
cc 2
nop 1
1
import colander
2
from pyramid.view import view_config
3
from pyramid.view import view_defaults
4
from skosprovider_sqlalchemy.models import Language
5
from sqlalchemy.exc import NoResultFound
6
7
from atramhasis.errors import LanguageNotFoundException
8
from atramhasis.errors import ValidationError
9
from atramhasis.validators import LanguageTag
10
from atramhasis.validators import languagetag_validator
11
12
13
@view_defaults(accept='application/json', renderer='skosrenderer_verbose')
14
class LanguagesCrud:
15
    """
16
    This object groups CRUD REST views for languages.
17
    """
18
19
    def __init__(self, context, request):
20
        self.request = request
21
        self.context = context
22
        self.logged_in = request.authenticated_userid
23
        self.languages_manager = self.request.data_managers['languages_manager']
24
25
    def _get_json_body(self):
26
        json_body = self.request.json_body
27
        if 'l_id' in self.request.matchdict and 'id' not in json_body:
28
            json_body['id'] = self.request.matchdict['l_id']
29
        return json_body
30
31
    def _validate_language(self, json_language, new):
32
        language = LanguageTag(
33
            validator=languagetag_validator
34
        ).bind(
35
            request=self.request,
36
            new=new
37
        )
38
        try:
39
            return language.deserialize(json_language)
40
        except colander.Invalid as e:
41
            raise ValidationError(
42
                'Language could not be validated',
43
                e.asdict()
44
            )
45
46
    @view_config(route_name='atramhasis.list_languages', permission='edit')
47
    def list_languages(self):
48
        """
49
        Get all existing languages
50
51
        :return: list of languages
52
        """
53
        if 'sort' in self.request.params:
54
            sort = self.request.params['sort']
55
            sort_desc = (sort[0:1] == '-')
56
            sort = sort[1:] if sort[0:1] in ['-', '+'] else sort
57
            sort = sort.strip()
58
            languages = self.languages_manager.get_all_sorted(sort, sort_desc)
59
        else:
60
            languages = self.languages_manager.get_all()
61
        return languages
62
63
    @view_config(route_name='atramhasis.get_language', permission='edit')
64
    def get_language(self):
65
        """
66
        Get an existing language
67
68
        :raises atramhasis.errors.LanguageNotFoundException: If the language can't be found
69
        :return the corresponding language
70
        """
71
        l_id = self.request.matchdict['l_id']
72
        try:
73
            language = self.languages_manager.get(l_id)
74
        except NoResultFound:
75
            raise LanguageNotFoundException(l_id)
76
77
        self.request.response.status = '200'
78
        return language
79
80
    @view_config(route_name='atramhasis.edit_language', permission='edit')
81
    def edit_language(self):
82
        """
83
        Edit an existing language or create when not found
84
85
        :raises atramhasis.errors.ValidationError: If the provided json can't be validated
86
        """
87
        l_id = self.request.matchdict['l_id']
88
        json_body = self._get_json_body()
89
        json_body['id'] = l_id
90
91
        try:
92
            language = self.languages_manager.get(l_id)
93
            validated_json_language = self._validate_language(json_body, False)
94
            language.name = validated_json_language['name']
95
        except NoResultFound:
96
            validated_json_language = self._validate_language(json_body, True)
97
            language = Language(id=validated_json_language['id'], name=validated_json_language['name'])
98
        language = self.languages_manager.save(language)
99
        self.request.response.status = '200'
100
        return {'id': language.id, 'name': language.name}
101
102
    @view_config(route_name='atramhasis.delete_language', permission='edit')
103
    def delete_language(self):
104
        """
105
        Delete an existing concept
106
107
        :raises atramhasis.errors.LanguageNotFoundException: If the language can't be found
108
        """
109
        l_id = self.request.matchdict['l_id']
110
        try:
111
            language = self.languages_manager.get(l_id)
112
        except NoResultFound:
113
            raise LanguageNotFoundException(l_id)
114
        self.languages_manager.delete(language)
115
116
        self.request.response.status = '200'
117
        return {'id': language.id, 'name': language.name}
118