From 9bd43e24b15b17731305f34705cf34b8e90aecd0 Mon Sep 17 00:00:00 2001 From: Ladebeze66 Date: Wed, 19 Mar 2025 15:39:56 +0100 Subject: [PATCH] J6-4 --- .gitignore | 1 - __pycache__/menu_handlers.cpython-312.pyc | Bin 4075 -> 4049 bytes __pycache__/ticket_manager.cpython-312.pyc | Bin 10131 -> 10014 bytes __pycache__/utils.cpython-312.pyc | Bin 2193 -> 788 bytes data_filter.py | 38 ------ exported_tickets/ticket_10157_raw.json | 141 --------------------- exported_tickets/ticket_T10178_raw.json | 3 - menu_handlers.py | 2 +- old_functions.py | 66 ---------- ticket_manager.py | 7 +- utils.py | 39 ------ 11 files changed, 3 insertions(+), 294 deletions(-) delete mode 100644 exported_tickets/ticket_10157_raw.json delete mode 100644 exported_tickets/ticket_T10178_raw.json delete mode 100644 old_functions.py diff --git a/.gitignore b/.gitignore index f581bfe..fce6cc6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ /odtkit -/exported_tickets config.py \ No newline at end of file diff --git a/__pycache__/menu_handlers.cpython-312.pyc b/__pycache__/menu_handlers.cpython-312.pyc index 4b6e9da55f85ea1a110067bf622898efbb9ba688..29f03a32b72052c2a7819385feb7432d6b2545cd 100644 GIT binary patch delta 525 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 Kh>=kdtP=pI)hYG> literal 2193 zcmZvdO>7fK6o6-T*K2QL#|d?QThb*-0SA#3S_q<{$PIy}pil^kN>pSm-ifn`z3a~I zCb8wTX@%4vMXl*2kpPK9524{uwU-fj|Xs&EMnc~lQbQ58XY(>UyV#0>R^u~X6e!TYDro{JvqI~&7A>#Tv35f63!3lMWC zi|A_>XoWIb@}o2W?WkuI(DX)KEti+iT9E|$lqu(f&WsIRoT+-9+gZ*ir)7-jJQ z3iEatRzytGrbPb8CUSzv^zO|Rp_ZY+kh+UZrVMJyWKuINat{8c&sC$wSlHumhUo|? z#Ts#hQA5)y`$)oEK=!t6+;oqD1(*P;b4qMKG|0IaZUGWUa+Mt^z(`B2^5i7O}OPF*?m zb<@J&O6bkY(%+%x87VJ_pP&5nWKOzqY*h%~uM8~

^1WVq5Rt3j=PHegS0;NvM3A zSztruZt;t39?AhU#aTriqQ&C-LdoJRrwXd)mbh4)bt&?y-tzsYeXVF8GVuh5(Rqa7 zm-bEa=g|aiMdhfrA^P$ZZ%L&CR4I$DBDEsRUq#o2#bU&n1=Tynf6S+aLOX#cP{CTb z(%uQX2NZjp#1*PSP>Ct4hOXbe35sIN!v;+%mi*qp>3#=KWIVPty!VhBX+37BnjSy? zi2Vx)r@t5u#f)j1BWk)zbgTbdW_K^8#HMn>pkNv(Qe<<>d2oal8_@`rGu&YrxDkvL z(SaG$0IAx^lq2;{#z@N2V8D~2nr?*!$2Y7ch^{0FtWhk*!NU$FCUZrGLj9mPlBtZ7 zC^JNxpUB)nE2q?#rq3k%iu+9jpHC zr#wtN48HW#Q)r*%D?^VF2fKZNx?9xERi)Kaf{L?3jGN@f znh>JFGI&{BTI0^}Sz!Q>EuXD!fl)%UBLK0ReAz(&an*BcJtbQV+}Zj~RK?7}(-$ob zpptD}j*S@Fq|9=GW-1orE2Yq+22(&7OGl8N43`=65xav7*CA&DgN6l(%iView%cI5 z$F-yB<4QtPNrya0Y%P%>8J6jYX)0+#J2E>qN8xk|sDcB!k-P}Diu=MMZ3JtMM07hz zD0t-X0IK8B^ptHmJh19i3@Qnmz-urlU@oSpkxW^Rx9FvV;n5UyM`Rwxh{?jja4zy3 zj1wzrn}kLS^K=i)H$XMN0x^vqR#X9%GsClid}GUvu7$`-W5;6vyX|t{Ok`#}@2|<7 z$@S#u{LcA?D%>#;&W0 zUxV%U>$m3uYdosn^F%~7b<1_#tJO!=YEfnI-zRmbx{00B1t%qjex4 z5QaXi#oce0`&n@liF@y^xtjnlTg=kUhOawmsCI(9P4_{Ud11DIfV;r>0g@h|%0JNd Xb-{~kA8+%42vy;(bs6Iwu8scy0SE^) diff --git a/data_filter.py b/data_filter.py index 6de835d..e69de29 100644 --- a/data_filter.py +++ b/data_filter.py @@ -1,38 +0,0 @@ -import re -import html -from bs4 import BeautifulSoup - -def clean_html(content): - """Nettoie le contenu HTML en supprimant les balises.""" - if not content: - return "" - soup = BeautifulSoup(content, 'html.parser') - return soup.get_text(separator='\n', strip=True) - -def filter_ticket_data(ticket_data): - """Filtre les données d'un ticket pour ne garder que les informations essentielles.""" - - # Vérifier que ticket_data est bien une liste et extraire le premier élément - if isinstance(ticket_data, list) and len(ticket_data) > 0: - ticket_data = ticket_data[0] - else: - return {"Erreur": "Format de ticket invalide"} - - filtered_ticket = { - "ID du Ticket": ticket_data.get("id", "ID non disponible"), - "Nom": ticket_data.get("name", "Nom inconnu"), - "Code": ticket_data.get("code", "N/A"), - "Date Limite": ticket_data.get("date_deadline", "Non définie"), - "Projet": { - "ID": ticket_data.get("project_id", [None, "Projet inconnu"])[0], - "Nom": ticket_data.get("project_id", [None, "Projet inconnu"])[1] - }, - "Étape": { - "ID": ticket_data.get("stage_id", [None, "Étape inconnue"])[0], - "Nom": ticket_data.get("stage_id", [None, "Étape inconnue"])[1] - }, - "Description": clean_html(ticket_data.get("description", "")), - "Discussions": ticket_data.get("message_ids", []) - } - - return filtered_ticket diff --git a/exported_tickets/ticket_10157_raw.json b/exported_tickets/ticket_10157_raw.json deleted file mode 100644 index 3ac2224..0000000 --- a/exported_tickets/ticket_10157_raw.json +++ /dev/null @@ -1,141 +0,0 @@ -{ - "id": 10157, - "active": true, - "name": "L'arrondi au 1/10 ne se fait pas sur la granulométrie du contrôle de conformité", - "description": "

L'arrondi au 1/10 ne se fait pas sur la granulométrie du contrôle de conformité sur le granulat 0.5




