Skip to content

Commit

Permalink
Merge pull request OCA#9 from akretion/py3o-usability
Browse files Browse the repository at this point in the history
Small usability improvements
  • Loading branch information
faide committed Oct 5, 2016
2 parents 8b9a824 + 2fbbdc9 commit c41dd46
Show file tree
Hide file tree
Showing 13 changed files with 240 additions and 159 deletions.
4 changes: 0 additions & 4 deletions report_py3o/NEWS

This file was deleted.

18 changes: 0 additions & 18 deletions report_py3o/README.md

This file was deleted.

94 changes: 94 additions & 0 deletions report_py3o/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3

===========
Report Py3o
===========

The py3o reporting engine is a reporting engine for Odoo based on `Libreoffice <http://www.libreoffice.org/>`_:

* the report is created with Libreoffice (ODT or ODS),
* the report is stored on the server in OpenDocument format (.odt or .ods file)
* the report is sent to the user in OpenDocument format or in any output format supported by Libreoffice (PDF, HTML, DOC, DOCX, Docbook, XLS, etc.)

The key advantages of a Libreoffice-based reporting engine are:

* no need to be a developper to create or modify a report: the report is created and modified with Libreoffice. So this reporting engine has a fully WYSIWYG report developpment tool!

* For a PDF report in A4/Letter format, it's easier to develop it with a tool such as Libreoffice that is designed to create A4/Letter documents than to develop it in HTML/CSS.

* If you want your users to be able to modify the document after its generation by Odoo, just configure the document with ODT output (or DOC or DOCX) and the user will be able to modify the document with Libreoffice (or Word) after its generation by Odoo.

* Easy development of spreadsheet reports in ODS format (XLS output possible).

This reporting engine is an alternative to `Aeroo <https://github.com/aeroo/aeroo_reports>`_: these 2 reporting engines have similar features but their codes are completely different.

Installation
============

You must install 2 additionnal python libs:

.. code::
pip install py3o.template
pip install py3o.formats
If you want to convert the ODT or ODS report in another format, you need several additionnal components and Python libs:

* `Py3o Fusion server <https://bitbucket.org/faide/py3o.fusion>`_
* `Py3o render server <https://bitbucket.org/faide/py3o.renderserver>`_
* Libreoffice started in the background in headless mode.

TODO : continue

Configuration
=============

