blob: 9341adfb41986fb5c94e62fbe84ea129a69aa7b4 [file] [log] [blame]
Anand Doshi885e0742015-03-03 14:55:30 +05301# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
Rushabh Mehta5eeef7f2014-11-24 14:16:51 +05302# License: GNU General Public License v3. See license.txt
3
4from __future__ import unicode_literals
5import frappe
6
7def load_address_and_contact(doc, key):
8 """Loads address list and contact list in `__onload`"""
9 from erpnext.utilities.doctype.address.address import get_address_display
10
11 doc.get("__onload").addr_list = [a.update({"display": get_address_display(a)}) \
12 for a in frappe.get_all("Address",
13 fields="*", filters={key: doc.name},
14 order_by="is_primary_address desc, modified desc")]
15
16 if doc.doctype != "Lead":
17 doc.get("__onload").contact_list = frappe.get_all("Contact",
18 fields="*", filters={key: doc.name},
19 order_by="is_primary_contact desc, modified desc")
Anand Doshi89b8d112015-09-29 20:06:53 +053020
21def has_permission(doc, ptype, user):
22 links = get_permitted_and_not_permitted_links(doc.doctype)
23 if not links.get("not_permitted_links"):
24 # optimization: don't determine permissions based on link fields
25 return True
26
27 # True if any one is True or all are empty
28 names = []
29 for df in (links.get("permitted_links") + links.get("not_permitted_links")):
30 doctype = df.options
31 name = doc.get(df.fieldname)
32
33 names.append(name)
34
35 if name and frappe.has_permission(doctype, ptype, doc=name):
36 return True
37
38 if not any(names):
39 return True
40
41 else:
42 return False
43
44def get_permission_query_conditions_for_contact(user):
45 return get_permission_query_conditions("Contact")
46
47def get_permission_query_conditions_for_address(user):
48 return get_permission_query_conditions("Address")
49
50def get_permission_query_conditions(doctype):
51 links = get_permitted_and_not_permitted_links(doctype)
52
53 if not links.get("not_permitted_links"):
54 # when everything is permitted, don't add additional condition
55 return ""
56
57 else:
58 conditions = []
59
60 for df in links.get("permitted_links"):
61 # like ifnull(customer, '')!='' or ifnull(supplier, '')!=''
62 conditions.append("ifnull(`tab{doctype}`.`{fieldname}`, '')!=''".format(doctype=doctype, fieldname=df.fieldname))
63
64 return "( " + " or ".join(conditions) + " )"
65
66def get_permitted_and_not_permitted_links(doctype):
67 permitted_links = []
68 not_permitted_links = []
69
70 meta = frappe.get_meta(doctype)
71
72 for df in meta.get_link_fields():
73 if df.options not in ("Customer", "Supplier", "Sales Partner"):
74 continue
75
76 if frappe.has_permission(df.options):
77 permitted_links.append(df)
78 else:
79 not_permitted_links.append(df)
80
81 return {
82 "permitted_links": permitted_links,
83 "not_permitted_links": not_permitted_links
84 }