From e34c989d34c811763b272c23096f3ce50abc34fc Mon Sep 17 00:00:00 2001 From: Ladebeze66 Date: Wed, 19 Mar 2025 14:06:15 +0100 Subject: [PATCH] J6-1 --- __pycache__/ticket_manager.cpython-312.pyc | Bin 9281 -> 8433 bytes exported_tickets/ticket_T10178_raw.json | 3 + ticket_manager.py | 69 ++++++--------------- 3 files changed, 23 insertions(+), 49 deletions(-) create mode 100644 exported_tickets/ticket_T10178_raw.json diff --git a/__pycache__/ticket_manager.cpython-312.pyc b/__pycache__/ticket_manager.cpython-312.pyc index bcaa58d4018c5ce3b4831f3583c3859979366166..d355324e45bbc5c7a08d4785d0651931c8f457b5 100644 GIT binary patch delta 1395 zcmZ{jO-vg{6vubgyK5WUV1vD2OtDj9z+g=C(GNaCOG8p1F--*_5p5t_b|8kuMzc0e zsHt<{;3%|>G#8`@i6arJV&tkKr_h_F9*S!!TwhA1UaB5S-5XM+&aCUGiqw((_spC3 z-<_S`d*2TJ*c8HZKekNv*^ITTPwIYGsk18x`qTqCy0Yt5NEeJ`WA*+ z(ZzMhPcrm0!={s2Cy8zYZIfBy@CUZqE>70P!DB||Hgwx;X$LTIZj_0dN-Ktud781o zmYsmPC;0UE@9Nv93LJuxjHt1okA|k_VRY)mIEAE70&{949CPD^#=48r5}fuZEkgsI z5uboMNiwRU@+!4C5mY0}5}ZO%k)okUSW>2DLQs)a)K8NHB0e6k**(?h0yPMw_ozHs z;6LoW37V!Z6S>bEIbS(+2C~k;R`hA&Nh0TbJ6V|*>kq}&tk}9`f9ihX-fiCN+H22z zmJ=tFre92A-r+oSoXa}SrLOFOospd5V)Am{Y&|r4vu5w+OiI6NOntiN+YeklFbDHB z&SdacL(RVUdMcFqaNpj4U@*R$uc|?IdK$?ff|Gywh&C|G$m}e5frG`0$un?kkYPR| z7q+5X;o{t!p7>rG@{606b@Q#{+rXMDYAh$kL5XKVSLPAbs*3KH2@*$79K>}pM~TxP zT@lLs2HQ(kYr`Cgj50o9xvhUL5{p8Q0#(nFq`(+bJu;b3-;ov;RZkg87%D0{O{}Py zNWrimHHYt=jfCNEw44gU6!FF&p-Y*T=#rB&$cH7jBjMwbjjo2Mv{CU>=^&zE^w5E- zY3wqQ<(4t6l!8)NnuRFvzZEhtO7ha9^Mu=%cOTqc7jjkZ&F)-P$JcGU*+$R+QFMuj zkNeO4Xw^N8pVvmf&2(qoBmiFgh4Ueh)AjXzoG?mFV|cPL1cErz_%Ja{0tG=@T!dj6 z`RMNZRIbsmPJ!V`f|f(M&>a9?Bu4B96vrHTY~LI=5+H zoXQO%<$hMtdo(npBZ`mQ=fTI=;dus>^!J_))~z*j=}Tx9rH5`(nWPfKuBOJ$E;3zZ ze&TKwIga-g%^dG7nrryFVp|2@@K+tr2SKsY#M_JYdR{Eraj5BxMLTsjF&0<^@mAA2 k^|ZmYYu4)I#L&ACkz)$%L-#RzI$#@S!6Ya$+Mky857j?t)c^nh delta 2282 zcmah~Uu+ab7@yg@y+3X5PkVc`ch}xc|4}c5E2xMRX{}HYwM2@jh+4L{L%DMQnBBEN z_B=_{V8lqXF*PA1s1LScBG^RHrwSTLjLB9mwruVJ5?)Mvz{-Q-i!*yYsA%FO` zzVDlFX20Jzzx99fxc3K-rv}hA{lV4I@1p0uy|C8tI(We)c_ioSaOOGK=zP#Y*KPFs z{UU`)pg`JLO@bOc1x|Bkmn0A47-e%AB&jHQK+NP(D*K9htP(Wz^yZ_{{;ZfjB2%gQZ-pLo6s1L!%%yYLEJpY3eQ`YT(yDk7 zWxMdHUfx6DHE_e_G5m?C!c@-i_Lf|IH~bBg z?rjrpBfRNC;fjCoIDfU)U#_b+gmvfemj}-uoNb-S8tVp(hOMQ#Z3}^>$&C{m-#?`H z8g;E@>dTubxw;p80U}WMGoouJ2RF>j)L@P$om8U7JSrT}-}Ah~^>Vsl59_^Nv`^vb zlGV;G^#z+7xPiuP0q@$A+$czLFS!9I*fqOmdj-nygiEtea3^Z*pukfpFV`t|Qc{A| zM5H;yX<*E)A9DrtK5wu|vT1M>YW!JyWuJmWbI3l$sek4QJ1pH=rdxDKJR^wYIBl!a z00PY+IYZQL7mWteuV5bs?Letp3K@)ftE0R9nE&p$I_dxf7o19l9Rs)KCLKy+)s;l&_t@CRLd<5HyJ`c$9w2cA=c~>W*Oy&d&A-== za236AI1Ucm_JDC1uhpA;`!=fGbi?IoUZrA6&gZhJ5z5tkj`ELEi{L}*rB4)`*kRfU z7A1Ys*HJW`ij}0px81`;98ZkNxh!GjMs1=naEH9;4&N}MRE-WCPNr2kmCOD|8R$Xk z8fv^flh4Vr6@t`7%R^R4QC`qc@Dd~QB)4-UeQBC9Ds@Q3iMWS6Oznt|f@zbnLRi%# zZ49Gtj*vJ7 z)AJ9`%B+x6UL&Nh^gmL3iq7QwXgPTeTnn|#hZ1w4#FX+`ak_XV)OXxl4!4}@Jnp;Z zZMey`deF58`hSj%Om)ugHipEX2E-3}BQ|ofj>7fE_OcK&(9V)Dv=E8ibbwg;8%h>tY?8?g?%iMf8A`Md)$`$=$%d39}9y|-H!$BU)U*p z?W5CgYPuQrgehJO@(jZ*TbgYb*Z0?MX|#Row6Kw9(AJs&8qCSBC2m6oJ~ zj&>0CW5^(dxV@4eEN3c7vRl`L98_n16<&rgp+C9eZFp>Eenqd{@jTP%(j$=+?9ktc zyzSjh1*SvH=W$jd_v`x_f<@Do##yt5CZB}&i)vaStRRxL4A{xYqYU~fn68X?5KAc{ z6IQ~k9E{gnj|P#L-~|SIndTD5WU`aZ92Lfy{z@+oj~p4675YS&fu#O%a}4g+zi<8u zzBO~KWi=PG^4p??MFAEvd6B^g15N)i7KJ_fud&byH!m!%sNtJ`Z{qnuxajTT(c%!) z!)UG7ihMIOSV=*D9z7a9#%Angu%58nu17LCNloKk@}~YdO4N^X@MX9Ntj<#V8xIOt ASpWb4 diff --git a/exported_tickets/ticket_T10178_raw.json b/exported_tickets/ticket_T10178_raw.json new file mode 100644 index 0000000..80bbc25 --- /dev/null +++ b/exported_tickets/ticket_T10178_raw.json @@ -0,0 +1,3 @@ +[ + 10157 +] \ No newline at end of file diff --git a/ticket_manager.py b/ticket_manager.py index f776fe7..689b4eb 100644 --- a/ticket_manager.py +++ b/ticket_manager.py @@ -42,18 +42,7 @@ class TicketManager: except Exception as e: print_error(f" Erreur inattendue lors de '{method}' sur '{model}': {e}") return None - - def extract_invalid_field(self, error_message): - """Extrait le nom du champ invalide depuis un message d'erreur RPC""" - print(f"Analyse du message d'erreur : {error_message}") #debug - - match = re.search(r"la colonne ([\w.]+) n'existe pas", error_message) - if match: - print(f"Champ détecté comme invalide : {match.group(1)}") #debug - return match.group(1) #Retourne le champ détecté - print("Aucun champ invalide détecté") #debug - return None - + def get_model_fields(self, model_name): """Récupére tous les champs disponibles pour un modèle donné, en filtrant ceux qui ne sont pas exploitables""" fields_info = self._safe_execute(model_name, 'fields_get', [], ['name', 'type']) @@ -76,43 +65,25 @@ class TicketManager: def get_ticket_by_id(self, ticket_id): """Récupère les détails d'un ticket par son ID et exclut dynamiquement les champs invalides""" fields_to_read = self.get_model_fields(self.model_name) # Récupère tous les champs - excluded_fields = set() # Liste des champs à exclure - - while True: - try: - # Mise à jour de fields_to_read en supprimant les champs invalides - valid_fields = [field for field in fields_to_read if field not in excluded_fields] - - if not valid_fields: - print_error("Aucun champ valide disponible pour la requête.") - return None - - # Récupérer les données du ticket avec les champs filtrés - ticket_data = self._safe_execute(self.model_name, 'read', [ticket_id], valid_fields) - - if not ticket_data: - 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") - return ticket_data[0] - - except odoorpc.error.RPCError as e: - error_message = str(e) - print_error(f"Erreur RPC détectée : {error_message}") - - # Identifier le champ problématique - invalid_field = self.extract_invalid_field(error_message) - if invalid_field: - print(f"Exclusion du champ invalide : {invalid_field}") - excluded_fields.add(invalid_field) - - # Relancer la boucle immédiatement avec le champ exclu - continue - else: - print_error("Impossible d'identifier le champ problématique.") - return None + ticket_data = self._safe_execute(self.model_name, 'read', [ticket_id], fields_to_read) + + if ticket_data: + ticket = self.resolve_relational_fields(ticket_data[0]) + self.save_raw_ticket_data(ticket, f"ticket_{ticket_id}_raw.json") + return ticket + + print_error(f"Aucun ticket trouvé avec l'ID {ticket_id}") + return None + + def resolve_relational_fields(self, ticket): + """Ajoute les valeurs des champs relationnels""" + fields_info = self._safe_execute(self.model_name, 'fields_get', [], ['type']) + + for field, info in fields_info.items(): + if info.get("type") == "many2one" and isinstance(ticket.get(field), list): + ticket[f"{field}_value"] = ticket[field[1]] #Ajoute la valeur lisible en plus du ID + return ticket + def get_ticket_by_code(self, ticket_code): """Récupérer un ticket via son code"""