-
Notifications
You must be signed in to change notification settings - Fork 1
/
report_sxw.py
109 lines (87 loc) · 3.51 KB
/
report_sxw.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
from osv import osv
import pooler
from report.report_sxw import report_sxw
from tools.safe_eval import safe_eval
import time
import base64
import logging
try:
from cStringIO import StringIO
except ImportError:
from StringIO import StringIO
try:
from pyPdf import PdfFileWriter, PdfFileReader
except ImportError:
raise osv.except_osv(
"agaplan_terms_and_conditions needs pyPdf",
"""To install the module "agaplan_terms_and_conditions" please ask your administrator to install the pyPdf package."""
)
# We store the original function
openerp_create_single_pdf = report_sxw.create_single_pdf
def create_single_pdf(self, cr, uid, ids, data, report_xml, context=None):
log = logging.getLogger('agaplan_terms_and_conditions')
res = openerp_create_single_pdf(self, cr, uid, ids, data, report_xml, context)
if report_xml.report_type != 'pdf':
log.warn("report_type was not what we expected (%s) thus we return regular result.", report_xml.report_type)
return res
pool = pooler.get_pool(cr.dbname)
# Check conditions to add or not
rule_obj = pool.get('term.rule')
if not rule_obj:
# Module is not installed
return res
rule_ids = rule_obj.search(cr, uid, [
('report_name','=',report_xml.report_name),
])
if not len(rule_ids):
# No conditions should be added, return regular result
return res
valid_rules = []
for rule in rule_obj.browse(cr, uid, rule_ids, context=context):
log.debug("Checking rule %s for report %s",
rule.term_id.name, report_xml.report_name)
if rule.company_id:
model_obj = pool.get( data['model'] ).browse(cr, uid, ids[0], context=context)
if hasattr(model_obj, 'company_id'):
if rule.company_id.id != model_obj.company_id.id:
log.debug("Company id's did not match !")
continue
else:
log.debug("Company id's matched !")
if rule.condition:
env = {
'object': pool.get( data['model'] ).browse(cr, uid, ids[0], context=context),
'report': report_xml,
'data': data,
'date': time.strftime('%Y-%m-%d'),
'time': time,
'context': context,
}
# User has specified a condition, check it and return res when not met
if not safe_eval(rule.condition, env):
log.debug("Term condition not met !")
continue
else:
log.debug("Term condition met !")
valid_rules += [ rule ]
output = PdfFileWriter()
reader = PdfFileReader( StringIO(res[0]) )
for rule in valid_rules:
if rule.term_id.mode == 'begin':
att = PdfFileReader( StringIO(base64.decodestring(rule.term_id.pdf)) )
map(output.addPage, att.pages)
for page in reader.pages:
output.addPage( page )
for rule in valid_rules:
if rule.term_id.mode == 'duplex':
att = PdfFileReader( StringIO(base64.decodestring(rule.term_id.pdf)) )
map(output.addPage, att.pages)
for rule in valid_rules:
if rule.term_id.mode == 'end':
att = PdfFileReader( StringIO(base64.decodestring(rule.term_id.pdf)) )
map(output.addPage, att.pages)
buf = StringIO()
output.write(buf)
return (buf.getvalue(), report_xml.report_type)
report_sxw.create_single_pdf = create_single_pdf
# vim:sts=4:et