65 lines
1.4 KiB
Python
65 lines
1.4 KiB
Python
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",
|
|
)
|