advice()   B
last analyzed

Complexity

Conditions 7

Size

Total Lines 30

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 7
c 2
b 0
f 0
dl 0
loc 30
rs 7.76
1
# -*- coding: utf-8 -*-
2
import json
3
import logging
4
5
from jsonpublish import dumps
6
from jsonpublish import jsonsettings
7
from datetime import datetime
8
9
from pytz import timezone
10
import hashlib
11
12
log = logging.getLogger(__name__)
13
14
15
def _action_from_request(request):
16
    if request.method == 'POST':
17
        return 'aanmaken'
18
    elif request.method == 'PUT':
19
        return 'bewerken'
20
    elif request.method == 'DELETE':
21
        return 'verwijderen'
22
    elif request.method == 'GET':
23
        return 'opvragen'
24
    else:
25
        return 'onbekend'
26
27
28
def _get_versie_hash(wijziging):
29
    timestamp = datetime.now(tz=timezone('CET'))
30
    inputversie = "{0}{1}{2}".format(timestamp, wijziging.resource_object_id, wijziging.updated_by)
31
    versie = hashlib.sha256(bytearray(inputversie, "utf-8")).hexdigest()
32
    return versie
33
34
35
def _get_id_from_result(r_id, result, kwarg):
36
    if kwarg.get('result_id_key'):
37
        return int(result[kwarg.get('result_id_key')])
38
    return result['id'] if not r_id else int(r_id)
39
40
41
def audit(**kwargs):
42
    """
43
    use this decorator to audit an operation
44
    """
45
46
    def wrap(fn):
47
48
        def advice(parent_object, *args, **kw):
49
            request = parent_object.request
50
            wijziging = request.audit_manager.create_revision()
51
52
            result = fn(parent_object, *args, **kw)
53
54
            if hasattr(request, 'user') and request.user is not None and 'actor' in request.user:
55
                actor = request.user['actor']
56
                wijziging.updated_by = actor.get('uri', None)
57
                wijziging.updated_by_omschrijving = actor.get('omschrijving', None)
58
            else:
59
                wijziging.updated_by = 'publiek'
60
                wijziging.updated_by_omschrijving = 'publiek'
61
62
            r_id = request.matchdict.get('id')
63
            wijziging.resource_object_id = r_id
64
            if result is not None:
65
                try:
66
                    result_object_json = json.loads(dumps(jsonsettings(result, request=request)))
67
                    wijziging.resource_object_json = result_object_json
68
                    wijziging.resource_object_id = _get_id_from_result(r_id, result_object_json, kwargs)
69
                except Exception as e:
70
                    log.error(e)
71
72
            wijziging.versie = _get_versie_hash(wijziging)
73
            wijziging.actie = kwargs.get('actie') if kwargs.get('actie') else _action_from_request(request)
74
75
            request.audit_manager.save(wijziging)
76
77
            return result
78
79
        return advice
80
81
    return wrap
82
83
84
def audit_with_request(**kwargs):
85
    """
86
    use this decorator to audit an operation with a request as input variable
87
    """
88
    def wrap(fn):
89
        @audit(**kwargs)
90
        def operation(parent_object, *args, **kw):
91
            return fn(parent_object.request, *args, **kw)
92
93
        def advice_with_request(the_request, *args, **kw):
94
            class ParentObject:
95
                request = the_request
96
97
            return operation(ParentObject(), *args, **kw)
98
99
        return advice_with_request
100
101
    return wrap
102