From 2a84b18d13afb2cf3491db318f23cf0ad1a0d028 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Mon, 23 Jan 2023 18:59:16 +0100 Subject: [PATCH] feat: load address and contact display - Handle missing permissions - Split into smaller functions --- frappe/contacts/address_and_contact.py | 70 ++-------------------- frappe/contacts/doctype/address/address.py | 20 +++++++ frappe/contacts/doctype/contact/contact.py | 42 +++++++++++++ 3 files changed, 67 insertions(+), 65 deletions(-) diff --git a/frappe/contacts/address_and_contact.py b/frappe/contacts/address_and_contact.py index 4df32c6705..dc866a8d94 100644 --- a/frappe/contacts/address_and_contact.py +++ b/frappe/contacts/address_and_contact.py @@ -1,77 +1,17 @@ # Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and Contributors # License: MIT. See LICENSE -import functools -import re - import frappe from frappe import _ -def load_address_and_contact(doc, key=None): +def load_address_and_contact(doc, key=None) -> None: """Loads address list and contact list in `__onload`""" - from frappe.contacts.doctype.address.address import get_address_display, get_condensed_address + from frappe.contacts.doctype.address.address import get_address_display_list + from frappe.contacts.doctype.contact.contact import get_contact_display_list - filters = [ - ["Dynamic Link", "link_doctype", "=", doc.doctype], - ["Dynamic Link", "link_name", "=", doc.name], - ["Dynamic Link", "parenttype", "=", "Address"], - ] - address_list = frappe.get_list("Address", filters=filters, fields=["*"], order_by="creation asc") - - address_list = [a.update({"display": get_address_display(a)}) for a in address_list] - - address_list = sorted( - address_list, - key=functools.cmp_to_key( - lambda a, b: (int(a.is_primary_address - b.is_primary_address)) - or (1 if a.modified - b.modified else 0) - ), - reverse=True, - ) - - doc.set_onload("addr_list", address_list) - - contact_list = [] - filters = [ - ["Dynamic Link", "link_doctype", "=", doc.doctype], - ["Dynamic Link", "link_name", "=", doc.name], - ["Dynamic Link", "parenttype", "=", "Contact"], - ] - contact_list = frappe.get_list("Contact", filters=filters, fields=["*"]) - - for contact in contact_list: - contact["email_ids"] = frappe.get_all( - "Contact Email", - filters={"parenttype": "Contact", "parent": contact.name, "is_primary": 0}, - fields=["email_id"], - ) - - contact["phone_nos"] = frappe.get_all( - "Contact Phone", - filters={ - "parenttype": "Contact", - "parent": contact.name, - "is_primary_phone": 0, - "is_primary_mobile_no": 0, - }, - fields=["phone"], - ) - - if contact.address: - address = frappe.get_doc("Address", contact.address) - contact["address"] = get_condensed_address(address) - - contact_list = sorted( - contact_list, - key=functools.cmp_to_key( - lambda a, b: (int(a.is_primary_contact - b.is_primary_contact)) - or (1 if a.modified - b.modified else 0) - ), - reverse=True, - ) - - doc.set_onload("contact_list", contact_list) + doc.set_onload("addr_list", get_address_display_list(doc.doctype, doc.name)) + doc.set_onload("contact_list", get_contact_display_list(doc.doctype, doc.name)) def has_permission(doc, ptype, user): diff --git a/frappe/contacts/doctype/address/address.py b/frappe/contacts/doctype/address/address.py index 5fe22eb7f2..70324d1c22 100644 --- a/frappe/contacts/doctype/address/address.py +++ b/frappe/contacts/doctype/address/address.py @@ -289,3 +289,23 @@ def get_condensed_address(doc): def update_preferred_address(address, field): frappe.db.set_value("Address", address, field, 0) + + +def get_address_display_list(doctype: str, name: str) -> list[dict]: + if not frappe.has_permission("Address", "read"): + return [] + + address_list = frappe.get_list( + "Address", + filters=[ + ["Dynamic Link", "link_doctype", "=", doctype], + ["Dynamic Link", "link_name", "=", name], + ["Dynamic Link", "parenttype", "=", "Address"], + ], + fields=["*"], + order_by="is_primary_address DESC, creation ASC", + ) + for a in address_list: + a["display"] = get_address_display(a) + + return address_list diff --git a/frappe/contacts/doctype/contact/contact.py b/frappe/contacts/doctype/contact/contact.py index e7d250148b..e58a5a2b7a 100644 --- a/frappe/contacts/doctype/contact/contact.py +++ b/frappe/contacts/doctype/contact/contact.py @@ -341,3 +341,45 @@ def get_full_name( full_name = company return full_name + + +def get_contact_display_list(doctype: str, name: str) -> list[dict]: + from frappe.contacts.doctype.address.address import get_condensed_address + + if not frappe.has_permission("Contact", "read"): + return [] + + contact_list = frappe.get_list( + "Contact", + filters=[ + ["Dynamic Link", "link_doctype", "=", doctype], + ["Dynamic Link", "link_name", "=", name], + ["Dynamic Link", "parenttype", "=", "Contact"], + ], + fields=["*"], + order_by="is_primary_contact DESC, creation ASC", + ) + + for contact in contact_list: + contact["email_ids"] = frappe.get_all( + "Contact Email", + filters={"parenttype": "Contact", "parent": contact.name, "is_primary": 0}, + fields=["email_id"], + ) + + contact["phone_nos"] = frappe.get_all( + "Contact Phone", + filters={ + "parenttype": "Contact", + "parent": contact.name, + "is_primary_phone": 0, + "is_primary_mobile_no": 0, + }, + fields=["phone"], + ) + + if contact.address and frappe.has_permission("Address", "read"): + address = frappe.get_doc("Address", contact.address) + contact["address"] = get_condensed_address(address) + + return contact_list