83 lines
3.7 KiB
Python
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
|