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

[12.0][MIG] report_csv #305

Merged
merged 6 commits into from
Nov 22, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
115 changes: 115 additions & 0 deletions report_csv/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
===============
Base report csv
===============

.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |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/12.0/report_csv
: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-12-0/reporting-engine-12-0-report_csv
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/143/12.0
:alt: Try me on Runbot

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

This module provides a basic report class to generate csv report.

**Table of contents**

.. contents::
:local:

Usage
=====

An example of CSV report for partners on a module called `module_name`:

A python class ::

from odoo import models

class PartnerCSV(models.AbstractModel):
_name = 'report.report_csv.partner_csv'
_inherit = 'report.report_csv.abstract'

def generate_csv_report(self, writer, data, partners):
writer.writeheader()
for obj in partners:
writer.writerow({
'name': obj.name,
'email': obj.email,
})

def csv_report_options(self):
res = super().csv_report_options()
res['fieldnames'].append('name')
res['fieldnames'].append('email')
res['delimiter'] = ';'
res['quoting'] = csv.QUOTE_ALL
return res


A report XML record ::

<report
id="partner_csv"
model="res.partner"
string="Print to CSV"
report_type="csv"
name="module_name.report_name"
file="res_partner"
attachment_use="False"
/>

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 <https://github.com/OCA/reporting-engine/issues/new?body=module:%20report_csv%0Aversion:%2012.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
~~~~~~~

* Creu Blanca

Contributors
~~~~~~~~~~~~

* Enric Tobella <etobella@creublanca.es>

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/12.0/report_csv>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
3 changes: 3 additions & 0 deletions report_csv/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from . import controllers
from . import models
from . import report
28 changes: 28 additions & 0 deletions report_csv/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Copyright 2019 Creu Blanca
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
{
'name': "Base report csv",

'summary': "Base module to create csv report",
'author': 'Creu Blanca,'
'Odoo Community Association (OCA)',
'website': "https://github.com/oca/reporting-engine",
'category': 'Reporting',
'version': '12.0.1.0.0',
'license': 'AGPL-3',
'external_dependencies': {
'python': [
'csv',
],
},
'depends': [
'base', 'web',
],
'data': [
'views/webclient_templates.xml',
],
'demo': [
'demo/report.xml',
],
'installable': True,
}
1 change: 1 addition & 0 deletions report_csv/controllers/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import main
60 changes: 60 additions & 0 deletions report_csv/controllers/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# Copyright (C) 2019 Creu Blanca
# License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl.html).

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

import json
import time


class ReportController(report.ReportController):
@route()
def report_routes(self, reportname, docids=None, converter=None, **data):
if converter == 'csv':
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'])
csv = report.with_context(context).render_csv(
docids, data=data
)[0]
filename = "%s.%s" % (report.name, "csv")
if docids:
obj = request.env[report.model].browse(docids)
if report.print_report_name and not len(obj) > 1:
report_name = safe_eval(
report.print_report_name,
{'object': obj, 'time': time, 'multi': False})
filename = "%s.%s" % (report_name, "csv")
# When we print multiple records we still allow a custom
# filename.
elif report.print_report_name and len(obj) > 1:
report_name = safe_eval(
report.print_report_name,
{'objects': obj, 'time': time, 'multi': True})
filename = "%s.%s" % (report_name, "csv")
csvhttpheaders = [
('Content-Type', 'text/csv'),
('Content-Length', len(csv)),
(
'Content-Disposition',
content_disposition(filename)
)
]
return request.make_response(csv, headers=csvhttpheaders)
return super(ReportController, self).report_routes(
reportname, docids, converter, **data
)
16 changes: 16 additions & 0 deletions report_csv/demo/report.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!--
Copyright 2019 Creu Blanca
License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl.html).
-->
<report
id="partner_csv"
model="res.partner"
string="Print to CSV"
report_type="csv"
name="report_csv.partner_csv"
file="res_partner"
attachment_use="False"
/>
</odoo>
59 changes: 59 additions & 0 deletions report_csv/i18n/report_csv.pot
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * report_csv
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"

#. module: report_csv
#: code:addons/report_csv/models/ir_report.py:18
#, python-format
msgid "%s model was not found"
msgstr ""

#. module: report_csv
#: model:ir.model.fields,field_description:report_csv.field_report_report_csv_abstract_display_name
#: model:ir.model.fields,field_description:report_csv.field_report_report_csv_partner_csv_display_name
msgid "Display Name"
msgstr ""

#. module: report_csv
#: model:ir.model.fields,field_description:report_csv.field_report_report_csv_abstract_id
#: model:ir.model.fields,field_description:report_csv.field_report_report_csv_partner_csv_id
msgid "ID"
msgstr ""

#. module: report_csv
#: model:ir.model.fields,field_description:report_csv.field_report_report_csv_abstract___last_update
#: model:ir.model.fields,field_description:report_csv.field_report_report_csv_partner_csv___last_update
msgid "Last Modified on"
msgstr ""

#. module: report_csv
#: model:ir.actions.report,name:report_csv.partner_csv
msgid "Print to CSV"
msgstr ""

#. module: report_csv
#: model:ir.model,name:report_csv.model_ir_actions_report
msgid "ir.actions.report"
msgstr ""

#. module: report_csv
#: model:ir.model,name:report_csv.model_report_report_csv_abstract
msgid "report.report_csv.abstract"
msgstr ""

#. module: report_csv
#: model:ir.model,name:report_csv.model_report_report_csv_partner_csv
msgid "report.report_csv.partner_csv"
msgstr ""

1 change: 1 addition & 0 deletions report_csv/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import ir_report
33 changes: 33 additions & 0 deletions report_csv/models/ir_report.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Copyright 2019 Creu Blanca
# 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=[("csv", "csv")])

@api.model
def render_csv(self, docids, data):
report_model_name = 'report.%s' % self.report_name
report_model = self.env.get(report_model_name)
if report_model is None:
raise UserError(_('%s model was not found' % report_model_name))
return report_model.with_context({
'active_model': self.model
}).create_csv_report(docids, data)

@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 = ['csv']
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)
2 changes: 2 additions & 0 deletions report_csv/readme/CONTRIBUTORS.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
* Enric Tobella <etobella@creublanca.es>
jarroyomorales marked this conversation as resolved.
Show resolved Hide resolved
* Jaime Arroyo <jaime.arroyo@creublanca.es>
1 change: 1 addition & 0 deletions report_csv/readme/DESCRIPTION.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This module provides a basic report class to generate csv report.
38 changes: 38 additions & 0 deletions report_csv/readme/USAGE.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
An example of CSV report for partners on a module called `module_name`:

A python class ::

from odoo import models

class PartnerCSV(models.AbstractModel):
_name = 'report.report_csv.partner_csv'
_inherit = 'report.report_csv.abstract'

def generate_csv_report(self, writer, data, partners):
writer.writeheader()
for obj in partners:
writer.writerow({
'name': obj.name,
'email': obj.email,
})

def csv_report_options(self):
res = super().csv_report_options()
res['fieldnames'].append('name')
res['fieldnames'].append('email')
res['delimiter'] = ';'
res['quoting'] = csv.QUOTE_ALL
return res


A report XML record ::

<report
id="partner_csv"
model="res.partner"
string="Print to CSV"
report_type="csv"
name="module_name.report_name"
file="res_partner"
attachment_use="False"
/>
2 changes: 2 additions & 0 deletions report_csv/report/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import report_csv
from . import report_partner_csv
Loading