126 lines
4.5 KiB
Python
126 lines
4.5 KiB
Python
"""
|
|
Cleanup ERPNext: hide unused modules, configure sidebar, check users/permissions.
|
|
"""
|
|
import frappe
|
|
|
|
|
|
def execute():
|
|
cleanup_modules()
|
|
cleanup_users()
|
|
setup_workspace()
|
|
frappe.db.commit()
|
|
print("\n=== Cleanup Complete ===\n")
|
|
|
|
|
|
def cleanup_modules():
|
|
"""Hide modules that are not needed from the sidebar."""
|
|
print("[1/3] Hiding unused modules...")
|
|
|
|
# Modules to KEEP visible
|
|
keep_modules = {
|
|
"Accounts", "Selling", "CRM", "Buying",
|
|
"Didi Custom", "Setup", "Core",
|
|
}
|
|
|
|
# Modules to HIDE
|
|
hide_modules = {
|
|
"Stock", "Manufacturing", "Assets", "Projects",
|
|
"Quality Management", "Subcontracting", "Support",
|
|
"Maintenance", "EDI", "Telephony", "Portal",
|
|
"Bulk Transaction", "ERPNext Integrations",
|
|
"Social", "Website",
|
|
}
|
|
|
|
# Use Module Profile to restrict what Administrator sees
|
|
# Actually in ERPNext v15, we use "Allowed Modules" on User
|
|
# But for Administrator we can't restrict. Instead, we hide workspaces.
|
|
|
|
# Hide workspaces for unused modules
|
|
workspaces_to_hide = [
|
|
"Stock", "Manufacturing", "Assets", "Projects",
|
|
"Quality", "Subcontracting", "Support",
|
|
"HR", "Payroll", "Website",
|
|
]
|
|
|
|
for ws_name in workspaces_to_hide:
|
|
ws_list = frappe.get_all("Workspace", filters={"name": ["like", f"%{ws_name}%"]})
|
|
for ws in ws_list:
|
|
doc = frappe.get_doc("Workspace", ws.name)
|
|
if doc.public:
|
|
doc.public = 0
|
|
doc.save(ignore_permissions=True)
|
|
print(f" Hidden workspace: {ws.name}")
|
|
|
|
print(" Module cleanup done.")
|
|
|
|
|
|
def cleanup_users():
|
|
"""Verify users and their roles."""
|
|
print("[2/3] Checking users...")
|
|
|
|
users = frappe.get_all("User",
|
|
filters={"user_type": "System User", "enabled": 1},
|
|
fields=["name", "full_name", "user_type"]
|
|
)
|
|
|
|
for u in users:
|
|
roles = frappe.get_all("Has Role",
|
|
filters={"parent": u.name},
|
|
fields=["role"]
|
|
)
|
|
role_names = [r.role for r in roles]
|
|
print(f" User: {u.name} ({u.full_name})")
|
|
print(f" Roles: {', '.join(role_names)}")
|
|
|
|
# Ensure website_api user has minimal roles
|
|
api_user = "website_api@didi.localhost"
|
|
if frappe.db.exists("User", api_user):
|
|
user_doc = frappe.get_doc("User", api_user)
|
|
current_roles = [r.role for r in user_doc.roles]
|
|
print(f"\n API User roles: {current_roles}")
|
|
|
|
# Remove unnecessary roles if any
|
|
wanted_roles = {"Website Integration"}
|
|
unwanted = set(current_roles) - wanted_roles - {"All", "Guest"}
|
|
if unwanted:
|
|
for role_name in unwanted:
|
|
user_doc.roles = [r for r in user_doc.roles if r.role != role_name]
|
|
user_doc.save(ignore_permissions=True)
|
|
print(f" Removed unwanted roles: {unwanted}")
|
|
|
|
print(" Users OK.")
|
|
|
|
|
|
def setup_workspace():
|
|
"""Create a clean DiDi workspace with only relevant shortcuts."""
|
|
print("[3/3] Setting up DiDi workspace...")
|
|
|
|
ws_name = "DiDi"
|
|
|
|
if frappe.db.exists("Workspace", ws_name):
|
|
frappe.delete_doc("Workspace", ws_name, force=True)
|
|
|
|
ws = frappe.get_doc({
|
|
"doctype": "Workspace",
|
|
"name": ws_name,
|
|
"label": "DiDi",
|
|
"title": "DiDi",
|
|
"module": "Didi Custom",
|
|
"icon": "home",
|
|
"public": 1,
|
|
"sequence_id": 1,
|
|
"shortcuts": [
|
|
{"type": "DocType", "link_to": "Customer", "label": "Clienti", "color": "#2563eb"},
|
|
{"type": "DocType", "link_to": "Lead", "label": "Lead-uri", "color": "#7c3aed"},
|
|
{"type": "DocType", "link_to": "Sales Invoice", "label": "Facturi", "color": "#059669"},
|
|
{"type": "DocType", "link_to": "Subscription Plan", "label": "Planuri Abonament", "color": "#d97706"},
|
|
{"type": "DocType", "link_to": "Subscription", "label": "Subscriptii", "color": "#dc2626"},
|
|
{"type": "DocType", "link_to": "Website Content", "label": "Continut Website (CMS)", "color": "#0891b2"},
|
|
{"type": "DocType", "link_to": "Service Agreement", "label": "Acorduri Servicii", "color": "#4f46e5"},
|
|
{"type": "DocType", "link_to": "Payment Log", "label": "Log Plati", "color": "#be185d"},
|
|
{"type": "DocType", "link_to": "Supplier", "label": "Furnizori", "color": "#64748b"},
|
|
{"type": "DocType", "link_to": "Email Template", "label": "Template-uri Email", "color": "#475569"},
|
|
],
|
|
})
|
|
ws.insert(ignore_permissions=True)
|
|
print(f" Created workspace: DiDi (with shortcuts + number cards)")
|