Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 
 
 

126 righe
3.4 KiB

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