From 12e34b9a7a30d23b67f69f9cf500b32cb21af9a8 Mon Sep 17 00:00:00 2001 From: Ladebeze66 Date: Tue, 18 Mar 2025 15:55:09 +0100 Subject: [PATCH] J5-4 --- __pycache__/data_filter.cpython-312.pyc | Bin 1490 -> 1866 bytes __pycache__/ticket_manager.cpython-312.pyc | Bin 6106 -> 6992 bytes data_filter.py | 45 ++++++++++----------- exported_tickets/ticket_10908_raw.json | 31 ++++++++++++++ exported_tickets/ticket_T10929_raw.json | 3 ++ ticket_manager.py | 15 ++++++- 6 files changed, 70 insertions(+), 24 deletions(-) create mode 100644 exported_tickets/ticket_10908_raw.json create mode 100644 exported_tickets/ticket_T10929_raw.json diff --git a/__pycache__/data_filter.cpython-312.pyc b/__pycache__/data_filter.cpython-312.pyc index a4b99e96576649124979fde6f5cf747721b61c2b..5101f40a9197de7c201099043748190e0af49284 100644 GIT binary patch literal 1866 zcma)6OKcNI7@qa69mktw6Pw}?M72by$UJPQ5?U%!1T}fIA#DYx^k8i~6Em=$b!TQ# zu@WVR9>|I2WGW%mJv9gpIU@B^i3?IMOScDiXeFwixCPP^r_R{klp;lRq}|!s|N9^F z{g0pf`%^%!vp0XM{1^w|FLj7ktoyNjOnx)~1WJqj>Re6}{pXS6bG+!gmps2#*19IuX2?gE&-SEzHNX;J+6|5GAeN;0d)*M0 zwI%JU!oIek4vqWq2z3eM67_fI5a%97wu|htM>rzBJ$?D&tc{4x{929TszbPxGJC;s zF+(gbK;68;t8TvLP=@GBEp<5;6TJ+{v%@_q;*3*V%f+Y)K_n}PmpJ;0OHfb81s4XB z*JCPN+kSbZaK)>l!eWIw?0DHJc+m4o-1FRPm=~bKozfz9IimU64UsCl$RQ==pY}_2 znFPQN%hxLS(@eLlq2JBn+u7#v&^)nPY?;=riM5I5*ap8j5t?IxF}5wC;6J?f$scWA zUq~(+;8jL>lu{6JM)z>#vAveSy)OGuyH*5%CS(q@eNwgzhyi0z$J!;Cr>i|(g;zFc zz@0qof=Ixg$m=eMB87grQg9~vgpyO!?8!0jTl3OW8_LJd8%qhBrZ^jd|KZ(*@oE= zMFugsF8c{05yP-PG*h&RM{I~$%_DfhMZzFX71hl-uWDl=+lKhUD0>jq^|``1(J$Kq zl^}AUiwW{o4bLh4hj$k-!APWP)VqqxyoBLgec&^7;E|nYs%m93#%78_m-a=Hai@YL z)VHMM;Tm^pC;}s4Ld43lpVb|yDt=*B5=HUv3jchZVy3NJVNEWsvqP zu40Zvq7#Il*l{7u;=h*V0kg8tm|`*)7b(mzk#Ui-q(aUeE_4?Wq03>??t2-(*-1@F zO$cFiMg)ST&fo5Ap^6!i?g+c0wgP=e3Y3ubNjg@+-${^6e{=K>|F!4P{mjM}Vea&U zbHC&!T6+&R53Z9n^XcGlFftxkr-J0EtpwP2=sW9MYr_cg=fdIhEo&@lR z8gC8mZ&>SAGqDj52lK7$Xk%r4rMdE8Ak0oZO&@3!)(g#Jn|p%yrh*gGVS47#!N=*@ zR_5)-+4Zx{GnS=0cb~{rrHHO{{*p zH46In2gV2;kgVhqB1R?iYR(FMfsM6id7Jq*b9X@-)~5Gm@=Vo(zKcGjN2RK&E~ctr cOV>2*3Fv(S%s;?^7e-tg-yRsz_O~_v0ba+|NdN!< delta 869 zcmY*WO-~a+7@pnjZnxdGTRyiRC|f{aB|uCRAy6U#NsJ0nj3d-_wiS`_N~q*N0OEuipU*fL*WwAQi7*P`v8_+!k8$BX#*DGW8a0L~kX~MxY%-LGQrm z3UjKlY#9dr(r^WcjAdQTlRkPUmg|1p<~}lvR2sSLlC_FV*E_4_Oq8=+ZpJc^rMn(t zPhs^4X-)oz9wQJZ(1k%^Tqcc81o7VGQu#c}L4_&pu$Kjw$r@>cys2Dz$95HZ@GgLt zag1RL)OZl>tM(=B$h0HI$~SB=;e_M6Vo|Jc`|MG8#F2U`Nn5(+#I98P$L!cmr~7Jk z=$73*<4Dm{k(aow#abueJIZ2paNLee*xreg$=e^b>f;yoe7d?~+4E~hldrbLYGlyn zpDFvpHa}kDKsa7b+M@Cccv)eaad@d5wE6yH9?Qc{>{2;n$A+AaNLeaAIgt{T-irEm z*ZfA6911E+0+falh#Clmgp%-A(N>A2#$CJ%G1$9wb{zsW zB?k_v5~&c}RlDI`I_fIgsk7J=qnV`v=!Lh|zU>%Kz+?7fS9 zu$GrJei7mp81QN0A_z&dK1ELT!!(3aieX0}EKZGbB`mDKoR|^P|H<4xE|e z6ZUvxy8<0yK{q0%7BwdRq`jU~7{?PeG~KWrSvRZ%(!;71iAIMK&1AXve+yapj@&-n zvZsQI;4r4;aMP-N#o;E+sDZo$#o^3p-5?IjG@J!aOT?!gei}s$Tj5bL4Ulr}hc(q! z9br5g(+xGQJ0jJ>E*c!ScoG?;1C`L6fTdp5!$_S8zmz;z^MQL1gQ}rU=&0$xF$=bO zoTOV}BCdnyf%28U<-V1H<$-UiS1?w&r@$M>%gL{NmX~(vJYzc?nZBf zlA8AJ4oX8xvAx@PK!{^ms;c0V@DBMK?y@gX2y!BQe#o9^OZNc)jE%?7{7&UA;)5!3|U#Bf=5l>XfcUk%cJP5v8{1T7*!|Rdo<<&?u7$es52anO1OHX}J-nDo2ex4qoC~}{v)t*+c&Yq!Su4e$`$QM0 z7@=Yk@03@K2}HH%RV;!h+{amtvNYqr|MckLC` z^OqqCP!Rg=Dt@QX)J!uRA%CJCv7@GeC~0yVZNvi=ouekT-3-dD1L2*xsU>21C!$Xu qePgV8B6e8_;SOkc3dE;C`VDkH0^K{{HR9Rlu0ePiW`R4oNPhz+YK2Px delta 766 zcmZXSPe>F|9LL{p=DnHOo&D#k>#7wZZaRvkCR%}-L?{>)bSNj%mYt{=N78J%01*W5MCnRx%k! ze68NzzG^hDr}E}S9z8`CvcN_Tm;l0;Y{`_km2KI7`Usi&`szJiX{_DjEDJrIWCfY3*k@{%${DjX&iJjE5wFd|D}Z<{ zE1v_%)JixjLyp~4>$yF_NJ!z7`M3L!b?MFlUv0=EbVs&GI}bMZI-W;{!rtf~@>Co* zFzx1srUirs)!1gDkPLLcQd%nei&oJuvd@VV$^b8Vr&(uma`2~uGTqMyUKU>*`jj57 zYs0jK7fb(MN3@Tw^Nc-CK4P<}48+)cst*pb`>9jS|F<1t-&3w~Of)gsLVC9LE{#Fy z;V~_+t;`yntX*gt!Fr#_j0hZIPg>9BdbxW;=Q!h5yGnM^^WJaJQTDra4Tji*+|*1U zxn6*mi~h9$Uw13jKy!*qWvfCxiutjCEYnKWH=1aZ5RK%=gf}jVYGVo>9b{VD6!fy$ zw%0IMlk#5xbQZQx+#M2oj|xl(T;kY3(L88YB*deNASU7&94lxWUk))QMwq~)5GI;Q zKI~7Bk#L_zM#C0`Ozmd+$O1G}gn*F<(yryYizT;OEtmX?Tcu*UbdJ64n1n0rPe*>d n%oE}tdj*akG63wL{;w$Z4NZSU(>rKC4}W1BU;#oDnW({E%;Koq diff --git a/data_filter.py b/data_filter.py index 045ca72..6de835d 100644 --- a/data_filter.py +++ b/data_filter.py @@ -11,29 +11,28 @@ def clean_html(content): def filter_ticket_data(ticket_data): """Filtre les données d'un ticket pour ne garder que les informations essentielles.""" - # Créer un nouveau dictionnaire pour le ticket filtré + + # 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["id", "ID non disponible"], - "Nom": ticket_data["Nom"], - "Code": ticket_data.get("Code", "N/A"), - "Date Limite": ticket_data["Date Limite"], - "Champs Simples": ticket_data["Champs Simples"], # Conserver tous les champs simples - "Champs Relationnels": ticket_data["Champs Relationnels"], # Conserver tous les champs relationnels - "Discussions": [] # Initialiser la liste des discussions + "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", []) } - # Nettoyer le champ description dans Champs Simples - if "description" in filtered_ticket["Champs Simples"]: - filtered_ticket["Champs Simples"]["description"] = clean_html(filtered_ticket["Champs Simples"]["description"]) - - # Garder uniquement les discussions nécessaires - for msg in ticket_data["Discussions"]: - filtered_ticket["Discussions"].append({ - "ID Message": msg["ID Message"], - "Sujet": msg["Sujet"], - "Contenu": clean_html(msg["Contenu"]), # Nettoyage du contenu HTML - "Auteur": msg["Auteur"], - "Date": msg["Date"] - }) - - return filtered_ticket \ No newline at end of file + return filtered_ticket diff --git a/exported_tickets/ticket_10908_raw.json b/exported_tickets/ticket_10908_raw.json new file mode 100644 index 0000000..d070535 --- /dev/null +++ b/exported_tickets/ticket_10908_raw.json @@ -0,0 +1,31 @@ +[ + { + "id": 10908, + "name": "TR: MAJ BRGlab", + "code": "T10929", + "stage_id": [ + 5, + "En attente de résolution" + ], + "project_id": [ + 3, + "Demandes" + ], + "date_deadline": false, + "description": "


