msg_attachments_to_mail_message: remove useless loggig in _is_msg_file

This commit is contained in:
Marc Durepos 2025-01-28 17:04:27 -05:00
parent def8e07135
commit c7c66a5501

View file

@ -16,9 +16,9 @@ from odoo.tools import email_normalize, email_split
from io import BytesIO from io import BytesIO
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
_msg_import_logger = logging.getLogger('msg.import') _msg_import_logger = logging.getLogger("msg.import")
handler = logging.FileHandler('/var/log/odoo/msg_import.log') handler = logging.FileHandler("/var/log/odoo/msg_import.log")
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter) handler.setFormatter(formatter)
_msg_import_logger.addHandler(handler) _msg_import_logger.addHandler(handler)
_msg_import_logger.setLevel(logging.ERROR) _msg_import_logger.setLevel(logging.ERROR)
@ -45,7 +45,6 @@ class IrAttachment(models.Model):
) )
if not is_msg: if not is_msg:
_msg_import_logger.error(f"Invalid file type for MSG processing: {self.name} (mimetype: {self.mimetype})")
return False return False
# Check file size # Check file size
@ -93,7 +92,7 @@ class IrAttachment(models.Model):
msg_data (bytes): MSG file data. msg_data (bytes): MSG file data.
Returns: Returns:
str: EML file data. str: EML file data.
""" """
try: try:
# Read the MSG file # Read the MSG file
@ -106,22 +105,26 @@ class IrAttachment(models.Model):
) )
# Create email message # Create email message
email_msg = MIMEMultipart('related') email_msg = MIMEMultipart("related")
# Clean and normalize email addresses # Clean and normalize email addresses
from_email = email_normalize(msg_file.sender) if msg_file.sender else False from_email = email_normalize(msg_file.sender) if msg_file.sender else False
to_emails = email_split(msg_file.to) if msg_file.to else [] to_emails = email_split(msg_file.to) if msg_file.to else []
cc_emails = email_split(msg_file.cc) if msg_file.cc else [] cc_emails = email_split(msg_file.cc) if msg_file.cc else []
# Vérifier si les adresses existent dans les partenaires # Vérifier si les adresses existent dans les partenaires
partner_model = self.env['res.partner'] partner_model = self.env["res.partner"]
from_partners = partner_model.search([('email', '=ilike', from_email)]) if from_email else False from_partners = (
partner_model.search([("email", "=ilike", from_email)])
if from_email
else False
)
# Get current record's partner if exists # Get current record's partner if exists
current_partner = False current_partner = False
if self.res_model and self.res_id: if self.res_model and self.res_id:
record = self.env[self.res_model].browse(self.res_id) record = self.env[self.res_model].browse(self.res_id)
if hasattr(record, 'partner_id'): if hasattr(record, "partner_id"):
current_partner = record.partner_id current_partner = record.partner_id
if not from_partners: if not from_partners:
@ -130,53 +133,97 @@ class IrAttachment(models.Model):
company = current_partner.commercial_partner_id company = current_partner.commercial_partner_id
# Extract name from email if possible # Extract name from email if possible
display_name = msg_file.sender display_name = msg_file.sender
if '<' in display_name and '>' in display_name: if "<" in display_name and ">" in display_name:
display_name = display_name.split('<')[0].strip() display_name = display_name.split("<")[0].strip()
from_partner = partner_model.create({ from_partner = partner_model.create(
'name': display_name, {
'email': from_email, "name": display_name,
'parent_id': company.id, "email": from_email,
'company_id': company.company_id.id if company.company_id else self.env.company.id, "parent_id": company.id,
'type': 'contact', "company_id": (
}) company.company_id.id
_logger.info('Created new contact %s under company %s for email %s', if company.company_id
display_name, company.name, from_email) else self.env.company.id
),
"type": "contact",
}
)
_logger.info(
"Created new contact %s under company %s for email %s",
display_name,
company.name,
from_email,
)
else: else:
_logger.warning('Email sender not found in partners and no current partner to link to: %s', from_email) _logger.warning(
"Email sender not found in partners and no current partner to link to: %s",
from_email,
)
# Continue processing with the original sender # Continue processing with the original sender
from_partner = None from_partner = None
elif len(from_partners) > 1: elif len(from_partners) > 1:
if current_partner: if current_partner:
# Chercher parmi les contacts liés à la compagnie de l'objet courant # Chercher parmi les contacts liés à la compagnie de l'objet courant
company = current_partner.commercial_partner_id company = current_partner.commercial_partner_id
company_contacts = from_partners.filtered(lambda p: p.commercial_partner_id == company) company_contacts = from_partners.filtered(
lambda p: p.commercial_partner_id == company
)
if company_contacts: if company_contacts:
# Si on trouve des contacts liés à la compagnie, prendre le plus récent # Si on trouve des contacts liés à la compagnie, prendre le plus récent
from_partner = company_contacts.filtered('active').sorted('write_date', reverse=True)[0] if company_contacts.filtered('active') else company_contacts[0] from_partner = (
_logger.info('Plusieurs partenaires trouvés pour l\'email %s - Utilisation du contact %s lié à la compagnie %s', company_contacts.filtered("active").sorted(
from_email, from_partner.name, company.name) "write_date", reverse=True
)[0]
if company_contacts.filtered("active")
else company_contacts[0]
)
_logger.info(
"Plusieurs partenaires trouvés pour l'email %s - Utilisation du contact %s lié à la compagnie %s",
from_email,
from_partner.name,
company.name,
)
else: else:
# Si aucun contact lié à la compagnie n'est trouvé, utiliser la logique précédente # Si aucun contact lié à la compagnie n'est trouvé, utiliser la logique précédente
company_partner = from_partners.filtered('is_company') company_partner = from_partners.filtered("is_company")
if len(company_partner) == 1: if len(company_partner) == 1:
from_partner = company_partner from_partner = company_partner
else: else:
from_partner = from_partners.filtered('active').sorted('write_date', reverse=True)[0] if from_partners.filtered('active') else from_partners[0] from_partner = (
_logger.info('Plusieurs partenaires trouvés pour l\'email %s - Utilisation de %s (aucun contact lié à la compagnie actuelle)', from_partners.filtered("active").sorted(
from_email, from_partner.name) "write_date", reverse=True
)[0]
if from_partners.filtered("active")
else from_partners[0]
)
_logger.info(
"Plusieurs partenaires trouvés pour l'email %s - Utilisation de %s (aucun contact lié à la compagnie actuelle)",
from_email,
from_partner.name,
)
else: else:
# Si pas de partenaire courant, utiliser la logique précédente # Si pas de partenaire courant, utiliser la logique précédente
company_partner = from_partners.filtered('is_company') company_partner = from_partners.filtered("is_company")
if len(company_partner) == 1: if len(company_partner) == 1:
from_partner = company_partner from_partner = company_partner
else: else:
from_partner = from_partners.filtered('active').sorted('write_date', reverse=True)[0] if from_partners.filtered('active') else from_partners[0] from_partner = (
_logger.info('Plusieurs partenaires trouvés pour l\'email %s - Utilisation de %s', from_email, from_partner.name) from_partners.filtered("active").sorted(
"write_date", reverse=True
)[0]
if from_partners.filtered("active")
else from_partners[0]
)
_logger.info(
"Plusieurs partenaires trouvés pour l'email %s - Utilisation de %s",
from_email,
from_partner.name,
)
else: else:
from_partner = from_partners from_partner = from_partners
# Add headers # Add headers
email_msg["Subject"] = ( email_msg["Subject"] = (
self._clean_header_value(msg_file.subject) or "No Subject" self._clean_header_value(msg_file.subject) or "No Subject"
@ -206,13 +253,19 @@ class IrAttachment(models.Model):
body = msg_file.body body = msg_file.body
# Check if the body is HTML or contains HTML-like content # Check if the body is HTML or contains HTML-like content
is_html = "<html" in body.lower() or any(tag in body.lower() for tag in ["<div", "<p", "<br", "<table", "<a"]) is_html = "<html" in body.lower() or any(
tag in body.lower() for tag in ["<div", "<p", "<br", "<table", "<a"]
)
if not is_html: if not is_html:
# Convert plain text to HTML # Convert plain text to HTML
body = body.replace("\n", "<br>") body = body.replace("\n", "<br>")
# Convert URLs to links # Convert URLs to links
body = re.sub(r'(https?://[^\s<>"]+|www\.[^\s<>"]+)', r'<a href="\1">\1</a>', body) body = re.sub(
r'(https?://[^\s<>"]+|www\.[^\s<>"]+)',
r'<a href="\1">\1</a>',
body,
)
# Convert CID references to img tags # Convert CID references to img tags
if "[cid:" in body: if "[cid:" in body:
body = re.sub( body = re.sub(
@ -224,7 +277,12 @@ class IrAttachment(models.Model):
body = f"<html><body>{body}</body></html>" body = f"<html><body>{body}</body></html>"
# Always sanitize HTML to ensure proper formatting # Always sanitize HTML to ensure proper formatting
body = html_sanitize(body, sanitize_tags=False, sanitize_attributes=False, sanitize_style=False) body = html_sanitize(
body,
sanitize_tags=False,
sanitize_attributes=False,
sanitize_style=False,
)
html_part = MIMEText(body, "html") html_part = MIMEText(body, "html")
email_msg.attach(html_part) email_msg.attach(html_part)
@ -292,13 +350,15 @@ class IrAttachment(models.Model):
return email_msg.as_string() return email_msg.as_string()
except Exception as e: except Exception as e:
_msg_import_logger.error("Error converting MSG to EML: %s", str(e), exc_info=True) _msg_import_logger.error(
"Error converting MSG to EML: %s", str(e), exc_info=True
)
raise raise
def process_msg_as_email(self): def process_msg_as_email(self):
""" """
Convert MSG file to EML and process it using Odoo's mail module. Convert MSG file to EML and process it using Odoo's mail module.
Returns: Returns:
bool: True if successful, False otherwise bool: True if successful, False otherwise
""" """
@ -388,12 +448,16 @@ class IrAttachment(models.Model):
Returns: Returns:
None None
""" """
self.env['bus.bus']._sendone(self.env.user.partner_id, 'notification', { self.env["bus.bus"]._sendone(
'type': 'danger', self.env.user.partner_id,
'title': title, "notification",
'message': message, {
'sticky': True, "type": "danger",
}) "title": title,
"message": message,
"sticky": True,
},
)
@api.model_create_multi @api.model_create_multi
def create(self, vals_list): def create(self, vals_list):