################################################################################### # # Copyright (c) 2017-2019 MuK IT GmbH. # # This file is part of MuK Binary Stream Support # (see https://mukit.at). # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program. If not, see . # ################################################################################### import logging from odoo import http from odoo.http import request from werkzeug import wrappers _logger = logging.getLogger(__name__) class StreamController(http.Controller): # ---------------------------------------------------------- # Routes # ---------------------------------------------------------- @http.route( [ "/binary/content", "/binary/content/", "/binary/content//", "/binary/content/", "/binary/content//", "/binary/content/-", "/binary/content/-/", "/binary/content/-//", "/binary/content///", "/binary/content////", ], type="http", auth="public", ) def binary_content( self, xmlid=None, model=None, id=None, field="content", filename=None, filename_field="content_fname", unique=None, mimetype=None, download=None, token=None, access_token=None, **kwargs ): status, headers, stream = request.env["ir.http"].binary_stream( xmlid=xmlid, model=model, id=id, field=field, unique=unique, filename=filename, filename_field=filename_field, download=download, mimetype=mimetype, access_token=access_token, ) if status != 200: return request.env["ir.http"]._response_by_status(status, headers, False) else: headers.append(("Content-Length", stream.seek(0, 2))) stream.seek(0, 0) response = wrappers.Response( stream, headers=headers, status=status, direct_passthrough=True ) if token: response.set_cookie("fileToken", token) return response