", - "sequence": 3, - "stage_id": [ - 46, - "Tickets existants" - ], - "kanban_state": "normal", - "create_date": "2024-10-14 14:46:55", - "write_date": "2025-03-18 15:49:16", - "date_start": "2024-10-14 14:46:55", - "date_end": false, - "date_assign": false, - "date_deadline": false, - "date_last_stage_update": "2024-10-15 08:40:18", - "project_id": [ - 4, - "Tickets" - ], - "notes": false, - "planned_hours": 0.0, - "user_id": false, - "partner_id": [ - 28644, - "GROLLEMUND LABOROUTES GRAND EST, Marion NICOD" - ], - "company_id": [ - 1, - "CBAO S.A.R.L." - ], - "color": 0, - "displayed_image_id": false, - "parent_id": false, - "child_ids": [], - "email_from": "m.nicod@laboroutes.com", - "email_cc": false, - "working_hours_open": 0.0, - "working_hours_close": 0.0, - "working_days_open": 0.0, - "working_days_close": 0.0, - "website_message_ids": [ - 205371 - ], - "remaining_hours": 0.0, - "effective_hours": 0.0, - "total_hours_spent": 0.0, - "progress": 0.0, - "subtask_effective_hours": 0.0, - "timesheet_ids": [], - "priority": "0", - "code": "T10178", - "milestone_id": false, - "sale_line_id": false, - "sale_order_id": false, - "billable_type": "no", - "activity_ids": [], - "message_follower_ids": [ - 81962, - 81963 - ], - "message_ids": [ - 205371, - 205370, - 205302 - ], - "message_main_attachment_id": false, - "failed_message_ids": [], - "rating_ids": [], - "rating_last_value": 0.0, - "access_token": false, - "create_uid": [ - 32, - "Romuald GRUSON" - ], - "write_uid": [ - 22, - "Fabien LAFAY" - ], - "x_CBAO_windows_maj_ID": false, - "x_CBAO_version_signalement": false, - "x_CBAO_version_correction": false, - "x_CBAO_DateCorrection": false, - "x_CBAO_Scoring_Facilite": 0, - "x_CBAO_Scoring_Importance": 2, - "x_CBAO_Scoring_Urgence": 2, - "x_CBAO_Scoring_Incidence": 2, - "x_CBAO_Scoring_Resultat": 6, - "x_CBAO_InformationsSup": false, - "kanban_state_label": "En cours", - "subtask_planned_hours": 0.0, - "manager_id": [ - 8, - "Quentin FAIVRE" - ], - "user_email": false, - "attachment_ids": [], - "legend_blocked": "Bloqué", - "legend_done": "Prêt pour la prochaine étape", - "legend_normal": "En cours", - "subtask_project_id": [ - 4, - "Tickets" - ], - "subtask_count": 0, - "analytic_account_active": true, - "allow_timesheets": true, - "use_milestones": false, - "show_time_control": "start", - "is_project_map_empty": true, - "activity_state": false, - "activity_user_id": false, - "activity_type_id": false, - "activity_date_deadline": false, - "activity_summary": false, - "message_is_follower": false, - "message_unread": false, - "message_unread_counter": 0, - "message_needaction": false, - "message_needaction_counter": 0, - "message_has_error": false, - "message_has_error_counter": 0, - "message_attachment_count": 0, - "rating_last_feedback": false, - "rating_last_image": false, - "rating_count": 0, - "access_url": "/my/task/10157", - "access_warning": "", - "display_name": "[T10178] L'arrondi au 1/10 ne se fait pas sur la granulométrie du contrôle de conformité", - "__last_update": "2025-03-18 15:49:16", - "stage_id_value": "Tickets existants", - "project_id_value": "Tickets", - "partner_id_value": "GROLLEMUND LABOROUTES GRAND EST, Marion NICOD", - "manager_id_value": "Quentin FAIVRE", - "company_id_value": "CBAO S.A.R.L.", - "subtask_project_id_value": "Tickets", - "create_uid_value": "Romuald GRUSON", - "write_uid_value": "Fabien LAFAY" -} \ No newline at end of file diff --git a/exported_tickets/ticket_T10178_raw.json b/exported_tickets/ticket_T10178_raw.json deleted file mode 100644 index 80bbc25..0000000 --- a/exported_tickets/ticket_T10178_raw.json +++ /dev/null @@ -1,3 +0,0 @@ -[ - 10157 -] \ No newline at end of file diff --git a/menu_handlers.py b/menu_handlers.py index d44e421..d46f947 100644 --- a/menu_handlers.py +++ b/menu_handlers.py @@ -1,5 +1,5 @@ from ticket_manager import TicketManager -from utils import get_user_choice, print_error +from utils import print_error # Initialisation de l'objet ticket_manager = TicketManager() diff --git a/old_functions.py b/old_functions.py deleted file mode 100644 index 2316bee..0000000 --- a/old_functions.py +++ /dev/null @@ -1,66 +0,0 @@ -def handle_list_models(): - """Gère l'affichage de la liste des modèles""" - ticket_manager.list_models() - - - -def handle_list_model_fields(): - """Gère l'affichage des champs d'un modèle""" - model_name = input("\nEntrez le nom du modèle: ") - if not model_name: - print("Aucun nom de modèle fourni.") - return - ticket_manager.list_model_fields(model_name) - - -def handle_export_model_fields_to_json(): - """Gère l'exportation des informations des champs d'un modèle en JSON""" - model_name = input("\nEntrez le nom du modèle: ") - if not model_name: - print("Aucun nom de modèle fourni.") - return - filename = input("Entrez le nom du fichier pour l'exportation: ") - if not filename: - print("Aucun nom de fichier fourni.") - return - ticket_manager.export_model_fields_to_json(model_name, filename) - - ///partie ticket_manager.py - def list_models(self): - """Affiche la liste des modèles disponibles dans Odoo""" - models = self._safe_execute('ir.model', 'search_read', [], ['model', 'name']) - if not models: - print_error("Aucun modèle disponible.") - return [] - - print("\nListe des modèles disponibles:") - for model in models: - print(f"Modèle: {model['name']} (ID: {model['model']})") - return models - - def list_model_fields(self, model_name): - """Affiche les champs d'un modèle donné""" - fields_info = self._safe_execute(model_name, 'fields_get') - if not fields_info: - print_error(f"Aucun champ trouvé pour le modèle {model_name}.") - return [] - - print(f"\nChamps du modèle {model_name}:") - for field_name, field_data in fields_info.items(): - print(f"Champ: {field_name} - Type: {field_data['type']}") - return fields_info - - def export_model_fields_to_json(self, model_name, filename): - """Exporte les champs d'un modèle dans un fichier JSON""" - fields_info = self._safe_execute(model_name, 'fields_get') - if not fields_info: - print_error(f"Aucun champ trouvé pour le modèle {model_name}.") - return - - data = {field_name: field_data['type'] for field_name, field_data in fields_info.items()} - filepath = os.path.join(EXPORT_DIR, filename) - - if save_json(filepath, data): - print(f"Champs du modèle {model_name} exportés dans {filepath}") - else: - print_error(f"Erreur lors de l'exportation des champs du modèle {model_name} dans {filepath}") \ No newline at end of file diff --git a/ticket_manager.py b/ticket_manager.py index 2bb0eb0..b882542 100644 --- a/ticket_manager.py +++ b/ticket_manager.py @@ -1,11 +1,8 @@ from odoo_connection import OdooConnection import os import json -import re -from utils import save_json, ensure_export_directory, print_error +from utils import print_error from config import EXPORT_DIR -from data_filter import filter_ticket_data -import odoorpc class TicketManager: """Gestionnaire de tickets simplifié avec seulement les fonctionnalités essentielles""" @@ -151,7 +148,7 @@ class TicketManager: # Récupérer les tickets du projet domain = [('project_id', '=', project_id)] - ticket_ids = self._safe_execute(self.model_name, 'search', domain, 0, 1000) + ticket_ids = self._safe_execute(self.model_name, 'search', domain, 0, 10) if not ticket_ids: print_error(f"Aucun ticket trouvé pour le projet {project_id}.") return diff --git a/utils.py b/utils.py index 54baa54..de76502 100644 --- a/utils.py +++ b/utils.py @@ -1,41 +1,2 @@ -import os -import json -from config import EXPORT_DIR - -def ensure_export_directory(subdir=None): - """Assure que le répertoire d'export existe""" - if subdir: - directory = os.path.join(EXPORT_DIR, subdir) - else: - directory = EXPORT_DIR - os.makedirs(directory, exist_ok=True) - return directory - -def save_json(filename, data): - """Sauvegarde des données au format JSON""" - try: - with open(filename, 'w', encoding='utf-8') as f: - json.dump(data, f, ensure_ascii=False, indent=4) - return True - except Exception as e: - print(f"Erreur lors de la sauvegarde du fichier {filename}: {e}") - return False - -def get_user_choice(prompt, options): - """Obtient un choix utilisateur parmi une liste d'options""" - while True: - print(prompt) - for i, option in enumerate(options, 1): - print(f"{i}. {option}") - - try: - choice = int(input("Votre choix: ")) - if 1 <= choice <= len(options): - return choice - else: - print("Choix invalide. Veuillez réessayer.") - except ValueError: - print("Veuillez entrer un nombre valide.") - def print_error(message): print(f" Erreur: {message}") \ No newline at end of file