[IMP] Allow user to use local fusion

pull/445/head
Laurent Mignon 2016-10-04 11:26:15 +02:00 committed by Elmeri Niemelä
parent 6d4efe1360
commit 10ce6f6c1c
8 changed files with 63 additions and 66 deletions

View File

@ -19,7 +19,8 @@ The py3o.template package is required; install it with:
'report' 'report'
], ],
'external_dependencies': { 'external_dependencies': {
'python': ['py3o.template'] 'python': ['py3o.template',
'py3o.formats']
}, },
'data': [ 'data': [
'security/ir.model.access.csv', 'security/ir.model.access.csv',
@ -28,8 +29,6 @@ The py3o.template package is required; install it with:
'views/py3o_template.xml', 'views/py3o_template.xml',
'views/py3o_server.xml', 'views/py3o_server.xml',
'views/ir_report.xml', 'views/ir_report.xml',
'data/py3o.fusion.filetype.csv',
], ],
'installable': True, 'installable': True,
} }

View File

@ -1,6 +0,0 @@
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
1 id fusion_ext human_ext
2 py3o_fusion_filetype_odt odt odt
3 py3o_fusion_filetype_ods ods ods
4 py3o_fusion_filetype_doc doc doc
5 py3o_fusion_filetype_docx docx docx
6 py3o_fusion_filetype_pdf pdf pdf

View File

@ -1,4 +1,3 @@
from . import ir_report from . import ir_report
from . import py3o_fusion_filetype
from . import py3o_template from . import py3o_template
from . import py3o_server from . import py3o_server

View File

@ -2,11 +2,12 @@
# Copyright 2013 XCG Consulting (http://odoo.consulting) # Copyright 2013 XCG Consulting (http://odoo.consulting)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import os import os
from py3o.formats import Formats
from openerp import api, fields, models from openerp import api, fields, models
from openerp.report.interface import report_int from openerp.report.interface import report_int
from ..py3o_parser import Py3oParser
from openerp.exceptions import ValidationError from openerp.exceptions import ValidationError
from openerp import addons from openerp import addons
from ..py3o_parser import Py3oParser
class ReportXml(models.Model): class ReportXml(models.Model):
@ -24,12 +25,40 @@ class ReportXml(models.Model):
raise ValidationError( raise ValidationError(
"Field 'Output Format' is required for Py3O report") "Field 'Output Format' is required for Py3O report")
py3o_fusion_filetype = fields.Many2one( @api.one
'py3o.fusion.filetype', @api.constrains("py3o_is_local_fusion", "py3o_server_id",
"Output Format") "py3o_fusion_filetype")
def _check_py3o_server_id(self):
is_native = Formats().get_format(self.py3o_fusion_filetype)
if ((not is_native or not self.py3o_is_local_fusion) and
not self.py3o_server_id):
raise ValidationError(
"Can not use not native format in local fusion. "
"Please specify a Fusion Server")
@api.model
def _get_py3o_fusion_filetypes(self):
formats = Formats()
names = formats.get_known_format_names()
selections = []
for name in names:
selections.append((name, name))
return selections
py3o_fusion_filetype = fields.Selection(
selection="_get_py3o_fusion_filetypes",
string="Output Format")
py3o_template_id = fields.Many2one( py3o_template_id = fields.Many2one(
'py3o.template', 'py3o.template',
"Template") "Template")
py3o_is_local_fusion = fields.Boolean(
"Local fusion",
help="Odt to Odt will be processed without sever. You must use this "
"mode if you call methods on your model into the template.",
default=False)
py3o_server_id = fields.Many2one(
"py3o.server"
"Fusion server")
module = fields.Char( module = fields.Char(
"Module", "Module",
help="The implementer module that provides this report") help="The implementer module that provides this report")

View File

