Przeglądaj źródła

fix: always execute method if found in `__dict__` (#15958)

285823
version-14
Sagar Vora 3 lat temu
committed by GitHub
rodzic
commit
c6049d7e7c
Nie znaleziono w bazie danych klucza dla tego podpisu ID klucza GPG: 4AEE18F83AFDEB23
2 zmienionych plików z 25 dodań i 7 usunięć
  1. +7
    -7
      frappe/model/document.py
  2. +18
    -0
      frappe/tests/test_document.py

+ 7
- 7
frappe/model/document.py Wyświetl plik

@@ -860,14 +860,14 @@ class Document(BaseDocument):

def run_method(self, method, *args, **kwargs):
"""run standard triggers, plus those in hooks"""
if "flags" in kwargs:
del kwargs["flags"]

if hasattr(self, method) and hasattr(getattr(self, method), "__call__"):
fn = lambda self, *args, **kwargs: getattr(self, method)(*args, **kwargs)
else:
# hack! to run hooks even if method does not exist
fn = lambda self, *args, **kwargs: None
def fn(self, *args, **kwargs):
method_object = getattr(self, method, None)

# Cannot have a field with same name as method
# If method found in __dict__, expect it to be callable
if method in self.__dict__ or callable(method_object):
return method_object(*args, **kwargs)

fn.__name__ = str(method)
out = Document.hook(fn)(self, *args, **kwargs)


+ 18
- 0
frappe/tests/test_document.py Wyświetl plik

@@ -319,3 +319,21 @@ class TestDocument(unittest.TestCase):
self.assertIsInstance(doc, Note)
self.assertIsInstance(doc.as_dict().get("age"), timedelta)
self.assertIsInstance(doc.get_valid_dict().get("age"), timedelta)

def test_run_method(self):
doc = frappe.get_last_doc("User")

# Case 1: Override with a string
doc.as_dict = ""

# run_method should throw TypeError
self.assertRaisesRegex(TypeError, "not callable", doc.run_method, "as_dict")

# Case 2: Override with a function
def my_as_dict(*args, **kwargs):
return "success"

doc.as_dict = my_as_dict

# run_method should get overridden
self.assertEqual(doc.run_method("as_dict"), "success")

Ładowanie…
Anuluj
Zapisz