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.
 
 
 
 
 
 

135 rivejä
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()