Completed
Push — master ( a78279...04d974 )
by
unknown
10s
created

audit_with_request()   A

Complexity

Conditions 4

Size

Total Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 4
c 1
b 0
f 1
dl 0
loc 18
rs 9.2

2 Methods

Rating   Name   Duplication   Size   Complexity  
A operation() 0 3 1
A advice_with_request() 0 5 1
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 audit(**kwargs):
36
    """
37
    use this decorator to audit an operation
38
    """
39
40
    def wrap(fn):
41
42
        def advice(parent_object, *args, **kw):
43
            request = parent_object.request
44
            wijziging = request.audit_manager.create_revision()
45
46
            result = fn(parent_object, *args, **kw)
47
48
            if hasattr(request, 'user') and request.user is not None and 'actor' in request.user:
49
                actor = request.user['actor']
50
                wijziging.updated_by = actor.get('uri', None)
51
                wijziging.updated_by_omschrijving = actor.get('omschrijving', None)
52
            else:
53
                wijziging.updated_by = 'publiek'
54
                wijziging.updated_by_omschrijving = 'publiek'
55
56
            r_id = request.matchdict.get('id')
57
            wijziging.resource_object_id = r_id
58
            if result is not None:
59
                wijziging.resource_object_id = result.id if not r_id else int(r_id)
60
                try:
61
                    wijziging.resource_object_json = json.loads(dumps(jsonsettings(result, request=request)))
62
                except Exception as e:
63
                    log.error(e)
64
65
            wijziging.versie = _get_versie_hash(wijziging)
66
            wijziging.actie = kwargs.get('actie') if kwargs.get('actie') else _action_from_request(request)
67
68
            request.audit_manager.save(wijziging)
69
70
            return result
71
72
        return advice
73
74
    return wrap
75
76
77
def audit_with_request(**kwargs):
78
    """
79
    use this decorator to audit an operation with a request as input variable
80
    """
81
    def wrap(fn):
82
        @audit(**kwargs)
83
        def operation(parent_object, *args, **kw):
84
            return fn(parent_object.request, *args, **kw)
85
86
        def advice_with_request(the_request, *args, **kw):
87
            class ParentObject:
88
                request = the_request
89
90
            return operation(ParentObject(), *args, **kw)
91
92
        return advice_with_request
93
94
    return wrap
95