import base64 import io import frappe import pyqrcode def generate_work_order_feedback_qr(doc, method=None): """Attach a small QR code for the public WO feedback page to custom_wo_qr.""" if not doc.name: return meta = frappe.get_meta("Work_Order") if not meta.has_field("custom_wo_qr"): return if doc.get("custom_wo_qr"): return if frappe.db.exists( "File", { "attached_to_doctype": "Work_Order", "attached_to_name": doc.name, "attached_to_field": "custom_wo_qr", }, ): return try: site_url = frappe.utils.get_url().rstrip("/") feedback_url = f"{site_url}/asm_app/wo-feedback?work_order={doc.name}" qr_obj = pyqrcode.create(feedback_url, error="H") buffer = io.BytesIO() qr_obj.png(buffer, scale=6) encoded_content = base64.b64encode(buffer.getvalue()).decode("utf-8") file_doc = frappe.get_doc( { "doctype": "File", "file_name": f"{doc.name}-wo-feedback-qr.png", "attached_to_doctype": "Work_Order", "attached_to_name": doc.name, "attached_to_field": "custom_wo_qr", "content": encoded_content, "decode": True, "is_private": 0, } ) file_doc.insert(ignore_permissions=True) frappe.db.set_value( "Work_Order", doc.name, "custom_wo_qr", file_doc.file_url, update_modified=False, ) except Exception: frappe.log_error( f"Error generating WO feedback QR for {doc.name}", "Work Order QR Generation Error", )