Browse Source

Merge PR #1641 into 12.0

Signed-off-by kittiu
12.0
OCA-git-bot 5 years ago
parent
commit
54bcb67265
  1. 31
      excel_import_export/README.rst
  2. 1
      excel_import_export/__init__.py
  3. 9
      excel_import_export/__manifest__.py
  4. 4
      excel_import_export/controllers/__init__.py
  5. 53
      excel_import_export/controllers/main.py
  6. 61
      excel_import_export/i18n/excel_import_export.pot
  7. 1
      excel_import_export/models/__init__.py
  8. 42
      excel_import_export/models/common.py
  9. 39
      excel_import_export/models/ir_report.py
  10. 5
      excel_import_export/readme/HISTORY.rst
  11. 20
      excel_import_export/readme/USAGE.rst
  12. 82
      excel_import_export/static/description/index.html
  13. 88
      excel_import_export/static/src/js/report/action_manager_report.js
  14. 11
      excel_import_export/views/webclient_templates.xml
  15. 27
      excel_import_export_demo/README.rst
  16. 1
      excel_import_export_demo/__init__.py
  17. 8
      excel_import_export_demo/__manifest__.py
  18. 55
      excel_import_export_demo/i18n/excel_import_export_demo.pot
  19. 2
      excel_import_export_demo/readme/DESCRIPTION.rst
  20. 5
      excel_import_export_demo/readme/HISTORY.rst
  21. 14
      excel_import_export_demo/readme/USAGE.rst
  22. 4
      excel_import_export_demo/report_action/__init__.py
  23. 4
      excel_import_export_demo/report_action/partner_list/__init__.py
  24. BIN
      excel_import_export_demo/report_action/partner_list/partner_list.xlsx
  25. 10
      excel_import_export_demo/report_action/partner_list/report.xml
  26. 37
      excel_import_export_demo/report_action/partner_list/report_partner_list.py
  27. 43
      excel_import_export_demo/report_action/partner_list/report_partner_list.xml
  28. 29
      excel_import_export_demo/report_action/partner_list/templates.xml
  29. 13
      excel_import_export_demo/report_action/sale_order/report.xml
  30. BIN
      excel_import_export_demo/report_action/sale_order/sale_order_form.xlsx
  31. 36
      excel_import_export_demo/report_action/sale_order/templates.xml
  32. 61
      excel_import_export_demo/static/description/index.html

31
excel_import_export/README.rst

@ -1,6 +1,6 @@
===================
Excel Import/Export
===================
==========================
Excel Import/Export/Report
==========================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
@ -90,6 +90,26 @@ This create report menu with criteria wizard. (example - excel_import_export_dem
4. Create/Design Excel Template File (.xlsx), in the template, name the underlining tab used for report results -- <report_file>.xlsx
5. Create instruction dictionary for report in xlsx.template model -- templates.xml
**Note:**
Another option for reporting is to use report action (report_type='excel'), I.e.,
.. code-block:: xml
<report id='action_report_saleorder_excel'
string='Quotation / Order (.xlsx)'
model='sale.order'
name='sale_order.xlsx'
file='sale_order'
report_type='excel'
/>
By using report action, Odoo will find template using combination of model and name, then do the export for the underlining record.
Please see example in excel_import_export_demo/report_action, which shows,
1. Print excel from an active sale.order
2. Run partner list report based on search criteria.
Known issues / Roadmap
======================
@ -99,6 +119,11 @@ Known issues / Roadmap
Changelog
=========
12.0.1.0.3 (2019-08-09)
~~~~~~~~~~~~~~~~~~~~~~~
* Add report action for report_type = 'excel'
12.0.1.0.2 (2019-08-07)
~~~~~~~~~~~~~~~~~~~~~~~

1
excel_import_export/__init__.py

@ -3,3 +3,4 @@
from . import wizard
from . import models
from . import controllers

9
excel_import_export/__manifest__.py

@ -2,9 +2,9 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
{
'name': 'Excel Import/Export',
'summary': 'Base module for easy way to develop Excel import/export',
'version': '12.0.1.0.1',
'name': 'Excel Import/Export/Report',
'summary': 'Base module for developing Excel import/export/report',
'version': '12.0.1.0.2',
'author': 'Ecosoft,Odoo Community Association (OCA)',
'license': 'AGPL-3',
'website': 'https://github.com/OCA/server-tools/',
@ -22,8 +22,9 @@
'wizard/import_xlsx_wizard.xml',
'views/xlsx_template_view.xml',
'views/xlsx_report.xml',
'views/webclient_templates.xml',
],
'installable': True,
'development_status': 'alpha',
'development_status': 'beta',
'maintainers': ['kittiu'],
}

4
excel_import_export/controllers/__init__.py

@ -0,0 +1,4 @@
# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
from . import main

53
excel_import_export/controllers/main.py

@ -0,0 +1,53 @@
# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
import json
import base64
import time
from odoo.addons.web.controllers import main as report
from odoo.http import content_disposition, route, request
from odoo.tools.safe_eval import safe_eval
class ReportController(report.ReportController):
@route()
def report_routes(self, reportname, docids=None, converter=None, **data):
if converter == 'excel':
report = request.env['ir.actions.report']._get_report_from_name(
reportname)
context = dict(request.env.context)
if docids:
docids = [int(i) for i in docids.split(',')]
if data.get('options'):
data.update(json.loads(data.pop('options')))
if data.get('context'):
# Ignore 'lang' here, because the context in data is the one
# from the webclient *but* if the user explicitely wants to
# change the lang, this mechanism overwrites it.
data['context'] = json.loads(data['context'])
if data['context'].get('lang'):
del data['context']['lang']
context.update(data['context'])
excel = report.with_context(context).render_excel(
docids, data=data
)[0]
excel = base64.decodestring(excel)
report_name = report.report_file
if report.print_report_name and not len(docids) > 1:
obj = request.env[report.model].browse(docids[0])
report_name = safe_eval(report.print_report_name,
{'object': obj, 'time': time})
excelhttpheaders = [
('Content-Type', 'application/vnd.openxmlformats-'
'officedocument.spreadsheetml.sheet'),
('Content-Length', len(excel)),
(
'Content-Disposition',
content_disposition(report_name + '.xlsx')
)
]
return request.make_response(excel, headers=excelhttpheaders)
return super(ReportController, self).report_routes(
reportname, docids, converter, **data
)

