158 lines
4.5 KiB
Python
158 lines
4.5 KiB
Python
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
|
# MIT License. See license.txt
|
|
|
|
from __future__ import unicode_literals
|
|
import frappe, json
|
|
import frappe.desk.form.meta
|
|
import frappe.desk.form.load
|
|
|
|
from frappe import _
|
|
|
|
@frappe.whitelist()
|
|
def remove_attach():
|
|
"""remove attachment"""
|
|
import frappe.utils.file_manager
|
|
fid = frappe.form_dict.get('fid')
|
|
return frappe.utils.file_manager.remove_file(fid)
|
|
|
|
@frappe.whitelist()
|
|
def get_fields():
|
|
"""get fields"""
|
|
r = {}
|
|
args = {
|
|
'select':frappe.form_dict.get('select')
|
|
,'from':frappe.form_dict.get('from')
|
|
,'where':frappe.form_dict.get('where')
|
|
}
|
|
ret = frappe.db.sql("select %(select)s from `%(from)s` where %(where)s limit 1" % args)
|
|
if ret:
|
|
fl, i = frappe.form_dict.get('fields').split(','), 0
|
|
for f in fl:
|
|
r[f], i = ret[0][i], i+1
|
|
frappe.response['message']=r
|
|
|
|
@frappe.whitelist()
|
|
def validate_link():
|
|
"""validate link when updated by user"""
|
|
import frappe
|
|
import frappe.utils
|
|
|
|
value, options, fetch = frappe.form_dict.get('value'), frappe.form_dict.get('options'), frappe.form_dict.get('fetch')
|
|
|
|
# no options, don't validate
|
|
if not options or options=='null' or options=='undefined':
|
|
frappe.response['message'] = 'Ok'
|
|
return
|
|
|
|
if frappe.db.sql("select name from `tab%s` where name=%s" % (options, '%s'), (value,)):
|
|
|
|
# get fetch values
|
|
if fetch:
|
|
# escape with "`"
|
|
fetch = ", ".join(("`{0}`".format(f.strip()) for f in fetch.split(",")))
|
|
|
|
frappe.response['fetch_values'] = [frappe.utils.parse_val(c) \
|
|
for c in frappe.db.sql("select %s from `tab%s` where name=%s" \
|
|
% (fetch, options, '%s'), (value,))[0]]
|
|
|
|
frappe.response['message'] = 'Ok'
|
|
|
|
@frappe.whitelist()
|
|
def add_comment(doc):
|
|
"""allow any logged user to post a comment"""
|
|
doc = frappe.get_doc(json.loads(doc))
|
|
|
|
if doc.doctype != "Comment":
|
|
frappe.throw(_("This method can only be used to create a Comment"), frappe.PermissionError)
|
|
|
|
doc.insert(ignore_permissions = True)
|
|
|
|
return doc.as_dict()
|
|
|
|
@frappe.whitelist()
|
|
def get_next(doctype, value, prev, filters=None, order_by="modified desc"):
|
|
import frappe.desk.reportview
|
|
|
|
prev = not int(prev)
|
|
sort_field, sort_order = order_by.split(" ")
|
|
|
|
if not filters: filters = []
|
|
if isinstance(filters, basestring):
|
|
filters = json.loads(filters)
|
|
|
|
# condition based on sort order
|
|
condition = ">" if sort_order.lower()=="desc" else "<"
|
|
|
|
# switch the condition
|
|
if prev:
|
|
condition = "<" if condition==">" else "<"
|
|
else:
|
|
sort_order = "asc" if sort_order.lower()=="desc" else "desc"
|
|
|
|
# add condition for next or prev item
|
|
if not order_by[0] in [f[1] for f in filters]:
|
|
filters.append([doctype, sort_field, condition, value])
|
|
|
|
res = frappe.desk.reportview.execute(doctype,
|
|
fields = ["name"],
|
|
filters = filters,
|
|
order_by = sort_field + " " + sort_order,
|
|
limit_start=0, limit_page_length=1, as_list=True)
|
|
|
|
if not res:
|
|
frappe.msgprint(_("No further records"))
|
|
return None
|
|
else:
|
|
return res[0][0]
|
|
|
|
@frappe.whitelist()
|
|
def get_linked_docs(doctype, name, metadata_loaded=None, no_metadata=False):
|
|
if not metadata_loaded: metadata_loaded = []
|
|
meta = frappe.desk.form.meta.get_meta(doctype)
|
|
linkinfo = meta.get("__linked_with")
|
|
results = {}
|
|
|
|
if not linkinfo:
|
|
return results
|
|
|
|
me = frappe.db.get_value(doctype, name, ["parenttype", "parent"], as_dict=True)
|
|
for dt, link in linkinfo.items():
|
|
link["doctype"] = dt
|
|
link_meta_bundle = frappe.desk.form.load.get_meta_bundle(dt)
|
|
linkmeta = link_meta_bundle[0]
|
|
if not linkmeta.get("issingle"):
|
|
fields = [d.fieldname for d in linkmeta.get("fields", {"in_list_view":1,
|
|
"fieldtype": ["not in", ["Image", "HTML", "Button", "Table"]]})] \
|
|
+ ["name", "modified", "docstatus"]
|
|
|
|
fields = ["`tab{dt}`.`{fn}`".format(dt=dt, fn=sf.strip()) for sf in fields if sf]
|
|
|
|
try:
|
|
if link.get("get_parent"):
|
|
if me and me.parent and me.parenttype == dt:
|
|
ret = frappe.get_list(doctype=dt, fields=fields,
|
|
filters=[[dt, "name", '=', me.parent]])
|
|
else:
|
|
ret = None
|
|
|
|
elif link.get("child_doctype"):
|
|
ret = frappe.get_list(doctype=dt, fields=fields,
|
|
filters=[[link.get('child_doctype'), link.get("fieldname"), '=', name]])
|
|
|
|
else:
|
|
ret = frappe.get_list(doctype=dt, fields=fields,
|
|
filters=[[dt, link.get("fieldname"), '=', name]])
|
|
|
|
except frappe.PermissionError:
|
|
if frappe.local.message_log:
|
|
frappe.local.message_log.pop()
|
|
|
|
continue
|
|
|
|
if ret:
|
|
results[dt] = ret
|
|
|
|
if not no_metadata and not dt in metadata_loaded:
|
|
frappe.local.response.docs.extend(link_meta_bundle)
|
|
|
|
return results
|