msg_attachments_to_mail_message: remove useless loggig in _is_msg_file
This commit is contained in:
parent
def8e07135
commit
c7c66a5501
1 changed files with 113 additions and 49 deletions
|
|
@ -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
|
||||||
|
|
@ -106,7 +105,7 @@ 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
|
||||||
|
|
@ -114,14 +113,18 @@ class IrAttachment(models.Model):
|
||||||
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,50 +133,94 @@ 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
|
||||||
|
|
||||||
|
|
@ -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,7 +350,9 @@ 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):
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue