Iman_Asset_Lite/asset_lite/patches/sync_dashboard_reports.py

174 lines
4.1 KiB
Python

"""Sync dashboard report scripts and Hospital/Site filters into the live database."""
import frappe
from asset_lite.patches.dashboard_report_inline_scripts import REPORT_SCRIPTS
LOCATION_FILTERS = [
{
"fieldname": "company",
"label": "Hospital",
"fieldtype": "Link",
"options": "Company",
"mandatory": 0,
"wildcard_filter": 0,
},
{
"fieldname": "site_name",
"label": "Site Name",
"fieldtype": "Link",
"options": "Mobile Team Site",
"mandatory": 0,
"wildcard_filter": 0,
},
]
DASHBOARD_REPORTS = {
"Asset Up and Down": {
"javascript": (
'frappe.query_reports["Asset Up and Down"] = {\n'
" filters: [\n"
" {\n"
' fieldname: "company",\n'
' label: __("Hospital"),\n'
' fieldtype: "Link",\n'
' options: "Company"\n'
" },\n"
" {\n"
' fieldname: "site_name",\n'
' label: __("Site Name"),\n'
' fieldtype: "Link",\n'
' options: "Mobile Team Site"\n'
" },\n"
" {\n"
' fieldname: "department",\n'
' label: __("Department"),\n'
' fieldtype: "Link",\n'
' options: "Department"\n'
" },\n"
" {\n"
' fieldname: "custom_class",\n'
' label: __("Class"),\n'
' fieldtype: "Select",\n'
' options: "\\nClass A\\nClass B\\nClass C"\n'
" },\n"
" {\n"
' fieldname: "name",\n'
' label: __("Asset"),\n'
' fieldtype: "Link",\n'
' options: "Asset"\n'
" }\n"
" ]\n"
"};\n"
),
"extra_filters": [
{
"fieldname": "department",
"label": "Department",
"fieldtype": "Link",
"options": "Department",
"mandatory": 0,
"wildcard_filter": 0,
},
{
"fieldname": "custom_class",
"label": "Class",
"fieldtype": "Select",
"options": "\nClass A\nClass B\nClass C",
"mandatory": 0,
"wildcard_filter": 0,
},
{
"fieldname": "name",
"label": "Asset",
"fieldtype": "Link",
"options": "Asset",
"mandatory": 0,
"wildcard_filter": 0,
},
],
},
"Work Order Status": {
"extra_filters": [
{
"fieldname": "repair_status",
"label": "Status",
"fieldtype": "Select",
"options": "\nOpen\nWork In Progress\nPending Review\nCompleted\nClosed",
"mandatory": 0,
"wildcard_filter": 0,
},
{
"fieldname": "work_order_type",
"label": "Work Order Type",
"fieldtype": "Link",
"options": "Issue Type",
"mandatory": 0,
"wildcard_filter": 0,
},
{
"fieldname": "wo_name",
"label": "Work Order",
"fieldtype": "Link",
"options": "Work_Order",
"mandatory": 0,
"wildcard_filter": 0,
},
{
"fieldname": "asset_type",
"label": "Asset Type",
"fieldtype": "Link",
"options": "Asset Type",
"mandatory": 0,
"wildcard_filter": 0,
},
],
},
"Asset wise Count": {"extra_filters": []},
"Asset Maintenance Assignees Status Count": {"extra_filters": []},
"Asset Maintenance Frequency": {"extra_filters": []},
}
def _merge_filters(report_name, extra_filters):
merged = []
seen = set()
for row in LOCATION_FILTERS + extra_filters:
fieldname = row["fieldname"]
if fieldname in seen:
continue
seen.add(fieldname)
merged.append({**row, "parent": report_name, "parenttype": "Report", "parentfield": "filters"})
return merged
def sync_dashboard_reports():
updated = []
for report_name, config in DASHBOARD_REPORTS.items():
if not frappe.db.exists("Report", report_name):
continue
inline_script = REPORT_SCRIPTS.get(report_name)
if not inline_script:
continue
doc = frappe.get_doc("Report", report_name)
doc.report_script = inline_script.strip()
doc.report_type = "Script Report"
doc.query = None
if config.get("javascript") is not None:
doc.javascript = config.get("javascript")
doc.set("filters", _merge_filters(report_name, config.get("extra_filters", [])))
doc.flags.ignore_permissions = True
doc.save()
updated.append(report_name)
frappe.db.commit()
return updated
def execute():
return sync_dashboard_reports()