You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

140 lines
4.0 KiB

  1. # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
  2. # MIT License. See license.txt
  3. from __future__ import unicode_literals
  4. import frappe, json
  5. import frappe.widgets.form.meta
  6. import frappe.widgets.form.load
  7. from frappe import _
  8. @frappe.whitelist()
  9. def remove_attach():
  10. """remove attachment"""
  11. import frappe.utils.file_manager
  12. fid = frappe.form_dict.get('fid')
  13. return frappe.utils.file_manager.remove_file(fid)
  14. @frappe.whitelist()
  15. def get_fields():
  16. """get fields"""
  17. r = {}
  18. args = {
  19. 'select':frappe.form_dict.get('select')
  20. ,'from':frappe.form_dict.get('from')
  21. ,'where':frappe.form_dict.get('where')
  22. }
  23. ret = frappe.db.sql("select %(select)s from `%(from)s` where %(where)s limit 1" % args)
  24. if ret:
  25. fl, i = frappe.form_dict.get('fields').split(','), 0
  26. for f in fl:
  27. r[f], i = ret[0][i], i+1
  28. frappe.response['message']=r
  29. @frappe.whitelist()
  30. def validate_link():
  31. """validate link when updated by user"""
  32. import frappe
  33. import frappe.utils
  34. value, options, fetch = frappe.form_dict.get('value'), frappe.form_dict.get('options'), frappe.form_dict.get('fetch')
  35. # no options, don't validate
  36. if not options or options=='null' or options=='undefined':
  37. frappe.response['message'] = 'Ok'
  38. return
  39. if frappe.db.sql("select name from `tab%s` where name=%s" % (options, '%s'), (value,)):
  40. # get fetch values
  41. if fetch:
  42. # escape with "`"
  43. fetch = ", ".join(("`{0}`".format(f.strip()) for f in fetch.split(",")))
  44. frappe.response['fetch_values'] = [frappe.utils.parse_val(c) \
  45. for c in frappe.db.sql("select %s from `tab%s` where name=%s" \
  46. % (fetch, options, '%s'), (value,))[0]]
  47. frappe.response['message'] = 'Ok'
  48. @frappe.whitelist()
  49. def add_comment(doc):
  50. """allow any logged user to post a comment"""
  51. doc = frappe.get_doc(json.loads(doc))
  52. doc.insert(ignore_permissions = True)
  53. return doc.as_dict()
  54. @frappe.whitelist()
  55. def get_next(doctype, value, prev, filters=None, order_by="modified desc"):
  56. import frappe.widgets.reportview
  57. prev = not int(prev)
  58. sort_field, sort_order = order_by.split(" ")
  59. if not filters: filters = []
  60. if isinstance(filters, basestring):
  61. filters = json.loads(filters)
  62. # condition based on sort order
  63. condition = ">" if sort_order.lower()=="desc" else "<"
  64. # switch the condition
  65. if prev:
  66. condition = "<" if condition==">" else "<"
  67. else:
  68. sort_order = "asc" if sort_order.lower()=="desc" else "desc"
  69. # add condition for next or prev item
  70. if not order_by[0] in [f[1] for f in filters]:
  71. filters.append([doctype, sort_field, condition, value])
  72. res = frappe.widgets.reportview.execute(doctype,
  73. fields = ["name"],
  74. filters = filters,
  75. order_by = sort_field + " " + sort_order,
  76. limit_start=0, limit_page_length=1, as_list=True)
  77. if not res:
  78. frappe.msgprint(_("No further records"))
  79. return None
  80. else:
  81. return res[0][0]
  82. @frappe.whitelist()
  83. def get_linked_docs(doctype, name, metadata_loaded=None, no_metadata=False):
  84. if not metadata_loaded: metadata_loaded = []
  85. meta = frappe.widgets.form.meta.get_meta(doctype)
  86. linkinfo = meta.get("__linked_with")
  87. results = {}
  88. for dt, link in linkinfo.items():
  89. link["doctype"] = dt
  90. link_meta_bundle = frappe.widgets.form.load.get_meta_bundle(dt)
  91. linkmeta = link_meta_bundle[0]
  92. if not linkmeta.get("issingle"):
  93. fields = [d.fieldname for d in linkmeta.get("fields", {"in_list_view":1,
  94. "fieldtype": ["not in", ["Image", "HTML", "Button", "Table"]]})] \
  95. + ["name", "modified", "docstatus"]
  96. fields = ["`tab{dt}`.`{fn}`".format(dt=dt, fn=sf.strip()) for sf in fields if sf]
  97. try:
  98. if link.get("child_doctype"):
  99. ret = frappe.get_list(doctype=dt, fields=fields,
  100. filters=[[link.get('child_doctype'), link.get("fieldname"), '=', name]])
  101. else:
  102. ret = frappe.get_list(doctype=dt, fields=fields,
  103. filters=[[dt, link.get("fieldname"), '=', name]])
  104. except frappe.PermissionError:
  105. continue
  106. if ret:
  107. results[dt] = ret
  108. if not no_metadata and not dt in metadata_loaded:
  109. frappe.local.response.docs.extend(link_meta_bundle)
  110. return results