* web_unsplash, website_forum With [1], the access errors when a portal user were using the media dialog got fixed. It also came with the unsplash capability for portal user in the media dialog. Still, there was a remaining problematic point: an internal user can't upload an unsplash image in the backend through the media dialog. It doesn't really make sense for an internal user to have less right than the portal user. This commit corrects that part. Note that only unsplash images were problematic, not regular uploaded image as the difference was that unsplash images attachment are saved with an `url` property, which was triggering due to [2]. Finally, it was chosen to make that "bypass" more robust and opt in, so forum and unsplash are allowing their use cases to go through, it's not done in a generic way anymore. Also fixing a small issue about the res_id not being sent when editing a forum post, because it was assuming that the URL would end with the ID which is not the case when you edit your answer. [1]: https://github.com/odoo/odoo/commit/e10493711879c7f0cc8832db3f1936c622ea605c [2]: https://github.com/odoo/odoo/commit/bfffe39f1376a56226572295b945a2cc73ba50ce task-3007844 closes odoo/odoo#103138 Signed-off-by: Quentin Smetz (qsm) <qsm@odoo.com>
75 lines
3.2 KiB
Python
75 lines
3.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from werkzeug.urls import url_quote
|
|
|
|
from odoo import api, models, fields, tools
|
|
|
|
SUPPORTED_IMAGE_MIMETYPES = ['image/gif', 'image/jpe', 'image/jpeg', 'image/jpg', 'image/png', 'image/svg+xml']
|
|
SUPPORTED_IMAGE_EXTENSIONS = ['.gif', '.jpe', '.jpeg', '.jpg', '.png', '.svg']
|
|
|
|
|
|
class IrAttachment(models.Model):
|
|
|
|
_inherit = "ir.attachment"
|
|
|
|
local_url = fields.Char("Attachment URL", compute='_compute_local_url')
|
|
image_src = fields.Char(compute='_compute_image_src')
|
|
image_width = fields.Integer(compute='_compute_image_size')
|
|
image_height = fields.Integer(compute='_compute_image_size')
|
|
original_id = fields.Many2one('ir.attachment', string="Original (unoptimized, unresized) attachment")
|
|
|
|
def _compute_local_url(self):
|
|
for attachment in self:
|
|
if attachment.url:
|
|
attachment.local_url = attachment.url
|
|
else:
|
|
attachment.local_url = '/web/image/%s?unique=%s' % (attachment.id, attachment.checksum)
|
|
|
|
@api.depends('mimetype', 'url', 'name')
|
|
def _compute_image_src(self):
|
|
for attachment in self:
|
|
# Only add a src for supported images
|
|
if attachment.mimetype not in SUPPORTED_IMAGE_MIMETYPES:
|
|
attachment.image_src = False
|
|
continue
|
|
|
|
if attachment.type == 'url':
|
|
attachment.image_src = attachment.url
|
|
else:
|
|
# Adding unique in URLs for cache-control
|
|
unique = attachment.checksum[:8]
|
|
if attachment.url:
|
|
# For attachments-by-url, unique is used as a cachebuster. They
|
|
# currently do not leverage max-age headers.
|
|
separator = '&' if '?' in attachment.url else '?'
|
|
attachment.image_src = '%s%sunique=%s' % (attachment.url, separator, unique)
|
|
else:
|
|
name = url_quote(attachment.name)
|
|
attachment.image_src = '/web/image/%s-%s/%s' % (attachment.id, unique, name)
|
|
|
|
@api.depends('datas')
|
|
def _compute_image_size(self):
|
|
for attachment in self:
|
|
try:
|
|
image = tools.base64_to_image(attachment.datas)
|
|
attachment.image_width = image.width
|
|
attachment.image_height = image.height
|
|
except Exception:
|
|
attachment.image_width = 0
|
|
attachment.image_height = 0
|
|
|
|
def _get_media_info(self):
|
|
"""Return a dict with the values that we need on the media dialog."""
|
|
self.ensure_one()
|
|
return self._read_format(['id', 'name', 'description', 'mimetype', 'checksum', 'url', 'type', 'res_id', 'res_model', 'public', 'access_token', 'image_src', 'image_width', 'image_height', 'original_id'])[0]
|
|
|
|
def _can_bypass_rights_on_media_dialog(self, **attachment_data):
|
|
""" This method is meant to be overridden, for instance to allow to
|
|
create image attachment despite the user not allowed to create
|
|
attachment, eg:
|
|
- Portal user uploading an image on the forum (bypass acl)
|
|
- Non admin user uploading an unsplash image (bypass binary/url check)
|
|
"""
|
|
return False
|