# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # MIT License. See license.txt from __future__ import unicode_literals """Allow adding of likes to documents""" import frappe, json from frappe.model.db_schema import add_column from frappe import _ from frappe.utils import get_link_to_form @frappe.whitelist() def toggle_like(doctype, name, add=False): """Adds / removes the current user in the `__liked_by` property of the given document. If column does not exist, will add it in the database. The `_liked_by` property is always set from this function and is ignored if set via Document API :param doctype: DocType of the document to like :param name: Name of the document to like :param add: `Yes` if like is to be added. If not `Yes` the like will be removed.""" _toggle_like(doctype, name, add) def _toggle_like(doctype, name, add, user=None): """Same as toggle_like but hides param `user` from API""" if not user: user = frappe.session.user try: liked_by = frappe.db.get_value(doctype, name, "_liked_by") # CHANGED: Allow someone to like their own documents as it also works as a bookmark # if owner==frappe.session.user and add=="Yes": # frappe.throw(_("You cannot like something that you created")) if liked_by: liked_by = json.loads(liked_by) else: liked_by = [] if add=="Yes": if user not in liked_by: liked_by.append(user) add_comment(doctype, name) else: if user in liked_by: liked_by.remove(user) remove_like(doctype, name) frappe.db.set_value(doctype, name, "_liked_by", json.dumps(liked_by), update_modified=False) except Exception as e: if isinstance(e.args, (tuple, list)) and e.args and e.args[0]==1054: add_column(doctype, "_liked_by", "Text") _toggle_like(doctype, name, add, user) else: raise def remove_like(doctype, name): """Remove previous Like""" # remove Comment frappe.delete_doc("Communication", [c.name for c in frappe.get_all("Communication", filters={ "communication_type": "Comment", "reference_doctype": doctype, "reference_name": name, "owner": frappe.session.user, "comment_type": "Like" } )], ignore_permissions=True) def add_comment(doctype, name): doc = frappe.get_doc(doctype, name) if doctype=="Communication" and doc.reference_doctype and doc.reference_name: link = get_link_to_form(doc.reference_doctype, doc.reference_name, "{0} {1}".format(_(doc.reference_doctype), doc.reference_name)) doc.add_comment("Like", _("{0}: {1} in {2}").format(_(doc.communication_type), "" + doc.subject + "", link), link_doctype=doc.reference_doctype, link_name=doc.reference_name) else: doc.add_comment("Like", _("Liked"))