mail/populate/discuss/discuss_channel_member.py

69 lines
3.3 KiB
Python
Raw Normal View History

2024-05-03 12:40:35 +03:00
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import logging
from collections import defaultdict
from odoo import models
from odoo.tools import populate
_logger = logging.getLogger(__name__)
class ChannelMember(models.Model):
_inherit = "discuss.channel.member"
_populate_dependencies = ["res.partner", "res.users", "discuss.channel"]
def _populate(self, size):
res = super()._populate(size)
random = populate.Random("discuss.channel.member")
channels = self.env["discuss.channel"].browse(self.env.registry.populated_models["discuss.channel"])
users = self.env["res.users"].browse(self.env.registry.populated_models["res.users"])
users = users.filtered(lambda user: user.active)
admin = self.env.ref("base.user_admin")
# group batches by channel because chat members must be created in the same batch to satisfy contraints
users_by_channel = defaultdict(list)
big_done = 0
big = min(300, len(users))
chat_with_admin = 0
admin_dm_size = {"small": 25, "medium": 100, "large": 500}[size]
for channel in channels:
allowed_users = users
if channel.channel_type == "channel" and channel.group_public_id:
if random.randint(1, 2) == 1 and channel.group_public_id in admin.groups_id:
users_by_channel[channel].append(admin)
allowed_users = users.filtered(lambda user: channel.group_public_id in user.groups_id)
elif random.randint(1, 2) == 1 and channel.channel_type in ["channel", "group"]:
users_by_channel[channel].append(admin)
if allowed_users:
# arbitrary limit of 20 for non-channel type to have a functionally significant number
max_users = len(allowed_users) if channel.channel_type == "channel" else min(20, len(allowed_users))
number_users = (
random.choices([1, 2], weights=[1, 100], k=1)[0]
if channel.channel_type == "chat"
else big
if big_done < 2 and channel.channel_type == "channel"
else random.randrange(max_users)
)
if number_users >= big and admin in users_by_channel[channel]:
big_done += 1
if chat_with_admin < admin_dm_size and channel.channel_type == "chat" and random.randint(1, 2) == 1:
users_by_channel[channel].extend([admin, random.choice(allowed_users)])
chat_with_admin += 1
else:
users_by_channel[channel].extend(random.sample(allowed_users, number_users))
batches = [[]]
i = 0
total = 0
for channel, users in users_by_channel.items():
if len(batches[i]) > 1000:
i += 1
batches.append([])
batches[i].extend({"channel_id": channel.id, "partner_id": user.partner_id.id} for user in users)
total += len(users)
count = 0
for batch in batches:
count += len(batch)
_logger.info("Batch of discuss.channel.member: %s/%s", count, total)
res += self.env["discuss.channel.member"].create(batch)
return res