This commit is contained in:
Ladebeze66 2025-04-03 14:09:30 +02:00
parent f3c69f1b75
commit ef39245360
5 changed files with 27 additions and 117 deletions

View File

@ -1,56 +0,0 @@
[
{
"message_id": 228803,
"sender": "Romuald GRUSON",
"timestamp": "2025-04-02 07:16:48",
"content": ""
},
{
"message_id": 227733,
"sender": "Romuald GRUSON",
"timestamp": "2025-03-18 14:19:29",
"content": ""
},
{
"message_id": 227732,
"sender": "Romuald GRUSON",
"timestamp": "2025-03-18 14:19:29",
"content": ""
},
{
"message_id": 227731,
"sender": "Romuald GRUSON",
"timestamp": "2025-03-18 14:18:51",
"content": "Bonjour,Effectivement, il y a une anomalie lors du changement du nom d'un poste de production. Les mises à jour déployées ce soir et demain devraient vous permettre deffectuer cette modification. Pour cela, il faut éditer le nom du poste de production denrobée, lenregistrer dans la fiche générale, puis cliquer sur la petite flèche à droite du nom et le modifier.Je reste à votre entière disposition pour toute information complémentaire.Cordialement,---Support technique Afin d'assurer une meilleure traçabilité et vous garantir une prise en charge optimale, nous vous invitons à envoyer vos demandes d'assistance technique à support@cbao.frL'objectif du Support Technique est de vous aider : si vous rencontrez une difficulté, ou pour nous soumettre une ou des suggestions d'amélioration de nos logiciels ou de nos méthodes. Notre service est ouvert du lundi au vendredi de 9h à 12h et de 14h à 18h. Dès réception, un technicien prendra en charge votre demande et au besoin vous rappellera.Confidentialité : Ce courriel contient des informations confidentielles exclusivement réservées au destinataire mentionné. Si vous deviez recevoir cet e-mail par erreur, merci den avertir immédiatement lexpéditeur et de le supprimer de votre système informatique. Au cas où vous ne seriez pas destinataire de ce message, veuillez noter que sa divulgation, sa copie ou tout acte en rapport avec la communication du contenu des informations est strictement interdit."
},
{
"message_id": 227730,
"sender": "Romuald GRUSON",
"timestamp": "2025-03-18 13:42:15",
"content": ""
},
{
"message_id": 227728,
"sender": "Romuald GRUSON",
"timestamp": "2025-03-18 13:42:04",
"content": ""
},
{
"message_id": 227726,
"sender": "OdooBot",
"timestamp": "2025-03-18 13:22:28",
"content": ""
},
{
"message_id": 227725,
"sender": "CONSEIL DEPARTEMENTAL DU MORBIHAN (56), Dominique CARVAL",
"timestamp": "2025-03-18 13:18:31",
"content": "Bonjour, 3 centrales denrobage ont changé de nom. Comment faire ce changement sur BRG-LAB ? (ici ARMOR ENROBÉS devient BREIZH ENROBÉS sur 3 sites) Bonne réception Dominique CARVAL Responsable du pôle Laboratoire Routier Direction des Infrastructures et des mobilités (DIM) Service dAppui aux Politiques dAménagement / Pôle Laboratoire Routier (SAPA/PLR) 115, rue du commerce 56000 VANNES tél : 02 97 54 71 14 - mobile : 06 98 32 88 30 dominique.carval@morbihan.fr Droit à la déconnexion : Si vous recevez ce message en dehors de vos heures de travail ou pendant vos congés, vous nêtes pas tenu de répondre immédiatement, sauf en cas durgence exceptionnelle. Ce message électronique et tous les fichiers attachés qu'il contient peuvent être confidentiels, contenir des données personnelles ou sensibles et être soumis au secret professionnel. Il est destiné exclusivement à l'usage du ou des destinataires. Si vous recevez ce message par erreur et/ou si vous n'êtes pas le destinataire désigné de ce message, le département du Morbihan vous remercie d'avertir immédiatement l'expéditeur et de le détruire ainsi que toutes les pièces jointes s'y rattachant. La publication, l'usage, la distribution, l'impression ou la copie non autorisée de ce message et des attachements qu'il contient sont strictement interdits. Tout message électronique est susceptible d'altération."
},
{
"message_id": 227724,
"sender": "OdooBot",
"timestamp": "2025-03-18 13:22:28",
"content": ""
}
]

View File

@ -2,16 +2,19 @@
{
"id": 144796,
"name": "image.png",
"file_path": "output/ticket_T11067/attachments/144796_image.png"
"file_path": "output/ticket_T11067/attachments/144796_image.png",
"mimetype": "image/png"
},
{
"id": 144794,
"name": "image004.jpg",
"file_path": "output/ticket_T11067/attachments/144794_image004.jpg"
"file_path": "output/ticket_T11067/attachments/144794_image004.jpg",
"mimetype": "image/jpeg"
},
{
"id": 144792,
"name": "image003.png",
"file_path": "output/ticket_T11067/attachments/144792_image003.png"
"file_path": "output/ticket_T11067/attachments/144792_image003.png",
"mimetype": "image/png"
}
]

View File

