75 lines
2 KiB
Python
75 lines
2 KiB
Python
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
|
# License: GNU General Public License v3. See license.txt
|
|
|
|
from __future__ import unicode_literals
|
|
import frappe
|
|
from frappe import _
|
|
|
|
@frappe.whitelist()
|
|
def get_all_nodes(doctype, parent, tree_method, **filters):
|
|
'''Recursively gets all data from tree nodes'''
|
|
|
|
if 'cmd' in filters:
|
|
del filters['cmd']
|
|
|
|
tree_method = frappe.get_attr(tree_method)
|
|
|
|
if not tree_method in frappe.whitelisted:
|
|
frappe.throw(_("Not Permitted"), frappe.PermissionError)
|
|
|
|
data = tree_method(doctype, parent, **filters)
|
|
out = [dict(parent=parent, data=data)]
|
|
|
|
if 'is_root' in filters:
|
|
del filters['is_root']
|
|
|
|
to_check = [d.value for d in data if d.expandable]
|
|
|
|
while to_check:
|
|
parent = to_check.pop()
|
|
data = tree_method(doctype, parent, is_root = False, **filters)
|
|
out.append(dict(parent=parent, data=data))
|
|
for d in data:
|
|
if d.expandable:
|
|
to_check.append(d.value)
|
|
|
|
return out
|
|
|
|
@frappe.whitelist()
|
|
def get_children(doctype, parent='', **filters):
|
|
parent_field = 'parent_' + doctype.lower().replace(' ', '_')
|
|
|
|
return frappe.db.sql("""select name as value, `{title_field}` as title,
|
|
is_group as expandable
|
|
from `tab{ctype}`
|
|
where docstatus < 2
|
|
and ifnull(`{parent_field}`,'') = %s
|
|
order by name""".format(
|
|
ctype = frappe.db.escape(doctype),
|
|
parent_field = frappe.db.escape(parent_field),
|
|
title_field = frappe.get_meta(doctype).title_field or 'name'),
|
|
parent, as_dict=1)
|
|
|
|
@frappe.whitelist()
|
|
def add_node():
|
|
args = make_tree_args(**frappe.form_dict)
|
|
doc = frappe.get_doc(args)
|
|
|
|
if args.doctype == "Sales Person":
|
|
doc.employee = frappe.form_dict.get('employee')
|
|
|
|
doc.save()
|
|
|
|
def make_tree_args(**kwarg):
|
|
del kwarg['cmd']
|
|
|
|
doctype = kwarg['doctype']
|
|
parent_field = 'parent_' + doctype.lower().replace(' ', '_')
|
|
name_field = kwarg.get('name_field', doctype.lower().replace(' ', '_') + '_name')
|
|
|
|
kwarg.update({
|
|
name_field: kwarg[name_field],
|
|
parent_field: kwarg.get("parent") or kwarg.get(parent_field)
|
|
})
|
|
|
|
return frappe._dict(kwarg)
|