If you want to convert the report in another format, go to the menu *Configuration > Technical > Reports > Py3o > Py3o Servers* and create a new Py3o server with its URL (for example: http://localhost:8765/form).

TODO: continue

Usage
=====

.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
:alt: Try me on Runbot
:target: https://runbot.odoo-community.org/runbot/143/9.0

Known issues / Roadmap
======================

* generate barcode ?

Bug Tracker
===========

Bugs are tracked on `GitHub Issues
<https://github.com/OCA/reporting-engine/issues>`_. In case of trouble, please
check there if your issue has already been reported. If you spotted it first,
help us smashing it by providing a detailed and welcomed feedback.

Credits
=======

Contributors
------------

* Florent Aide (`XCG Consulting <http://odoo.consulting/>`_)
* Laurent Mignon (Acsone)

Maintainer
----------

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

This module is maintained by the OCA.

OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.

To contribute to this module, please visit https://odoo-community.org.
19 changes: 6 additions & 13 deletions report_py3o/__openerp__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,15 @@
# Copyright 2013 XCG Consulting (http://odoo.consulting)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
'name': 'LibreOffice Report Engine',
'description': '''
Generation of LibreOffice/OpenOffice reports using LibreOffice/OpenOffice
templates.
The py3o.template package is required; install it with:
pip install py3o.template
''',
'name': 'Py3o Report Engine',
'summary': 'Reporting engine based on Libreoffice (ODT -> ODT, '
'ODT -> PDF, ODT -> DOC, ODT -> DOCX, ODS -> ODS, etc.)',
'version': '9.0.1.0.0',
'category': 'Reporting',
'author': 'XCG Consulting',
'license': 'AGPL-3',
'author': 'XCG Consulting,Odoo Community Association (OCA)',
'website': 'http://odoo.consulting/',
'depends': [
'base',
'report'
],
'depends': ['report'],
'external_dependencies': {
'python': ['py3o.template',
'py3o.formats']
Expand Down
25 changes: 16 additions & 9 deletions report_py3o/models/ir_report.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,22 @@
# Copyright 2013 XCG Consulting (http://odoo.consulting)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import os
from py3o.formats import Formats
from openerp import api, fields, models, _
from openerp.report.interface import report_int
from openerp.exceptions import ValidationError
from openerp import addons
from ..py3o_parser import Py3oParser
import logging

logger = logging.getLogger(__name__)

class ReportXml(models.Model):
try:
from py3o.formats import Formats
except ImportError:
logger.debug('Cannot import py3o.formats')


class IrActionsReportXml(models.Model):
""" Inherit from ir.actions.report.xml to allow customizing the template
file. The user cam chose a template from a list.
The list is configurable in the configuration tab, see py3o_template.py
Expand All @@ -22,8 +29,8 @@ class ReportXml(models.Model):
@api.constrains("py3o_filetype", "report_type")
def _check_py3o_filetype(self):
if self.report_type == "py3o" and not self.py3o_filetype:
raise ValidationError(
"Field 'Output Format' is required for Py3O report")
raise ValidationError(_(
"Field 'Output Format' is required for Py3O report"))

@api.one
@api.constrains("py3o_is_local_fusion", "py3o_server_id",
Expand All @@ -32,9 +39,9 @@ def _check_py3o_server_id(self):
is_native = Formats().get_format(self.py3o_filetype)
if ((not is_native or not self.py3o_is_local_fusion) and
not self.py3o_server_id):
raise ValidationError(
raise ValidationError(_(
"Can not use not native format in local fusion. "
"Please specify a Fusion Server")
"Please specify a Fusion Server"))

@api.model
def _get_py3o_filetypes(self):
Expand All @@ -55,14 +62,14 @@ def _get_py3o_filetypes(self):
'py3o.template',
"Template")
py3o_is_local_fusion = fields.Boolean(
"Local fusion",
"Local Fusion",
help="Native formats will be processed without a server. "
"You must use this mode if you call methods on your model into "
"the template.",
default=True)
py3o_server_id = fields.Many2one(
"py3o.server",
"Fusion server")
"Fusion Server")
module = fields.Char(
"Module",
help="The implementer module that provides this report")
Expand Down Expand Up @@ -116,4 +123,4 @@ def _lookup_report(self, cr, name):
if new_report:
return new_report
else:
return super(ReportXml, self)._lookup_report(cr, name)
return super(IrActionsReportXml, self)._lookup_report(cr, name)
6 changes: 5 additions & 1 deletion report_py3o/models/py3o_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@

class Py3oServer(models.Model):
_name = 'py3o.server'
_rec_name = 'url'

url = fields.Char("URL", required=True)
url = fields.Char(
"Py3o Fusion Server URL", required=True,
help="If your Py3o Fusion server is on the same machine and runs "
"on the default port, the URL is http://localhost:8765/form")
is_active = fields.Boolean("Active", default=True)
2 changes: 1 addition & 1 deletion report_py3o/models/py3o_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class Py3oTemplate(models.Model):
_name = 'py3o.template'

name = fields.Char(required=True)
py3o_template_data = fields.Binary("LibreOffice template")
py3o_template_data = fields.Binary("LibreOffice Template")
filetype = fields.Selection(
selection=[
('odt', "ODF Text Document"),
Expand Down
17 changes: 13 additions & 4 deletions report_py3o/py3o_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,23 @@
from base64 import b64decode
import requests
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 exceptions
from openerp.report.report_sxw import report_sxw
from openerp import registry
import logging

logger = logging.getLogger(__name__)

try:
from py3o.template.helpers import Py3oConvertor
from py3o.template import Template
except ImportError:
logger.debug('Cannot import py3o.template')
try:
from py3o.formats import Formats
except ImportError:
logger.debug('Cannot import py3o.formats')


_extender_functions = {}
Expand Down
2 changes: 1 addition & 1 deletion report_py3o/security/ir.model.access.csv
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_py3o_template_admin,access_py3o_template_admin,model_py3o_template,base.group_no_one,1,1,1,1
access_py3o_template_user,access_py3o_template_user,model_py3o_template,base.group_user,1,0,0,0
access_py3o_server_admin,access_py3o_server_admin,model_py3o_server,base.group_no_one,1,1,1,1
access_py3o_server_user,access_py3o_server_user,model_py3o_server,base.group_user,1,0,0,0
access_py3o_server_user,access_py3o_server_user,model_py3o_server,base.group_user,1,0,0,0
46 changes: 23 additions & 23 deletions report_py3o/views/ir_report.xml
Original file line number Diff line number Diff line change
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>

<!-- Inherit from base.act_report_xml_view to add py3o-related settings. -->
<!-- Inherit from base.act_report_xml_view to add py3o-related settings. -->

<record id="py3o_report_view" model="ir.ui.view">
<field name="name">py3o_report_view</field>
<field name="model">ir.actions.report.xml</field>
<field name="inherit_id" ref="base.act_report_xml_view" />
<field name="arch" type="xml">
<record id="py3o_report_view" model="ir.ui.view">
<field name="name">py3o_report_view</field>
<field name="model">ir.actions.report.xml</field>
<field name="inherit_id" ref="base.act_report_xml_view" />
<field name="arch" type="xml">

<xpath expr="//page[@name='security']" position="before">
<page string="LibreOffice template"
attrs="{'invisible': [('report_type', '!=', 'py3o')]}">
<xpath expr="//page[@name='security']" position="before">
<page string="LibreOffice Template" name="py3o_tab"
attrs="{'invisible': [('report_type', '!=', 'py3o')]}">

<group>
<field name="py3o_filetype" />
<field name="py3o_is_local_fusion"/>
<field name="py3o_server_id" />
<field name="py3o_template_id" />
<field name="module" />
<field name="py3o_template_fallback" />
</group>
<group name="py3o_params">
<field name="py3o_filetype" />
<field name="py3o_is_local_fusion"/>
<field name="py3o_server_id" />
<field name="py3o_template_id" />
<field name="module" />
<field name="py3o_template_fallback" />
</group>

</page>
</xpath>
</page>
</xpath>

</field>
</record>

</field>
</record>
</data>
</odoo>
10 changes: 5 additions & 5 deletions report_py3o/views/menu.xml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<menuitem id="py3o_config_menu"
name="Py3o"
parent="report.reporting_menuitem" />
</data>

<menuitem id="py3o_config_menu"
name="Py3o"
parent="report.reporting_menuitem" />

</odoo>

0 comments on commit c41dd46

Please sign in to comment.