From 39e7fc8d35903dc095771fe3bf7b517109a50963 Mon Sep 17 00:00:00 2001 From: lauty95 Date: Wed, 11 Mar 2026 17:27:18 +0000 Subject: [PATCH 1/2] feat: beam_barcode_resolver hook --- beam/beam/scan/__init__.py | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/beam/beam/scan/__init__.py b/beam/beam/scan/__init__.py index 87a927ca..182a930d 100644 --- a/beam/beam/scan/__init__.py +++ b/beam/beam/scan/__init__.py @@ -83,6 +83,13 @@ def get_barcode_context(barcode: str) -> frappe._dict | None: "barcode": barcode, } ) + + # Fallback: custom barcode resolvers registered by other apps via beam_barcode_resolver hook + for resolver in frappe.get_hooks("beam_barcode_resolver"): + result = frappe.call(resolver, barcode=barcode) + if result: + return result + return None @@ -212,6 +219,12 @@ def get_list_action(barcode_doc: frappe._dict, context: frappe._dict) -> list[di def get_form_action(barcode_doc: frappe._dict, context: frappe._dict) -> list[dict[str, Any]]: target = None + beam_override = frappe.get_hooks("beam_frm") + has_frm_override = bool( + beam_override + and beam_override.get(barcode_doc.doc.doctype, {}).get(context.frm) + ) + if barcode_doc.doc.doctype == "Handling Unit": hu_details = get_handling_unit(barcode_doc.doc.name, context.frm) if context.frm == "Stock Entry": @@ -224,6 +237,15 @@ def get_form_action(barcode_doc: frappe._dict, context: frappe._dict) -> list[di "item_code": hu_details.item_code, } ) + elif has_frm_override: + # A beam_frm override handles this form - skip get_item_details() which would + # fail for forms without a standard "{doctype} Item" child table. + target = frappe._dict( + { + "doctype": context.frm, + "item_code": hu_details.item_code, + } + ) else: target = get_item_details( { @@ -255,6 +277,15 @@ def get_form_action(barcode_doc: frappe._dict, context: frappe._dict) -> list[di "item_code": barcode_doc.doc.name, } ) + elif has_frm_override: + # A beam_frm override handles this form — skip get_item_details() which would + # fail for forms without a standard "{doctype} Item" child table. + target = frappe._dict( + { + "doctype": context.frm, + "item_code": barcode_doc.doc.name, + } + ) else: target = get_item_details( { @@ -313,8 +344,6 @@ def get_form_action(barcode_doc: frappe._dict, context: frappe._dict) -> list[di if not target: return [] - beam_override = frappe.get_hooks("beam_frm") - if beam_override: override_doctype = beam_override.get(barcode_doc.doc.doctype) if override_doctype: From df31da7882ef3658aa64db1b8c8305bf167fbb5e Mon Sep 17 00:00:00 2001 From: lauty95 Date: Wed, 11 Mar 2026 17:29:01 +0000 Subject: [PATCH 2/2] fix: linters --- .pre-commit-config.yaml | 2 +- beam/beam/scan/__init__.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 939e47ba..b6548f25 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -53,7 +53,7 @@ repos: additional_dependencies: ['flake8-bugbear'] - repo: https://github.com/agritheory/test_utils - rev: v1.20.1 + rev: v1.20.2 hooks: - id: update_pre_commit_config - id: validate_frappe_project diff --git a/beam/beam/scan/__init__.py b/beam/beam/scan/__init__.py index 182a930d..ad382736 100644 --- a/beam/beam/scan/__init__.py +++ b/beam/beam/scan/__init__.py @@ -221,8 +221,7 @@ def get_form_action(barcode_doc: frappe._dict, context: frappe._dict) -> list[di target = None beam_override = frappe.get_hooks("beam_frm") has_frm_override = bool( - beam_override - and beam_override.get(barcode_doc.doc.doctype, {}).get(context.frm) + beam_override and beam_override.get(barcode_doc.doc.doctype, {}).get(context.frm) ) if barcode_doc.doc.doctype == "Handling Unit":