currency total prob is solved in general ledger...
[odoo/odoo.git] / bin / report / printscreen / ps_form.py
1 # -*- encoding: utf-8 -*-
2 ##############################################################################
3 #
4 # Copyright (c) 2004-2008 TINY SPRL. (http://tiny.be) All Rights Reserved.
5 #
6 # $Id$
7 #
8 # WARNING: This program as such is intended to be used by professional
9 # programmers who take the whole responsability of assessing all potential
10 # consequences resulting from its eventual inadequacies and bugs
11 # End users who are looking for a ready-to-use solution with commercial
12 # garantees and support are strongly adviced to contract a Free Software
13 # Service Company
14 #
15 # This program is Free Software; you can redistribute it and/or
16 # modify it under the terms of the GNU General Public License
17 # as published by the Free Software Foundation; either version 2
18 # of the License, or (at your option) any later version.
19 #
20 # This program is distributed in the hope that it will be useful,
21 # but WITHOUT ANY WARRANTY; without even the implied warranty of
22 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23 # GNU General Public License for more details.
24 #
25 # You should have received a copy of the GNU General Public License
26 # along with this program; if not, write to the Free Software
27 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
28 #
29 ##############################################################################
30
31 from report.interface import report_int
32 import pooler
33 import tools
34
35 from report import render
36
37 from xml.dom import minidom
38 import libxml2
39 import libxslt
40
41 import time, os
42
43 class report_printscreen_list(report_int):
44     def __init__(self, name):
45         report_int.__init__(self, name)
46
47     def _parse_node(self, root_node):
48         result = []
49         for node in root_node.childNodes:
50             if node.localName == 'field':
51                 attrsa = node.attributes
52                 attrs = {}
53                 if not attrsa is None:
54                     for i in range(attrsa.length):
55                         attrs[attrsa.item(i).localName] = attrsa.item(i).nodeValue
56                 result.append(attrs['name'])
57             else:
58                 result.extend(self._parse_node(node))
59         return result
60
61     def _parse_string(self, view):
62         dom = minidom.parseString(view)
63         return self._parse_node(dom)
64
65     def create(self, cr, uid, ids, datas, context=None):
66         if not context:
67             context={}
68         datas['ids'] = ids
69         pool = pooler.get_pool(cr.dbname)
70         model_id = pool.get('ir.model').search(cr, uid, [('model','=',model._name)])
71         if model_id:
72             model_desc = pool.get('ir.model').browse(cr, uid, model_id, context).name
73             self.title = model_desc
74         else:
75             model_desc = model._description
76             self.title = model_desc
77
78         model = pool.get(datas['model'])
79         result = model.fields_view_get(cr, uid, view_type='tree', context=context)
80
81         fields_order = self._parse_string(result['arch'])
82         rows = model.read(cr, uid, datas['ids'], result['fields'].keys() )
83         res = self._create_table(uid, datas['ids'], result['fields'], fields_order, rows, context, model._description)
84         return (self.obj.get(), 'pdf')
85
86
87     def _create_table(self, uid, ids, fields, fields_order, results, context, title=''):
88         pageSize=[297.0,210.0]
89
90         impl = minidom.getDOMImplementation()
91         new_doc = impl.createDocument(None, "report", None)
92
93         # build header
94         config = new_doc.createElement("config")
95
96         def _append_node(name, text):
97             n = new_doc.createElement(name)
98             t = new_doc.createTextNode(text)
99             n.appendChild(t)
100             config.appendChild(n)
101
102         _append_node('date', time.strftime('%d/%m/%Y'))
103         _append_node('PageSize', '%.2fmm,%.2fmm' % tuple(pageSize))
104         _append_node('PageWidth', '%.2f' % (pageSize[0] * 2.8346,))
105         _append_node('PageHeight', '%.2f' %(pageSize[1] * 2.8346,))
106
107         _append_node('report-header', title)
108
109         l = []
110         t = 0
111         strmax = (pageSize[0]-40) * 2.8346
112         for f in fields_order:
113             s = 0
114             if fields[f]['type'] in ('date','time','float','integer'):
115                 s = 60
116                 strmax -= s
117             else:
118                 t += fields[f].get('size', 56) / 28 + 1
119             l.append(s)
120         for pos in range(len(l)):
121             if not l[pos]:
122                 s = fields[fields_order[pos]].get('size', 56) / 28 + 1
123                 l[pos] = strmax * s / t
124         _append_node('tableSize', ','.join(map(str,l)) )
125         new_doc.childNodes[0].appendChild(config)
126         header = new_doc.createElement("header")
127
128         for f in fields_order:
129             field = new_doc.createElement("field")
130             field_txt = new_doc.createTextNode(str(fields[f]['string']))
131             field.appendChild(field_txt)
132             header.appendChild(field)
133
134         new_doc.childNodes[0].appendChild(header)
135
136         lines = new_doc.createElement("lines")
137         for line in results:
138             node_line = new_doc.createElement("row")
139             for f in fields_order:
140                 if fields[f]['type']=='many2one' and line[f]:
141                     line[f] = line[f][1]
142                 if fields[f]['type'] in ('one2many','many2many') and line[f]:
143                     line[f] = '( '+str(len(line[f])) + ' )'
144                 if fields[f]['type'] == 'float':
145                     precision=(('digits' in fields[f]) and fields[f]['digits'][1]) or 2
146                     line[f]=round(line[f],precision)
147                 col = new_doc.createElement("col")
148                 col.setAttribute('tree','no')
149                 if line[f] != None:
150                     txt = new_doc.createTextNode(str(line[f] or ''))
151                 else:
152                     txt = new_doc.createTextNode('/')
153                 col.appendChild(txt)
154                 node_line.appendChild(col)
155             lines.appendChild(node_line)
156         new_doc.childNodes[0].appendChild(lines)
157
158         styledoc = libxml2.parseFile(os.path.join(tools.config['root_path'],'addons/base/report/custom_new.xsl'))
159         style = libxslt.parseStylesheetDoc(styledoc)
160         doc = libxml2.parseDoc(new_doc.toxml())
161         rml_obj = style.applyStylesheet(doc, None)
162         rml = style.saveResultToString(rml_obj)
163         self.obj = render.rml(rml, self.title)
164         self.obj.render()
165         return True
166 report_printscreen_list('report.printscreen.form')
167
168
169 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
170