Merge pull request #31858 from sagarvora/simple-pls

fix: revert to simpler LocalProxy override
This commit is contained in:
Sagar Vora 2025-03-22 10:45:06 +05:30 committed by GitHub
commit 512ef78b43
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 14 additions and 31 deletions

View file

@ -2,7 +2,6 @@ from contextvars import ContextVar
from typing import Any, Generic, TypeVar
from werkzeug.local import LocalProxy as WerkzeugLocalProxy
from werkzeug.local import _ProxyLookup
from werkzeug.local import release_local as release_werkzeug_local
_contextvar = ContextVar("frappe_local")
@ -60,52 +59,38 @@ class Local:
return lp
class LocalProxy(Generic[T]):
__slots__ = WerkzeugLocalProxy.__slots__
__init__ = WerkzeugLocalProxy.__init__
class LocalProxy(WerkzeugLocalProxy, Generic[T]):
__slots__ = ()
for attr, val in vars(WerkzeugLocalProxy).items():
if attr == "__getattr__" or not isinstance(val, _ProxyLookup):
continue
locals()[attr] = val
def __getattribute__(self, name: str) -> Any:
if name in _local_proxy_attributes:
return object.__getattribute__(self, name)
return getattr(get_obj(self), name)
def __getattr__(self, name: str) -> Any:
return getattr(self._get_current_object(), name)
def __setattr__(self, name: str, value: str) -> None:
setattr(get_obj(self), name, value)
setattr(self._get_current_object(), name, value)
def __delattr__(self, name: str) -> None:
delattr(get_obj(self), name)
delattr(self._get_current_object(), name)
def __getitem__(self, key: str) -> Any:
return get_obj(self)[key]
return self._get_current_object()[key]
def __setitem__(self, key: str, value: str) -> None:
get_obj(self)[key] = value
self._get_current_object()[key] = value
def __delitem__(self, key: str) -> None:
del get_obj(self)[key]
del self._get_current_object()[key]
def __bool__(self) -> bool:
try:
return bool(get_obj(self))
return bool(self._get_current_object())
except RuntimeError:
return False
def __contains__(self, key: str) -> bool:
return key in get_obj(self)
return key in self._get_current_object()
def __str__(self) -> str:
return str(get_obj(self))
def get_obj(lp: LocalProxy) -> Any:
return object.__getattribute__(lp, "_get_current_object")()
return str(self._get_current_object())
def release_local(local):
@ -117,4 +102,3 @@ def release_local(local):
# _local_attributes = frozenset(attr for attr in dir(Local))
_local_proxy_attributes = frozenset(attr for attr in dir(LocalProxy))

View file

@ -16,6 +16,7 @@ from urllib.parse import quote
import werkzeug.utils
from werkzeug.exceptions import Forbidden, NotFound
from werkzeug.local import LocalProxy
from werkzeug.wrappers import Response
from werkzeug.wsgi import wrap_file
@ -26,12 +27,10 @@ import frappe.utils
from frappe import _
from frappe.core.doctype.access_log.access_log import make_access_log
from frappe.utils import format_timedelta
from frappe.utils.local import LocalProxy, WerkzeugLocalProxy
if TYPE_CHECKING:
from frappe.core.doctype.file.file import File
LocalProxyTypes = LocalProxy | WerkzeugLocalProxy
DateOrTimeTypes = datetime.date | datetime.datetime | datetime.time
@ -222,7 +221,7 @@ def json_handler(obj):
elif isinstance(obj, datetime.timedelta):
return format_timedelta(obj)
elif isinstance(obj, LocalProxyTypes):
elif isinstance(obj, LocalProxy):
return str(obj)
elif hasattr(obj, "__json__"):