您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

135 行
3.7 KiB

  1. """
  2. Server side methods for the follower pattern (Follow button used in forms)
  3. """
  4. import webnotes
  5. form = webnotes.form_dict
  6. #
  7. # Follow
  8. #
  9. def follow(dt=None, dn=None, user=None, verbose=0):
  10. "Add as follower to a particular record. If no parameteres, then take from the http request (form)"
  11. if not dt:
  12. dt, dn, user = form.get('dt'), form.get('dn'), form.get('user')
  13. verbose = 1
  14. if not user: return
  15. if not is_follower(dt, dn, user):
  16. make_follower(dt, dn, user, verbose)
  17. else:
  18. if verbose: webnotes.msgprint("%s is already a follower!" % user)
  19. return load_followers(dt, dn)
  20. def make_follower(dt, dn, user, verbose):
  21. "Add the user as a follower"
  22. if has_permission(dt, user):
  23. from webnotes.model.doc import Document
  24. d = Document('Follower')
  25. d.doc_type = dt
  26. d.doc_name = dn
  27. d.owner = user
  28. d.save(1)
  29. else:
  30. if verbose: webnotes.msgprint('%s does not have sufficient permission to follow' % user)
  31. def has_permission(dt, user):
  32. "Check to see if the user has permission to follow"
  33. return webnotes.conn.sql("select name from tabDocPerm where parent=%s and ifnull(`read`,0)=1 and role in ('%s') limit 1" \
  34. % ('%s', ("', '".join(webnotes.user.get_roles()))), dt)
  35. def is_follower(dt, dn, user):
  36. "returns true if given user is a follower"
  37. return webnotes.conn.sql("""
  38. select name from tabFollower
  39. where ifnull(doc_type,'')=%s
  40. and ifnull(doc_name,'')=%s
  41. and owner=%s""", (dt, dn, user))
  42. #
  43. # Unfollow
  44. #
  45. def unfollow(dt=None, dn=None, user=None):
  46. "Unfollow a particular record. If no parameteres, then take from the http request (form)"
  47. if not dt:
  48. dt, dn, user = form.get('dt'), form.get('dn'), form.get('user')
  49. webnotes.conn.sql("delete from tabFollower where doc_name=%s and doc_type=%s and owner=%s", (dn, dt, user))
  50. return load_followers(dt, dn)
  51. #
  52. # Load followers
  53. #
  54. def load_followers(dt=None, dn=None):
  55. "returns list of followers (Full Names) for a particular object"
  56. if not dt: dt, dn = form.get('dt'), form.get('dn')
  57. try:
  58. return [t[0] for t in webnotes.conn.sql("""
  59. SELECT IFNULL(CONCAT(t1.first_name, if(t1.first_name IS NULL, '', ' '), t1.last_name), t1.name)
  60. FROM tabProfile t1, tabFollower t2 WHERE t2.doc_type=%s AND t2.doc_name=%s
  61. AND t1.name = t2.owner""", (dt, dn))]
  62. except Exception, e:
  63. if e.args[0] in (1146, 1054):
  64. setup()
  65. return []
  66. else:
  67. raise e
  68. #
  69. # Email followers
  70. #
  71. def email_followers(dt, dn, msg_html=None, msg_text=None):
  72. "Send an email to all followers of this object"
  73. pass
  74. #
  75. # Update feed
  76. #
  77. def on_docsave(doc):
  78. "Add the owner and all linked Profiles as followers"
  79. follow(doc.doctype, doc.name, doc.owner)
  80. for p in get_profile_fields(doc.doctype):
  81. follow(doc.doctype, doc.name, doc.fields.get(p))
  82. update_followers(doc = doc)
  83. #
  84. # update the follower record timestamp and subject
  85. #
  86. def update_followers(dt=None, dn=None, subject=None, update_by=None, doc=None):
  87. "Updates the timestamp and subject in follower table (for feed generation)"
  88. from webnotes.utils import now
  89. webnotes.conn.sql("update tabFollower set modified=%s, subject=%s, modified_by=%s where doc_type=%s and doc_name=%s", \
  90. (now(),
  91. subject or doc.fields.get('subject'), \
  92. update_by or webnotes.session['user'],\
  93. dt or doc.doctype,
  94. dn or doc.name))
  95. #
  96. # get type of "Profile" fields
  97. #
  98. def get_profile_fields(dt):
  99. "returns a list of all profile link fields from the doctype"
  100. return [f[0] for f in \
  101. webnotes.conn.sql("select fieldname from tabDocField where parent=%s and fieldtype='Link' and options='Profile'", dt)]
  102. #
  103. # setup - make followers table
  104. #
  105. def setup():
  106. "Make table for followers - if missing"
  107. webnotes.conn.commit()
  108. from webnotes.modules.module_manager import reload_doc
  109. reload_doc('core', 'doctype', 'follower')
  110. webnotes.conn.begin()