diff --git a/addons/account/controllers/__init__.py b/addons/account/controllers/__init__.py index 44eea6b8e43..ffbfd584f8f 100644 --- a/addons/account/controllers/__init__.py +++ b/addons/account/controllers/__init__.py @@ -3,3 +3,4 @@ from . import portal from . import terms +from . import download_edi_docs diff --git a/addons/account/controllers/download_edi_docs.py b/addons/account/controllers/download_edi_docs.py new file mode 100644 index 00000000000..e8d0cbfb1ba --- /dev/null +++ b/addons/account/controllers/download_edi_docs.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +import io +import zipfile + +from odoo import http, _ +from odoo.http import request, content_disposition + +class AccountEdiDocumentDownloadController(http.Controller): + @http.route('/account/export_edi_documents', type='http', auth='user') + def export_edi_documents(self, **args): + ids = list(map(int, request.httprequest.args.getlist('ids'))) + + moves = request.env['account.move'].browse(ids) + moves.check_access_rights('read') + moves.check_access_rule('read') + + attachments = moves._get_edi_doc_attachments_to_export() + if not attachments: + error_msg = _("No EDI documents found for export.") + return request.not_found(error_msg) + + # Create zip file + buffer = io.BytesIO() + with zipfile.ZipFile(buffer, 'w', compression=zipfile.ZIP_DEFLATED) as zipfile_obj: + for attachment in attachments: + zipfile_obj.writestr(attachment.display_name, attachment.raw) + content = buffer.getvalue() + + headers = [ + ('Content-Type', 'zip'), + ('X-Content-Type-Options', 'nosniff'), + ('Content-Length', len(content)), + ('Content-Disposition', content_disposition('edi_documents.zip')), + ] + return request.make_response(content, headers) diff --git a/addons/account/models/account_move.py b/addons/account/models/account_move.py index f895ca159c1..d727c4c0d5a 100644 --- a/addons/account/models/account_move.py +++ b/addons/account/models/account_move.py @@ -1,5 +1,7 @@ # -*- coding: utf-8 -*- +from werkzeug.urls import url_encode + from collections import defaultdict from contextlib import ExitStack, contextmanager from datetime import date, timedelta @@ -3101,6 +3103,27 @@ class AccountMove(models.Model): return success + #################################################### + # Export Electronic Document + #################################################### + + def _action_download_electronic_invoice(self): + if not self: + return False + return { + 'type': 'ir.actions.act_url', + 'url': '/account/export_edi_documents?%s' % url_encode({'ids': self.ids}), + 'target': 'new', + } + + def _get_edi_doc_attachments_to_export(self): + """ + To override + :return a recordset of ir.attachment to export + """ + return self.env['ir.attachment'] + + # ------------------------------------------------------------------------- # BUSINESS METHODS # ------------------------------------------------------------------------- diff --git a/addons/account/views/account_move_views.xml b/addons/account/views/account_move_views.xml index 8b9ecf80280..da699d5bb3e 100644 --- a/addons/account/views/account_move_views.xml +++ b/addons/account/views/account_move_views.xml @@ -1644,5 +1644,17 @@ if records: + + Download Electronic Invoices + + + list + code + + if records: + action = records._action_download_electronic_invoice() + + + diff --git a/addons/account_edi/__init__.py b/addons/account_edi/__init__.py index 3a7dfde6acb..7749576f92c 100644 --- a/addons/account_edi/__init__.py +++ b/addons/account_edi/__init__.py @@ -1,5 +1,4 @@ # -*- encoding: utf-8 -*- from . import models -from . import controller from . import wizard diff --git a/addons/account_edi/controller/__init__.py b/addons/account_edi/controller/__init__.py deleted file mode 100644 index 12a7e529b67..00000000000 --- a/addons/account_edi/controller/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from . import main diff --git a/addons/account_edi/controller/main.py b/addons/account_edi/controller/main.py deleted file mode 100644 index 065b7dff157..00000000000 --- a/addons/account_edi/controller/main.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo import http -from odoo.http import request, content_disposition - - -class EdiDocumentDownloadController(http.Controller): - @http.route('/account_edi/download_edi_documents', type='http', auth='user') - def download_edi_documents(self, **args): - ids = list(map(int, request.httprequest.args.getlist('ids'))) - content = request.env['account.move'].browse(ids)._create_zipped() - headers = [ - ('Content-Type', 'zip'), - ('X-Content-Type-Options', 'nosniff'), - ('Content-Length', len(content)), - ('Content-Disposition', content_disposition('edi_documents.zip')), - ] - return request.make_response(content, headers) diff --git a/addons/account_edi/models/account_move.py b/addons/account_edi/models/account_move.py index 45463090be9..90dbbdba7b3 100644 --- a/addons/account_edi/models/account_move.py +++ b/addons/account_edi/models/account_move.py @@ -379,24 +379,6 @@ class AccountMove(models.Model): move_result.setdefault('attachments', []).extend(edi_attachments.get('attachments', [])) return result - #################################################### - # Export Electronic Document - #################################################### - - def _action_download_electronic_invoice(self): - if not self: - return False - return { - 'type': 'ir.actions.act_url', - 'url': '/account_edi/download_edi_documents?%s' % url_encode({'ids': self.filtered('edi_document_ids').ids}), - 'target': 'new', - } - - def _create_zipped(self): - buffer = io.BytesIO() - with zipfile.ZipFile(buffer, 'w', compression=zipfile.ZIP_DEFLATED) as zipfile_obj: - for invoice in self: - for document in invoice.edi_document_ids: - if document.state in {'sent', 'cancelled'}: - zipfile_obj.writestr(document.display_name, document.attachment_id.raw) - return buffer.getvalue() + def _get_edi_doc_attachments_to_export(self): + # EXTENDS 'account' + return super()._get_edi_doc_attachments_to_export() + self.edi_document_ids.attachment_id diff --git a/addons/account_edi/views/account_move_views.xml b/addons/account_edi/views/account_move_views.xml index d7ae9a03f2b..03127f54772 100644 --- a/addons/account_edi/views/account_move_views.xml +++ b/addons/account_edi/views/account_move_views.xml @@ -142,16 +142,5 @@ - - Download Electronic Invoices - - - list - code - - if records: - action = records._action_download_electronic_invoice() - - diff --git a/addons/account_edi_ubl_cii/models/account_move.py b/addons/account_edi_ubl_cii/models/account_move.py index 13f2803181c..0006d9ba495 100644 --- a/addons/account_edi_ubl_cii/models/account_move.py +++ b/addons/account_edi_ubl_cii/models/account_move.py @@ -52,3 +52,7 @@ class AccountMove(models.Model): return ubl_cii_xml_builder._import_invoice_ubl_cii return super()._get_edi_decoder(file_data, new=new) + + def _get_edi_doc_attachments_to_export(self): + # EXTENDS 'account' + return super()._get_edi_doc_attachments_to_export() + self.ubl_cii_xml_id