", + "message_ids": [ + 227288, + 225765, + 225756, + 225755, + 225636, + 225635, + 225634, + 225633, + 225614, + 225613, + 225612, + 225611 + ] + } +] \ No newline at end of file diff --git a/exported_tickets/ticket_T10929_raw.json b/exported_tickets/ticket_T10929_raw.json new file mode 100644 index 0000000..1ba3ba8 --- /dev/null +++ b/exported_tickets/ticket_T10929_raw.json @@ -0,0 +1,3 @@ +[ + 10908 +] \ No newline at end of file diff --git a/ticket_manager.py b/ticket_manager.py index ef11efc..a416062 100644 --- a/ticket_manager.py +++ b/ticket_manager.py @@ -1,5 +1,6 @@ from odoo_connection import OdooConnection import os +import json from utils import save_json, ensure_export_directory, print_error from config import EXPORT_DIR from data_filter import filter_ticket_data @@ -40,6 +41,13 @@ class TicketManager: print_error(f" Erreur inattendue lors de '{method}' sur '{model}': {e}") return None + def save_raw_ticket_data(self, ticket_data, filename="raw_ticket_data.json"): + """Sauvegarde les données brutes du ticket dans un fichier JSON""" + file_path = os.path.join(EXPORT_DIR, filename) + with open(file_path, "w", encoding="utf-8") as f: + json.dump(ticket_data, f, indent=4, ensure_ascii=False) + print(f"Données brutes du ticket sauvegardées dans : {file_path}") + def get_ticket_by_id(self, ticket_id): """ Récupère les détails d'un ticket par son ID et applique le filtre """ fields_to_read = ['id', 'name', 'code', 'stage_id', 'project_id', 'date_deadline', 'description', 'message_ids'] @@ -51,8 +59,10 @@ class TicketManager: print_error(f"Aucun ticket trouvé avec l'ID {ticket_id}") return None + # Sauvegarde des données brutes pour analyse + self.save_raw_ticket_data(ticket_data, f"ticket_{ticket_id}_raw.json") # Nettoyer et filtrer les données du ticket - return filter_ticket_data(ticket_data[0]) # Utilisation de data_filter.py + #return filter_ticket_data(ticket_data[0]) # Utilisation de data_filter.py def get_ticket_by_code(self, ticket_code): """Récupérer un ticket via son code""" @@ -62,6 +72,9 @@ class TicketManager: print_error(f"Aucun ticket trouvé avec le code '{ticket_code}'.") return None + # Sauvegarde des données brutes pour analyse + self.save_raw_ticket_data(ticket_ids, f"ticket_{ticket_code}_raw.json") + return self.get_ticket_by_id(ticket_ids[0]) def get_available_projects(self):