Odoo18-Base/addons/website_slides/controllers/mail.py
2025-01-06 10:57:38 +07:00

80 lines
3.4 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from werkzeug.exceptions import NotFound, Forbidden
from odoo import http
from odoo.http import request
from odoo.addons.portal.controllers.mail import PortalChatter
from odoo.tools import plaintext2html, html2plaintext
class SlidesPortalChatter(PortalChatter):
def _portal_post_has_content(self, thread_model, thread_id, message, attachment_ids=None, **kw):
""" Relax constraint on slide model: having a rating value is sufficient
to consider we have a content. """
if thread_model == 'slide.channel' and kw.get('rating_value'):
return True
return super()._portal_post_has_content(thread_model, thread_id, message, attachment_ids=attachment_ids, **kw)
@http.route([
'/slides/mail/update_comment',
], type='json', auth="user", methods=['POST'])
def mail_update_message(self, thread_model, thread_id, message_id, post_data, **post):
# keep this mechanism intern to slide currently (saas 12.5) as it is
# considered experimental
if thread_model != 'slide.channel':
raise Forbidden()
thread_id = int(thread_id)
attachment_ids = post_data.get('attachment_ids', [])
self._portal_post_check_attachments(attachment_ids, post.get('attachment_tokens', []))
pid = int(post['pid']) if post.get('pid') else False
channel = request.env["slide.channel"]._get_thread_with_access(
thread_id,
request.env["slide.channel"]._mail_post_access,
token=post.get("token"),
hash=post.get("hash"),
pid=pid,
)
if not channel:
raise Forbidden()
# fetch and update mail.message
message_id = int(message_id)
message_body = plaintext2html(post_data.get('body', ''))
subtype_comment_id = request.env['ir.model.data']._xmlid_to_res_id('mail.mt_comment')
domain = [
('model', '=', thread_model),
('res_id', '=', thread_id),
('subtype_id', '=', subtype_comment_id),
('author_id', '=', request.env.user.partner_id.id),
('message_type', '=', 'comment'),
('id', '=', message_id)
] # restrict to the given message_id
message = request.env['mail.message'].search(domain, limit=1)
if not message:
raise NotFound()
message.sudo().write({
'body': message_body,
'attachment_ids': [(4, aid) for aid in attachment_ids],
})
# update rating
if post_data.get('rating_value'):
domain = [('res_model', '=', thread_model), ('res_id', '=', thread_id), ('message_id', '=', message.id)]
rating = request.env['rating.rating'].sudo().search(domain, order='write_date DESC', limit=1)
rating.write({
'rating': float(post_data['rating_value']),
'feedback': html2plaintext(message.body),
})
return {
'default_message_id': message.id,
'default_message': html2plaintext(message.body),
'default_rating_value': message.rating_value,
'rating_avg': channel.rating_avg,
'rating_count': channel.rating_count,
'default_attachment_ids': message.attachment_ids.sudo().read(['id', 'name', 'mimetype', 'file_size', 'access_token']),
'force_submit_url': '/slides/mail/update_comment',
}