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.
 
 
 
 
 
 

146 lines
3.6 KiB

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