Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

11 лет назад
13 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
13 лет назад
11 лет назад
11 лет назад
13 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
13 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
12 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
11 лет назад
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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