bemade-addons/replace_invoicing_user/models/account_move.py
2025-03-06 11:39:23 -05:00

82 lines
4.1 KiB
Python

from odoo import models, api, _
from odoo.tools import float_compare
class AccountMove(models.Model):
_inherit = 'account.move'
def _get_mail_thread_data_for_subtype(self, subtype_id):
# Surcharge de la méthode qui contrôle l'ajout des followers
# Si no_follower_tracking est activé, on empêche l'ajout du follower par défaut
if self.env.context.get('no_follower_tracking'):
return []
return super()._get_mail_thread_data_for_subtype(subtype_id)
def message_subscribe(self, partner_ids=None, subtype_ids=None, email=True):
# Empêcher l'ajout automatique de followers pour les factures si no_follower_tracking est activé
if self._name == 'account.move' and self.env.context.get('no_follower_tracking'):
# On ne permet l'ajout que de l'utilisateur spécifique
specific_user_id = self.env.context.get('specific_invoice_user_id') or int(self.env['ir.config_parameter'].sudo().get_param(
'current_user_as_invoice_user.specific_user_id', '0'
))
if specific_user_id:
specific_user = self.env['res.users'].browse(specific_user_id)
if specific_user.exists() and specific_user.partner_id:
# On filtre pour ne garder que l'utilisateur spécifique dans les partner_ids
partner_ids = [pid for pid in partner_ids if pid == specific_user.partner_id.id] if partner_ids else []
# Si vide, on ne fait rien
if not partner_ids:
return True
else:
# Aucun utilisateur spécifique, on empêche l'ajout de followers
return True
return super().message_subscribe(partner_ids=partner_ids, subtype_ids=subtype_ids, email=email)
@api.model_create_multi
def create(self, vals_list):
# Modélisation des vals_list pour empêcher l'ajout des followers par défaut
if self.env.context.get('no_follower_tracking'):
for vals in vals_list:
# Désactiver l'ajout automatique des followers lors de la création
vals['message_follower_ids'] = []
# Créer les factures normalement avec le contexte approprié
# Le contexte no_follower_tracking désactive l'ajout automatique du current_user via _get_mail_thread_data_for_subtype
moves = super().create(vals_list)
# Vérifier si on doit configurer des followers spécifiques
if self.env.context.get('no_follower_tracking'):
# Utiliser specific_invoice_user_id du contexte s'il existe, sinon lire depuis les paramètres
specific_user_id = self.env.context.get('specific_invoice_user_id') or int(self.env['ir.config_parameter'].sudo().get_param(
'current_user_as_invoice_user.specific_user_id', '0'
))
# Récupérer l'utilisateur spécifique
specific_user = None
if specific_user_id:
specific_user = self.env['res.users'].browse(specific_user_id)
# Utiliser l'environnement superuser pour éviter les problèmes de droits
# et traiter tous les moves d'un coup
moves_sudo = moves.sudo()
# D'abord, supprimer tous les followers pour tous les moves
follower_model = self.env['mail.followers'].sudo()
domain = [
('res_model', '=', 'account.move'),
('res_id', 'in', moves.ids)
]
followers = follower_model.search(domain)
if followers:
followers.unlink()
# Ensuite, ajouter l'utilisateur spécifique comme seul follower si nécessaire
if specific_user and specific_user.exists() and specific_user.partner_id:
for move in moves_sudo:
follower_model.create({
'partner_id': specific_user.partner_id.id,
'res_model': 'account.move',
'res_id': move.id
})
return moves