Tower: upload at_accounting 18.0.1.7 (via marketplace)
This commit is contained in:
89
addons/at_accounting/controllers/main.py
Normal file
89
addons/at_accounting/controllers/main.py
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
import werkzeug
|
||||||
|
from werkzeug.exceptions import InternalServerError
|
||||||
|
|
||||||
|
from odoo.addons.at_accounting.models.account_report import AccountReportFileDownloadException
|
||||||
|
from odoo.addons.account.controllers.download_docs import _get_headers
|
||||||
|
from odoo import http
|
||||||
|
from odoo.models import check_method_name
|
||||||
|
from odoo.http import content_disposition, request
|
||||||
|
from odoo.tools.misc import html_escape
|
||||||
|
|
||||||
|
import json
|
||||||
|
|
||||||
|
|
||||||
|
class AccountReportController(http.Controller):
|
||||||
|
|
||||||
|
@http.route('/at_accounting', type='http', auth='user', methods=['POST'], csrf=False)
|
||||||
|
def get_report(self, options, file_generator, **kwargs):
|
||||||
|
uid = request.uid
|
||||||
|
options = json.loads(options)
|
||||||
|
|
||||||
|
allowed_company_ids = request.env['account.report'].get_report_company_ids(options)
|
||||||
|
if not allowed_company_ids:
|
||||||
|
company_str = request.cookies.get('cids', str(request.env.user.company_id.id))
|
||||||
|
allowed_company_ids = [int(str_id) for str_id in company_str.split('-')]
|
||||||
|
|
||||||
|
report = request.env['account.report'].with_user(uid).with_context(allowed_company_ids=allowed_company_ids).browse(options['report_id'])
|
||||||
|
|
||||||
|
try:
|
||||||
|
check_method_name(file_generator)
|
||||||
|
generated_file_data = report.dispatch_report_action(options, file_generator)
|
||||||
|
file_content = generated_file_data['file_content']
|
||||||
|
file_type = generated_file_data['file_type']
|
||||||
|
response_headers = self._get_response_headers(file_type, generated_file_data['file_name'], file_content)
|
||||||
|
|
||||||
|
if file_type == 'xlsx':
|
||||||
|
response = request.make_response(None, headers=response_headers)
|
||||||
|
response.stream.write(file_content)
|
||||||
|
else:
|
||||||
|
response = request.make_response(file_content, headers=response_headers)
|
||||||
|
|
||||||
|
if file_type in ('zip', 'xaf'):
|
||||||
|
# Adding direct_passthrough to the response and giving it a file
|
||||||
|
# as content means that we will stream the content of the file to the user
|
||||||
|
# Which will prevent having the whole file in memory
|
||||||
|
response.direct_passthrough = True
|
||||||
|
|
||||||
|
return response
|
||||||
|
except AccountReportFileDownloadException as e:
|
||||||
|
if e.content:
|
||||||
|
e.content['file_content'] = e.content['file_content'].decode()
|
||||||
|
data = {
|
||||||
|
'name': type(e).__name__,
|
||||||
|
'arguments': [e.errors, e.content],
|
||||||
|
}
|
||||||
|
raise InternalServerError(response=self._generate_response(data)) from e
|
||||||
|
except Exception as e: # noqa: BLE001
|
||||||
|
data = http.serialize_exception(e)
|
||||||
|
raise InternalServerError(response=self._generate_response(data)) from e
|
||||||
|
|
||||||
|
def _generate_response(self, data):
|
||||||
|
error = {
|
||||||
|
'code': 200,
|
||||||
|
'message': 'Odoo Server Error',
|
||||||
|
'data': data,
|
||||||
|
}
|
||||||
|
return request.make_response(html_escape(json.dumps(error)))
|
||||||
|
|
||||||
|
def _get_response_headers(self, file_type, file_name, file_content):
|
||||||
|
headers = [
|
||||||
|
('Content-Type', request.env['account.report'].get_export_mime_type(file_type)),
|
||||||
|
('Content-Disposition', content_disposition(file_name)),
|
||||||
|
]
|
||||||
|
|
||||||
|
if file_type in ('xml', 'txt', 'csv', 'kvr', 'csv'):
|
||||||
|
headers.append(('Content-Length', len(file_content)))
|
||||||
|
|
||||||
|
return headers
|
||||||
|
|
||||||
|
@http.route('/at_accounting/download_attachments/<models("ir.attachment"):attachments>', type='http', auth='user')
|
||||||
|
def download_report_attachments(self, attachments):
|
||||||
|
attachments.check_access('read')
|
||||||
|
assert all(attachment.res_id and attachment.res_model == 'res.partner' for attachment in attachments)
|
||||||
|
if len(attachments) == 1:
|
||||||
|
headers = _get_headers(attachments.name, attachments.mimetype, attachments.raw)
|
||||||
|
return request.make_response(attachments.raw, headers)
|
||||||
|
else:
|
||||||
|
content = attachments._build_zip_from_attachments()
|
||||||
|
headers = _get_headers('attachments.zip', 'zip', content)
|
||||||
|
return request.make_response(content, headers)
|
||||||
Reference in New Issue
Block a user