You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

91 lines
3.1 KiB

  1. ###################################################################################
  2. #
  3. # Copyright (c) 2017-2019 MuK IT GmbH.
  4. #
  5. # This file is part of MuK Binary Stream Support
  6. # (see https://mukit.at).
  7. #
  8. # This program is free software: you can redistribute it and/or modify
  9. # it under the terms of the GNU Lesser General Public License as published by
  10. # the Free Software Foundation, either version 3 of the License, or
  11. # (at your option) any later version.
  12. #
  13. # This program is distributed in the hope that it will be useful,
  14. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. # GNU Lesser General Public License for more details.
  17. #
  18. # You should have received a copy of the GNU Lesser General Public License
  19. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  20. #
  21. ###################################################################################
  22. import logging
  23. from odoo import http
  24. from odoo.http import request
  25. from werkzeug import wrappers
  26. _logger = logging.getLogger(__name__)
  27. class StreamController(http.Controller):
  28. # ----------------------------------------------------------
  29. # Routes
  30. # ----------------------------------------------------------
  31. @http.route(
  32. [
  33. "/binary/content",
  34. "/binary/content/<string:xmlid>",
  35. "/binary/content/<string:xmlid>/<string:filename>",
  36. "/binary/content/<int:id>",
  37. "/binary/content/<int:id>/<string:filename>",
  38. "/binary/content/<int:id>-<string:unique>",
  39. "/binary/content/<int:id>-<string:unique>/<string:filename>",
  40. "/binary/content/<int:id>-<string:unique>/<path:extra>/<string:filename>",
  41. "/binary/content/<string:model>/<int:id>/<string:field>",
  42. "/binary/content/<string:model>/<int:id>/<string:field>/<string:filename>",
  43. ],
  44. type="http",
  45. auth="public",
  46. )
  47. def binary_content(
  48. self,
  49. xmlid=None,
  50. model=None,
  51. id=None,
  52. field="content",
  53. filename=None,
  54. filename_field="content_fname",
  55. unique=None,
  56. mimetype=None,
  57. download=None,
  58. token=None,
  59. access_token=None,
  60. **kwargs
  61. ):
  62. status, headers, stream = request.env["ir.http"].binary_stream(
  63. xmlid=xmlid,
  64. model=model,
  65. id=id,
  66. field=field,
  67. unique=unique,
  68. filename=filename,
  69. filename_field=filename_field,
  70. download=download,
  71. mimetype=mimetype,
  72. access_token=access_token,
  73. )
  74. if status != 200:
  75. return request.env["ir.http"]._response_by_status(status, headers, False)
  76. else:
  77. headers.append(("Content-Length", stream.seek(0, 2)))
  78. stream.seek(0, 0)
  79. response = wrappers.Response(
  80. stream, headers=headers, status=status, direct_passthrough=True
  81. )
  82. if token:
  83. response.set_cookie("fileToken", token)
  84. return response