@ -1,13 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2013 XCG Consulting (http://odoo.consulting)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from openerp import fields, models
class Py3oFusionFiletype(models.Model):
_name = 'py3o.fusion.filetype'
_rec_name = 'human_ext'
fusion_ext = fields.Char("Fusion Extension", siez=8)
human_ext = fields.Char("Human readble extension", size=8)

View File

@ -9,14 +9,15 @@ import sys
from base64 import b64decode from base64 import b64decode
import requests import requests
from tempfile import NamedTemporaryFile from tempfile import NamedTemporaryFile
from py3o.template.helpers import Py3oConvertor
from py3o.template import Template
from py3o.formats import Formats
from openerp import _ from openerp import _
from openerp import exceptions from openerp import exceptions
from openerp.report.report_sxw import report_sxw, rml_parse from openerp.report.report_sxw import report_sxw, rml_parse
from openerp import registry from openerp import registry
from py3o.template.helpers import Py3oConvertor
from py3o.template import Template
_extender_functions = {} _extender_functions = {}
@ -101,9 +102,9 @@ class Py3oParser(report_sxw):
# It is an absolute path # It is an absolute path
flbk_filename = os.path.normcase(os.path.normpath(tmpl_name)) flbk_filename = os.path.normcase(os.path.normpath(tmpl_name))
if flbk_filename and os.path.exists(flbk_filename): if flbk_filename and os.path.exists(flbk_filename):
# and it exists on the fileystem # and it exists on the fileystem
with open(flbk_filename, 'r') as tmpl: with open(flbk_filename, 'r') as tmpl:
tmpl_data = tmpl.read() tmpl_data = tmpl.read()
if tmpl_data is None: if tmpl_data is None:
# if for any reason the template is not found # if for any reason the template is not found
@ -152,47 +153,33 @@ class Py3oParser(report_sxw):
in_stream = StringIO(tmpl_data) in_stream = StringIO(tmpl_data)
out_stream = StringIO() out_stream = StringIO()
template = Template(in_stream, out_stream) template = Template(in_stream, out_stream)
expressions = template.get_all_user_python_expression() localcontext = parser_instance.localcontext
py_expression = template.convert_py3o_to_python_ast(expressions) if report_xml.py3o_is_local_fusion:
convertor = Py3oConvertor() template.render(localcontext)
data_struct = convertor(py_expression) input = out_stream.getvalue()
else:
expressions = template.get_all_user_python_expression()
py_expression = template.convert_py3o_to_python_ast(expressions)
convertor = Py3oConvertor()
data_struct = convertor(py_expression)
input = data_struct.render(localcontext)
filetype = report_xml.py3o_fusion_filetype filetype = report_xml.py3o_fusion_filetype
is_native = Formats().get_format(filetype)
datadict = parser_instance.localcontext if is_native:
res = input
parsed_datadict = data_struct.render(datadict)
fusion_server_obj = pool.get('py3o.server')
fusion_server_ids = fusion_server_obj.search(
cr, uid, [('is_active', '=', True)], context=context, limit=1
)
if not fusion_server_ids:
if filetype.fusion_ext == report_xml.py3o_template_id.filetype:
# No format conversion is needed, render the template directly
template.render(parsed_datadict)
res = out_stream.getvalue()
else:
raise exceptions.MissingError(
_(u"No Py3o server configuration found")
)
else: # Call py3o.server to render the template in the desired format else: # Call py3o.server to render the template in the desired format
fusion_server_id = fusion_server_ids[0]
fusion_server = fusion_server_obj.browse(
cr, uid, fusion_server_id, context=context
)
in_stream.seek(0) in_stream.seek(0)
files = { files = {
'tmpl_file': in_stream, 'tmpl_file': in_stream,
} }
fields = { fields = {
"targetformat": filetype.fusion_ext, "targetformat": filetype.fusion_ext,
"datadict": json.dumps(parsed_datadict), "datadict": json.dumps(input),
"image_mapping": "{}", "image_mapping": "{}",
} }
r = requests.post(fusion_server.url, data=fields, files=files) r = requests.post(
report_xml.py3o_server_id.url, data=fields, files=files)
if r.status_code != 200: if r.status_code != 200:
# server says we have an issue... let's tell that to enduser # server says we have an issue... let's tell that to enduser
raise exceptions.Warning( raise exceptions.Warning(
@ -212,7 +199,7 @@ class Py3oParser(report_sxw):
# ... but odoo wants the whole data in memory anyways :) # ... but odoo wants the whole data in memory anyways :)
res = fd.read() res = fd.read()
return res, filetype.human_ext return res, "." + filetype
def create(self, cr, uid, ids, data, context=None): def create(self, cr, uid, ids, data, context=None):
""" Override this function to handle our py3o report """ Override this function to handle our py3o report

View File

@ -15,6 +15,8 @@
<group> <group>
<field name="py3o_fusion_filetype" /> <field name="py3o_fusion_filetype" />
<field name="py3o_is_local_fusion"/>
<field name="py3o_server_id" />
<field name="py3o_template_id" /> <field name="py3o_template_id" />
<field name="module" /> <field name="module" />
<field name="py3o_template_fallback" /> <field name="py3o_template_fallback" />