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.
 
 
 
 
 
 

188 line
4.1 KiB

  1. // Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
  2. // MIT License. See license.txt
  3. // My HTTP Request
  4. wn.provide('wn.request');
  5. wn.request.url = '/';
  6. // generic server call (call page, object)
  7. wn.call = function(opts) {
  8. var args = $.extend({}, opts.args);
  9. // cmd
  10. if(opts.module && opts.page) {
  11. args.cmd = opts.module+'.page.'+opts.page+'.'+opts.page+'.'+opts.method;
  12. } else if(opts.doc) {
  13. $.extend(args, {
  14. cmd: "runserverobj",
  15. docs: wn.model.compress(wn.model.get_doclist(opts.doc.doctype,
  16. opts.doc.name)),
  17. method: opts.method,
  18. args: opts.args,
  19. });
  20. } else if(opts.method) {
  21. args.cmd = opts.method;
  22. }
  23. // stringify args if required
  24. for(key in args) {
  25. if(args[key] && typeof args[key] != 'string') {
  26. args[key] = JSON.stringify(args[key]);
  27. }
  28. }
  29. return wn.request.call({
  30. type: opts.type || "POST",
  31. args: args,
  32. success: opts.callback,
  33. error: opts.error,
  34. btn: opts.btn,
  35. freeze: opts.freeze,
  36. show_spinner: !opts.no_spinner,
  37. progress_bar: opts.progress_bar,
  38. async: opts.async
  39. });
  40. }
  41. wn.request.call = function(opts) {
  42. wn.request.prepare(opts);
  43. // all requests will be post, set _type as POST for commit
  44. opts.args._type = opts.type;
  45. var ajax_args = {
  46. url: opts.url || wn.request.url,
  47. data: opts.args,
  48. type: 'POST',
  49. dataType: opts.dataType || 'json',
  50. success: function(r, xhr) {
  51. wn.request.cleanup(opts, r);
  52. opts.success && opts.success(r, xhr.responseText);
  53. },
  54. error: function(xhr, textStatus) {
  55. wn.request.cleanup(opts, {});
  56. show_alert(wn._("Unable to complete request: ") + textStatus)
  57. opts.error && opts.error(xhr)
  58. },
  59. async: opts.async
  60. };
  61. wn.last_request = ajax_args.data;
  62. if(opts.progress_bar) {
  63. var interval = null;
  64. $.extend(ajax_args, {
  65. xhr: function() {
  66. var xhr = jQuery.ajaxSettings.xhr();
  67. interval = setInterval(function() {
  68. if(xhr.readyState > 2) {
  69. var total = parseInt(xhr.getResponseHeader('Original-Length') || 0) ||
  70. parseInt(xhr.getResponseHeader('Content-Length'));
  71. var completed = parseInt(xhr.responseText.length);
  72. var percent = (100.0 / total * completed).toFixed(2);
  73. opts.progress_bar.css('width', (percent < 10 ? 10 : percent) + '%');
  74. }
  75. }, 50);
  76. wn.last_xhr = xhr;
  77. return xhr;
  78. },
  79. complete: function() {
  80. opts.progress_bar.css('width', '100%');
  81. clearInterval(interval);
  82. }
  83. })
  84. }
  85. return $.ajax(ajax_args);
  86. }
  87. // call execute serverside request
  88. wn.request.prepare = function(opts) {
  89. // btn indicator
  90. if(opts.btn) $(opts.btn).set_working();
  91. // navbar indicator
  92. if(opts.show_spinner) wn.set_loading();
  93. // freeze page
  94. if(opts.freeze) wn.dom.freeze();
  95. // no cmd?
  96. if(!opts.args.cmd) {
  97. console.log(opts)
  98. throw "Incomplete Request";
  99. }
  100. }
  101. wn.request.cleanup = function(opts, r) {
  102. // stop button indicator
  103. if(opts.btn) $(opts.btn).done_working();
  104. // hide button indicator
  105. if(opts.show_spinner) wn.done_loading();
  106. // un-freeze page
  107. if(opts.freeze) wn.dom.unfreeze();
  108. // session expired? - Guest has no business here!
  109. if(r.session_expired || wn.get_cookie("sid")==="Guest") {
  110. if(!wn.app.logged_out) {
  111. msgprint(wn._('Session Expired. Logging you out'));
  112. wn.app.logout();
  113. }
  114. return;
  115. }
  116. // show messages
  117. if(r._server_messages) {
  118. r._server_messages = JSON.parse(r._server_messages)
  119. msgprint(r._server_messages);
  120. }
  121. // show errors
  122. if(r.exc) {
  123. r.exc = JSON.parse(r.exc);
  124. if(r.exc instanceof Array) {
  125. $.each(r.exc, function(i, v) {
  126. if(v)console.log(v);
  127. })
  128. } else {
  129. console.log(r.exc);
  130. }
  131. };
  132. // debug messages
  133. if(r._debug_messages) {
  134. console.log("-")
  135. console.log("-")
  136. console.log("-")
  137. if(opts.args) {
  138. console.log("<<<< arguments ");
  139. console.log(opts.args);
  140. console.log(">>>>")
  141. }
  142. $.each(JSON.parse(r._debug_messages), function(i, v) { console.log(v); });
  143. console.log("<<<< response");
  144. delete r._debug_messages;
  145. console.log(r);
  146. console.log(">>>>")
  147. console.log("-")
  148. console.log("-")
  149. console.log("-")
  150. }
  151. if(r['403']) {
  152. wn.show_not_permitted(wn.get_route_str());
  153. }
  154. if(r.docs) {
  155. r.docs = wn.model.sync(r);
  156. }
  157. if(r.__messages) {
  158. $.extend(wn._messages, r.__messages);
  159. }
  160. wn.last_response = r;
  161. }