61
excel_import_export/i18n/excel_import_export.pot

@ -161,6 +161,13 @@ msgstr ""
msgid "<code>value</code>: value from <b>Field</b>"
msgstr ""
#. module: excel_import_export
#. openerp-web
#: code:addons/excel_import_export/static/src/js/report/action_manager_report.js:49
#, python-format
msgid "A popup window with your report was blocked. You may need to change your browser settings to allow popup windows for this page."
msgstr ""
#. module: excel_import_export
#: model_terms:ir.ui.view,arch_db:excel_import_export.view_xlsx_template_form
msgid "Add data column"
@ -370,6 +377,11 @@ msgid "Error importing data\n"
"%s"
msgstr ""
#. module: excel_import_export
#: selection:ir.actions.report,report_type:0
msgid "Excel"
msgstr ""
#. module: excel_import_export
#: model:ir.model,name:excel_import_export.model_xlsx_export
msgid "Excel Export AbstractModel"
@ -494,6 +506,11 @@ msgstr ""
msgid "Group Name"
msgstr ""
#. module: excel_import_export
#: selection:ir.actions.report,report_type:0
msgid "HTML"
msgstr ""
#. module: excel_import_export
#: selection:xlsx.template.export,section_type:0
#: selection:xlsx.template.import,section_type:0
@ -728,6 +745,12 @@ msgstr ""
msgid "Not enough worksheets"
msgstr ""
#. module: excel_import_export
#: code:addons/excel_import_export/models/ir_report.py:17
#, python-format
msgid "Only one id is allowed for excel_import_export"
msgstr ""
#. module: excel_import_export
#: model:ir.model.fields,help:excel_import_export.field_xlsx_template__redirect_action
msgid "Optional action, redirection after finish import operation"
@ -748,6 +771,11 @@ msgstr ""
msgid "Optional for CSV, default is full quoting."
msgstr ""
#. module: excel_import_export
#: selection:ir.actions.report,report_type:0
msgid "PDF"
msgstr ""
#. module: excel_import_export
#: code:addons/excel_import_export/wizard/import_xlsx_wizard.py:146
#, python-format
@ -784,6 +812,16 @@ msgstr ""
msgid "Records in %s exceed max records allowed"
msgstr ""
#. module: excel_import_export
#: model:ir.model,name:excel_import_export.model_ir_actions_report
msgid "Report Action"
msgstr ""
#. module: excel_import_export
#: model:ir.model.fields,field_description:excel_import_export.field_ir_actions_report__report_type
msgid "Report Type"
msgstr ""
#. module: excel_import_export
#: model:ir.model.fields,field_description:excel_import_export.field_export_xlsx_wizard__res_id
#: model:ir.model.fields,field_description:excel_import_export.field_import_xlsx_wizard__res_id
@ -886,6 +924,12 @@ msgstr ""
msgid "Template"
msgstr ""
#. module: excel_import_export
#: code:addons/excel_import_export/models/ir_report.py:23
#, python-format
msgid "Template %s on model %s is not unique!"
msgstr ""
#. module: excel_import_export
#: model:ir.model.fields,field_description:excel_import_export.field_import_xlsx_wizard__fname
#: model:ir.model.fields,field_description:excel_import_export.field_xlsx_template__name
@ -905,6 +949,11 @@ msgstr ""
msgid "Template's model mismatch"
msgstr ""
#. module: excel_import_export
#: selection:ir.actions.report,report_type:0
msgid "Text"
msgstr ""
#. module: excel_import_export
#: model:ir.model.fields,help:excel_import_export.field_xlsx_template__res_model
msgid "The database object this attachment will be attached to."
@ -916,6 +965,11 @@ msgstr ""
msgid "The selected redirect action is not for model %s"
msgstr ""
#. module: excel_import_export
#: model:ir.model.fields,help:excel_import_export.field_ir_actions_report__report_type
msgid "The type of the report that will be rendered, each one having its own rendering method. HTML means the report will be opened directly in your browser PDF means the report will be rendered using Wkhtmltopdf and downloaded by the user."
msgstr ""
#. module: excel_import_export
#: code:addons/excel_import_export/wizard/import_xlsx_wizard.py:89
#, python-format
@ -933,6 +987,13 @@ msgstr ""
msgid "This is used to construct instruction in tab Import/Export"
msgstr ""
#. module: excel_import_export
#. openerp-web
#: code:addons/excel_import_export/static/src/js/report/action_manager_report.js:52
#, python-format
msgid "Warning"
msgstr ""
#. module: excel_import_export
#: model:ir.model,name:excel_import_export.model_export_xlsx_wizard
msgid "Wizard for exporting excel"

1
excel_import_export/models/__init__.py

@ -6,3 +6,4 @@ from . import xlsx_export
from . import xlsx_import
from . import xlsx_template
from . import xlsx_report
from . import ir_report

42
excel_import_export/models/common.py

