From 6db7cb096d6b0f70c8f32f446549f70ed80edd79 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Fri, 21 Feb 2025 20:09:40 +0530 Subject: [PATCH] fix: Better proxy for active site and disable on selfhosted --- frappe/core/doctype/user/user.json | 6 +++-- frappe/tests/test_scheduler.py | 36 ++++++++++++------------------ frappe/utils/scheduler.py | 12 +++++----- 3 files changed, 25 insertions(+), 29 deletions(-) diff --git a/frappe/core/doctype/user/user.json b/frappe/core/doctype/user/user.json index 940d083482..d43ca6f430 100644 --- a/frappe/core/doctype/user/user.json +++ b/frappe/core/doctype/user/user.json @@ -558,7 +558,8 @@ "fieldtype": "Datetime", "label": "Last Active", "no_copy": 1, - "read_only": 1 + "read_only": 1, + "search_index": 1 }, { "description": "Stores the JSON of last known versions of various installed apps. It is used to show release notes.", @@ -888,7 +889,7 @@ "link_fieldname": "user" } ], - "modified": "2024-12-31 19:35:17.052698", + "modified": "2025-02-21 20:11:36.150167", "modified_by": "Administrator", "module": "Core", "name": "User", @@ -920,6 +921,7 @@ ], "quick_entry": 1, "route": "user", + "row_format": "Dynamic", "search_fields": "full_name", "show_name_in_global_search": 1, "sort_field": "creation", diff --git a/frappe/tests/test_scheduler.py b/frappe/tests/test_scheduler.py index 572bcdd659..91cb381f25 100644 --- a/frappe/tests/test_scheduler.py +++ b/frappe/tests/test_scheduler.py @@ -61,42 +61,34 @@ class TestScheduler(IntegrationTestCase): # 1st job is in the queue (or running), don't enqueue it again self.assertFalse(job.enqueue()) - def test_is_dormant(self): + @patch.object(frappe.utils.frappecloud, "on_frappecloud", return_value=True) + @patch.dict(frappe.conf, {"developer_mode": 0}) + def test_is_dormant(self, _mock): + last_activity = frappe.db.get_value("User", filters={}, fieldname="max(last_active)") self.assertTrue(is_dormant(check_time=get_datetime("2100-01-01 00:00:00"))) - self.assertTrue(is_dormant(check_time=add_days(frappe.db.get_last_created("Activity Log"), 5))) - self.assertFalse(is_dormant(check_time=frappe.db.get_last_created("Activity Log"))) + self.assertTrue(is_dormant(check_time=add_days(last_activity, 5))) + self.assertFalse(is_dormant(check_time=last_activity)) - def test_once_a_day_for_dormant(self): + @patch.object(frappe.utils.frappecloud, "on_frappecloud", return_value=True) + @patch.dict(frappe.conf, {"developer_mode": 0}) + def test_once_a_day_for_dormant(self, _mocks): + last_activity = frappe.db.get_value("User", filters={}, fieldname="max(last_active)") frappe.db.truncate("Scheduled Job Log") self.assertTrue(schedule_jobs_based_on_activity(check_time=get_datetime("2100-01-01 00:00:00"))) - self.assertTrue( - schedule_jobs_based_on_activity( - check_time=add_days(frappe.db.get_last_created("Activity Log"), 5) - ) - ) + self.assertTrue(schedule_jobs_based_on_activity(check_time=add_days(last_activity, 5))) # create a fake job executed 5 days from now job = get_test_job(method="frappe.tests.test_scheduler.test_method", frequency="Daily") job.execute() job_log = frappe.get_doc("Scheduled Job Log", dict(scheduled_job_type=job.name)) - job_log.db_set( - "creation", add_days(_get_last_creation_timestamp("Activity Log"), 5), update_modified=False - ) + job_log.db_set("creation", add_days(last_activity, 5), update_modified=False) schedule_jobs_based_on_activity.clear_cache() # inactive site with recent job, don't run - self.assertFalse( - schedule_jobs_based_on_activity( - check_time=add_days(_get_last_creation_timestamp("Activity Log"), 5) - ) - ) + self.assertFalse(schedule_jobs_based_on_activity(check_time=add_days(last_activity, 5))) # one more day has passed - self.assertTrue( - schedule_jobs_based_on_activity( - check_time=add_days(_get_last_creation_timestamp("Activity Log"), 6) - ) - ) + self.assertTrue(schedule_jobs_based_on_activity(check_time=add_days(last_activity, 6))) def test_real_time_alignment(self): test_cases = { diff --git a/frappe/utils/scheduler.py b/frappe/utils/scheduler.py index e48e364d9e..088dd4cbd8 100644 --- a/frappe/utils/scheduler.py +++ b/frappe/utils/scheduler.py @@ -220,17 +220,19 @@ def schedule_jobs_based_on_activity(check_time=None): def is_dormant(check_time=None): - if frappe.conf.developer_mode: - return False # Assume never dormant if developer_mode is enabled + from frappe.utils.frappecloud import on_frappecloud + + if frappe.conf.developer_mode or not on_frappecloud(): + return False threshold = cint(frappe.get_system_settings("dormant_days")) * 86400 if not threshold: return False - last_activity_log_timestamp = _get_last_creation_timestamp("Activity Log") + last_activity = frappe.db.get_value("User", filters={}, fieldname="max(last_active)") - if not last_activity_log_timestamp: + if not last_activity: return True - if ((check_time or now_datetime()) - last_activity_log_timestamp).total_seconds() >= threshold: + if ((check_time or now_datetime()) - last_activity).total_seconds() >= threshold: return True return False