website_forum/populate/mail_message.py

83 lines
3.7 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import logging
from odoo import fields, models
from odoo.tools import populate
CP_WEIGHTS = {1: 35, 2: 30, 3: 25, 4: 10}
_logger = logging.getLogger(__name__)
class Message(models.Model):
_inherit = 'mail.message'
@property
def _populate_dependencies(self):
return super()._populate_dependencies + ["res.users", "forum.post"]
def _populate(self, size):
"""Randomly assign messages to some populated posts and answers.
This makes sure these questions and answers get one to four comments.
Also define a date that is more recent than the post/answer's create_date
"""
records = super()._populate(size)
comment_subtype = self.env.ref('mail.mt_comment')
hours = [_ for _ in range(1, 24)]
random = populate.Random('comments_on_forum_posts')
users = self.env["res.users"].browse(self.env.registry.populated_models['res.users'])
vals_list = []
question_ids = self.env.registry.populated_models['forum.post']
posts = self.env['forum.post'].search(['|', ('id', 'in', question_ids), ('parent_id', 'in', question_ids)])
for post in random.sample(posts, int(len(question_ids) * 0.7)):
nb_comments = random.choices(*zip(*CP_WEIGHTS.items()))[0]
for counter in range(nb_comments):
vals_list.append({
"author_id": random.choice(users.partner_id.ids),
"body": f"message_body_{counter}",
"date": fields.Datetime.add(post.create_date, hours=random.choice(hours)),
"message_type": "comment",
"model": "forum.post",
"res_id": post.id,
"subtype_id": comment_subtype.id,
})
messages = self.env["mail.message"].create(vals_list)
_logger.info('mail.message: update comments create date and uid')
_logger.info('forum.post: update last_activity_date for posts with comments and/or commented answers')
query = """
WITH comment_author AS(
SELECT mm.id, mm.author_id, ru.id as user_id, ru.partner_id
FROM mail_message mm
JOIN res_users ru
ON mm.author_id = ru.partner_id
WHERE mm.id in %(comment_ids)s
),
updated_comments as (
UPDATE mail_message mm
SET create_date = date,
create_uid = ca.user_id
FROM comment_author ca
WHERE mm.id = ca.id
RETURNING res_id as post_id, create_date as comment_date
),
max_comment_dates AS (
SELECT post_id, max(comment_date) as last_comment_date
FROM updated_comments
GROUP BY post_id
),
updated_posts AS (
UPDATE forum_post fp
SET last_activity_date = CASE --on questions, answer could be more recent
WHEN fp.parent_id IS NOT NULL THEN greatest(last_activity_date, last_comment_date)
ELSE last_comment_date END
FROM max_comment_dates
WHERE max_comment_dates.post_id = fp.id
RETURNING fp.id as post_id, fp.last_activity_date as last_activity_date, fp.parent_id as parent_id
)
UPDATE forum_post fp
SET last_activity_date = greatest(fp.last_activity_date, up.last_activity_date)
FROM updated_posts up
WHERE up.parent_id = fp.id
"""
self.env.cr.execute(query, {'comment_ids': tuple(messages.ids)})
return records + messages