"""
Server side methods for the follower pattern (Follow button used in forms)
"""
import webnotes
form = webnotes.form_dict
#
# Follow
#
[docs]def follow(dt=None, dn=None, user=None, verbose=0):
"Add as follower to a particular record. If no parameteres, then take from the http request (form)"
if not dt:
dt, dn, user = form.get('dt'), form.get('dn'), form.get('user')
verbose = 1
if not user: return
if not is_follower(dt, dn, user):
make_follower(dt, dn, user, verbose)
else:
if verbose: webnotes.msgprint("%s is already a follower!" % user)
return load_followers(dt, dn)
[docs]def make_follower(dt, dn, user, verbose):
"Add the user as a follower"
if has_permission(dt, user):
from webnotes.model.doc import Document
d = Document('Follower')
d.doc_type = dt
d.doc_name = dn
d.owner = user
d.save(1)
else:
if verbose: webnotes.msgprint('%s does not have sufficient permission to follow' % user)
[docs]def has_permission(dt, user):
"Check to see if the user has permission to follow"
return webnotes.conn.sql("select name from tabDocPerm where parent=%s and ifnull(`read`,0)=1 and role in ('%s') limit 1" \
% ('%s', ("', '".join(webnotes.user.get_roles()))), dt)
[docs]def is_follower(dt, dn, user):
"returns true if given user is a follower"
return webnotes.conn.sql("""
select name from tabFollower
where ifnull(doc_type,'')=%s
and ifnull(doc_name,'')=%s
and owner=%s""", (dt, dn, user))
#
# Unfollow
#
[docs]def unfollow(dt=None, dn=None, user=None):
"Unfollow a particular record. If no parameteres, then take from the http request (form)"
if not dt:
dt, dn, user = form.get('dt'), form.get('dn'), form.get('user')
webnotes.conn.sql("delete from tabFollower where doc_name=%s and doc_type=%s and owner=%s", (dn, dt, user))
return load_followers(dt, dn)
#
# Load followers
#
[docs]def load_followers(dt=None, dn=None):
"returns list of followers (Full Names) for a particular object"
if not dt: dt, dn = form.get('dt'), form.get('dn')
try:
return [t[0] for t in webnotes.conn.sql("""
SELECT IFNULL(CONCAT(t1.first_name, if(t1.first_name IS NULL, '', ' '), t1.last_name), t1.name)
FROM tabProfile t1, tabFollower t2 WHERE t2.doc_type=%s AND t2.doc_name=%s
AND t1.name = t2.owner""", (dt, dn))]
except Exception, e:
if e.args[0] in (1146, 1054):
setup()
return []
else:
raise e
#
# Email followers
#
[docs]def email_followers(dt, dn, msg_html=None, msg_text=None):
"Send an email to all followers of this object"
pass
#
# Update feed
#
[docs]def on_docsave(doc):
"Add the owner and all linked Profiles as followers"
follow(doc.doctype, doc.name, doc.owner)
for p in get_profile_fields(doc.doctype):
follow(doc.doctype, doc.name, doc.fields.get(p))
update_followers(doc = doc)
#
# update the follower record timestamp and subject
#
[docs]def update_followers(dt=None, dn=None, subject=None, update_by=None, doc=None):
"Updates the timestamp and subject in follower table (for feed generation)"
from webnotes.utils import now
webnotes.conn.sql("update tabFollower set modified=%s, subject=%s, modified_by=%s where doc_type=%s and doc_name=%s", \
(now(),
subject or doc.fields.get('subject'), \
update_by or webnotes.session['user'],\
dt or doc.doctype,
dn or doc.name))
#
# get type of "Profile" fields
#
[docs]def get_profile_fields(dt):
"returns a list of all profile link fields from the doctype"
return [f[0] for f in \
webnotes.conn.sql("select fieldname from tabDocField where parent=%s and fieldtype='Link' and options='Profile'", dt)]
#
# setup - make followers table
#
[docs]def setup():
"Make table for followers - if missing"
webnotes.conn.commit()
from webnotes.modules.module_manager import reload_doc
reload_doc('core', 'doctype', 'follower')
webnotes.conn.begin()