diff --git a/report_csv/README.rst b/report_csv/README.rst index a594624eb0..5cafc1945c 100644 --- a/report_csv/README.rst +++ b/report_csv/README.rst @@ -32,6 +32,19 @@ This module provides a basic report class to generate csv report. .. contents:: :local: +Configuration +============= + +In case the exported CSV report should be encoded in another system than UTF-8, following +fields of the report record (*Settings > Technical > Reports*) should be populated accordingly. + +* Encoding: set an encoding system (such as cp932) +* Encode Error Handling: select 'Ignore' or 'Replace' as necessary. + + * 'Ignore': in case of an encoding error, the problematic character will be removed from the exported file. + * 'Replace': in case of an encoding error, the problematic character will be replaced with '?' symbol. + * Leaving the field blank: in case of an encoding error, the report generation fails with an error message. + Usage ===== @@ -74,6 +87,8 @@ A report XML record :: attachment_use="False" /> +Update encoding with an appropriate value (e.g. cp932) as necessary. + Bug Tracker =========== @@ -98,6 +113,9 @@ Contributors * Enric Tobella * Jaime Arroyo * Rattapong Chokmasermkul +* `Quartile `__: + + * Aung Ko Ko Lin Maintainers ~~~~~~~~~~~ diff --git a/report_csv/__manifest__.py b/report_csv/__manifest__.py index 9640e27d5a..03228e67db 100644 --- a/report_csv/__manifest__.py +++ b/report_csv/__manifest__.py @@ -9,7 +9,7 @@ "version": "13.0.1.0.2", "license": "AGPL-3", "depends": ["base", "web"], - "data": ["views/webclient_templates.xml"], + "data": ["views/webclient_templates.xml", "views/ir_actions_views.xml"], "demo": ["demo/report.xml"], "installable": True, } diff --git a/report_csv/models/ir_report.py b/report_csv/models/ir_report.py index 9865cff759..7d06f9dcbb 100644 --- a/report_csv/models/ir_report.py +++ b/report_csv/models/ir_report.py @@ -9,6 +9,14 @@ class ReportAction(models.Model): _inherit = "ir.actions.report" report_type = fields.Selection(selection_add=[("csv", "csv")]) + encoding = fields.Char( + help="Encoding to be applied to the generated CSV file. e.g. cp932" + ) + encode_error_handling = fields.Selection( + selection=[("ignore", "Ignore"), ("replace", "Replace")], + help="If nothing is selected, CSV export will fail with an error message when " + "there is a character that fail to be encoded.", + ) @api.model def render_csv(self, docids, data): @@ -17,7 +25,11 @@ def render_csv(self, docids, data): if report_model is None: raise UserError(_("%s model was not found" % report_model_name)) return report_model.with_context( - {"active_model": self.model} + { + "active_model": self.model, + "encoding": self.encoding, + "encode_error_handling": self.encode_error_handling, + } ).create_csv_report(docids, data) @api.model diff --git a/report_csv/readme/CONFIGURE.rst b/report_csv/readme/CONFIGURE.rst new file mode 100644 index 0000000000..a0859d07d1 --- /dev/null +++ b/report_csv/readme/CONFIGURE.rst @@ -0,0 +1,9 @@ +In case the exported CSV report should be encoded in another system than UTF-8, following +fields of the report record (*Settings > Technical > Reports*) should be populated accordingly. + +* Encoding: set an encoding system (such as cp932) +* Encode Error Handling: select 'Ignore' or 'Replace' as necessary. + + * 'Ignore': in case of an encoding error, the problematic character will be removed from the exported file. + * 'Replace': in case of an encoding error, the problematic character will be replaced with '?' symbol. + * Leaving the field blank: in case of an encoding error, the report generation fails with an error message. diff --git a/report_csv/readme/CONTRIBUTORS.rst b/report_csv/readme/CONTRIBUTORS.rst index 1ee404f733..922a3262e8 100644 --- a/report_csv/readme/CONTRIBUTORS.rst +++ b/report_csv/readme/CONTRIBUTORS.rst @@ -1,3 +1,6 @@ * Enric Tobella * Jaime Arroyo * Rattapong Chokmasermkul +* `Quartile `__: + + * Aung Ko Ko Lin diff --git a/report_csv/readme/USAGE.rst b/report_csv/readme/USAGE.rst index e5d9964cb8..e6d22e3821 100644 --- a/report_csv/readme/USAGE.rst +++ b/report_csv/readme/USAGE.rst @@ -36,3 +36,5 @@ A report XML record :: file="res_partner" attachment_use="False" /> + +Update encoding with an appropriate value (e.g. cp932) as necessary. diff --git a/report_csv/report/report_csv.py b/report_csv/report/report_csv.py index 0d9aeffdd8..6d7bd19f2c 100644 --- a/report_csv/report/report_csv.py +++ b/report_csv/report/report_csv.py @@ -4,7 +4,8 @@ import logging from io import StringIO -from odoo import models +from odoo import _, models +from odoo.exceptions import UserError _logger = logging.getLogger(__name__) @@ -46,7 +47,18 @@ def create_csv_report(self, docids, data): file = csv.DictWriter(file_data, **self.csv_report_options()) self.generate_csv_report(file, data, objs) file_data.seek(0) - return file_data.read(), "csv" + encoding = self._context.get("encoding") + if not encoding: + return file_data.read(), "csv" + error_handling = self._context.get("encode_error_handling") + if error_handling: + return file_data.read().encode(encoding, errors=error_handling), "csv" + try: + return file_data.read().encode(encoding), "csv" + except Exception: + raise UserError( + _("Failed to encode the data with the encoding set in the report.") + ) def csv_report_options(self): """ diff --git a/report_csv/static/description/index.html b/report_csv/static/description/index.html index 94ae1a3ebf..9511241f1f 100644 --- a/report_csv/static/description/index.html +++ b/report_csv/static/description/index.html @@ -3,7 +3,7 @@ - + Base report csv