diff --git a/data/py3o.fusion.filetype.csv b/data/py3o.fusion.filetype.csv new file mode 100644 index 00000000..f0e11e8b --- /dev/null +++ b/data/py3o.fusion.filetype.csv @@ -0,0 +1,6 @@ +id,fusion_ext,human_ext +py3o_fusion_filetype_odt,ODT,odt +py3o_fusion_filetype_ods,ODS,ods +py3o_fusion_filetype_doc,DOC,doc +py3o_fusion_filetype_docx,DOCX,docx +py3o_fusion_filetype_pdf,PDF,pdf diff --git a/menu.xml b/menu.xml new file mode 100644 index 00000000..23589c9e --- /dev/null +++ b/menu.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/py3o_fusion_filetype.py b/py3o_fusion_filetype.py new file mode 100644 index 00000000..570ca474 --- /dev/null +++ b/py3o_fusion_filetype.py @@ -0,0 +1,18 @@ +from openerp.osv import fields, osv + + +class py3o_fusion_filetype(osv.Model): + _name = 'py3o.fusion.filetype' + + _rec_name = 'human_ext' + + _columns = { + 'fusion_ext': fields.char( + u"Fusion Extension", + size=8, + ), + 'human_ext': fields.char( + u"Human readble extension", + size=8, + ), + } diff --git a/py3o_report_modif.py b/py3o_report_modif.py new file mode 100644 index 00000000..5c474835 --- /dev/null +++ b/py3o_report_modif.py @@ -0,0 +1,144 @@ +from base64 import b64decode +from tempfile import NamedTemporaryFile as tempfile + +from openerp import pooler +from openerp.report.report_sxw import * +from openerp.tools.translate import _ +from openerp.osv.osv import except_osv + +from py3o.template import Template + +from oe_json_serializer import OESerializer + +import json +import requests +import os + + +class py3o_report(report_sxw): +# def __init__(self, name, table): +# super(py3o_report, self).__init__(name, table) + + def get_values(self, cr, uid, ids, data, context): + ''' Override this function to customize the dictionary given to the + py3o.template renderer. ''' + + return { + 'lang': self.get_lang(cr, uid, context), + 'objects': self.getObjects(cr, uid, ids, context), + } + + def get_lang(self, cr, uid, context): + pool = pooler.get_pool(cr.dbname) + lang_obj = pool.get('res.lang') + user_obj = pool.get('res.users') + + lang_code = user_obj.browse(cr, uid, uid, context=context).lang + lang = lang_obj.search(cr, uid, + [('code', '=', lang_code)], + context=context)[0] + return lang_obj.browse(cr, uid, lang, context=context) + + def format_date(self, date, values): + ''' Return a date formatted according to the language extracted from + the "values" argument (which should be the result of get_values). ''' + return date.strftime(values['lang'].date_format) + + def create(self, cr, uid, ids, data, context=None): + # Find the report definition to get its settings. + pool = pooler.get_pool(cr.dbname) + report_xml_obj = pool.get('ir.actions.report.xml') + report_xml_ids = report_xml_obj.search(cr, uid, + [('report_name', '=', self.name[7:])], # Ignore "report." + context=context) + if not report_xml_ids: + return super(py3o_report, self).create(cr, uid, ids, data, + context=context) + report_xml = report_xml_obj.browse(cr, uid, + report_xml_ids[0], + context=context) + + template = report_xml.py3o_template_id + filetype = report_xml.py3o_fusion_filetype + + + #Try to request fusion server: + + fusion_server_obj = pool['py3o.server'] + #TODO: Raise a message if no config found + fusion_server_id = fusion_server_obj.search( + cr, uid, [], context=context + )[0] + fusion_server = fusion_server_obj.browse(cr, uid, fusion_server_id) + + # py3o.template operates on filenames so create temporary files. + in_temp = tempfile(suffix='.odt', prefix='py3o-template-') + + in_temp.write(b64decode(template.py3o_template_data)) + in_temp.seek(0) + out_temp = tempfile(suffix='.odt', prefix='py3o-report-') + + # We need to get the variables used in the template + #TODO: Find a way to avoid calling Template + t = Template(in_temp.name, out_temp.name) + # Remove 'py3o.' + user_variable = [x[5:] for x in t.get_user_variable()] + print user_variable + + values = self.get_values(cr, uid, ids, data, context) + print values + + #WARNING: We rely on the fact that there is a for loop on the report + # on objects (for object in objects) due to lack of time + val_dict = {} + for val in values: + if val == 'objects': + o = [] + for obj in values[val]: + x = OESerializer.serialize( + obj, + [ + v[len('object') + 1:] + for v in user_variable + if v.startswith('object') + ] + ) + o.append(x) + val_dict.update({val: o}) + continue + + x = OESerializer.serialize( + values[val], + [ + v[len(val) + 1:] + for v in user_variable + if v.startswith(val) + ] + ) + val_dict.update({val: x}) + + import pprint + pprint.pprint(val_dict) + val_json = json.dumps(val_dict) + + fields = { + 'targetformat': filetype.fusion_ext, + 'datadict': val_json, + 'image_mapping': '{}', + } + print fields + + r = requests.post( + fusion_server.url, data=fields, files={'tmpl_file': in_temp} + ) + in_temp.close() + if r.status_code == 400: + raise Exception("Problem with fusion server: %s" % r.json()) + + chunk_size = 1024 + + ext = filetype.human_ext + for chunk in r.iter_content(chunk_size): + out_temp.write(chunk) + out_temp.seek(0) + return out_temp.read(), ext diff --git a/py3o_server.py b/py3o_server.py new file mode 100644 index 00000000..957e7b81 --- /dev/null +++ b/py3o_server.py @@ -0,0 +1,12 @@ +from openerp.osv import fields, osv + + +class py3o_server(osv.Model): + _name = 'py3o.server' + + _columns = { + 'url': fields.char( + u"URL", + size=256, + ), + } diff --git a/py3o_server.xml b/py3o_server.xml new file mode 100644 index 00000000..ba3456a9 --- /dev/null +++ b/py3o_server.xml @@ -0,0 +1,40 @@ + + + + + py3o.server.configuration.form.view + py3o.server + +
+ + + + + +
+
+
+ + + py3o.server.configuration.tree.view + py3o.server + + + + + + + + + py3o.server.configuration.action + py3o.server + form + tree,form + + + +
+
diff --git a/py3o_template.py b/py3o_template.py new file mode 100644 index 00000000..c5392922 --- /dev/null +++ b/py3o_template.py @@ -0,0 +1,14 @@ +from openerp.osv import fields, osv + + +class py3o_template(osv.Model): + _name = 'py3o.template' + + _columns = { + 'name': fields.char( + u"Name", + ), + 'py3o_template_data': fields.binary( + u"LibreOffice template", + ), + } diff --git a/py3o_template.xml b/py3o_template.xml new file mode 100644 index 00000000..62625b52 --- /dev/null +++ b/py3o_template.xml @@ -0,0 +1,41 @@ + + + + + py3o.template.configuration.form.view + py3o.template + +
+ + + + + + +
+
+
+ + + py3o.template.configuration.tree.view + py3o.template + + + + + + + + + Py3o Templates Configuration + py3o.template + form + tree,form + + + +
+