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.
 
 
 
 
 
 

113 regels
3.2 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 json
  5. import frappe
  6. import frappe.handler
  7. import frappe.client
  8. import frappe.widgets.reportview
  9. from frappe.utils.response import build_response
  10. from frappe import _
  11. def handle():
  12. """
  13. /api/method/{methodname} will call a whitelisted method
  14. /api/resource/{doctype} will query a table
  15. examples:
  16. ?fields=["name", "owner"]
  17. ?filters=[["Task", "name", "like", "%005"]]
  18. ?limit_start=0
  19. ?limit_page_length=20
  20. /api/resource/{doctype}/{name} will point to a resource
  21. GET will return doclist
  22. POST will insert
  23. PUT will update
  24. DELETE will delete
  25. /api/resource/{doctype}/{name}?run_method={method} will run a whitelisted controller method
  26. """
  27. parts = frappe.request.path[1:].split("/",3)
  28. call = doctype = name = None
  29. if len(parts) > 1:
  30. call = parts[1]
  31. if len(parts) > 2:
  32. doctype = parts[2]
  33. if len(parts) > 3:
  34. name = parts[3]
  35. if call=="method":
  36. frappe.local.form_dict.cmd = doctype
  37. return frappe.handler.handle()
  38. elif call=="resource":
  39. if "run_method" in frappe.local.form_dict:
  40. method = frappe.local.form_dict.pop("run_method")
  41. doc = frappe.get_doc(doctype, name)
  42. doc.is_whitelisted(method)
  43. if frappe.local.request.method=="GET":
  44. if not doc.has_permission("read"):
  45. frappe.throw(_("Not permitted"), frappe.PermissionError)
  46. doc.run_method(method, **frappe.local.form_dict)
  47. if frappe.local.request.method=="POST":
  48. if not doc.has_permission("write"):
  49. frappe.throw(_("Not permitted"), frappe.PermissionError)
  50. doc.run_method(method, **frappe.local.form_dict)
  51. frappe.db.commit()
  52. else:
  53. if name:
  54. if frappe.local.request.method=="GET":
  55. doc = frappe.get_doc(doctype, name)
  56. if not doc.has_permission("read"):
  57. raise frappe.PermissionError
  58. frappe.local.response.update({"data": doc})
  59. if frappe.local.request.method=="PUT":
  60. data = json.loads(frappe.local.form_dict.data)
  61. doc = frappe.get_doc(doctype, name)
  62. # Not checking permissions here because it's checked in doc.save
  63. doc.update(data)
  64. frappe.local.response.update({
  65. "data": doc.save().as_dict()
  66. })
  67. frappe.db.commit()
  68. if frappe.local.request.method=="DELETE":
  69. # Not checking permissions here because it's checked in delete_doc
  70. frappe.delete_doc(doctype, name)
  71. frappe.local.response.http_status_code = 202
  72. frappe.local.response.message = "ok"
  73. frappe.db.commit()
  74. elif doctype:
  75. if frappe.local.request.method=="GET":
  76. if frappe.local.form_dict.get('fields'):
  77. frappe.local.form_dict['fields'] = json.loads(frappe.local.form_dict['fields'])
  78. frappe.local.response.update({
  79. "data": frappe.call(frappe.widgets.reportview.execute,
  80. doctype, **frappe.local.form_dict)})
  81. if frappe.local.request.method=="POST":
  82. data = json.loads(frappe.local.form_dict.data)
  83. data.update({
  84. "doctype": doctype
  85. })
  86. frappe.local.response.update({
  87. "data": frappe.get_doc(data).insert().as_dict()
  88. })
  89. frappe.db.commit()
  90. else:
  91. raise frappe.DoesNotExistError
  92. else:
  93. raise frappe.DoesNotExistError
  94. return build_response("json")