seitime-frappe/frappe/desk/like.py
Gavin D'souza 3446026555 chore: Update header: license.txt => LICENSE
The license.txt file has been replaced with LICENSE for quite a while
now. INAL but it didn't seem accurate to say "hey, checkout license.txt
although there's no such file". Apart from this, there were
inconsistencies in the headers altogether...this change brings
consistency.
2021-09-03 12:02:59 +05:30

83 lines
2.4 KiB
Python

# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# License: MIT. See LICENSE
"""Allow adding of likes to documents"""
import frappe, json
from frappe.database.schema import add_column
from frappe import _
from frappe.desk.form.document_follow import follow_document
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")
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)
follow_document(doctype, name, user)
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 frappe.db.ProgrammingError as e:
if frappe.db.is_column_missing(e):
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("Comment", [c.name for c in frappe.get_all("Comment",
filters={
"comment_type": "Like",
"reference_doctype": doctype,
"reference_name": name,
"owner": frappe.session.user,
}
)], 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),
"<b>" + doc.subject + "</b>", link),
link_doctype=doc.reference_doctype, link_name=doc.reference_name)
else:
doc.add_comment("Like", _("Liked"))