seitime-frappe/frappe/desk/form/utils.py
Akash Tom 8b276237b9
fix: navigation api for explicit sorting (#37080)
* fix: navigation api for explicit sorting

* fix: add type annotations

* fix: dont ignore perms
2026-02-17 13:28:55 +05:30

127 lines
3.8 KiB
Python

# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# License: MIT. See LICENSE
import json
from typing import TYPE_CHECKING
import frappe
import frappe.desk.form.load
import frappe.desk.form.meta
from frappe import _
from frappe.core.doctype.file.utils import extract_images_from_html
from frappe.desk.form.document_follow import follow_document
if TYPE_CHECKING:
from frappe.core.doctype.comment.comment import Comment
@frappe.whitelist(methods=["DELETE", "POST"])
def remove_attach():
"""remove attachment"""
fid = frappe.form_dict.get("fid")
frappe.delete_doc("File", fid)
@frappe.whitelist(methods=["POST", "PUT"])
def add_comment(
reference_doctype: str, reference_name: str, content: str, comment_email: str, comment_by: str
) -> "Comment":
"""Allow logged user with permission to read document to add a comment"""
reference_doc = frappe.get_lazy_doc(reference_doctype, reference_name, check_permission=True)
comment = frappe.new_doc("Comment")
comment.update(
{
"comment_type": "Comment",
"reference_doctype": reference_doctype,
"reference_name": reference_name,
"comment_email": comment_email,
"comment_by": comment_by,
"content": extract_images_from_html(reference_doc, content, is_private=True),
}
)
comment.insert(ignore_permissions=True)
if frappe.get_cached_value("User", frappe.session.user, "follow_commented_documents"):
follow_document(comment.reference_doctype, comment.reference_name, frappe.session.user)
return comment
@frappe.whitelist()
def update_comment(name, content):
"""allow only owner to update comment"""
doc = frappe.get_doc("Comment", name)
if frappe.session.user not in ["Administrator", doc.owner]:
frappe.throw(_("Comment can only be edited by the owner"), frappe.PermissionError)
if doc.reference_doctype and doc.reference_name:
reference_doc = frappe.get_lazy_doc(doc.reference_doctype, doc.reference_name, check_permission=True)
doc.content = extract_images_from_html(reference_doc, content, is_private=True)
else:
doc.content = content
doc.save(ignore_permissions=True)
@frappe.whitelist()
def update_comment_publicity(name: str, publish: bool):
doc = frappe.get_doc("Comment", name)
if frappe.session.user != doc.owner and "System Manager" not in frappe.get_roles():
frappe.throw(_("Comment publicity can only be updated by the original author or a System Manager."))
doc.published = int(publish)
doc.save(ignore_permissions=True)
@frappe.whitelist()
def get_next(
doctype: str,
value: str,
prev: str | int,
filters: dict | str | None = None,
sort_order: str = "desc",
sort_field: str = "creation",
):
prev = int(prev)
if not filters:
filters = []
if isinstance(filters, str):
filters = json.loads(filters)
table = frappe.qb.DocType(doctype)
sort_column = table[sort_field]
name_column = table.name
current_sort_value = frappe.db.get_value(doctype, value, sort_field)
is_ascending = sort_order.lower() == "asc"
if prev == is_ascending:
composite_condition = (sort_column < current_sort_value) | (
(sort_column == current_sort_value) & (name_column < value)
)
order = frappe.qb.desc
else:
composite_condition = (sort_column > current_sort_value) | (
(sort_column == current_sort_value) & (name_column > value)
)
order = frappe.qb.asc
query = (
frappe.qb.get_query(doctype, filters=filters, fields=["name"], ignore_permissions=False)
.orderby(sort_column, order=order)
.orderby(name_column, order=order)
.where(composite_condition)
.limit(1)
)
if res := query.run(as_list=True):
return res[0][0]
frappe.msgprint(_("No further records"))
return None
def get_pdf_link(doctype, docname, print_format="Standard", no_letterhead=0):
return f"/api/method/frappe.utils.print_format.download_pdf?doctype={doctype}&name={docname}&format={print_format}&no_letterhead={no_letterhead}"