asset-lite latest fixtures and data import code
This commit is contained in:
parent
eab723d294
commit
fcb2167953
@ -21,13 +21,19 @@ def get_user_details(user_id=None):
|
|||||||
response_data = {
|
response_data = {
|
||||||
"user_id": user_id,
|
"user_id": user_id,
|
||||||
"full_name": user.full_name,
|
"full_name": user.full_name,
|
||||||
|
"first_name": user.first_name or "",
|
||||||
|
"middle_name": user.middle_name or "",
|
||||||
|
"last_name": user.last_name or "",
|
||||||
|
"username": user.username or "",
|
||||||
"email": user.email,
|
"email": user.email,
|
||||||
|
"mobile_no": user.mobile_no or "",
|
||||||
"user_image": user.user_image,
|
"user_image": user.user_image,
|
||||||
"roles": roles,
|
"roles": roles,
|
||||||
"last_login": user.last_login,
|
"last_login": user.last_login,
|
||||||
"enabled": user.enabled,
|
"enabled": user.enabled,
|
||||||
"creation": user.creation,
|
"creation": user.creation,
|
||||||
"modified": user.modified,
|
"modified": user.modified,
|
||||||
|
"custom_user_id": user.get("custom_user_id") or "",
|
||||||
"custom_site_name": user.get("custom_site_name") or "",
|
"custom_site_name": user.get("custom_site_name") or "",
|
||||||
"custom_phcc_site_name": user.get("custom_phcc_site_name") or "",
|
"custom_phcc_site_name": user.get("custom_phcc_site_name") or "",
|
||||||
"role_profile_name": user.get("role_profile_name") or "",
|
"role_profile_name": user.get("role_profile_name") or "",
|
||||||
|
|||||||
121
asset_lite/api/data_import_api.py
Normal file
121
asset_lite/api/data_import_api.py
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
import csv
|
||||||
|
import os
|
||||||
|
from io import StringIO
|
||||||
|
|
||||||
|
import frappe
|
||||||
|
from frappe import _
|
||||||
|
from frappe.utils.csvutils import read_csv_content
|
||||||
|
from frappe.utils.file_manager import save_file
|
||||||
|
from frappe.utils.xlsxutils import (
|
||||||
|
make_xlsx,
|
||||||
|
read_xls_file_from_attached_file,
|
||||||
|
read_xlsx_file_from_attached_file,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _trim_cell(value):
|
||||||
|
if isinstance(value, str):
|
||||||
|
trimmed = value.strip()
|
||||||
|
return trimmed if trimmed else None
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
def _trim_rows(rows):
|
||||||
|
trimmed_cells = 0
|
||||||
|
out = []
|
||||||
|
for row in rows:
|
||||||
|
new_row = []
|
||||||
|
for cell in row:
|
||||||
|
if isinstance(cell, str):
|
||||||
|
original = cell
|
||||||
|
trimmed = _trim_cell(cell)
|
||||||
|
if original != (trimmed or ""):
|
||||||
|
trimmed_cells += 1
|
||||||
|
new_row.append(trimmed)
|
||||||
|
else:
|
||||||
|
new_row.append(cell)
|
||||||
|
out.append(new_row)
|
||||||
|
return out, trimmed_cells
|
||||||
|
|
||||||
|
|
||||||
|
def _read_rows_from_content(content, extension):
|
||||||
|
extension = (extension or "").lower()
|
||||||
|
if extension == "csv":
|
||||||
|
return read_csv_content(content)
|
||||||
|
if extension == "xlsx":
|
||||||
|
return read_xlsx_file_from_attached_file(fcontent=content)
|
||||||
|
if extension == "xls":
|
||||||
|
return read_xls_file_from_attached_file(content)
|
||||||
|
frappe.throw(_("Import file must be .csv, .xlsx, or .xls"))
|
||||||
|
|
||||||
|
|
||||||
|
def _write_trimmed_content(rows, extension):
|
||||||
|
extension = (extension or "").lower()
|
||||||
|
if extension == "csv":
|
||||||
|
buffer = StringIO()
|
||||||
|
writer = csv.writer(buffer)
|
||||||
|
for row in rows:
|
||||||
|
writer.writerow(["" if cell is None else cell for cell in row])
|
||||||
|
return buffer.getvalue().encode("utf-8"), "csv"
|
||||||
|
|
||||||
|
if extension == "xls":
|
||||||
|
extension = "xlsx"
|
||||||
|
|
||||||
|
if extension == "xlsx":
|
||||||
|
return make_xlsx(rows, "Import").getvalue(), "xlsx"
|
||||||
|
|
||||||
|
frappe.throw(_("Import file must be .csv, .xlsx, or .xls"))
|
||||||
|
|
||||||
|
|
||||||
|
def _trimmed_filename(original_name, output_extension):
|
||||||
|
base, _ = os.path.splitext(original_name or "import")
|
||||||
|
return f"{base}_trimmed.{output_extension}"
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def trim_and_upload_import_file(data_import):
|
||||||
|
doc = frappe.get_doc("Data Import", data_import)
|
||||||
|
doc.check_permission("write")
|
||||||
|
|
||||||
|
if not doc.import_file:
|
||||||
|
frappe.throw(_("Attach an import file first."))
|
||||||
|
|
||||||
|
if doc.google_sheets_url:
|
||||||
|
frappe.throw(_("Trim and Upload is only available for attached files, not Google Sheets URLs."))
|
||||||
|
|
||||||
|
file_name = frappe.db.get_value("File", {"file_url": doc.import_file}, "name")
|
||||||
|
if not file_name:
|
||||||
|
frappe.throw(_("Import file not found in File attachments."))
|
||||||
|
|
||||||
|
source_file = frappe.get_doc("File", file_name)
|
||||||
|
content = source_file.get_content()
|
||||||
|
extension = os.path.splitext(source_file.file_name or doc.import_file)[1][1:].lower()
|
||||||
|
|
||||||
|
rows = _read_rows_from_content(content, extension)
|
||||||
|
if not rows:
|
||||||
|
frappe.throw(_("Import file is empty."))
|
||||||
|
|
||||||
|
trimmed_rows, trimmed_cells = _trim_rows(rows)
|
||||||
|
output_content, output_extension = _write_trimmed_content(trimmed_rows, extension)
|
||||||
|
output_name = _trimmed_filename(source_file.file_name or os.path.basename(doc.import_file), output_extension)
|
||||||
|
|
||||||
|
new_file = save_file(
|
||||||
|
output_name,
|
||||||
|
output_content,
|
||||||
|
dt=doc.doctype,
|
||||||
|
dn=doc.name,
|
||||||
|
is_private=source_file.is_private,
|
||||||
|
df="import_file",
|
||||||
|
)
|
||||||
|
|
||||||
|
doc.import_file = new_file.file_url
|
||||||
|
doc.template_options = ""
|
||||||
|
doc.template_warnings = ""
|
||||||
|
doc.save()
|
||||||
|
|
||||||
|
return {
|
||||||
|
"import_file": new_file.file_url,
|
||||||
|
"file_name": new_file.file_name,
|
||||||
|
"trimmed_cells": trimmed_cells,
|
||||||
|
"summary": _("Trimmed {0} cell(s) and uploaded {1}.").format(trimmed_cells, new_file.file_name),
|
||||||
|
}
|
||||||
@ -42,6 +42,56 @@ PM_ENTRY_LINE_FIELDS = [
|
|||||||
'model'
|
'model'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
PPM_PLANNER_ASSET_FIELDS = [
|
||||||
|
"name",
|
||||||
|
"asset_name",
|
||||||
|
"custom_modality",
|
||||||
|
"company",
|
||||||
|
"custom_manufacturer",
|
||||||
|
"custom_device_status",
|
||||||
|
"custom_model",
|
||||||
|
"department",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def get_ppm_planner_assets(
|
||||||
|
company=None,
|
||||||
|
custom_modality=None,
|
||||||
|
custom_manufacturer=None,
|
||||||
|
custom_device_status=None,
|
||||||
|
custom_model=None,
|
||||||
|
department=None,
|
||||||
|
):
|
||||||
|
"""Fetch submitted assets for PPM Planner bulk scheduling."""
|
||||||
|
filters = {"docstatus": 1}
|
||||||
|
|
||||||
|
if company:
|
||||||
|
filters["company"] = company
|
||||||
|
if custom_modality:
|
||||||
|
filters["custom_modality"] = custom_modality
|
||||||
|
if custom_manufacturer:
|
||||||
|
filters["custom_manufacturer"] = custom_manufacturer
|
||||||
|
if custom_device_status:
|
||||||
|
filters["custom_device_status"] = custom_device_status
|
||||||
|
if custom_model:
|
||||||
|
filters["custom_model"] = custom_model
|
||||||
|
if department:
|
||||||
|
filters["department"] = department
|
||||||
|
|
||||||
|
assets = frappe.get_all("Asset", filters=filters, fields=PPM_PLANNER_ASSET_FIELDS)
|
||||||
|
|
||||||
|
existing_maintenance_assets = set(
|
||||||
|
frappe.get_all(
|
||||||
|
"Asset Maintenance",
|
||||||
|
filters={"docstatus": ["<", 2]},
|
||||||
|
pluck="name",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
return [asset for asset in assets if asset.name not in existing_maintenance_assets]
|
||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def create_bulk_schedules(asset_names, start_date, end_date, maintenance_team=None, periodicity='Monthly', maintenance_type='Preventive'):
|
def create_bulk_schedules(asset_names, start_date, end_date, maintenance_team=None, periodicity='Monthly', maintenance_type='Preventive'):
|
||||||
"""Create maintenance schedules for multiple assets"""
|
"""Create maintenance schedules for multiple assets"""
|
||||||
|
|||||||
@ -55,62 +55,6 @@
|
|||||||
"unique": 0,
|
"unique": 0,
|
||||||
"width": null
|
"width": null
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"allow_in_quick_entry": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"collapsible_depends_on": null,
|
|
||||||
"columns": 0,
|
|
||||||
"default": null,
|
|
||||||
"depends_on": null,
|
|
||||||
"description": null,
|
|
||||||
"docstatus": 0,
|
|
||||||
"doctype": "Custom Field",
|
|
||||||
"dt": "User",
|
|
||||||
"fetch_from": null,
|
|
||||||
"fetch_if_empty": 0,
|
|
||||||
"fieldname": "custom_department",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"hidden": 0,
|
|
||||||
"hide_border": 0,
|
|
||||||
"hide_days": 0,
|
|
||||||
"hide_seconds": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 1,
|
|
||||||
"in_preview": 0,
|
|
||||||
"in_standard_filter": 1,
|
|
||||||
"insert_after": "Username",
|
|
||||||
"is_system_generated": 0,
|
|
||||||
"is_virtual": 0,
|
|
||||||
"label": "Department",
|
|
||||||
"length": 0,
|
|
||||||
"link_filters": null,
|
|
||||||
"mandatory_depends_on": null,
|
|
||||||
"modified": "2025-08-26 15:24:16.357765",
|
|
||||||
"module": "Asset Lite",
|
|
||||||
"name": "User-custom_department",
|
|
||||||
"no_copy": 0,
|
|
||||||
"non_negative": 0,
|
|
||||||
"options": "Department",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"print_width": null,
|
|
||||||
"read_only": 0,
|
|
||||||
"read_only_depends_on": null,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"show_dashboard": 0,
|
|
||||||
"sort_options": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0,
|
|
||||||
"width": null
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_in_quick_entry": 0,
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
@ -12153,7 +12097,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_in_quick_entry": 0,
|
"allow_in_quick_entry": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 1,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"collapsible_depends_on": null,
|
"collapsible_depends_on": null,
|
||||||
@ -12185,7 +12129,7 @@
|
|||||||
"length": 0,
|
"length": 0,
|
||||||
"link_filters": null,
|
"link_filters": null,
|
||||||
"mandatory_depends_on": null,
|
"mandatory_depends_on": null,
|
||||||
"modified": "2025-04-22 12:52:15.979629",
|
"modified": "2026-08-31 09:21:30.053035",
|
||||||
"module": "Asset Lite",
|
"module": "Asset Lite",
|
||||||
"name": "Asset-custom_installation_date",
|
"name": "Asset-custom_installation_date",
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
|
|||||||
@ -1468,5 +1468,47 @@
|
|||||||
"timeline": 0,
|
"timeline": 0,
|
||||||
"two_factor_auth": 0,
|
"two_factor_auth": 0,
|
||||||
"view_switcher": 0
|
"view_switcher": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bulk_actions": 1,
|
||||||
|
"dashboard": 1,
|
||||||
|
"desk_access": 1,
|
||||||
|
"disabled": 0,
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "Role",
|
||||||
|
"form_sidebar": 1,
|
||||||
|
"home_page": null,
|
||||||
|
"is_custom": 0,
|
||||||
|
"list_sidebar": 1,
|
||||||
|
"modified": "2026-08-28 12:49:21.664589",
|
||||||
|
"name": "BME Director",
|
||||||
|
"notifications": 1,
|
||||||
|
"restrict_to_domain": null,
|
||||||
|
"role_name": "BME Director",
|
||||||
|
"search_bar": 1,
|
||||||
|
"timeline": 1,
|
||||||
|
"two_factor_auth": 0,
|
||||||
|
"view_switcher": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bulk_actions": 1,
|
||||||
|
"dashboard": 1,
|
||||||
|
"desk_access": 1,
|
||||||
|
"disabled": 0,
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "Role",
|
||||||
|
"form_sidebar": 1,
|
||||||
|
"home_page": null,
|
||||||
|
"is_custom": 0,
|
||||||
|
"list_sidebar": 1,
|
||||||
|
"modified": "2026-08-28 12:49:45.525864",
|
||||||
|
"name": "Engineer",
|
||||||
|
"notifications": 1,
|
||||||
|
"restrict_to_domain": null,
|
||||||
|
"role_name": "Engineer",
|
||||||
|
"search_bar": 1,
|
||||||
|
"timeline": 1,
|
||||||
|
"two_factor_auth": 0,
|
||||||
|
"view_switcher": 1
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -674,13 +674,13 @@
|
|||||||
"doctype_event": "Before Insert",
|
"doctype_event": "Before Insert",
|
||||||
"enable_rate_limit": 0,
|
"enable_rate_limit": 0,
|
||||||
"event_frequency": "All",
|
"event_frequency": "All",
|
||||||
"modified": "2026-01-09 13:21:21.936865",
|
"modified": "2026-08-25 12:15:18.912036",
|
||||||
"module": "Asset Lite",
|
"module": "Asset Lite",
|
||||||
"name": "Update Item Defaults",
|
"name": "Update Item Defaults",
|
||||||
"rate_limit_count": 5,
|
"rate_limit_count": 5,
|
||||||
"rate_limit_seconds": 86400,
|
"rate_limit_seconds": 86400,
|
||||||
"reference_doctype": "Item",
|
"reference_doctype": "Item",
|
||||||
"script": "row = doc.append(\"item_defaults\", {})\r\nrow.company = \"Iman General Hospital\"\r\nrow.default_warehouse = \"Iman Central Warehouse - IGH\"",
|
"script": "#row = doc.append(\"item_defaults\", {})\r\n#row.company = \"Iman General Hospital\"\r\n#row.default_warehouse = \"Iman Central Warehouse - IGH\"\r\n\r\n\r\nif doc.custom_hospital_name:\r\n company = frappe.get_doc(\"Company\", doc.custom_hospital_name)\r\n\r\n if company.abbr:\r\n warehouse = \"Stores - \" + company.abbr\r\n\r\n # If no Item Defaults rows exist, create one\r\n if not doc.item_defaults:\r\n row = doc.append(\"item_defaults\")\r\n row.company = doc.custom_hospital_name\r\n row.default_warehouse = warehouse\r\n\r\n else:\r\n # Update existing Item Defaults rows\r\n for row in doc.item_defaults:\r\n row.company = doc.custom_hospital_name\r\n row.default_warehouse = warehouse",
|
||||||
"script_type": "DocType Event"
|
"script_type": "DocType Event"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
142
asset_lite/fixtures/web_form.json
Normal file
142
asset_lite/fixtures/web_form.json
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"accept_payment": 0,
|
||||||
|
"allow_comments": 0,
|
||||||
|
"allow_delete": 0,
|
||||||
|
"allow_edit": 0,
|
||||||
|
"allow_incomplete": 0,
|
||||||
|
"allow_multiple": 0,
|
||||||
|
"allow_print": 0,
|
||||||
|
"amount": 0.0,
|
||||||
|
"amount_based_on_field": 0,
|
||||||
|
"amount_field": null,
|
||||||
|
"anonymous": 0,
|
||||||
|
"apply_document_permissions": 0,
|
||||||
|
"banner_image": null,
|
||||||
|
"breadcrumbs": null,
|
||||||
|
"button_label": "Save",
|
||||||
|
"client_script": null,
|
||||||
|
"condition_json": "[]",
|
||||||
|
"currency": "SAR",
|
||||||
|
"custom_css": null,
|
||||||
|
"doc_type": "WO Feedback",
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "Web Form",
|
||||||
|
"introduction_text": "<div class=\"ql-editor read-mode\"><p>Work Order is Closed Please Give Your Feedback Here</p></div>",
|
||||||
|
"is_standard": 0,
|
||||||
|
"list_columns": [],
|
||||||
|
"list_title": null,
|
||||||
|
"login_required": 0,
|
||||||
|
"max_attachment_size": 0,
|
||||||
|
"meta_description": null,
|
||||||
|
"meta_image": null,
|
||||||
|
"meta_title": null,
|
||||||
|
"modified": "2026-08-18 13:35:38.853748",
|
||||||
|
"module": "Asset Lite",
|
||||||
|
"name": "wo-feedback",
|
||||||
|
"payment_button_help": null,
|
||||||
|
"payment_button_label": "Buy Now",
|
||||||
|
"payment_gateway": null,
|
||||||
|
"print_format": null,
|
||||||
|
"published": 1,
|
||||||
|
"route": "wo-feedback",
|
||||||
|
"show_attachments": 0,
|
||||||
|
"show_list": 0,
|
||||||
|
"show_sidebar": 0,
|
||||||
|
"success_message": "Your Feedback Submitted successfully",
|
||||||
|
"success_title": "Feedback Submitted",
|
||||||
|
"success_url": null,
|
||||||
|
"title": "WO Feedback",
|
||||||
|
"web_form_fields": [
|
||||||
|
{
|
||||||
|
"allow_read_on_all_link_options": 0,
|
||||||
|
"default": null,
|
||||||
|
"depends_on": null,
|
||||||
|
"description": null,
|
||||||
|
"fieldname": "work_order",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 0,
|
||||||
|
"label": "Work Order",
|
||||||
|
"mandatory_depends_on": null,
|
||||||
|
"max_length": 0,
|
||||||
|
"max_value": 0,
|
||||||
|
"options": "Work_Order",
|
||||||
|
"parent": "wo-feedback",
|
||||||
|
"parentfield": "web_form_fields",
|
||||||
|
"parenttype": "Web Form",
|
||||||
|
"precision": "",
|
||||||
|
"read_only": 0,
|
||||||
|
"read_only_depends_on": null,
|
||||||
|
"reqd": 1,
|
||||||
|
"show_in_filter": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_read_on_all_link_options": 0,
|
||||||
|
"default": null,
|
||||||
|
"depends_on": null,
|
||||||
|
"description": null,
|
||||||
|
"fieldname": "requester_name",
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"hidden": 0,
|
||||||
|
"label": "Requester Name",
|
||||||
|
"mandatory_depends_on": null,
|
||||||
|
"max_length": 0,
|
||||||
|
"max_value": 0,
|
||||||
|
"options": null,
|
||||||
|
"parent": "wo-feedback",
|
||||||
|
"parentfield": "web_form_fields",
|
||||||
|
"parenttype": "Web Form",
|
||||||
|
"precision": "",
|
||||||
|
"read_only": 0,
|
||||||
|
"read_only_depends_on": null,
|
||||||
|
"reqd": 1,
|
||||||
|
"show_in_filter": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_read_on_all_link_options": 0,
|
||||||
|
"default": null,
|
||||||
|
"depends_on": null,
|
||||||
|
"description": null,
|
||||||
|
"fieldname": "rating",
|
||||||
|
"fieldtype": "Select",
|
||||||
|
"hidden": 0,
|
||||||
|
"label": "Rating",
|
||||||
|
"mandatory_depends_on": null,
|
||||||
|
"max_length": 0,
|
||||||
|
"max_value": 0,
|
||||||
|
"options": "\nExcellent / ممتاز\nGood / جيد\nAverage / متوسط\nPoor / ضعيف",
|
||||||
|
"parent": "wo-feedback",
|
||||||
|
"parentfield": "web_form_fields",
|
||||||
|
"parenttype": "Web Form",
|
||||||
|
"precision": "",
|
||||||
|
"read_only": 0,
|
||||||
|
"read_only_depends_on": null,
|
||||||
|
"reqd": 1,
|
||||||
|
"show_in_filter": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_read_on_all_link_options": 0,
|
||||||
|
"default": null,
|
||||||
|
"depends_on": null,
|
||||||
|
"description": null,
|
||||||
|
"fieldname": "comments",
|
||||||
|
"fieldtype": "Small Text",
|
||||||
|
"hidden": 0,
|
||||||
|
"label": "Comments",
|
||||||
|
"mandatory_depends_on": null,
|
||||||
|
"max_length": 0,
|
||||||
|
"max_value": 0,
|
||||||
|
"options": null,
|
||||||
|
"parent": "wo-feedback",
|
||||||
|
"parentfield": "web_form_fields",
|
||||||
|
"parenttype": "Web Form",
|
||||||
|
"precision": "",
|
||||||
|
"read_only": 0,
|
||||||
|
"read_only_depends_on": null,
|
||||||
|
"reqd": 0,
|
||||||
|
"show_in_filter": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"website_sidebar": null
|
||||||
|
}
|
||||||
|
]
|
||||||
@ -80,15 +80,6 @@
|
|||||||
"style": "",
|
"style": "",
|
||||||
"workflow_state_name": "Sent To Site Manager"
|
"workflow_state_name": "Sent To Site Manager"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"docstatus": 0,
|
|
||||||
"doctype": "Workflow State",
|
|
||||||
"icon": "",
|
|
||||||
"modified": "2026-08-11 11:37:18.893891",
|
|
||||||
"name": "Sent To Project Manager",
|
|
||||||
"style": "",
|
|
||||||
"workflow_state_name": "Sent To Project Manager"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"doctype": "Workflow State",
|
"doctype": "Workflow State",
|
||||||
@ -116,6 +107,15 @@
|
|||||||
"style": "",
|
"style": "",
|
||||||
"workflow_state_name": "Pending Purchase"
|
"workflow_state_name": "Pending Purchase"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "Workflow State",
|
||||||
|
"icon": "",
|
||||||
|
"modified": "2026-08-11 11:37:18.893891",
|
||||||
|
"name": "Sent To Project Manager",
|
||||||
|
"style": "",
|
||||||
|
"workflow_state_name": "Sent To Project Manager"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"doctype": "Workflow State",
|
"doctype": "Workflow State",
|
||||||
@ -138,19 +138,19 @@
|
|||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"doctype": "Workflow State",
|
"doctype": "Workflow State",
|
||||||
"icon": "",
|
"icon": "",
|
||||||
"modified": "2025-08-11 12:01:35.474110",
|
"modified": "2024-09-13 13:50:24.315353",
|
||||||
"name": "Closed",
|
"name": "Pending Approval",
|
||||||
"style": "",
|
"style": "Primary",
|
||||||
"workflow_state_name": "Closed"
|
"workflow_state_name": "Pending Approval"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"doctype": "Workflow State",
|
"doctype": "Workflow State",
|
||||||
"icon": "",
|
"icon": "",
|
||||||
"modified": "2024-09-13 13:50:24.315353",
|
"modified": "2025-08-11 12:01:35.474110",
|
||||||
"name": "Pending Approval",
|
"name": "Closed",
|
||||||
"style": "Primary",
|
"style": "",
|
||||||
"workflow_state_name": "Pending Approval"
|
"workflow_state_name": "Closed"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
|
|||||||
@ -44,7 +44,10 @@ app_include_js = "/assets/asset_lite/js/dashboard_embed.js?v=1.0.28"
|
|||||||
# page_js = {"page" : "public/js/file.js"}
|
# page_js = {"page" : "public/js/file.js"}
|
||||||
|
|
||||||
# include js in doctype views
|
# include js in doctype views
|
||||||
doctype_js = {"Asset Maintenance Log" : "public/js/custom_asset_maintenance_log.js"}
|
doctype_js = {
|
||||||
|
"Asset Maintenance Log" : "public/js/custom_asset_maintenance_log.js",
|
||||||
|
"Data Import" : "public/js/custom_data_import.js"
|
||||||
|
}
|
||||||
# doctype_list_js = {"doctype" : "public/js/doctype_list.js"}
|
# doctype_list_js = {"doctype" : "public/js/doctype_list.js"}
|
||||||
# doctype_tree_js = {"doctype" : "public/js/doctype_tree.js"}
|
# doctype_tree_js = {"doctype" : "public/js/doctype_tree.js"}
|
||||||
# doctype_calendar_js = {"doctype" : "public/js/doctype_calendar.js"}
|
# doctype_calendar_js = {"doctype" : "public/js/doctype_calendar.js"}
|
||||||
@ -281,6 +284,7 @@ fixtures = [
|
|||||||
{"doctype": "Server Script", "filters": [["module","=","Asset Lite"]]},
|
{"doctype": "Server Script", "filters": [["module","=","Asset Lite"]]},
|
||||||
{"doctype": "Notification", "filters": [["is_standard","=",0]]},
|
{"doctype": "Notification", "filters": [["is_standard","=",0]]},
|
||||||
{"doctype": "Report", "filters": [["module","=","Asset Lite"]]},
|
{"doctype": "Report", "filters": [["module","=","Asset Lite"]]},
|
||||||
|
{"doctype": "Web Form", "filters": [["module","=","Asset Lite"]]},
|
||||||
{
|
{
|
||||||
"doctype": "Dashboard Chart",
|
"doctype": "Dashboard Chart",
|
||||||
"filters": [
|
"filters": [
|
||||||
|
|||||||
70
asset_lite/public/js/custom_data_import.js
Normal file
70
asset_lite/public/js/custom_data_import.js
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
function trim_and_upload_import_file(frm) {
|
||||||
|
frappe.confirm(
|
||||||
|
__(
|
||||||
|
'Trim leading and trailing spaces from all cells, upload the cleaned file, and update Import File?'
|
||||||
|
),
|
||||||
|
() => {
|
||||||
|
frappe.call({
|
||||||
|
method: 'asset_lite.api.data_import_api.trim_and_upload_import_file',
|
||||||
|
args: { data_import: frm.doc.name },
|
||||||
|
freeze: true,
|
||||||
|
freeze_message: __('Trimming and uploading file...'),
|
||||||
|
callback(r) {
|
||||||
|
if (!r.message) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
frappe.show_alert(
|
||||||
|
{
|
||||||
|
message: r.message.summary || __('File trimmed and uploaded.'),
|
||||||
|
indicator: 'green',
|
||||||
|
},
|
||||||
|
5
|
||||||
|
);
|
||||||
|
|
||||||
|
frm.reload_doc().then(() => frm.trigger('import_file'));
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function add_trim_and_upload_button(frm) {
|
||||||
|
if (frm.is_new() || !frm.doc.import_file || frm.doc.google_sheets_url) {
|
||||||
|
frm.fields_dict.import_file?.$wrapper?.find('.trim-upload-btn').remove();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const label = __('Trim and Upload file');
|
||||||
|
const action = () => trim_and_upload_import_file(frm);
|
||||||
|
|
||||||
|
frm.add_custom_button(label, action, __('Actions'));
|
||||||
|
frm.page.add_action_item(label, action);
|
||||||
|
|
||||||
|
const field = frm.get_field('import_file');
|
||||||
|
if (!field?.$wrapper) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
field.$wrapper.find('.trim-upload-btn').remove();
|
||||||
|
const $btn = $(`<button type="button" class="btn btn-default btn-sm trim-upload-btn" style="margin-left: 8px;">
|
||||||
|
${label}
|
||||||
|
</button>`);
|
||||||
|
$btn.on('click', action);
|
||||||
|
|
||||||
|
const $attachRow = field.$wrapper.find('.attached-file, .file-preview, .control-input-wrapper').last();
|
||||||
|
if ($attachRow.length) {
|
||||||
|
$attachRow.append($btn);
|
||||||
|
} else {
|
||||||
|
field.$wrapper.append($btn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
frappe.ui.form.on('Data Import', {
|
||||||
|
refresh(frm) {
|
||||||
|
add_trim_and_upload_button(frm);
|
||||||
|
},
|
||||||
|
onload_post_render(frm) {
|
||||||
|
add_trim_and_upload_button(frm);
|
||||||
|
},
|
||||||
|
});
|
||||||
Loading…
x
Reference in New Issue
Block a user