@ -180,28 +180,28 @@ def xlrd_get_sheet_by_name(book, name):
raise ValidationError(_("'%s' sheet not found") % (name,))
def isfloat(input):
def isfloat(input_val):
try:
float(input)
float(input_val)
return True
except ValueError:
return False
def isinteger(input):
def isinteger(input_val):
try:
int(input)
int(input_val)
return True
except ValueError:
return False
def isdatetime(input):
def isdatetime(input_val):
try:
if len(input) == 10:
dt.strptime(input, '%Y-%m-%d')
elif len(input) == 19:
dt.strptime(input, '%Y-%m-%d %H:%M:%S')
if len(input_val) == 10:
dt.strptime(input_val, '%Y-%m-%d')
elif len(input_val) == 19:
dt.strptime(input_val, '%Y-%m-%d %H:%M:%S')
else:
return False
return True
@ -209,18 +209,18 @@ def isdatetime(input):
return False
def str_to_number(input):
if isinstance(input, str):
if ' ' not in input:
if isdatetime(input):
return parse(input)
elif isinteger(input):
if not (len(input) > 1 and input[:1] == '0'):
return int(input)
elif isfloat(input):
if not (input.find(".") > 2 and input[:1] == '0'): # 00.123
return float(input)
return input
def str_to_number(input_val):
if isinstance(input_val, str):
if ' ' not in input_val:
if isdatetime(input_val):
return parse(input_val)
elif isinteger(input_val):
if not (len(input_val) > 1 and input_val[:1] == '0'):
return int(input_val)
elif isfloat(input_val):
if not (input_val.find(".") > 2 and input_val[:1] == '0'):
return float(input_val)
return input_val
def csv_from_excel(excel_content, delimiter, quote):

39
excel_import_export/models/ir_report.py

@ -0,0 +1,39 @@
# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
from odoo import api, fields, models, _
from odoo.exceptions import UserError
class ReportAction(models.Model):
_inherit = "ir.actions.report"
report_type = fields.Selection(selection_add=[("excel", "Excel")])
@api.model
def render_excel(self, docids, data):
if len(docids) != 1:
raise UserError(
_('Only one id is allowed for excel_import_export'))
xlsx_template = self.env['xlsx.template'].search(
[('fname', '=', self.report_name), ('res_model', '=', self.model)])
if not xlsx_template or len(xlsx_template) != 1:
raise UserError(
_("Template %s on model %s is not unique!" %
(self.report_name, self.model)))
Export = self.env['xlsx.export']
return Export.export_xlsx(xlsx_template, self.model, docids[0])
@api.model
def _get_report_from_name(self, report_name):
res = super(ReportAction, self)._get_report_from_name(report_name)
if res:
return res
report_obj = self.env['ir.actions.report']
qwebtypes = ['excel']
conditions = [
('report_type', 'in', qwebtypes),
('report_name', '=', report_name),
]
context = self.env['res.users'].context_get()
return report_obj.with_context(context).search(conditions, limit=1)

5
excel_import_export/readme/HISTORY.rst

@ -1,3 +1,8 @@
12.0.1.0.3 (2019-08-09)
~~~~~~~~~~~~~~~~~~~~~~~
* Add report action for report_type = 'excel'
12.0.1.0.2 (2019-08-07)
~~~~~~~~~~~~~~~~~~~~~~~

20
excel_import_export/readme/USAGE.rst