@ -1,9 +1,8 @@
{
"date_extraction": "2025-04-03T11:44:17.400752",
"date_extraction": "2025-04-03T14:08:56.839665",
"ticket_dir": "output/ticket_T11067",
"fichiers_json": [
"ticket_info.json",
"all_messages.json",
"attachments_info.json"
]
}

View File

@ -67,15 +67,6 @@ class TicketManager:
return {}
def get_ticket_by_code(self, ticket_code: str) -> Dict[str, Any]:
"""
Recherche un ticket par son code unique.
Args:
ticket_code: Code unique du ticket (ex: T11067)
Returns:
Dictionnaire contenant les données du ticket ou un message d'erreur
"""
params = {
"model": self.model_name,
"method": "search_read",
@ -89,33 +80,22 @@ class TicketManager:
else:
print(f"Aucun ticket trouvé avec le code {ticket_code} ou une erreur est survenue.")
return {}
def get_ticket_messages(self, ticket_id: int) -> List[Dict[str, Any]]:
messages = self._rpc_call("/web/dataset/call_kw", {
"model": "mail.message",
"method": "search_read",
"args": [[[ "res_id", "=", ticket_id], ["model", "=", "project.task"]]],
"kwargs": {"fields": ["id", "body", "author_id", "date"]}
})
return messages if isinstance(messages, list) else []
def get_ticket_attachments(self, ticket_id: int) -> List[Dict[str, Any]]:
attachments = self._rpc_call("/web/dataset/call_kw", {
"model": "ir.attachment",
"method": "search_read",
"args": [[[ "res_id", "=", ticket_id], ["res_model", "=", self.model_name]]],
"kwargs": {"fields": ["id", "name", "datas"]}
"args": [[["res_id", "=", ticket_id], ["res_model", "=", self.model_name]]],
"kwargs": {"fields": ["id", "name", "datas", "mimetype"]}
})
return attachments if isinstance(attachments, list) else []
def save_json(self, data: Any, path: str):
with open(path, "w", encoding="utf-8") as f:
json.dump(data, f, indent=2, ensure_ascii=False)
def clean_html(self, html_content: str) -> str:
if BeautifulSoup:
soup = BeautifulSoup(html_content, "html.parser")
text = soup.get_text()
for element in soup(['style', 'script', 'footer', 'header']):
element.extract()
text = soup.get_text(separator=' ', strip=True)
else:
text = re.sub(r'<.*?>', '', html_content)
@ -124,44 +104,30 @@ class TicketManager:
return text
def save_json(self, data: Any, path: str):
with open(path, "w", encoding="utf-8") as f:
json.dump(data, f, indent=2, ensure_ascii=False)
def extract_ticket_data(self, ticket_id: int, output_dir: str):
os.makedirs(output_dir, exist_ok=True)
ticket_data = self.get_ticket(ticket_id)
if not ticket_data or "id" not in ticket_data:
print(f"Erreur: Ticket non trouvé.")
if not ticket_data:
print("Erreur: Ticket non trouvé.")
return None
# Sauvegarder ticket_info.json
ticket_info_path = os.path.join(output_dir, "ticket_info.json")
self.save_json(ticket_data, ticket_info_path)
# Récupération et nettoyage des messages
messages = self.get_ticket_messages(ticket_id)
cleaned_messages = []
for msg in messages:
cleaned_messages.append({
"message_id": msg["id"],
"sender": msg["author_id"][1] if msg["author_id"] else "Unknown",
"timestamp": msg["date"],
"content": self.clean_html(msg["body"])
})
# Sauvegarder all_messages.json
messages_path = os.path.join(output_dir, "all_messages.json")
self.save_json(cleaned_messages, messages_path)
# Pièces jointes
attachments = self.get_ticket_attachments(ticket_id)
attachment_list = []
attachments_dir = os.path.join(output_dir, "attachments")
os.makedirs(attachments_dir, exist_ok=True)
for attachment in attachments:
if "datas" in attachment and attachment["datas"]:
file_name = f"{attachment['id']}_{attachment['name']}"
file_path = os.path.join(output_dir, "attachments", file_name)
os.makedirs(os.path.dirname(file_path), exist_ok=True)
file_path = os.path.join(attachments_dir, file_name)
with open(file_path, "wb") as f:
f.write(base64.b64decode(attachment["datas"]))
@ -169,19 +135,18 @@ class TicketManager:
attachment_list.append({
"id": attachment["id"],
"name": attachment["name"],
"file_path": file_path
"file_path": file_path,
"mimetype": attachment.get("mimetype")
})
attachments_path = os.path.join(output_dir, "attachments_info.json")
self.save_json(attachment_list, attachments_path)
attachments_info_path = os.path.join(output_dir, "attachments_info.json")
self.save_json(attachment_list, attachments_info_path)
# Génération de structure.json
structure = {
"date_extraction": datetime.now().isoformat(),
"ticket_dir": output_dir,
"fichiers_json": [
"ticket_info.json",
"all_messages.json",
"attachments_info.json"
]
}
@ -190,7 +155,6 @@ class TicketManager:
return {
"ticket_info": ticket_info_path,
"messages_file": messages_path,
"attachments_info": attachments_info_path,
"ticket_data_file": structure_path,
"attachments": attachments_path
}