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.
 
 
 
 
 
 

143 line
3.5 KiB

  1. # Simple Web service client for wnframework (ERPNext)
  2. # License MIT
  3. #
  4. # Uses: requests (http://docs.python-requests.org/en/v1.0.0/)
  5. #
  6. # Usage:
  7. # 1. set the server settings, user, password in this file
  8. # 2. user the "insert", "update", "delete" methods to push data
  9. #
  10. # Help:
  11. # Data is sent as JSON objects called "doclist". A doclist is a list of records that represent one transaction (document)
  12. # in ERPNext, both parent (header) and child records.
  13. #
  14. # For what fields to set in the doclist, please check the table columns of the table you want to update
  15. import requests
  16. import unittest
  17. import json
  18. server = "http://localhost/webnotes/erpnext_master/public/server.py"
  19. user = "Administrator"
  20. password = "test"
  21. sid = None
  22. debug = True
  23. class AuthError(Exception): pass
  24. def login(usr=None, pwd=None):
  25. response = requests.get(server, params = {
  26. "cmd": "login",
  27. "usr": usr or user,
  28. "pwd": pwd or password
  29. })
  30. if response.json.get("message")=="Logged In":
  31. global sid
  32. sid = response.cookies["sid"]
  33. return response
  34. else:
  35. raise AuthError
  36. def insert(doclist):
  37. return post_request({
  38. "cmd": "webnotes.client.insert",
  39. "doclist": json.dumps(doclist)
  40. })
  41. def update(doclist):
  42. return post_request({
  43. "cmd": "webnotes.client.save",
  44. "doclist": json.dumps(doclist)
  45. })
  46. def delete(doctype, name):
  47. return post_request({
  48. "cmd": "webnotes.model.delete_doc",
  49. "doctype": doctype,
  50. "name": name
  51. })
  52. def submit(doclist):
  53. return post_request({
  54. "cmd": "webnotes.client.submit",
  55. "doclist": json.dumps(doclist)
  56. })
  57. def cancel(doctype, name):
  58. return post_request({
  59. "cmd": "webnotes.client.cancel",
  60. "doctype": doctype,
  61. "name": name
  62. })
  63. def get_doc(doctype, name=None, filters=None):
  64. params = {
  65. "cmd": "webnotes.client.get",
  66. "doctype": doctype,
  67. }
  68. if name:
  69. params["name"] = name
  70. if filters:
  71. params["filters"] = json.dumps(filters)
  72. ret = get_request(params)
  73. return ret
  74. def get_request(params):
  75. if not sid: login()
  76. response = requests.get(server, params = params, cookies = {"sid": sid})
  77. return post_process(response)
  78. def post_request(params):
  79. if not sid: login()
  80. response = requests.post(server, data = params, cookies = {"sid": sid})
  81. return post_process(response)
  82. def post_process(response):
  83. if debug and response.json and ("exc" in response.json) and response.json["exc"]:
  84. print response.json["exc"]
  85. return response
  86. class TestAPI(unittest.TestCase):
  87. def test_login(self):
  88. global sid
  89. response = login()
  90. self.assertTrue(response.json.get("message")=="Logged In")
  91. self.assertTrue(sid)
  92. self.assertRaises(AuthError, login, {"pwd":"--"})
  93. sid = None
  94. def test_all(self):
  95. login()
  96. delete("Customer", "Import Test Customer")
  97. response = insert([{
  98. "doctype":"Customer",
  99. "customer_name": "Import Test Customer",
  100. "customer_type": "Company",
  101. "customer_group": "Standard Group",
  102. "territory": "Default",
  103. "customer_details": "some unique info",
  104. "company": "Alpha"
  105. }])
  106. self.assertTrue(response.json["message"][0]["name"]=="Import Test Customer")
  107. # get
  108. response = get_doc("Customer", "Import Test Customer")
  109. self.check_get(response)
  110. response = get_doc("Customer", filters={"customer_details":"some unique info"})
  111. self.check_get(response)
  112. # delete
  113. self.assertTrue(delete("Customer", "Import Test Customer").json["message"]=="okay")
  114. def check_get(self, response):
  115. doclist = response.json["message"]
  116. self.assertTrue(len(doclist)==1)
  117. self.assertTrue(doclist[0]["doctype"]=="Customer")
  118. self.assertTrue(doclist[0]["customer_group"]=="Standard Group")
  119. if __name__=="__main__":
  120. unittest.main()