From 40ce993a5b2250ba688ced1c3040e7d32d2925cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Sat, 3 Jan 2026 13:45:10 +0100 Subject: [PATCH] Defer patching requests default agent when it is imported Importing requests module in `trytond/__init__.py` prevents the gevent monkey patch to be applied to the requests module as it is imported before. Closes #14461 --- trytond/trytond/__init__.py | 40 +++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/trytond/trytond/__init__.py b/trytond/trytond/__init__.py index f0566c9e74..a1f23f4918 100644 --- a/trytond/trytond/__init__.py +++ b/trytond/trytond/__init__.py @@ -2,7 +2,9 @@ # this repository contains the full copyright notices and license terms. import decimal +import importlib import os +import sys import time import warnings from email import charset @@ -10,11 +12,6 @@ from email import charset import __main__ from lxml import etree, objectify -try: - from requests import utils as requests_utils -except ImportError: - requests_utils = None - __version__ = "7.9.0" __series__ = '.'.join(__version__.split('.')[:2]) @@ -37,12 +34,29 @@ charset.add_charset('utf-8', charset.QP, charset.QP) etree.set_default_parser(etree.XMLParser(resolve_entities=False)) objectify.set_default_parser(objectify.makeparser(resolve_entities=False)) - -def default_user_agent(name="Tryton"): - return f"{name}/{__version__}" - - -if requests_utils: - requests_utils.default_user_agent = default_user_agent - decimal.DefaultContext.prec = int(os.environ.get('TRYTOND_DECIMAL_PREC', 28)) + + +class _RequestPatchFinder: + def find_spec(self, fullname, path, target=None): + if fullname != 'requests.utils': + return + sys.meta_path.remove(self) + spec = importlib.util.find_spec(fullname) + loader = spec.loader + original_exec = loader.exec_module + + def exec_module(module): + original_exec(module) + self._patch_requests_utils(module) + loader.exec_module = exec_module + return spec + + @staticmethod + def _patch_requests_utils(module): + def default_user_agent(name="Tryton"): + return f"{name}/{__version__}" + module.default_user_agent = default_user_agent + + +sys.meta_path.insert(0, _RequestPatchFinder())