Corriger les watchdogs ENT et Outlook
Some checks are pending
CI - Tests et Syntax / lint-and-test (push) Waiting to run
Some checks are pending
CI - Tests et Syntax / lint-and-test (push) Waiting to run
This commit is contained in:
parent
372671204d
commit
899b298048
4 changed files with 58 additions and 8 deletions
|
|
@ -4,7 +4,7 @@ Intégration avec Outlook/Microsoft
|
||||||
"""
|
"""
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
from app_new.extensions import db
|
from app_new.extensions import db
|
||||||
from sqlalchemy.dialects.mysql import LONGTEXT
|
from sqlalchemy.dialects.mysql import LONGTEXT, LONGBLOB
|
||||||
|
|
||||||
|
|
||||||
class OutlookAccount(db.Model):
|
class OutlookAccount(db.Model):
|
||||||
|
|
@ -96,14 +96,16 @@ class OutlookAttachment(db.Model):
|
||||||
"""Pièce jointe d'un email Outlook."""
|
"""Pièce jointe d'un email Outlook."""
|
||||||
__tablename__ = "outlook_attachments"
|
__tablename__ = "outlook_attachments"
|
||||||
|
|
||||||
id = db.Column(db.String(100), primary_key=True) # Attachment ID from Microsoft
|
# Les identifiants Microsoft Graph peuvent dépasser 100 caractères.
|
||||||
|
id = db.Column(db.String(500), primary_key=True) # Attachment ID from Microsoft
|
||||||
mail_id = db.Column(db.String(500), db.ForeignKey("outlook_mails.id"), nullable=False)
|
mail_id = db.Column(db.String(500), db.ForeignKey("outlook_mails.id"), nullable=False)
|
||||||
name = db.Column(db.String(500), nullable=False)
|
name = db.Column(db.String(500), nullable=False)
|
||||||
content_type = db.Column(db.String(100), nullable=True)
|
content_type = db.Column(db.String(100), nullable=True)
|
||||||
size = db.Column(db.Integer, default=0)
|
size = db.Column(db.Integer, default=0)
|
||||||
is_inline = db.Column(db.Boolean, default=False)
|
is_inline = db.Column(db.Boolean, default=False)
|
||||||
content_id = db.Column(db.String(200), nullable=True) # Pour les images inline
|
content_id = db.Column(db.String(200), nullable=True) # Pour les images inline
|
||||||
content = db.Column(db.LargeBinary, nullable=True) # Contenu binaire de la pièce jointe
|
# Les PDF et documents doivent pouvoir dépasser 64 Kio (BLOB).
|
||||||
|
content = db.Column(LONGBLOB, nullable=True) # Contenu binaire de la pièce jointe
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f"<OutlookAttachment {self.name}>"
|
return f"<OutlookAttachment {self.name}>"
|
||||||
|
|
|
||||||
|
|
@ -179,8 +179,10 @@ def analyze_ent_message_with_hermes(msg, gmao_context):
|
||||||
from app_new.core.models.settings import AppSettings
|
from app_new.core.models.settings import AppSettings
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
api_key_setting = AppSettings.query.filter_by(key='openrouter_api_key').first()
|
# AppSettings.get déchiffre les valeurs sensibles stockées sous la forme
|
||||||
api_key = api_key_setting.value if api_key_setting else None
|
# ``enc:...``. Lire directement ``.value`` envoyait la valeur chiffrée à
|
||||||
|
# OpenRouter et provoquait une réponse 401.
|
||||||
|
api_key = AppSettings.get('openrouter_api_key')
|
||||||
|
|
||||||
if not api_key:
|
if not api_key:
|
||||||
return {'error': 'Clé API OpenRouter non configurée'}
|
return {'error': 'Clé API OpenRouter non configurée'}
|
||||||
|
|
@ -395,7 +397,7 @@ def run_watchdog():
|
||||||
db.session.add(interpretation)
|
db.session.add(interpretation)
|
||||||
created_count += 1
|
created_count += 1
|
||||||
elif result and result.get('error'):
|
elif result and result.get('error'):
|
||||||
log(f"Erreur analyse message {msg.id}: {result.get('error')}")
|
log(f"Erreur analyse message {msg.id}: {result.get('error')}", level='error')
|
||||||
|
|
||||||
processed_count += 1
|
processed_count += 1
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -208,7 +208,10 @@ def sync_inbox():
|
||||||
pdf_count += 1
|
pdf_count += 1
|
||||||
log(f" PDF téléchargé: {att_name}")
|
log(f" PDF téléchargé: {att_name}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
log(f" Erreur téléchargement pièce jointe: {str(e)[:50]}")
|
# Une pièce jointe défectueuse ne doit pas empoisonner la
|
||||||
|
# transaction et faire échouer toute la synchronisation.
|
||||||
|
db.session.rollback()
|
||||||
|
log(f" Erreur téléchargement pièce jointe {att_name}: {str(e)[:200]}", level='error')
|
||||||
|
|
||||||
if pdf_count > 0:
|
if pdf_count > 0:
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
@ -268,7 +271,7 @@ def run_watchdog():
|
||||||
|
|
||||||
if result.get('errors'):
|
if result.get('errors'):
|
||||||
for err in result.get('errors', []):
|
for err in result.get('errors', []):
|
||||||
log(f" ⚠ Erreur email: {err[:100]}")
|
log(f" Erreur email: {err[:300]}", level='error')
|
||||||
|
|
||||||
save_last_run()
|
save_last_run()
|
||||||
log("save_last_run done")
|
log("save_last_run done")
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
"""Étend le stockage des pièces jointes Outlook.
|
||||||
|
|
||||||
|
Revision ID: f1a2b3c4d5e6
|
||||||
|
Revises: e2f6a7b8c9d0
|
||||||
|
"""
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
from sqlalchemy.dialects import mysql
|
||||||
|
|
||||||
|
revision = 'f1a2b3c4d5e6'
|
||||||
|
down_revision = 'e2f6a7b8c9d0'
|
||||||
|
branch_labels = None
|
||||||
|
depends_on = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
op.alter_column(
|
||||||
|
'outlook_attachments', 'id',
|
||||||
|
existing_type=sa.String(length=100),
|
||||||
|
type_=sa.String(length=500),
|
||||||
|
existing_nullable=False,
|
||||||
|
)
|
||||||
|
op.alter_column(
|
||||||
|
'outlook_attachments', 'content',
|
||||||
|
existing_type=sa.LargeBinary(),
|
||||||
|
type_=mysql.LONGBLOB(),
|
||||||
|
existing_nullable=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
op.alter_column(
|
||||||
|
'outlook_attachments', 'content',
|
||||||
|
existing_type=mysql.LONGBLOB(),
|
||||||
|
type_=sa.LargeBinary(),
|
||||||
|
existing_nullable=True,
|
||||||
|
)
|
||||||
|
op.alter_column(
|
||||||
|
'outlook_attachments', 'id',
|
||||||
|
existing_type=sa.String(length=500),
|
||||||
|
type_=sa.String(length=100),
|
||||||
|
existing_nullable=False,
|
||||||
|
)
|
||||||
Loading…
Reference in a new issue