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.
 
 
 
 
 
 

122 lines
3.1 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.utils
  7. import frappe.sessions
  8. import frappe.utils.file_manager
  9. import frappe.widgets.form.run_method
  10. from frappe.utils.response import build_response, report_error
  11. @frappe.whitelist(allow_guest=True)
  12. def startup():
  13. frappe.response.update(frappe.sessions.get())
  14. @frappe.whitelist()
  15. def runserverobj(arg=None):
  16. frappe.widgets.form.run_method.runserverobj()
  17. @frappe.whitelist(allow_guest=True)
  18. def logout():
  19. frappe.local.login_manager.logout()
  20. @frappe.whitelist(allow_guest=True)
  21. def web_logout():
  22. frappe.local.login_manager.logout()
  23. frappe.conn.commit()
  24. frappe.repsond_as_web_page("Logged Out", """<p>You have been logged out.</p>
  25. <p><a href='index'>Back to Home</a></p>""")
  26. @frappe.whitelist(allow_guest=True)
  27. def run_custom_method(doctype, name, custom_method):
  28. """cmd=run_custom_method&doctype={doctype}&name={name}&custom_method={custom_method}"""
  29. bean = frappe.bean(doctype, name)
  30. controller = bean.get_controller()
  31. if getattr(controller, custom_method, frappe._dict()).is_whitelisted:
  32. frappe.call(getattr(controller, custom_method), **frappe.local.form_dict)
  33. else:
  34. frappe.throw("Not Allowed")
  35. @frappe.whitelist()
  36. def uploadfile():
  37. try:
  38. if frappe.form_dict.get('from_form'):
  39. try:
  40. ret = frappe.utils.file_manager.upload()
  41. except frappe.DuplicateEntryError, e:
  42. # ignore pass
  43. ret = None
  44. frappe.conn.rollback()
  45. else:
  46. if frappe.form_dict.get('method'):
  47. ret = frappe.get_attr(frappe.form_dict.method)()
  48. except Exception, e:
  49. frappe.errprint(frappe.utils.get_traceback())
  50. ret = None
  51. return ret
  52. def handle():
  53. """handle request"""
  54. cmd = frappe.local.form_dict.cmd
  55. if cmd!='login':
  56. status_codes = {
  57. frappe.PermissionError: 403,
  58. frappe.AuthenticationError: 401,
  59. frappe.DoesNotExistError: 404,
  60. frappe.SessionStopped: 503,
  61. frappe.OutgoingEmailError: 501
  62. }
  63. try:
  64. execute_cmd(cmd)
  65. except Exception, e:
  66. report_error(status_codes.get(e.__class__, 500))
  67. else:
  68. if frappe.local.request.method in ("POST", "PUT") and frappe.conn:
  69. frappe.conn.commit()
  70. build_response()
  71. if frappe.conn:
  72. frappe.conn.close()
  73. if frappe._memc:
  74. frappe._memc.disconnect_all()
  75. def execute_cmd(cmd):
  76. """execute a request as python module"""
  77. method = get_attr(cmd)
  78. # check if whitelisted
  79. if frappe.session['user'] == 'Guest':
  80. if (method not in frappe.guest_methods):
  81. raise frappe.PermissionError('Not Allowed, %s' % str(method))
  82. else:
  83. if not method in frappe.whitelisted:
  84. frappe._response.status_code = 403
  85. frappe.msgprint('Not Allowed, %s' % str(method))
  86. raise frappe.PermissionError('Not Allowed, %s' % str(method))
  87. ret = frappe.call(method, **frappe.form_dict)
  88. # returns with a message
  89. if ret:
  90. frappe.response['message'] = ret
  91. # update session
  92. if "session_obj" in frappe.local:
  93. frappe.local.session_obj.update()
  94. def get_attr(cmd):
  95. """get method object from cmd"""
  96. if '.' in cmd:
  97. method = frappe.get_attr(cmd)
  98. else:
  99. method = globals()[cmd]
  100. frappe.log("method:" + cmd)
  101. return method