@ -39,3 +39,23 @@ This create report menu with criteria wizard. (example - excel_import_export_dem
3. Create report model as models.Transient, then define search criteria fields, and get reporing data into ``results`` field -- <report>.py
4. Create/Design Excel Template File (.xlsx), in the template, name the underlining tab used for report results -- <report_file>.xlsx
5. Create instruction dictionary for report in xlsx.template model -- templates.xml
**Note:**
Another option for reporting is to use report action (report_type='excel'), I.e.,
.. code-block:: xml
<report id='action_report_saleorder_excel'
string='Quotation / Order (.xlsx)'
model='sale.order'
name='sale_order.xlsx'
file='sale_order'
report_type='excel'
/>
By using report action, Odoo will find template using combination of model and name, then do the export for the underlining record.
Please see example in excel_import_export_demo/report_action, which shows,
1. Print excel from an active sale.order
2. Run partner list report based on search criteria.

82
excel_import_export/static/description/index.html

@ -4,7 +4,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
<title>Excel Import/Export</title>
<title>Excel Import/Export/Report</title>
<style type="text/css">
/*
@ -360,8 +360,8 @@ ul.auto-toc {
</style>
</head>
<body>
<div class="document" id="excel-import-export">
<h1 class="title">Excel Import/Export</h1>
<div class="document" id="excel-import-export-report">
<h1 class="title">Excel Import/Export/Report</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
@ -379,32 +379,33 @@ ul.auto-toc {
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#installation" id="id4">Installation</a></li>
<li><a class="reference internal" href="#usage" id="id5">Usage</a></li>
<li><a class="reference internal" href="#known-issues-roadmap" id="id6">Known issues / Roadmap</a></li>
<li><a class="reference internal" href="#changelog" id="id7">Changelog</a><ul>
<li><a class="reference internal" href="#id1" id="id8">12.0.1.0.2 (2019-08-07)</a></li>
<li><a class="reference internal" href="#id2" id="id9">12.0.1.0.1 (2019-06-24)</a></li>
<li><a class="reference internal" href="#id3" id="id10">12.0.1.0.0 (2019-02-24)</a></li>
<li><a class="reference internal" href="#installation" id="id5">Installation</a></li>
<li><a class="reference internal" href="#usage" id="id6">Usage</a></li>
<li><a class="reference internal" href="#known-issues-roadmap" id="id7">Known issues / Roadmap</a></li>
<li><a class="reference internal" href="#changelog" id="id8">Changelog</a><ul>
<li><a class="reference internal" href="#id1" id="id9">12.0.1.0.3 (2019-08-09)</a></li>
<li><a class="reference internal" href="#id2" id="id10">12.0.1.0.2 (2019-08-07)</a></li>
<li><a class="reference internal" href="#id3" id="id11">12.0.1.0.1 (2019-06-24)</a></li>
<li><a class="reference internal" href="#id4" id="id12">12.0.1.0.0 (2019-02-24)</a></li>
</ul>
</li>
<li><a class="reference internal" href="#bug-tracker" id="id11">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id12">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id13">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id14">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id15">Maintainers</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id13">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id14">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id15">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id16">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id17">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="installation">
<h1><a class="toc-backref" href="#id4">Installation</a></h1>
<h1><a class="toc-backref" href="#id5">Installation</a></h1>
<p>To install this module, you need to install following python library, <strong>xlrd, xlwt, openpyxl</strong>.</p>
<p>Then, simply install <strong>excel_import_export</strong>.</p>
<p>For demo, install <strong>excel_import_export_demo</strong>.</p>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id5">Usage</a></h1>
<h1><a class="toc-backref" href="#id6">Usage</a></h1>
<p>This module contain pre-defined function and wizards to make exporting, importing and reporting easy.</p>
<p>At the heart of this module, there are 2 <cite>main methods</cite></p>
<ul class="simple">
@ -441,37 +442,60 @@ ul.auto-toc {
<li>Create/Design Excel Template File (.xlsx), in the template, name the underlining tab used for report results – &lt;report_file&gt;.xlsx</li>
<li>Create instruction dictionary for report in xlsx.template model – templates.xml</li>
</ol>
<p><strong>Note:</strong></p>
<p>Another option for reporting is to use report action (report_type=’excel’), I.e.,</p>
<pre class="code xml literal-block">
<span class="nt">&lt;report</span> <span class="na">id=</span><span class="s">'action_report_saleorder_excel'</span>
<span class="na">string=</span><span class="s">'Quotation / Order (.xlsx)'</span>
<span class="na">model=</span><span class="s">'sale.order'</span>
<span class="na">name=</span><span class="s">'sale_order.xlsx'</span>
<span class="na">file=</span><span class="s">'sale_order'</span>
<span class="na">report_type=</span><span class="s">'excel'</span>
<span class="nt">/&gt;</span>
</pre>
<p>By using report action, Odoo will find template using combination of model and name, then do the export for the underlining record.
Please see example in excel_import_export_demo/report_action, which shows,</p>
<ol class="arabic simple">
<li>Print excel from an active sale.order</li>
<li>Run partner list report based on search criteria.</li>
</ol>
</div>
<div class="section" id="known-issues-roadmap">
<h1><a class="toc-backref" href="#id6">Known issues / Roadmap</a></h1>
<h1><a class="toc-backref" href="#id7">Known issues / Roadmap</a></h1>
<ul class="simple">
<li>Module extension e.g., excel_import_export_async, that add ability to execute as async process.</li>
<li>Ability to add contextual action in XLSX Tempalte, e.g., Add import action, Add export action. In similar manner as in Server Action.</li>
</ul>
</div>
<div class="section" id="changelog">
<h1><a class="toc-backref" href="#id7">Changelog</a></h1>
<h1><a class="toc-backref" href="#id8">Changelog</a></h1>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id8">12.0.1.0.2 (2019-08-07)</a></h2>
<h2><a class="toc-backref" href="#id9">12.0.1.0.3 (2019-08-09)</a></h2>
<ul class="simple">
<li>Small fix, to ensure that system parameter ‘path_temp_file’ (ir.config_parameter) is readable</li>
<li>Add report action for report_type = ‘excel’</li>
</ul>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id9">12.0.1.0.1 (2019-06-24)</a></h2>
<h2><a class="toc-backref" href="#id10">12.0.1.0.2 (2019-08-07)</a></h2>
<ul class="simple">
<li>Fix wizard on v12 can’t download sample template file - <a class="reference external" href="https://github.com/OCA/server-tools/issues/1574">https://github.com/OCA/server-tools/issues/1574</a></li>
<li>Small fix, to ensure that system parameter ‘path_temp_file’ (ir.config_parameter) is readable</li>
</ul>
</div>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id10">12.0.1.0.0 (2019-02-24)</a></h2>
<h2><a class="toc-backref" href="#id11">12.0.1.0.1 (2019-06-24)</a></h2>
<ul class="simple">
<li>Fix wizard on v12 can’t download sample template file - <a class="reference external" href="https://github.com/OCA/server-tools/issues/1574">https://github.com/OCA/server-tools/issues/1574</a></li>
</ul>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id12">12.0.1.0.0 (2019-02-24)</a></h2>
<ul class="simple">
<li>Start of the history</li>
</ul>
</div>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id11">Bug Tracker</a></h1>
<h1><a class="toc-backref" href="#id13">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/server-tools/issues">GitHub Issues</a>.
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
@ -479,21 +503,21 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id12">Credits</a></h1>
<h1><a class="toc-backref" href="#id14">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id13">Authors</a></h2>
<h2><a class="toc-backref" href="#id15">Authors</a></h2>
<ul class="simple">
<li>Ecosoft</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id14">Contributors</a></h2>
<h2><a class="toc-backref" href="#id16">Contributors</a></h2>
<ul class="simple">
<li>Kitti Upariphutthiphong. &lt;<a class="reference external" href="mailto:kittiu&#64;gmail.com">kittiu&#64;gmail.com</a>&gt; (<a class="reference external" href="http://ecosoft.co.th">http://ecosoft.co.th</a>)</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id15">Maintainers</a></h2>
<h2><a class="toc-backref" href="#id17">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose

88
excel_import_export/static/src/js/report/action_manager_report.js

@ -0,0 +1,88 @@
// Copyright 2019 Ecosoft Co., Ltd.
// License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl.html).
odoo.define("excel_import_export.report", function (require) {
"use strict";
var core = require("web.core");
var ActionManager = require("web.ActionManager");
var crash_manager = require("web.crash_manager");
var framework = require("web.framework");
var session = require("web.session");
var _t = core._t;
ActionManager.include({
_downloadReportExcel: function (url, actions) {
framework.blockUI();
var def = $.Deferred();
var type = "excel";
var cloned_action = _.clone(actions);
if (_.isUndefined(cloned_action.data) ||
_.isNull(cloned_action.data) ||
(_.isObject(cloned_action.data) && _.isEmpty(cloned_action.data)))
{
if (cloned_action.context.active_ids) {
url += "/" + cloned_action.context.active_ids.join(',');
}
} else {
url += "?options=" + encodeURIComponent(JSON.stringify(cloned_action.data));
url += "&context=" + encodeURIComponent(JSON.stringify(cloned_action.context));
}
var blocked = !session.get_file({
url: url,
data: {
data: JSON.stringify([url, type]),
},
success: def.resolve.bind(def),
error: function () {
crash_manager.rpc_error.apply(crash_manager, arguments);
def.reject();
},
complete: framework.unblockUI,
});
if (blocked) {
// AAB: this check should be done in get_file service directly,
// should not be the concern of the caller (and that way, get_file
// could return a deferred)
var message = _t('A popup window with your report was blocked. You ' +
'may need to change your browser settings to allow ' +
'popup windows for this page.');
this.do_warn(_t('Warning'), message, true);
}
return def;
},
_triggerDownload: function (action, options, type) {
var self = this;
var reportUrls = this._makeReportUrls(action);
if (type === "excel") {
return this._downloadReportExcel(reportUrls[type], action).then(function () {
if (action.close_on_report_download) {
var closeAction = {type: 'ir.actions.act_window_close'};
return self.doAction(closeAction, _.pick(options, 'on_close'));
} else {
return options.on_close();
}
});
}
return this._super.apply(this, arguments);
},
_makeReportUrls: function (action) {
var reportUrls = this._super.apply(this, arguments);
reportUrls.excel = '/report/excel/' + action.report_name;
return reportUrls;
},
_executeReportAction: function (action, options) {
var self = this;
if (action.report_type === 'excel') {
return self._triggerDownload(action, options, 'excel');
}
return this._super.apply(this, arguments);
}
});
});

11
excel_import_export/views/webclient_templates.xml

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!--
Copyright 2019 Ecosoft Co., Ltd.
License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).-->
<odoo>
<template id="assets_backend" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<script type="text/javascript" src="/excel_import_export/static/src/js/report/action_manager_report.js"/>
</xpath>
</template>
</odoo>

27
excel_import_export_demo/README.rst

@ -1,6 +1,6 @@
========================
Excel Import/Export Demo
========================
===============================
Excel Import/Export/Report Demo
===============================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
@ -27,6 +27,8 @@ This module provide some example use case for excel_import_export
1. Import/Export Sales Order (import_export_sale_order)
2. Import New Sales Orders (import_sale_orders)
3. Sales Orders Report (report_sale_order)
4. Print Quoation / Order (.xlsx) (report_action/sale_order)
5. Run Partner List Report (report_action/partner_list)
**Table of contents**
@ -43,21 +45,34 @@ Then, simply install **excel_import_export_demo**.
Usage
=====
**Use Case 1:** Export/Import Excel on existing document
**Example 1:** Export/Import Excel on existing document
To test this use case, go to any Sales Order and use Export Excel or Import Excel in action menu.
**Use Case 2:** Import Excel Files
**Example 2:** Import Excel Files
To test this use case, go to Settings > Excel Import/Export > Sample Import Sales Order
**Use Case 3:** Create Excel Report
**Example 3:** Create Excel Report
To test this use case, go to Settings > Excel Import/Export > Sample Sales Report
**Example 4:** Printout Excel on existing document, using report action
To test this use case, go to any Sales Order and click print "Quotation / Order (.xlsx)".
**Example 5:** Run Partner List Report, using report action
To test this use case, go to menu Sales > Reporting > Partner List Report
Changelog
=========
12.0.1.0.0 (2019-08-09)
~~~~~~~~~~~~~~~~~~~~~~~
* Add 2 new examples using report action, 1) sale_order 2) partner_list
12.0.1.0.0 (2019-02-24)
~~~~~~~~~~~~~~~~~~~~~~~

1
excel_import_export_demo/__init__.py

@ -3,3 +3,4 @@
from . import import_export_sale_order
from . import report_sale_order
from . import report_action

8
excel_import_export_demo/__manifest__.py

@ -1,7 +1,7 @@
# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
{'name': 'Excel Import/Export Demo',
{'name': 'Excel Import/Export/Report Demo',
'version': '12.0.1.0.0',
'author': 'Ecosoft,Odoo Community Association (OCA)',
'license': 'AGPL-3',
@ -15,6 +15,12 @@
'report_sale_order/templates.xml',
'import_sale_orders/menu_action.xml',
'import_sale_orders/templates.xml',
# Use report action
'report_action/sale_order/report.xml',
'report_action/sale_order/templates.xml',
'report_action/partner_list/report.xml',
'report_action/partner_list/templates.xml',
'report_action/partner_list/report_partner_list.xml',
],
'installable': True,
'development_status': 'alpha',

55
excel_import_export_demo/i18n/excel_import_export_demo.pot

@ -24,26 +24,44 @@ msgstr ""
msgid "Allow Choose Template"
msgstr ""
#. module: excel_import_export_demo
#: model_terms:ir.ui.view,arch_db:excel_import_export_demo.partner_list_wizard
msgid "Cancel"
msgstr ""
#. module: excel_import_export_demo
#: selection:report.sale.order,state:0
msgid "Choose"
msgstr ""
#. module: excel_import_export_demo
#: model:ir.model.fields,field_description:excel_import_export_demo.field_report_partner_list__create_uid
#: model:ir.model.fields,field_description:excel_import_export_demo.field_report_sale_order__create_uid
msgid "Created by"
msgstr ""
#. module: excel_import_export_demo
#: model:ir.model.fields,field_description:excel_import_export_demo.field_report_partner_list__create_date
#: model:ir.model.fields,field_description:excel_import_export_demo.field_report_sale_order__create_date
msgid "Created on"
msgstr ""
#. module: excel_import_export_demo
#: model:ir.model.fields,field_description:excel_import_export_demo.field_report_partner_list__customer
msgid "Customer"
msgstr ""
#. module: excel_import_export_demo
#: model:ir.model.fields,field_description:excel_import_export_demo.field_report_partner_list__display_name
#: model:ir.model.fields,field_description:excel_import_export_demo.field_report_sale_order__display_name
msgid "Display Name"
msgstr ""
#. module: excel_import_export_demo
#: model_terms:ir.ui.view,arch_db:excel_import_export_demo.partner_list_wizard
msgid "Execute"
msgstr ""
#. module: excel_import_export_demo
#: model:ir.actions.act_window,name:excel_import_export_demo.action_sale_oder_export_xlsx
msgid "Export Excel"
@ -65,6 +83,7 @@ msgid "Get"
msgstr ""
#. module: excel_import_export_demo
#: model:ir.model.fields,field_description:excel_import_export_demo.field_report_partner_list__id
#: model:ir.model.fields,field_description:excel_import_export_demo.field_report_sale_order__id
msgid "ID"
msgstr ""
@ -75,26 +94,47 @@ msgid "Import Excel"
msgstr ""
#. module: excel_import_export_demo
#: model:ir.model.fields,field_description:excel_import_export_demo.field_report_partner_list____last_update
#: model:ir.model.fields,field_description:excel_import_export_demo.field_report_sale_order____last_update
msgid "Last Modified on"
msgstr ""
#. module: excel_import_export_demo
#: model:ir.model.fields,field_description:excel_import_export_demo.field_report_partner_list__write_uid
#: model:ir.model.fields,field_description:excel_import_export_demo.field_report_sale_order__write_uid
msgid "Last Updated by"
msgstr ""
#. module: excel_import_export_demo
#: model:ir.model.fields,field_description:excel_import_export_demo.field_report_partner_list__write_date
#: model:ir.model.fields,field_description:excel_import_export_demo.field_report_sale_order__write_date
msgid "Last Updated on"
msgstr ""
#. module: excel_import_export_demo
#: model:ir.model.fields,field_description:excel_import_export_demo.field_report_partner_list__partner_ids
#: model:ir.model.fields,field_description:excel_import_export_demo.field_report_sale_order__partner_id
msgid "Partner"
msgstr ""
#. module: excel_import_export_demo
#: model:ir.actions.report,name:excel_import_export_demo.action_report_partner_excel
msgid "Partner List (.xlsx)"
msgstr ""
#. module: excel_import_export_demo
#: model:ir.actions.act_window,name:excel_import_export_demo.action_report_partner_list
#: model:ir.ui.menu,name:excel_import_export_demo.menu_report_partner_list
msgid "Partner List Report"
msgstr ""
#. module: excel_import_export_demo
#: model:ir.actions.report,name:excel_import_export_demo.action_report_saleorder_excel
msgid "Quotation / Order (.xlsx)"
msgstr ""
#. module: excel_import_export_demo
#: model:ir.model.fields,field_description:excel_import_export_demo.field_report_partner_list__results
#: model:ir.model.fields,field_description:excel_import_export_demo.field_report_sale_order__results
msgid "Results"
msgstr ""
@ -116,16 +156,31 @@ msgstr ""
msgid "State"
msgstr ""
#. module: excel_import_export_demo
#: model:ir.model.fields,field_description:excel_import_export_demo.field_report_partner_list__supplier
msgid "Supplier"
msgstr ""
#. module: excel_import_export_demo
#: model:ir.model.fields,field_description:excel_import_export_demo.field_report_sale_order__template_id
msgid "Template"
msgstr ""
#. module: excel_import_export_demo
#: model:ir.model.fields,help:excel_import_export_demo.field_report_partner_list__results
msgid "Use compute fields, so there is nothing store in database"
msgstr ""
#. module: excel_import_export_demo
#: model:ir.model.fields,help:excel_import_export_demo.field_report_sale_order__results
msgid "Use compute fields, so there is nothing stored in database"
msgstr ""
#. module: excel_import_export_demo
#: model:ir.model,name:excel_import_export_demo.model_report_partner_list
msgid "Wizard for report.partner.list"
msgstr ""
#. module: excel_import_export_demo
#: model:ir.model,name:excel_import_export_demo.model_report_sale_order
msgid "Wizard for report.sale.order"

2
excel_import_export_demo/readme/DESCRIPTION.rst

@ -3,3 +3,5 @@ This module provide some example use case for excel_import_export
1. Import/Export Sales Order (import_export_sale_order)
2. Import New Sales Orders (import_sale_orders)
3. Sales Orders Report (report_sale_order)
4. Print Quoation / Order (.xlsx) (report_action/sale_order)
5. Run Partner List Report (report_action/partner_list)

5
excel_import_export_demo/readme/HISTORY.rst

@ -1,3 +1,8 @@
12.0.1.0.0 (2019-08-09)
~~~~~~~~~~~~~~~~~~~~~~~
* Add 2 new examples using report action, 1) sale_order 2) partner_list
12.0.1.0.0 (2019-02-24)
~~~~~~~~~~~~~~~~~~~~~~~

14
excel_import_export_demo/readme/USAGE.rst

@ -1,11 +1,19 @@
**Use Case 1:** Export/Import Excel on existing document
**Example 1:** Export/Import Excel on existing document
To test this use case, go to any Sales Order and use Export Excel or Import Excel in action menu.
**Use Case 2:** Import Excel Files
**Example 2:** Import Excel Files
To test this use case, go to Settings > Excel Import/Export > Sample Import Sales Order
**Use Case 3:** Create Excel Report
**Example 3:** Create Excel Report
To test this use case, go to Settings > Excel Import/Export > Sample Sales Report
**Example 4:** Printout Excel on existing document, using report action
To test this use case, go to any Sales Order and click print "Quotation / Order (.xlsx)".
**Example 5:** Run Partner List Report, using report action
To test this use case, go to menu Sales > Reporting > Partner List Report

4
excel_import_export_demo/report_action/__init__.py

@ -0,0 +1,4 @@
# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
from . import partner_list

4
excel_import_export_demo/report_action/partner_list/__init__.py

@ -0,0 +1,4 @@
# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
from . import report_partner_list

BIN
excel_import_export_demo/report_action/partner_list/partner_list.xlsx

10
excel_import_export_demo/report_action/partner_list/report.xml

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<report id='action_report_partner_excel'
string='Partner List (.xlsx)'
model='report.partner.list'
name='partner_list.xlsx'
file='partner_list'
report_type='excel'
/>
</odoo>

37
excel_import_export_demo/report_action/partner_list/report_partner_list.py

@ -0,0 +1,37 @@
# Copyright 2019 Ecosoft Co., Ltd (http://ecosoft.co.th/)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
from odoo import models, fields, api
class ReportPartnerList(models.TransientModel):
_name = 'report.partner.list'
_description = 'Wizard for report.partner.list'
partner_ids = fields.Many2many(
comodel_name='res.partner',
)
supplier = fields.Boolean(
default=True,
)
customer = fields.Boolean(
default=True,
)
results = fields.Many2many(
'res.partner',
string='Results',
compute='_compute_results',
help='Use compute fields, so there is nothing store in database',
)
@api.multi
def _compute_results(self):
""" On the wizard, result will be computed and added to results line
before export to excel by report_excel action
"""
self.ensure_one()
domain = ['|', ('supplier', '=', self.supplier),
('customer', '=', self.customer)]
if self.partner_ids:
domain.append(('id', 'in', self.partner_ids.ids))
self.results = self.env['res.partner'].search(domain, order='id')

43
excel_import_export_demo/report_action/partner_list/report_partner_list.xml

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="partner_list_wizard" model="ir.ui.view">
<field name="name">partner.list.wizard</field>
<field name="model">report.partner.list</field>
<field name="arch" type="xml">
<form>
<group>
<group>
<field name="partner_ids" widget="many2many_tags"/>
</group>
<group>
<field name="customer"/>
<field name="supplier"/>
</group>
</group>
<footer>
<button name='%(excel_import_export_demo.action_report_partner_excel)d'
type='action' string='Execute'
class='oe_highlight'/>
<button special='cancel'
string='Cancel'/>
</footer>
</form>
</field>
</record>
<record id='action_report_partner_list' model='ir.actions.act_window'>
<field name='name'>Partner List Report</field>
<field name='res_model'>report.partner.list</field>
<field name='view_type'>form</field>
<field name='view_mode'>form</field>
<field name='target'>new</field>
</record>
<menuitem id="menu_report_partner_list"
parent="sale.menu_sale_report"
action="action_report_partner_list"
name="Partner List Report"
/>
</odoo>

29
excel_import_export_demo/report_action/partner_list/templates.xml

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="partner_list_xlsx_template" model="xlsx.template">
<field name="res_model">report.partner.list</field>
<field name="fname">partner_list.xlsx</field>
<field name="name">Partner List Report Template</field>
<field name="description">Sample Partner List Report Template for testing</field>
<field name="input_instruction">
{
'__EXPORT__': {
1: {
'results': {
'A4': 'id',
'B4': 'name${value or ""}#{style=text}',
'C4': 'phone${value or ""}#{style=text}',
'D4': 'email${value or ""}#{style=text}',
}
}
},
}
</field>
</record>
<function model="xlsx.template" name="load_xlsx_template">
<value eval="[ref('partner_list_xlsx_template')]"/>
</function>
</odoo>

13
excel_import_export_demo/report_action/sale_order/report.xml

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<report id='action_report_saleorder_excel'
string='Quotation / Order (.xlsx)'
model='sale.order'
name='sale_order_form.xlsx'
file='sale_order'
print_report_name="(object.state in ('draft', 'sent') and 'Quotation - %s' % (object.name)) or 'Order - %s' % (object.name)"
report_type='excel'
/>
</odoo>

BIN
excel_import_export_demo/report_action/sale_order/sale_order_form.xlsx

36
excel_import_export_demo/report_action/sale_order/templates.xml

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="sale_order_excel_template" model="xlsx.template">
<field name="res_model">sale.order</field>
<field name="fname">sale_order_form.xlsx</field>
<field name="name">Sale Order Template</field>
<field name="description">Sample Sales Order Template for testing</field>
<field name="input_instruction">
{
'__EXPORT__': {
'sale_order': {
'_HEAD_': {
'B2': 'partner_id.display_name${value or ""}#{align=left;style=text}',
'B3': 'name${value or ""}#{align=left;style=text}',
},
'order_line': {
'A6': 'product_id.display_name${value or ""}#{style=text}',
'B6': 'name${value or ""}#{style=text}',
'C6': 'product_uom_qty${value or 0}#{style=number}',
'D6': 'product_uom.name${value or ""}#{style=text}',
'E6': 'price_unit${value or 0}#{style=number}',
'F6': 'tax_id${value and ",".join([x.display_name for x in value]) or ""}',
'G6': 'price_subtotal${value or 0}#{style=number}@{sum}',
}
}
},
}
</field>
</record>
<function model="xlsx.template" name="load_xlsx_template">
<value eval="[ref('sale_order_excel_template')]"/>
</function>
</odoo>

61
excel_import_export_demo/static/description/index.html

@ -4,7 +4,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
<title>Excel Import/Export Demo</title>
<title>Excel Import/Export/Report Demo</title>
<style type="text/css">
/*
@ -360,8 +360,8 @@ ul.auto-toc {
</style>
</head>
<body>
<div class="document" id="excel-import-export-demo">
<h1 class="title">Excel Import/Export Demo</h1>
<div class="document" id="excel-import-export-report-demo">
<h1 class="title">Excel Import/Export/Report Demo</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
@ -373,50 +373,63 @@ ul.auto-toc {
<li>Import/Export Sales Order (import_export_sale_order)</li>
<li>Import New Sales Orders (import_sale_orders)</li>
<li>Sales Orders Report (report_sale_order)</li>
<li>Print Quoation / Order (.xlsx) (report_action/sale_order)</li>
<li>Run Partner List Report (report_action/partner_list)</li>
</ol>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#installation" id="id2">Installation</a></li>
<li><a class="reference internal" href="#usage" id="id3">Usage</a></li>
<li><a class="reference internal" href="#changelog" id="id4">Changelog</a><ul>
<li><a class="reference internal" href="#id1" id="id5">12.0.1.0.0 (2019-02-24)</a></li>
<li><a class="reference internal" href="#installation" id="id3">Installation</a></li>
<li><a class="reference internal" href="#usage" id="id4">Usage</a></li>
<li><a class="reference internal" href="#changelog" id="id5">Changelog</a><ul>
<li><a class="reference internal" href="#id1" id="id6">12.0.1.0.0 (2019-08-09)</a></li>
<li><a class="reference internal" href="#id2" id="id7">12.0.1.0.0 (2019-02-24)</a></li>
</ul>
</li>
<li><a class="reference internal" href="#bug-tracker" id="id6">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id7">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id8">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id9">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id10">Maintainers</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id8">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id9">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id10">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id11">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id12">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="installation">
<h1><a class="toc-backref" href="#id2">Installation</a></h1>
<h1><a class="toc-backref" href="#id3">Installation</a></h1>
<p>To install this module, you need to install <strong>excel_import_export</strong></p>
<p>Then, simply install <strong>excel_import_export_demo</strong>.</p>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id3">Usage</a></h1>
<p><strong>Use Case 1:</strong> Export/Import Excel on existing document</p>
<h1><a class="toc-backref" href="#id4">Usage</a></h1>
<p><strong>Example 1:</strong> Export/Import Excel on existing document</p>
<p>To test this use case, go to any Sales Order and use Export Excel or Import Excel in action menu.</p>
<p><strong>Use Case 2:</strong> Import Excel Files</p>
<p><strong>Example 2:</strong> Import Excel Files</p>
<p>To test this use case, go to Settings &gt; Excel Import/Export &gt; Sample Import Sales Order</p>
<p><strong>Use Case 3:</strong> Create Excel Report</p>
<p><strong>Example 3:</strong> Create Excel Report</p>
<p>To test this use case, go to Settings &gt; Excel Import/Export &gt; Sample Sales Report</p>
<p><strong>Example 4:</strong> Printout Excel on existing document, using report action</p>
<p>To test this use case, go to any Sales Order and click print “Quotation / Order (.xlsx)”.</p>
<p><strong>Example 5:</strong> Run Partner List Report, using report action</p>
<p>To test this use case, go to menu Sales &gt; Reporting &gt; Partner List Report</p>
</div>
<div class="section" id="changelog">
<h1><a class="toc-backref" href="#id4">Changelog</a></h1>
<h1><a class="toc-backref" href="#id5">Changelog</a></h1>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id5">12.0.1.0.0 (2019-02-24)</a></h2>
<h2><a class="toc-backref" href="#id6">12.0.1.0.0 (2019-08-09)</a></h2>
<ul class="simple">
<li>Add 2 new examples using report action, 1) sale_order 2) partner_list</li>
</ul>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id7">12.0.1.0.0 (2019-02-24)</a></h2>
<ul class="simple">
<li>Start of the history</li>
</ul>
</div>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id6">Bug Tracker</a></h1>
<h1><a class="toc-backref" href="#id8">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/server-tools/issues">GitHub Issues</a>.
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
@ -424,21 +437,21 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id7">Credits</a></h1>
<h1><a class="toc-backref" href="#id9">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id8">Authors</a></h2>
<h2><a class="toc-backref" href="#id10">Authors</a></h2>
<ul class="simple">
<li>Ecosoft</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id9">Contributors</a></h2>
<h2><a class="toc-backref" href="#id11">Contributors</a></h2>
<ul class="simple">
<li>Kitti Upariphutthiphong. &lt;<a class="reference external" href="mailto:kittiu&#64;gmail.com">kittiu&#64;gmail.com</a>&gt; (<a class="reference external" href="http://ecosoft.co.th">http://ecosoft.co.th</a>)</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id10">Maintainers</a></h2>
<h2><a class="toc-backref" href="#id12">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose

Loading…
Cancel
Save