mirror of
https://github.com/frappe/frappe_docker.git
synced 2026-06-17 13:55:08 +00:00
fix: remove frappe.db.commit() from OnSite WIP server script
Frappe v16's server script sandbox does not allow explicit commits — the framework manages the transaction automatically after the event handler runs. Calling frappe.db.commit() inside a DocType Event script throws AttributeError: module has no attribute 'commit'. Also adds fix_server_script_commit.py to patch already-deployed instances. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
7c52d9b84b
commit
4678d517ae
2 changed files with 62 additions and 1 deletions
61
fix_server_script_commit.py
Normal file
61
fix_server_script_commit.py
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
"""
|
||||||
|
fix_server_script_commit.py
|
||||||
|
Removes frappe.db.commit() from the OnSite WIP warehouse server script.
|
||||||
|
In DocType Event server scripts, Frappe manages the transaction automatically —
|
||||||
|
calling frappe.db.commit() inside the script throws AttributeError in the sandbox.
|
||||||
|
Run via: bench --site frontend execute frappe.fix_server_script_commit.run
|
||||||
|
"""
|
||||||
|
|
||||||
|
import frappe
|
||||||
|
|
||||||
|
SCRIPT_NAME = "Furnitex - Auto Create OnSite WIP Warehouse"
|
||||||
|
|
||||||
|
FIXED_SCRIPT = """\
|
||||||
|
# Auto-fires after a new Project is saved
|
||||||
|
# Creates "{Project Name} - OnSite WIP" warehouse automatically
|
||||||
|
|
||||||
|
project_name = doc.project_name or doc.name
|
||||||
|
company = doc.company or "Furnitex"
|
||||||
|
abbr = frappe.db.get_value("Company", company, "abbr") or "F"
|
||||||
|
wh_short_name = project_name + " - OnSite WIP"
|
||||||
|
warehouse_name = wh_short_name + " - " + abbr
|
||||||
|
|
||||||
|
root_wh = frappe.db.get_value(
|
||||||
|
"Warehouse",
|
||||||
|
{"company": company, "is_group": 1},
|
||||||
|
"name"
|
||||||
|
) or ("All Warehouses - " + abbr)
|
||||||
|
|
||||||
|
if not frappe.db.exists("Warehouse", warehouse_name):
|
||||||
|
wh = frappe.get_doc({
|
||||||
|
"doctype": "Warehouse",
|
||||||
|
"warehouse_name": wh_short_name,
|
||||||
|
"parent_warehouse": root_wh,
|
||||||
|
"company": company,
|
||||||
|
"is_group": 0,
|
||||||
|
})
|
||||||
|
wh.flags.ignore_permissions = True
|
||||||
|
wh.insert()
|
||||||
|
# NOTE: no frappe.db.commit() here — Frappe handles the transaction
|
||||||
|
frappe.msgprint(
|
||||||
|
"OnSite WIP Warehouse created: <b>" + warehouse_name + "</b>",
|
||||||
|
alert=True, indicator="green"
|
||||||
|
)
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def run():
|
||||||
|
frappe.set_user("Administrator")
|
||||||
|
|
||||||
|
if not frappe.db.exists("Server Script", SCRIPT_NAME):
|
||||||
|
print(f" [WARN] Server Script '{SCRIPT_NAME}' not found — nothing to fix.")
|
||||||
|
return
|
||||||
|
|
||||||
|
doc = frappe.get_doc("Server Script", SCRIPT_NAME)
|
||||||
|
doc.script = FIXED_SCRIPT
|
||||||
|
doc.flags.ignore_permissions = True
|
||||||
|
doc.save()
|
||||||
|
frappe.db.commit()
|
||||||
|
|
||||||
|
print(f" [OK] Removed frappe.db.commit() from: {SCRIPT_NAME}")
|
||||||
|
print(" Warehouse auto-creation will now work without AttributeError.")
|
||||||
|
|
@ -552,7 +552,7 @@ if not frappe.db.exists("Warehouse", warehouse_name):
|
||||||
})
|
})
|
||||||
wh.flags.ignore_permissions = True
|
wh.flags.ignore_permissions = True
|
||||||
wh.insert()
|
wh.insert()
|
||||||
frappe.db.commit()
|
# No frappe.db.commit() — Frappe manages the transaction in server scripts
|
||||||
frappe.msgprint(
|
frappe.msgprint(
|
||||||
"OnSite WIP Warehouse created: <b>" + warehouse_name + "</b>",
|
"OnSite WIP Warehouse created: <b>" + warehouse_name + "</b>",
|
||||||
alert=True, indicator="green"
|
alert=True, indicator="green"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue