~technofluid-team/openobject-addons/technofluid_multiple_installations

« back to all changes in this revision

Viewing changes to audittrail/audittrail.py

  • Committer: pinky
  • Date: 2006-12-07 13:41:40 UTC
  • Revision ID: pinky-dedd7f8a42bd4557112a0513082691b8590ad6cc
New trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding :utf-8 -*-
 
2
 
 
3
from osv import osv, fields
 
4
import time, pooler, copy
 
5
 
 
6
class audittrail_rule(osv.osv):
 
7
        _name = 'audittrail.rule'
 
8
        _columns = {
 
9
                "name": fields.char("Rule Name", size=32, required=True),
 
10
                "object_id": fields.many2one('ir.model', 'Object', required=True),
 
11
                "user_id": fields.many2many('res.users', 'audittail_rules_users', 'user_id', 'rule_id', 'Users'),
 
12
                "log_read": fields.boolean("Log reads"),
 
13
                "log_write": fields.boolean("Log writes"),
 
14
                "log_unlink": fields.boolean("Log deletes"),
 
15
                "log_create": fields.boolean("Log creates"),
 
16
                "state": fields.selection((("draft", "Draft"),("subscribed", "Subscribed")), "State", required=True)
 
17
        }
 
18
        _defaults = {
 
19
                'state': lambda *a: 'draft',
 
20
                'log_create': lambda *a: 1,
 
21
                'log_unlink': lambda *a: 1,
 
22
                'log_write': lambda *a: 1,
 
23
        }
 
24
        __functions = {}
 
25
 
 
26
        def subscribe(self, cr, uid, ids, *args):
 
27
                for thisrule in self.browse(cr, uid, ids):
 
28
                        obj = self.pool.get(thisrule.object_id.model)
 
29
                        if not obj:
 
30
                                print ("%s WARNING:audittrail:%s is not part of the pool -- change audittrail depends -- setting rule: %s as DRAFT" % (time.strftime('%a, %d %b %Y %H:%M:%S'), thisrule.object_id.model, thisrule.name))
 
31
                                self.write(cr, uid, ids, {"state": "draft"})
 
32
                                return False
 
33
                        for field in ('read','write','create','unlink'):
 
34
                                if getattr(thisrule, 'log_'+field):
 
35
                                        # backup corresponding method
 
36
                                        self.__functions.setdefault(thisrule.id, [])
 
37
                                        self.__functions[thisrule.id].append( (obj, field, getattr(obj,field)) )
 
38
                                        uids_to_log = []
 
39
                                        for user in thisrule.user_id:
 
40
                                                uids_to_log.append(user.id)
 
41
                                        # override it with the logging variant
 
42
                                        setattr(obj, field, self.logging_fct(getattr(obj,field), thisrule.object_id, uids_to_log))
 
43
                self.write(cr, uid, ids, {"state": "subscribed"})
 
44
                return True
 
45
 
 
46
        def logging_fct(self, fct_src, object, logged_uids):
 
47
                if object.model=="audittrail.log":
 
48
                        return fct_src
 
49
                def my_fct( cr, uid, *args, **args2):
 
50
                        if not len(logged_uids) or uid in logged_uids:
 
51
                                self.pool.get('audittrail.log').create(cr, uid, {"method": fct_src.__name__, "object_id": object.id, "user_id": uid, "args": "%s, %s" % (str(args), str(args2)), "name": "%s %s %s" % (fct_src.__name__, object.id, time.strftime("%Y-%m-%d %H:%M:%S"))})
 
52
                        return fct_src( cr, uid, *args, **args2)
 
53
                return my_fct
 
54
 
 
55
        def unsubscribe(self, cr, uid, ids, *args):
 
56
                for thisrule in self.browse(cr, uid, ids):
 
57
                        for function in self.__functions[thisrule.id]:
 
58
                                setattr(function[0], function[1], function[2])
 
59
                self.write(cr, uid, ids, {"state": "draft"})
 
60
                return True
 
61
 
 
62
#       def __init__(self, *args):
 
63
#               super(audittrail_rule, self).__init__(*args)
 
64
#               cr = pooler.db.cursor()
 
65
#FIXME: ah merde, ca craint pour le multi-db! Une solution serait d'overrider d'office toutes les methodes
 
66
# et de checker dans la methode elle meme s'il faut logger ou pas, mais ca risque de tout faire ramer violemment
 
67
# une autre solution (bien meilleure, il me semble) est de rajouter une méthode "db_dependant_init" dans osv qui est overridable
 
68
# et appellée dans le __init__ de osv (comme creation des tables et chargement des données)
 
69
# a merde, ca marche pas, vu que plusieurs utilisateurs peuvent etre sur des bases differentes en meme temps
 
70
#               self.subscribe(cr, 1, self.search(cr, 1, [('state','=','subscribed')]))
 
71
#               cr.commit()
 
72
#               cr.close()
 
73
#               del cr
 
74
 
 
75
class audittrail_log(osv.osv):
 
76
        _name = 'audittrail.log'
 
77
        _columns = {
 
78
                "name": fields.char("Name", size=32),
 
79
                "object_id": fields.many2one('ir.model', 'Object'),
 
80
                "user_id": fields.many2one('res.users', 'User'),
 
81
                "method": fields.selection((('read', 'Read'), ('write', 'Write'), ('unlink', 'Delete'), ('create', 'Create')), "Method"),
 
82
                "args": fields.text("Arguments"),
 
83
                "timestamp": fields.datetime("Timestamp")
 
84
        }
 
85
        _defaults = {
 
86
                "timestamp": lambda *a: time.strftime("%Y-%m-%d %H:%M:%S")
 
87
        }
 
88
 
 
89
audittrail_log()
 
90
audittrail_rule()
 
91
 
 
92