* Handle inconsistencies in type handling in DatabaseQuery & Database APIs * Update incompatible queries with frappe.qb notation * Fixed use cases discovered by failing ERPNext CI tests fix: db independent syntax for user_type fix: handle postgres datetime values feat: add ability to auto commit on db inserts feat: add ability to escape underscore in postgres fix: handle missing data in test runner bootstrapping fix: db independent syntax for queries fix: refactor to use qb fix: update cache for language fix: use pluck in email_queue Co-authored-by: gavin <gavin18d@gmail.com> fix: don't auto insert on tests for make_property_setter fix: remove auto_commit in custom_field insertion fix: remove auto_commit functionality fix: review comments fix: revert link validation fix: style suggestion for readability Co-authored-by: gavin <gavin18d@gmail.com> fix: revert .lower() in link validation fix: add rollback for setup_wizard Revert "fix: add rollback for setup_wizard" This reverts commit 83b3b0913db17718ccd5edae01858cff15603829. Revert "feat: add ability to escape underscore in postgres" This reverts commit 8ed9c2aa3306438e94bb813f60e65b416d0b947b. fix: more concise representation of order fields Co-authored-by: gavin <gavin18d@gmail.com>
81 lines
2 KiB
Python
81 lines
2 KiB
Python
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
|
# License: MIT. See LICENSE
|
|
|
|
import frappe
|
|
from frappe import _
|
|
|
|
|
|
@frappe.whitelist()
|
|
def get_all_nodes(doctype, label, parent, tree_method, **filters):
|
|
'''Recursively gets all data from tree nodes'''
|
|
|
|
if 'cmd' in filters:
|
|
del filters['cmd']
|
|
filters.pop('data', None)
|
|
|
|
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=label, data=data)]
|
|
|
|
if 'is_root' in filters:
|
|
del filters['is_root']
|
|
to_check = [d.get('value') for d in data if d.get('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.get('expandable'):
|
|
to_check.append(d.get('value'))
|
|
|
|
return out
|
|
|
|
@frappe.whitelist()
|
|
def get_children(doctype, parent='', **filters):
|
|
return _get_children(doctype, parent)
|
|
|
|
def _get_children(doctype, parent='', ignore_permissions=False):
|
|
parent_field = 'parent_' + doctype.lower().replace(' ', '_')
|
|
filters = [["ifnull(`{0}`,'')".format(parent_field), '=', parent],
|
|
['docstatus', '<' ,2]]
|
|
|
|
meta = frappe.get_meta(doctype)
|
|
|
|
return frappe.get_list(
|
|
doctype,
|
|
fields=[
|
|
'name as value',
|
|
'{0} as title'.format(meta.get('title_field') or 'name'),
|
|
'is_group as expandable'
|
|
],
|
|
filters=filters,
|
|
order_by='name',
|
|
ignore_permissions=ignore_permissions
|
|
)
|
|
|
|
@frappe.whitelist()
|
|
def add_node():
|
|
args = make_tree_args(**frappe.form_dict)
|
|
doc = frappe.get_doc(args)
|
|
|
|
doc.save()
|
|
|
|
def make_tree_args(**kwarg):
|
|
kwarg.pop('cmd', None)
|
|
|
|
doctype = kwarg['doctype']
|
|
parent_field = 'parent_' + doctype.lower().replace(' ', '_')
|
|
|
|
if kwarg['is_root'] == 'false': kwarg['is_root'] = False
|
|
if kwarg['is_root'] == 'true': kwarg['is_root'] = True
|
|
|
|
kwarg.update({
|
|
parent_field: kwarg.get("parent") or kwarg.get(parent_field)
|
|
})
|
|
|
|
return frappe._dict(kwarg)
|