Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[17.0][MIG] report py3o: Migration to 17.0 #954

Open
wants to merge 138 commits into
base: 17.0
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
138 commits
Select commit Hold shift + click to select a range
c820a10
Move to report_py3o after import from HG
lmignon Oct 3, 2016
6d43f6e
Add setup
lmignon Oct 3, 2016
3fd7b8b
[FIX] View inheritance may not use attribute 'string' as a selector.
lmignon Oct 3, 2016
3afe566
[IMP] New API + Short Hearder
lmignon Oct 4, 2016
89cf3e6
Remove unicode string
lmignon Oct 4, 2016
871a1cc
[IMP] Add the possiblity to get the template from an absolute path on…
lmignon Oct 4, 2016
c8f3534
[IMP] Allow user to use local fusion
lmignon Oct 4, 2016
aa7448e
Add a simple way to extend the parser context
lmignon Oct 4, 2016
b62afdb
Remove ACL on removed model
lmignon Oct 4, 2016
dfe676c
Improve filetype selection name
lmignon Oct 4, 2016
ec931d9
Fix native flag
lmignon Oct 4, 2016
1a96946
fixed missing comma in model definition
faide Oct 4, 2016
f4a63a4
Add simple tests and fix call to fusion server
lmignon Oct 4, 2016
3ad6df1
Fix skip fusion on server when the fusion is local
lmignon Oct 4, 2016
3c59e37
Improve tests
lmignon Oct 4, 2016
ca74e47
Replace openerp element by odoo
lmignon Oct 4, 2016
4d2cf82
Small usability improvements
alexis-via Oct 4, 2016
663c3d3
Take into accounts most remarks of @lasley
alexis-via Oct 5, 2016
e4ff94c
Replace plain SQL by orm
lmignon Oct 6, 2016
8a76fcb
rename module ir_report to ir_actions_report_xml
lmignon Oct 6, 2016
e73a723
Add more tests and fixes issues found by tests
lmignon Oct 6, 2016
ce0ba0d
[FIX] Check constrains only if report_type == 'py3o'
lmignon Oct 12, 2016
78fad85
report_py3o: full installation procedure in README
alexis-via Oct 14, 2016
d3a53ea
Port report_py3o to Odoo v10
alexis-via Oct 14, 2016
766a37a
Update version numbers
alexis-via Oct 14, 2016
a468813
PEP8 fix
alexis-via Oct 14, 2016
f175749
Update README
alexis-via Nov 4, 2016
50222bd
FIX double dot in filename
alexis-via Dec 19, 2016
d634eac
Add access to report_xml object in report
alexis-via Dec 19, 2016
89a6d40
FIX Adapt test suite to my recent commit to avoid double dot on filen…
alexis-via Dec 20, 2016
39925a5
[IMP] Escape 'False' when rendering value
lmignon Nov 16, 2016
4c1738f
[IMP] Replace old style parser by TransientModel
lmignon Dec 17, 2016
0f511ab
[FIX] imports
Dec 22, 2016
123c916
[IMP] Minimizes memory consumption
lmignon Dec 23, 2016
0e1928b
* travis.yml
Jan 9, 2017
ac5208a
Update and improve README instructions to setup py3o
alexis-via Jan 25, 2017
10a7c87
[IMP] Allow to override/extend the way we get the fallback template
lmignon Jan 25, 2017
27434ac
[FIX] report_py3o: fix exception when report must be saved as attache…
lmignon Feb 23, 2017
6a60f89
OCA Transbot updated translations from Transifex
oca-transbot Feb 25, 2017
73f079c
[FIX] delete PDF invoice attachment on invoice back to draft (native …
alexis-via Mar 2, 2017
abeed67
[IMP] report_py3o: update authors and contributors
lmignon Mar 6, 2017
21cf746
OCA Transbot updated translations from Transifex
oca-transbot Mar 11, 2017
3564141
[IMP] report_py3o: prevent injections when retrieving the template fr…
lmignon Mar 8, 2017
21eeedc
OCA Transbot updated translations from Transifex
oca-transbot Mar 18, 2017
158641d
report_py3o: bump version following last merge
sbidoul Mar 22, 2017
dabca6b
Fix py3o freeze when using server fusion
guewen Apr 3, 2017
d8abb61
Pass option for escaping False values to server
guewen Apr 5, 2017
cb74b08
Add option py3o_multi_in_one for Py3o reports
alexis-via Apr 12, 2017
4f3a6b3
OCA Transbot updated translations from Transifex
oca-transbot May 1, 2017
5c80264
[FIX] report_py3o: must return the path to the report
lmignon May 30, 2017
4298b0b
[IMP] report_py3o: Take into account print_report_name
lmignon Feb 17, 2017
ba7d1ac
OCA Transbot updated translations from Transifex
oca-transbot Jun 3, 2017
5b79ad8
[IMP] report_py3o: Allows to interpret \n and \t in texts, cleans htm…
omar7r Oct 31, 2017
ae04d1f
[FIX] Deletes an unnecessary function call
omar7r Nov 7, 2017
b0280c9
[FIX] report_py3o: Removes api.one
omar7r Nov 9, 2017
cf9f0c9
[FIX] report_py3o: Import new dependencies in try...except
omar7r Nov 9, 2017
a597689
[UPD] report_py3o: Bump version
omar7r Nov 10, 2017
a82aa72
OCA Transbot updated translations from Transifex
oca-transbot Nov 25, 2017
36617a8
[RFR] split off the fusion server to its own module
hbrunn Dec 17, 2017
b9af10e
Improve README.rst for report_py3o* modules
alexis-via Jan 10, 2018
b03e390
[ADD] migration script to install report_py3o_fusion_server on upgrades
hbrunn Jan 11, 2018
7a24542
OCA Transbot updated translations from Transifex
oca-transbot Jan 16, 2018
ef9cc5d
[FIX] fallback to libreoffice conversion when no server is configured
hbrunn Mar 21, 2018
334fdba
[FIX] report_py3o: Bump version number
pedrobaeza Mar 26, 2018
0ce7376
[FIX]report_py3o: Escape correctly html characters.
jesusVMayor Dec 19, 2017
6d62bd0
[IMP] check for template data, not for the id
hbrunn Apr 16, 2018
4d8c356
[FIX] If this is not a py3o report, do nothing at all. In some cases …
SimoRubi May 2, 2018
2f8364e
report_py3o: mention formatLang in README
sbidoul May 16, 2018
72199b1
report_py3o_fusion_server: Add support for PDF Export options of libr…
alexis-via Apr 24, 2018
d11ab80
[UPD] Update report_py3o.pot
oca-travis Jun 23, 2018
4d0042d
Translated using Weblate (Français)
kryskool Jul 18, 2018
46f75e7
[MIG] report_py3o, report_py3o_fusion_server: Migration to 12.0
lmignon Nov 26, 2018
013115a
[IMP] report_py2o: cleanup js
lmignon Nov 27, 2018
bef7ab3
[12.0][MIG] improvement py3o_report_extender
Nov 29, 2018
4ff053e
Update i18n
sbejaoui Dec 4, 2018
5a22373
[FIX] report_py3o: Use the right naming convention for the render method
lmignon Jan 8, 2019
fc81ac3
[IMP] report_py3o: remove obsolete methods
lmignon Jan 8, 2019
38ea1a3
[IMP] report_py3o: Document new methods available into the parser con…
lmignon Jan 31, 2019
1855406
[FIX] report_py3o: Add missing method _merge_pdf.
lmignon Jan 31, 2019
b793f7b
[IMP][FIX] py3o_report, py3o_report_fusion_server: Compute the availa…
lmignon Feb 1, 2019
2d92a83
[FIX] report_py3o: Add missing 'user' and 'lang' into the parser context
lmignon Feb 1, 2019
ae0ba6a
[IMP] py3o_report: Allow to specify the lang when calling o_format_lang
lmignon Feb 1, 2019
8c1616d
[FIX] report_py3o: Access to ir.config_parameter with sudo
lmignon Feb 5, 2019
bf04455
[UPD] Update report_py3o.pot
oca-travis Mar 12, 2019
d65052e
Update translation files
oca-transbot Mar 17, 2019
a2c8faf
[UPD] Update report_py3o.pot
oca-travis Jun 12, 2019
18f93fb
Update translation files
oca-transbot Jun 16, 2019
a9af91d
Update README for report_py3o and report_py3o_fusion_server (#306)
alexis-via Jul 18, 2019
011e35a
[FIX] report_py3o readme structure
sbidoul Jul 31, 2019
46d828c
[UPD] README.rst
OCA-git-bot Jul 31, 2019
a411120
[IMP] report_py3o, report_py3o_fusion_server: black, isort
lmignon Nov 19, 2019
324d83c
[MIG] report_py3o, report_py3o_fusion_server: Migration to 13.0
lmignon Nov 19, 2019
2c93d9c
Make sure value is always set for computed fields
dupski Oct 28, 2019
2fa7c35
[12.0][FIX] - report_py3o: run libreoffice in an isolated user instal…
sbejaoui Jan 23, 2020
2ae56d4
[FIX] report_py3o: prettier xml after merge with master
lmignon May 12, 2020
4b4a0c8
[FIX] make prettier happy
sbidoul May 13, 2020
fef5a27
[UPD] Update report_py3o.pot
oca-travis Jun 17, 2020
e7dcbcc
[UPD] README.rst
OCA-git-bot Jun 18, 2020
0c083c4
Update translation files
oca-transbot Jun 18, 2020
b85ec72
Update translation files
oca-transbot Aug 16, 2020
6c6bf36
[14.0][MIG] report_py3o: Migration to 14.0
elmeriniemela Oct 21, 2020
cb85092
Update report_py3o/models/ir_actions_report.py
elmeriniemela Nov 7, 2020
baad77a
[MIG] Use safe_eval wrapped time module. Fix deprecation warnings.
elmeriniemela Feb 2, 2021
dd6897c
[IMP] Add ability to include properly formatted datetime field in a r…
elmeriniemela Nov 5, 2021
1374344
[IMP] Workaround for genshi DeprecationWarning that makes runbot buil…
elmeriniemela Nov 7, 2021
7312d5c
[IMP] Cleanup unnecessary imports
elmeriniemela Nov 7, 2021
788178b
[IMP] Remove except of IOError as its an alias to OSError in python3
elmeriniemela Nov 7, 2021
3b60019
run pre-commit
leemannd Nov 23, 2021
a8a0373
[UPD] Update report_py3o.pot
oca-travis Dec 9, 2021
918efdc
[UPD] README.rst
OCA-git-bot Dec 9, 2021
86fe95c
[MIG] report_py3o: Migration to 15.0
phuctranfxvn May 15, 2022
9dae660
[MIG] report_py3o to v16
alexis-via Dec 12, 2022
70de5f1
[UPD] Update report_py3o.pot
Aug 23, 2023
8454f19
[UPD] README.rst
OCA-git-bot Aug 23, 2023
35f0d11
[UPD] README.rst
OCA-git-bot Sep 3, 2023
3ce840f
Update translation files
weblate Sep 3, 2023
cc53e17
Translated using Weblate (Spanish)
Ivorra78 Sep 7, 2023
f999f16
Translated using Weblate (Spanish (Argentina))
ibuioli Sep 10, 2023
3e47f17
Translated using Weblate (Italian)
mymage Sep 13, 2023
168a809
Update translation files
weblate Oct 10, 2023
8d3e4e6
Replaced `mktemp` with `mkstemp`
fazledyn-or Nov 8, 2023
c36e319
Reformatted using pre-commit
fazledyn-or Nov 9, 2023
e0b5f53
[BOT] post-merge updates
OCA-git-bot Dec 8, 2023
a4a1424
Translated using Weblate (Italian)
mymage Jan 19, 2024
0214623
[IMP] remove python libs included in odoo from requirements
CRogos Apr 4, 2024
9e0384b
[BOT] post-merge updates
OCA-git-bot Apr 4, 2024
0332ac1
Translated using Weblate (Swedish)
jakobkrabbe Jun 27, 2024
7a39762
[FIX] _py3o_parser_context: fix call to format_date in old_format_lang
jdoutreloux Jan 8, 2024
6c44897
[BOT] post-merge updates
OCA-git-bot Jul 24, 2024
5003beb
[FIX] report_py3o: change display_address() to _display_address()
imbarbudiman Aug 21, 2024
9349068
[IMP] report_py3o: use the standard file name behavior when zipping r…
ThomasBinsfeld Dec 18, 2023
a4930d0
[BOT] post-merge updates
OCA-git-bot Sep 5, 2024
34c3808
[BOT] post-merge updates
OCA-git-bot Oct 22, 2024
d8a20e9
[MIG] report_py3o: Migration to 17.0
yaseentai Dec 4, 2024
69e207d
[FIX] python version compatibility
yaseentai Dec 5, 2024
b923a48
refactoring
yaseentai Dec 5, 2024
141c66e
fixes
yaseentai Dec 5, 2024
8d684bc
fix format
yaseentai Dec 5, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
661 changes: 661 additions & 0 deletions report_py3o/LICENSE

Large diffs are not rendered by default.

304 changes: 304 additions & 0 deletions report_py3o/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,304 @@
==================
Py3o Report Engine
==================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:bccc4a998b5fe5b2d098e7528445efe2e46e4f351a99b9f7c5efae03b5002ebe
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Freporting--engine-lightgray.png?logo=github
:target: https://github.com/OCA/reporting-engine/tree/17.0/report_py3o
:alt: OCA/reporting-engine
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/reporting-engine-17-0/reporting-engine-17-0-report_py3o
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/reporting-engine&target_branch=17.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

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 developer to create or modify a report: the report is
created and modified with Libreoffice. So this reporting engine has a
full WYSIWYG report development 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, also some print
peculiarities (backgrounds, margin boxes) are not very well supported
by the HTML/CSS based solutions.
- 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 module *report_py3o* is the base module for the Py3o reporting
engine. If used alone, it will spawn a libreoffice process for each ODT
to PDF (or ODT to DOCX, ..) document conversion. This is slow and can
become a problem if you have a lot of reports to convert from ODT to
another format. In this case, you should consider the additionnal module
*report_py3o_fusion_server* which is designed to work with a libreoffice
daemon. With *report_py3o_fusion_server*, the technical environnement is
more complex to setup because you have to install additionnal software
components and run 2 daemons, but you have much better performances and
you can configure the libreoffice PDF export options in Odoo (allows to
generate PDF forms, PDF/A documents, password-protected PDFs,
watermarked PDFs, etc.).

This reporting engine is an alternative to
`Aeroo <https://github.com/aeroo-community/aeroo_reports>`__: these two
reporting engines have similar features but their implementation is
entirely different. You cannot use aeroo templates as drop in
replacement though, you'll have to change a few details.

**Table of contents**

.. contents::
:local:

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

Install the required python libs:

::

pip install py3o.template
pip install py3o.formats

To allow the conversion of ODT or ODS reports to other formats (PDF,
DOC, DOCX, etc.), install libreoffice:

::

apt-get --no-install-recommends install libreoffice

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

For example, to replace the native invoice report by a custom py3o
report, add the following XML file in your custom module:

::

<?xml version="1.0" encoding="utf-8"?>
<odoo>

<record id="account.account_invoices" model="ir.actions.report">
<field name="report_type">py3o</field>
<field name="py3o_filetype">odt</field>
<field name="module">my_custom_module_base</field>
<field name="py3o_template_fallback">report/account_invoice.odt</field>
</record>

</odoo>

where *my_custom_module_base* is the name of the custom Odoo module. In
this example, the invoice ODT file is located in
*my_custom_module_base/report/account_invoice.odt*.

It's also possible to reference a template located in a trusted path of
your Odoo server. In this case you must let the *module* entry empty and
specify the path to the template as *py3o_template_fallback*.

::

<?xml version="1.0" encoding="utf-8"?>
<odoo>

<record id="account.account_invoices" model="ir.actions.report">
<field name="report_type">py3o</field>
<field name="py3o_filetype">odt</field>
<field name="py3o_template_fallback">/odoo/templates/py3o/report/account_invoice.odt</field>
</record>

</odoo>

Moreover, you must also modify the Odoo server configuration file to
declare the allowed root directory for your py3o templates. Only
templates located into this directory can be loaded by py3o report.

::

[options]
...

[report_py3o]
root_tmpl_path=/odoo/templates/py3o

If you want an invoice in PDF format instead of ODT format, the XML file
should look like:

::

<?xml version="1.0" encoding="utf-8"?>
<odoo>

<record id="account.account_invoices" model="ir.actions.report">
<field name="report_type">py3o</field>
<field name="py3o_filetype">pdf</field>
<field name="module">my_custom_module_base</field>
<field name="py3o_template_fallback">report/account_invoice.odt</field>
</record>

</odoo>

If you want to add a new py3o PDF report (and not replace a native
report), the XML file should look like this:

::

<?xml version="1.0" encoding="utf-8"?>
<odoo>

<record id="partner_summary_report" model="ir.actions.report">
<field name="name">Partner Summary</field>
<field name="model">res.partner</field>
<field name="report_name">res.partner.summary</field>
<field name="report_type">py3o</field>
<field name="py3o_filetype">pdf</field>
<field name="module">my_custom_module_base</field>
<field name="py3o_template_fallback">report/partner_summary.odt</field>
<!-- Add entry in "Print" drop-down list -->
<field name="binding_type">report</field>
<field name="binding_model_id" ref="base.model_res_partner"/>
</record>

</odoo>

Configuration parameters
------------------------

| py3o.conversion_command
| The command to be used to run the conversion, ``libreoffice`` by
default. If you change this, whatever you set here must accept the
parameters ``--headless --convert-to $ext $file`` and put the
resulting file into ``$file``'s directory with extension ``$ext``. The
command will be started in ``$file``'s directory.

Usage
=====

The templating language is `extensively
documented <http://py3otemplate.readthedocs.io/en/latest/templating.html>`__,
the records are exposed in libreoffice as ``objects``, on which you can
also call functions.

Available functions and objects
-------------------------------

| user
| Browse record of current user

| lang
| The user's company's language as string (ISO code)

| b64decode
| ``base64.b64decode``

| format_multiline_value(string)
| Generate the ODF equivalent of ``<br/>`` and ``&nbsp;`` for multiline
fields (ODF is XML internally, so those would be skipped otherwise)

| html_sanitize(string)
| Sanitize HTML string

| time
| Python's ``time`` module

| display_address(partner)
| Return a formatted string of the partner's address

| o_format_lang(value, lang_code=False, digits=None, grouping=True,
monetary=False, dp=False, currency_obj=False, no_break_space=True)
| Return a formatted numeric or monetary value according to the context
language and timezone

| o_format_date(value, lang_code=False, date_format=False)
| Return a formatted date or time value according to the context
language and timezone

Sample report templates
-----------------------

Sample py3o report templates for the main Odoo native reports (invoice,
sale order, purchase order, picking, etc.) are available on the Github
project
`odoo-py3o-report-templates <https://github.com/akretion/odoo-py3o-report-templates>`__.

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

- generate barcode ?
- add more detailed example in demo file to showcase features
- add migration guide aeroo -> py3o

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 to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/reporting-engine/issues/new?body=module:%20report_py3o%0Aversion:%2017.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
-------

* XCG Consulting
* ACSONE SA/NV

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

- Florent Aide (`XCG Consulting <http://odoo.consulting/>`__)
- Laurent Mignon <laurent.mignon@acsone.eu>,
- Alexis de Lattre <alexis.delattre@akretion.com>,
- Guewen Baconnier <guewen.baconnier@camptocamp.com>
- Omar Castiñeira <omar@comunitea.com>
- Holger Brunn <hbrunn@therp.nl>
- Phuc Tran Thanh <phuc@trobz.com>

Maintainers
-----------

This module is maintained by the OCA.

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

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.

This module is part of the `OCA/reporting-engine <https://github.com/OCA/reporting-engine/tree/17.0/report_py3o>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
2 changes: 2 additions & 0 deletions report_py3o/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import models
from . import controllers
29 changes: 29 additions & 0 deletions report_py3o/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Copyright 2013 XCG Consulting (http://odoo.consulting)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Py3o Report Engine",
"summary": "Reporting engine based on Libreoffice (ODT -> ODT, "
"ODT -> PDF, ODT -> DOC, ODT -> DOCX, ODS -> ODS, etc.)",
"version": "17.0.1.0.0",
"category": "Reporting",
"license": "AGPL-3",
"author": "XCG Consulting, ACSONE SA/NV, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/reporting-engine",
"depends": ["web"],
"external_dependencies": {
"python": ["py3o.template", "py3o.formats"],
"deb": ["libreoffice"],
},
"assets": {
"web.assets_backend": [
"report_py3o/static/src/js/py3oactionservice.esm.js",
],
},
"data": [
"security/ir.model.access.csv",
"views/py3o_template.xml",
"views/ir_actions_report.xml",
"demo/report_py3o.xml",
],
"installable": True,
}
1 change: 1 addition & 0 deletions report_py3o/controllers/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import main
Loading
Loading