From aae0cd896ec30484a33a5c5709df86a76e9b1f59 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Fri, 12 Jul 2024 19:54:10 +0200 Subject: [PATCH 1/4] refactor: frappe.cache.set_value redis.set accepts ex kwarg, etc --- frappe/utils/redis_wrapper.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/frappe/utils/redis_wrapper.py b/frappe/utils/redis_wrapper.py index c38f54a2f2..e494d07bab 100644 --- a/frappe/utils/redis_wrapper.py +++ b/frappe/utils/redis_wrapper.py @@ -2,6 +2,7 @@ # License: MIT. See LICENSE import pickle import re +from contextlib import suppress import redis from redis.commands.search import Search @@ -62,14 +63,8 @@ class RedisWrapper(redis.Redis): if not expires_in_sec: frappe.local.cache[key] = val - try: - if expires_in_sec: - self.setex(name=key, time=expires_in_sec, value=pickle.dumps(val)) - else: - self.set(key, pickle.dumps(val)) - - except redis.exceptions.ConnectionError: - return None + with suppress(redis.exceptions.ConnectionError): + self.set(name=key, value=pickle.dumps(val), ex=expires_in_sec) def get_value(self, key, generator=None, user=None, expires=False, shared=False): """Return cache value. If not found and generator function is From 281e04bd5e10759541e6e10b8a4966d1c7e618e1 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Fri, 12 Jul 2024 20:08:18 +0200 Subject: [PATCH 2/4] fix: Enqueue Notification log creation after commit Avoid ghost notifications in case the transaction gets rolled back --- frappe/desk/doctype/notification_log/notification_log.py | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/desk/doctype/notification_log/notification_log.py b/frappe/desk/doctype/notification_log/notification_log.py index 70f31606c1..8793559611 100644 --- a/frappe/desk/doctype/notification_log/notification_log.py +++ b/frappe/desk/doctype/notification_log/notification_log.py @@ -93,6 +93,7 @@ def enqueue_create_notification(users: list[str] | str, doc: dict): doc=doc, users=users, now=frappe.flags.in_test, + enqueue_after_commit=not frappe.flags.in_test, ) From aee278b6aec4f19e20af8c0da3ebd54f9f1edbac Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Fri, 12 Jul 2024 20:10:30 +0200 Subject: [PATCH 3/4] fix: Pass string method path to q.enqueue_call Passing a method results in rq doing some internal gymnastics to generate this string. In our case, this function never changes so we can get rid of those steps --- frappe/utils/background_jobs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/utils/background_jobs.py b/frappe/utils/background_jobs.py index 815145ef70..4e2a7c71b9 100644 --- a/frappe/utils/background_jobs.py +++ b/frappe/utils/background_jobs.py @@ -163,7 +163,7 @@ def enqueue( def enqueue_call(): return q.enqueue_call( - execute_job, + "frappe.utils.background_jobs.execute_job", on_success=Callback(func=on_success) if on_success else None, on_failure=Callback(func=on_failure) if on_failure else None, timeout=timeout, From 84919bfe8e5ae291970899ab50165e6953ec88ff Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Mon, 15 Jul 2024 09:25:08 +0200 Subject: [PATCH 4/4] fix: Typing hint for Document.get_doc_before_save --- frappe/model/document.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/model/document.py b/frappe/model/document.py index 01278775b3..8e7d4a7f54 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -458,7 +458,7 @@ class Document(BaseDocument): d: Document d.db_update() - def get_doc_before_save(self) -> "Document": + def get_doc_before_save(self) -> "Self": return getattr(self, "_doc_before_save", None) def has_value_changed(self, fieldname):