import tempfile
import time
import logging
+ from functools import partial
-from mako.template import Template
-from mako.lookup import TemplateLookup
-from mako import exceptions
-
-from openerp import netsvc
-from openerp import pooler
from report_helper import WebKitHelper
+import openerp
+from openerp.modules.module import get_module_resource
from openerp.report.report_sxw import *
-from openerp import addons
from openerp import tools
from openerp.tools.translate import _
from openerp.osv.osv import except_osv
"""Custom class that use webkit to render HTML reports
Code partially taken from report openoffice. Thanks guys :)
"""
- def __init__(self, name, table, rml=False, parser=False,
- header=True, store=False):
+ def __init__(self, name, table, rml=False, parser=rml_parse,
+ header=True, store=False, register=True):
- self.parser_instance = False
self.localcontext = {}
report_sxw.__init__(self, name, table, rml, parser,
- header, store)
+ header, store, register=register)
def get_lib(self, cursor, uid):
"""Return the lib wkhtml path"""
if report_xml.report_type != 'webkit':
return super(WebKitParser,self).create_single_pdf(cursor, uid, ids, data, report_xml, context=context)
- self.parser_instance = self.parser(cursor,
- uid,
- self.name2,
- context=context)
+ parser_instance = self.parser(cursor,
+ uid,
+ self.name2,
+ context=context)
- self.pool = pooler.get_pool(cursor.dbname)
+ self.pool = pool
objs = self.getObjects(cursor, uid, ids, context)
- self.parser_instance.set_context(objs, data, ids, report_xml.report_type)
+ parser_instance.set_context(objs, data, ids, report_xml.report_type)
template = False
if not css :
css = ''
+ translate_call = partial(self.translate_call, parser_instance)
- #default_filters=['unicode', 'entity'] can be used to set global filter
body_mako_tpl = mako_template(template)
helper = WebKitHelper(cursor, uid, report_xml.id, context)
- self.parser_instance.localcontext['helper'] = helper
- self.parser_instance.localcontext['css'] = css
- self.parser_instance.localcontext['_'] = self.translate_call
++ parser_instance.localcontext['helper'] = helper
++ parser_instance.localcontext['css'] = css
++ parser_instance.localcontext['_'] = translate_call
+
+ # apply extender functions
+ additional = {}
+ if xml_id in _extender_functions:
+ for fct in _extender_functions[xml_id]:
- fct(pool, cr, uid, self.parser_instance.localcontext, context)
++ fct(pool, cr, uid, parser_instance.localcontext, context)
+
if report_xml.precise_mode:
- ctx = dict(self.parser_instance.localcontext)
- for obj in self.parser_instance.localcontext['objects']:
- for obj in objs:
- parser_instance.localcontext['objects'] = [obj]
++ ctx = dict(parser_instance.localcontext)
++ for obj in parser_instance.localcontext['objects']:
+ ctx['objects'] = [obj]
try :
- html = body_mako_tpl.render(helper=helper,
- css=css,
- _=translate_call,
- **parser_instance.localcontext)
+ html = body_mako_tpl.render(dict(ctx))
htmls.append(html)
- except Exception:
- msg = exceptions.text_error_template().render()
+ except Exception, e:
+ msg = u"%s" % e
_logger.error(msg)
raise except_osv(_('Webkit render!'), msg)
else:
try :
- html = body_mako_tpl.render(dict(self.parser_instance.localcontext))
- html = body_mako_tpl.render(helper=helper,
- css=css,
- _=translate_call,
- **parser_instance.localcontext)
++ html = body_mako_tpl.render(dict(parser_instance.localcontext))
htmls.append(html)
- except Exception:
- msg = exceptions.text_error_template().render()
+ except Exception, e:
+ msg = u"%s" % e
_logger.error(msg)
raise except_osv(_('Webkit render!'), msg)
head_mako_tpl = mako_template(header)
try :
- head = head_mako_tpl.render(dict(self.parser_instance.localcontext, _debug=False))
- head = head_mako_tpl.render(helper=helper,
- css=css,
- _=translate_call,
- _debug=False,
- **parser_instance.localcontext)
- except Exception:
- raise except_osv(_('Webkit render!'),
- exceptions.text_error_template().render())
++ head = head_mako_tpl.render(dict(parser_instance.localcontext, _debug=False))
+ except Exception, e:
+ raise except_osv(_('Webkit render!'), u"%s" % e)
foot = False
if footer :
foot_mako_tpl = mako_template(footer)
try :
- foot = foot_mako_tpl.render(dict({},
- **self.parser_instance.localcontext))
- foot = foot_mako_tpl.render(helper=helper,
- css=css,
- _=translate_call,
- **parser_instance.localcontext)
- except:
- msg = exceptions.text_error_template().render()
++ foot = foot_mako_tpl.render(dict(parser_instance.localcontext))
+ except Exception, e:
+ msg = u"%s" % e
_logger.error(msg)
raise except_osv(_('Webkit render!'), msg)
if report_xml.webkit_debug :
try :
- deb = head_mako_tpl.render(dict(self.parser_instance.localcontext, _debug=tools.ustr("\n".join(htmls))))
- deb = head_mako_tpl.render(helper=helper,
- css=css,
- _debug=tools.ustr("\n".join(htmls)),
- _=translate_call,
- **parser_instance.localcontext)
- except Exception:
- msg = exceptions.text_error_template().render()
++ deb = head_mako_tpl.render(dict(parser_instance.localcontext, _debug=tools.ustr("\n".join(htmls))))
+ except Exception, e:
+ msg = u"%s" % e
_logger.error(msg)
raise except_osv(_('Webkit render!'), msg)
return (deb, 'html')
('numeric', 'float', get_pg_type(f)[1], '::'+get_pg_type(f)[1]),
('float8', 'float', get_pg_type(f)[1], '::'+get_pg_type(f)[1]),
]
- if f_pg_type == 'varchar' and f._type == 'char' and ((f.size is None and f_pg_size) or f_pg_size < f.size):
+ if f_pg_type == 'varchar' and f._type == 'char' and f_pg_size and (f.size is None or f_pg_size < f.size):
- cr.execute('ALTER TABLE "%s" RENAME COLUMN "%s" TO temp_change_size' % (self._table, k))
- cr.execute('ALTER TABLE "%s" ADD COLUMN "%s" %s' % (self._table, k, pg_varchar(f.size)))
- cr.execute('UPDATE "%s" SET "%s"=temp_change_size::%s' % (self._table, k, pg_varchar(f.size)))
- cr.execute('ALTER TABLE "%s" DROP COLUMN temp_change_size CASCADE' % (self._table,))
+ try:
+ with cr.savepoint():
+ cr.execute('ALTER TABLE "%s" ALTER COLUMN "%s" TYPE %s' % (self._table, k, pg_varchar(f.size)))
+ except psycopg2.NotSupportedError:
+ # In place alter table cannot be done because a view is depending of this field.
+ # Do a manual copy. This will drop the view (that will be recreated later)
+ cr.execute('ALTER TABLE "%s" RENAME COLUMN "%s" TO temp_change_size' % (self._table, k))
+ cr.execute('ALTER TABLE "%s" ADD COLUMN "%s" %s' % (self._table, k, pg_varchar(f.size)))
+ cr.execute('UPDATE "%s" SET "%s"=temp_change_size::%s' % (self._table, k, pg_varchar(f.size)))
+ cr.execute('ALTER TABLE "%s" DROP COLUMN temp_change_size CASCADE' % (self._table,))
cr.commit()
_schema.debug("Table '%s': column '%s' (type varchar) changed size from %s to %s",
self._table, k, f_pg_size or 'unlimited', f.size or 'unlimited')