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.

12 年之前
12 年之前
12 年之前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. // Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
  2. // MIT License. See license.txt
  3. wn.provide("wn.perm");
  4. var READ = 0, WRITE = 1, CREATE = 2;
  5. var SUBMIT = 3, CANCEL = 4, AMEND = 5;
  6. $.extend(wn.perm, {
  7. doctype_perm: {},
  8. has_perm: function(doctype, level, type) {
  9. if(!level) level = 0;
  10. var perms = wn.perm.doctype_perm;
  11. if(!perms[doctype])
  12. perms[doctype] = wn.perm.get_perm(doctype);
  13. if(!perms[doctype])
  14. return false;
  15. if(!perms[doctype][level])
  16. return false;
  17. return perms[doctype][level][type];
  18. },
  19. get_perm: function(doctype, dn) {
  20. var perm = [[0,0],];
  21. if(in_list(user_roles, 'Administrator'))
  22. perm[0][READ] = 1;
  23. if(locals["DocType"][doctype] && locals["DocType"][doctype].istable) {
  24. parent_df = wn.model.get("DocField", {fieldtype:"Table", options:doctype});
  25. if(parent_df.length) {
  26. dn = locals[doctype][dn].parent;
  27. doctype = parent_df[0].parent;
  28. }
  29. }
  30. $.each(wn.model.get("DocPerm", {parent:doctype}), function(i, p) {
  31. var pl = cint(p.permlevel?p.permlevel:0);
  32. // if user role
  33. if(in_list(user_roles, p.role)) {
  34. // if field match
  35. if(wn.perm.check_match(p, doctype, dn)) { // new style
  36. if(!perm[pl])
  37. perm[pl] = [];
  38. if(!perm[pl][READ]) {
  39. if(cint(p.read)) perm[pl][READ]=1; else perm[pl][READ]=0;
  40. }
  41. if(!perm[pl][WRITE]) {
  42. if(cint(p.write)) { perm[pl][WRITE]=1; perm[pl][READ]=1; }
  43. else perm[pl][WRITE]=0;
  44. }
  45. if(!perm[pl][CREATE]) {
  46. if(cint(p.create))perm[pl][CREATE]=1; else perm[pl][CREATE]=0;
  47. }
  48. if(!perm[pl][SUBMIT]) {
  49. if(cint(p.submit))perm[pl][SUBMIT]=1; else perm[pl][SUBMIT]=0;
  50. }
  51. if(!perm[pl][CANCEL]) {
  52. if(cint(p.cancel))perm[pl][CANCEL]=1; else perm[pl][CANCEL]=0;
  53. }
  54. if(!perm[pl][AMEND]) {
  55. if(cint(p.amend)) perm[pl][AMEND]=1; else perm[pl][AMEND]=0;
  56. }
  57. }
  58. }
  59. });
  60. return perm;
  61. },
  62. get_match_rule: function(doctype) {
  63. var match_rules = {};
  64. var match = true;
  65. $.each(wn.model.get("DocPerm", {parent:doctype}), function(i, p) {
  66. if(p.permlevel==0 && in_list(user_roles, p.role)) {
  67. if(p.match) {
  68. match_keys = wn.perm.get_match_keys(p.match);
  69. match_rules[match_keys[0]] = wn.defaults.get_user_defaults(match_keys[1]);
  70. } else {
  71. match = false;
  72. }
  73. }
  74. });
  75. return match ? match_rules : {};
  76. },
  77. get_match_keys: function(match) {
  78. if(match.indexOf(":")!=-1) {
  79. key_list = match.split(":");
  80. } else {
  81. key_list = [match, match];
  82. }
  83. return key_list;
  84. },
  85. check_match: function(p, doctype, name) {
  86. if(!name) return true;
  87. var out =false;
  88. if(p.match) {
  89. var key_list = wn.perm.get_match_keys(p.match);
  90. var document_key = key_list[0];
  91. var default_key = key_list[1];
  92. var match_values = wn.defaults.get_user_defaults(default_key);
  93. if(match_values) {
  94. for(var i=0 ; i<match_values.length;i++) {
  95. // user must have match field in defaults
  96. if(match_values[i]==locals[doctype][name][document_key]) {
  97. // must match document
  98. return true;
  99. }
  100. }
  101. return false;
  102. } else if(!locals[doctype][name][document_key]) { // blanks are true
  103. return true;
  104. } else {
  105. return false;
  106. }
  107. } else {
  108. return true;
  109. }
  110. },
  111. get_field_display_status: function(df, doc, perm, explain) {
  112. if(!doc) return "Write"
  113. if(!df.permlevel) df.permlevel = 0;
  114. perm = perm || wn.perm.get_perm(doc.doctype, doc.name);
  115. var p = perm[df.permlevel],
  116. ret = null;
  117. // permission level
  118. if(p && p[WRITE] && !df.disabled)
  119. ret='Write';
  120. else if(p && p[READ])
  121. ret='Read';
  122. else
  123. ret='None';
  124. if(explain) console.log("By Permission:" + ret)
  125. // hidden
  126. if(cint(df.hidden)) {
  127. ret = 'None';
  128. }
  129. if(explain) console.log("By Hidden:" + ret)
  130. // hidden due to dependency
  131. if(ret!=='None' && df.hidden_due_to_dependency)
  132. ret = 'None';
  133. if(explain) console.log("By Hidden Due To Dependency:" + ret)
  134. // for submit
  135. if(ret=='Write' && cint(doc.docstatus) > 0) {
  136. ret = 'Read';
  137. }
  138. if(explain) console.log("By Submit:" + ret)
  139. // allow on submit
  140. var allow_on_submit = df.fieldtype!= "Table" ?
  141. cint(df.allow_on_submit) :
  142. 0;
  143. // if(allow_on_submit && doc.parent) {
  144. // parent_df = wn.model.get("DocField", {
  145. // "parent": doc.parenttype,
  146. // "fieldname": doc.parentfield
  147. // });
  148. // allow_on_submit = parent_df ?
  149. // parent_df[0].allow_on_submit :
  150. // 0;
  151. // }
  152. if(explain) console.log("Allow on Submit:" + allow_on_submit)
  153. if(ret=="Read" && allow_on_submit && cint(doc.docstatus)==1 &&
  154. perm[df.permlevel][WRITE]) {
  155. ret='Write';
  156. }
  157. if(explain) console.log("By Allow on Submt:" + ret)
  158. // workflow state
  159. if(ret=="Write" && cur_frm && cur_frm.state_fieldname) {
  160. if(cint(cur_frm.read_only)) {
  161. ret = 'Read';
  162. }
  163. // fields updated by workflow must be read-only
  164. if(in_list(cur_frm.states.update_fields, df.fieldname) ||
  165. df.fieldname==cur_frm.state_fieldname) {
  166. ret = 'Read';
  167. }
  168. }
  169. if(explain) console.log("By Workflow:" + ret)
  170. // make a field read_only if read_only
  171. // is checked (disregards write permission)
  172. if(ret=="Write" && cint(df.read_only)) {
  173. ret = "Read";
  174. }
  175. if(explain) console.log("By Read Only:" + ret)
  176. return ret;
  177. }
  178. });