From 5202e2550f19a711ca15c21df1027dc921358b76 Mon Sep 17 00:00:00 2001 From: Sankara Subramanian V Date: Thu, 5 Mar 2026 17:17:34 +0530 Subject: [PATCH 1/5] Update frappe dependency version range --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 25a58c1..9fa1240 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,7 +20,7 @@ build-backend = "flit_core.buildapi" # package_name = "~=1.1.0" [tool.bench.frappe-dependencies] -frappe = ">=15.0.0,<16.0.0" +frappe = ">=15.0.0,<16.10.9" [tool.ruff] line-length = 110 From 348e999d6f334266b9ad899f679b3a60fa5c196b Mon Sep 17 00:00:00 2001 From: Sankara Subramanian V Date: Thu, 12 Mar 2026 12:32:38 +0530 Subject: [PATCH 2/5] Update frappe dependency version in pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 9fa1240..db69ee1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,7 +20,7 @@ build-backend = "flit_core.buildapi" # package_name = "~=1.1.0" [tool.bench.frappe-dependencies] -frappe = ">=15.0.0,<16.10.9" +frappe = ">=15.0.0,<16.11.1" [tool.ruff] line-length = 110 From 1dd5e54ce6599711364ceb3593b777e50d4eb694 Mon Sep 17 00:00:00 2001 From: Sankara Subramanian V Date: Mon, 6 Apr 2026 16:40:39 +0530 Subject: [PATCH 3/5] fix: update frappe dependency to support >15.0.0,<=17.0.0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index db69ee1..731f0b0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,7 +20,7 @@ build-backend = "flit_core.buildapi" # package_name = "~=1.1.0" [tool.bench.frappe-dependencies] -frappe = ">=15.0.0,<16.11.1" +frappe = ">15.0.0,<=17.0.0" [tool.ruff] line-length = 110 From d39dc0a73d9706a12e34f973c4b7615eadc7d877 Mon Sep 17 00:00:00 2001 From: Sankara Subramanian V Date: Mon, 6 Apr 2026 19:17:11 +0530 Subject: [PATCH 4/5] fix: add boto3 to requirements.txt (fixes install on Frappe Cloud) --- requirements.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..30ddf82 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +boto3 From dc2dd9179b7031b0b91f2e6a8574c6538a73ab1b Mon Sep 17 00:00:00 2001 From: Sankara Subramanian Date: Sat, 25 Apr 2026 12:01:36 +0530 Subject: [PATCH 5/5] fix: scope s3 realtime events to system managers --- aws_integration/s3/handlers.py | 10 +++++++++- aws_integration/s3/scheduler.py | 18 +++++++++++------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/aws_integration/s3/handlers.py b/aws_integration/s3/handlers.py index 1a67c47..7cc5cd8 100644 --- a/aws_integration/s3/handlers.py +++ b/aws_integration/s3/handlers.py @@ -7,6 +7,14 @@ from aws_integration.s3 import S3_API_PREFIX, get_s3_file_url +def _publish_system_manager_realtime(event, message): + """Publish realtime events only to System Managers.""" + recipients = frappe.get_all("Has Role", filters={"role": "System Manager", "parenttype": "User"}, pluck="parent") + for user in set(recipients or []): + if user and user != "Guest": + frappe.publish_realtime(event, message=message, user=user) + + def on_file_upload(doc, method): """Upload file to S3 immediately after it's created in ERP. @@ -155,7 +163,7 @@ def _upload_single_file(file_name): frappe.db.commit() # Notify the browser so the File form auto-refreshes with the S3 indicator - frappe.publish_realtime("s3_upload_complete", {"file_name": file_doc.name}) + _publish_system_manager_realtime("s3_upload_complete", {"file_name": file_doc.name}) def _mark_dedup_file_as_s3(doc, s3_key=None, uploaded_at=None): diff --git a/aws_integration/s3/scheduler.py b/aws_integration/s3/scheduler.py index 91b8f50..d84cddf 100644 --- a/aws_integration/s3/scheduler.py +++ b/aws_integration/s3/scheduler.py @@ -4,7 +4,11 @@ from frappe.utils import cint, now_datetime from aws_integration.s3 import get_s3_file_url -from aws_integration.s3.handlers import _mark_dedup_file_as_s3, _update_parent_attach_field +from aws_integration.s3.handlers import ( + _mark_dedup_file_as_s3, + _publish_system_manager_realtime, + _update_parent_attach_field, +) def upload_pending_files(): @@ -296,14 +300,14 @@ def _update_migration_progress(migration_id, batch_uploaded, batch_failed, total frappe.cache.set_value(cache_key, progress, expires_in_sec=3600) - frappe.publish_realtime("s3_migration_progress", { + _publish_system_manager_realtime("s3_migration_progress", { "uploaded": progress["uploaded"], "failed": progress["failed"], "total": total, }) if progress["completed_batches"] >= progress.get("total_batches", 0): - frappe.publish_realtime("s3_migration_complete", { + _publish_system_manager_realtime("s3_migration_complete", { "uploaded": progress["uploaded"], "failed": progress["failed"], }) @@ -382,7 +386,7 @@ def cleanup_local_s3_files(): # Commit after each batch so progress is not lost on crash frappe.db.commit() - frappe.publish_realtime( + _publish_system_manager_realtime( "s3_cleanup_progress", { "deleted": total_deleted, @@ -395,7 +399,7 @@ def cleanup_local_s3_files(): if len(files) < batch_size: break - frappe.publish_realtime( + _publish_system_manager_realtime( "s3_cleanup_complete", { "deleted": total_deleted, @@ -468,7 +472,7 @@ def adopt_orphaned_files(): adopted += a errors += e batch.clear() - frappe.publish_realtime( + _publish_system_manager_realtime( "s3_orphan_progress", {"adopted": adopted, "errors": errors}, ) @@ -486,7 +490,7 @@ def adopt_orphaned_files(): finally: frappe.cache.delete_value(lock_key) frappe.db.commit() - frappe.publish_realtime( + _publish_system_manager_realtime( "s3_orphan_complete", {"adopted": adopted, "errors": errors}, )