~smile-openerp-team/smile-openerp/addons-6.0

« back to all changes in this revision

Viewing changes to smile_export/export_handler.py

  • Committer: Xavier Fernandez
  • Date: 2011-10-17 12:30:47 UTC
  • Revision ID: xafer@apophis-20111017123047-krfwan06i0gfy8gc
[IMP] smile_export is now based on smile_log

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# -*- encoding: utf-8 -*-
2
 
##############################################################################
3
 
#
4
 
#    OpenERP, Open Source Management Solution    
5
 
#    Copyright (C) 2011 Smile (<http://www.smile.fr>). All Rights Reserved
6
 
#
7
 
#    This program is free software: you can redistribute it and/or modify
8
 
#    it under the terms of the GNU General Public License as published by
9
 
#    the Free Software Foundation, either version 3 of the License, or
10
 
#    (at your option) any later version.
11
 
#
12
 
#    This program is distributed in the hope that it will be useful,
13
 
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 
#    GNU General Public License for more details.
16
 
#
17
 
#    You should have received a copy of the GNU General Public License
18
 
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
19
 
#
20
 
##############################################################################
21
 
 
22
 
import datetime
23
 
import logging
24
 
import threading
25
 
import traceback
26
 
 
27
 
import pooler
28
 
import tools
29
 
 
30
 
class SmileExportDBHandler(logging.Handler):
31
 
 
32
 
    def __init__(self, level=logging.NOTSET):
33
 
        logging.Handler.__init__(self, level)
34
 
        self._dbname_to_cr = {}
35
 
 
36
 
    def emit(self, record):
37
 
        dbname = getattr(threading.currentThread(), 'dbname', '')
38
 
        db, pool = pooler.get_db_and_pool(dbname, update_module=tools.config['init'] or tools.config['update'], pooljobs=False)
39
 
        cr = self._dbname_to_cr.get(dbname, False)
40
 
        if not cr:
41
 
            cr = self._dbname_to_cr[dbname] = db.cursor()
42
 
        export_id = record.args and isinstance(record.args, dict) and record.args.get('export_id', False) or False
43
 
        uid = record.args and isinstance(record.args, dict) and record.args.get('uid', False) or False
44
 
 
45
 
        if uid and pool.get('res.users').exists(cr, 1, uid):
46
 
            pool.get('ir.model.export.log').create(cr, uid, {
47
 
                'export_id': export_id,
48
 
                'level': record.levelname,
49
 
                'message': record.msg,
50
 
            })
51
 
        else:
52
 
            cr.execute("INSERT INTO ir_model_export_log (create_date, export_id, level, message) VALUES (now(), %s, %s, %s)",
53
 
                       (export_id,
54
 
                        record.levelname,
55
 
                        record.msg,))
56
 
        cr.commit()
57
 
        return True
58
 
 
59
 
    def close(self):
60
 
        logging.Handler.close(self)
61
 
        for cr in self._dbname_to_cr.values():
62
 
            cr.close()
63
 
        self._dbname_to_cr = {}
64
 
 
65
 
logger = logging.getLogger("smile_export")
66
 
handler = SmileExportDBHandler()
67
 
logger.addHandler(handler)
68
 
 
69
 
def add_timing(original_method):
70
 
    def new_method(self, msg):
71
 
        delay = datetime.datetime.now() - self.export_start
72
 
        msg += " after %sh %smin %ss" % tuple(str(delay).split(':'))
73
 
        return original_method(self, msg)
74
 
    return new_method
75
 
 
76
 
def add_trace(original_method):
77
 
    def new_method(self, msg):
78
 
        stack = traceback.format_exc()
79
 
        msg += '\n%s' % stack
80
 
        return original_method(self, msg)
81
 
    return new_method
82
 
 
83
 
class SmileExportLogger():
84
 
 
85
 
    def __init__(self, uid, export_id):
86
 
        assert isinstance(uid, (int, long)), 'uid should be an integer'
87
 
        self.logger = logging.getLogger("smile_export")
88
 
        self.uid = uid
89
 
        self.export_id = export_id
90
 
        self.export_start = datetime.datetime.now()
91
 
        self.logger_args = {'export_id': self.export_id, 'uid': self.uid}
92
 
 
93
 
    def debug(self, msg):
94
 
        self.logger.debug(msg, self.logger_args)
95
 
 
96
 
    def info(self, msg):
97
 
        self.logger.info(msg, self.logger_args)
98
 
 
99
 
    def warning(self, msg):
100
 
        self.logger.warning(msg, self.logger_args)
101
 
 
102
 
    def log(self, msg):
103
 
        self.logger.log(msg, self.logger_args)
104
 
 
105
 
    @add_trace
106
 
    def error(self, msg):
107
 
        self.logger.error(msg, self.logger_args)
108
 
 
109
 
    @add_trace
110
 
    def critical(self, msg):
111
 
        self.logger.critical(msg, self.logger_args)
112
 
 
113
 
    @add_trace
114
 
    def exception(self, msg):
115
 
        self.logger.exception(msg, self.logger_args)
116
 
 
117
 
    @add_timing
118
 
    def time_info(self, msg):
119
 
        self.logger.info(msg, self.logger_args)
120
 
 
121
 
    @add_timing
122
 
    def time_debug(self, msg):
123
 
        self.logger.debug(msg, self.logger_args)