* [hotfix] dont allow guest user to list the invoices or orders * [hotfix] fixed Not Permitted issue for System user while accessing documents on portal * [codecy] removed trailing whitespace * [fixes] added filters for supplier in RFQ and other minor fixes
		
			
				
	
	
		
			168 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
 | |
| # License: GNU General Public License v3. See license.txt
 | |
| 
 | |
| from __future__ import unicode_literals
 | |
| import json
 | |
| import frappe
 | |
| from frappe import _
 | |
| from frappe.utils import flt, has_common
 | |
| from frappe.utils.user import is_website_user
 | |
| 
 | |
| def get_list_context(context=None):
 | |
| 	return {
 | |
| 		"global_number_format": frappe.db.get_default("number_format") or "#,###.##",
 | |
| 		"currency": frappe.db.get_default("currency"),
 | |
| 		"currency_symbols": json.dumps(dict(frappe.db.sql("""select name, symbol
 | |
| 			from tabCurrency where enabled=1"""))),
 | |
| 		"row_template": "templates/includes/transaction_row.html",
 | |
| 		"get_list": get_transaction_list
 | |
| 	}
 | |
| 
 | |
| 
 | |
| def get_transaction_list(doctype, txt=None, filters=None, limit_start=0, limit_page_length=20, order_by="modified"):
 | |
| 	user = frappe.session.user
 | |
| 	key = None
 | |
| 
 | |
| 	if not filters: filters = []
 | |
| 
 | |
| 	if doctype == 'Supplier Quotation':
 | |
| 		filters.append((doctype, "docstatus", "<", 2))
 | |
| 	else:
 | |
| 		filters.append((doctype, "docstatus", "=", 1))
 | |
| 
 | |
| 	if (user != "Guest" and is_website_user()) or doctype == 'Request for Quotation':
 | |
| 		parties_doctype = 'Request for Quotation Supplier' if doctype == 'Request for Quotation' else doctype
 | |
| 		# find party for this contact
 | |
| 		customers, suppliers = get_customers_suppliers(parties_doctype, user)
 | |
| 
 | |
| 		if not customers and not suppliers: return []
 | |
| 
 | |
| 		key, parties = get_party_details(customers, suppliers)
 | |
| 
 | |
| 		if doctype == 'Request for Quotation':
 | |
| 			return rfq_transaction_list(parties_doctype, doctype, parties, limit_start, limit_page_length)
 | |
| 
 | |
| 		filters.append((doctype, key, "in", parties))
 | |
| 
 | |
| 		if key:
 | |
| 			return post_process(doctype, get_list_for_transactions(doctype, txt,
 | |
| 				filters=filters, fields="name",limit_start=limit_start,
 | |
| 				limit_page_length=limit_page_length,ignore_permissions=True,
 | |
| 				order_by="modified desc"))
 | |
| 		else:
 | |
| 			return []
 | |
| 
 | |
| 	return post_process(doctype, get_list_for_transactions(doctype, txt, filters, limit_start, limit_page_length,
 | |
| 		fields="name", order_by="modified desc"))
 | |
| 
 | |
| def get_list_for_transactions(doctype, txt, filters, limit_start, limit_page_length=20,
 | |
| 	ignore_permissions=False,fields=None, order_by=None):
 | |
| 	""" Get List of transactions like Invoices, Orders """
 | |
| 	from frappe.www.list import get_list
 | |
| 	meta = frappe.get_meta(doctype)
 | |
| 	data = []
 | |
| 	or_filters = []
 | |
| 
 | |
| 	for d in get_list(doctype, txt, filters=filters, fields="name", limit_start=limit_start,
 | |
| 		limit_page_length=limit_page_length, ignore_permissions=ignore_permissions, order_by="modified desc"):
 | |
| 		data.append(d)
 | |
| 
 | |
| 	if txt:
 | |
| 		if meta.get_field('items'):
 | |
| 			if meta.get_field('items').options:
 | |
| 				child_doctype = meta.get_field('items').options
 | |
| 				for item in frappe.get_all(child_doctype, {"item_name": ['like', "%" + txt + "%"]}):
 | |
| 					child = frappe.get_doc(child_doctype, item.name)
 | |
| 					or_filters.append([doctype, "name", "=", child.parent])
 | |
| 
 | |
| 	if or_filters:
 | |
| 		for r in frappe.get_list(doctype, fields=fields,filters=filters, or_filters=or_filters,
 | |
| 			limit_start=limit_start, limit_page_length=limit_page_length, 
 | |
| 			ignore_permissions=ignore_permissions, order_by=order_by):
 | |
| 			data.append(r)
 | |
| 
 | |
| 	return data
 | |
| 
 | |
| def get_party_details(customers, suppliers):
 | |
| 	if customers:
 | |
| 		key, parties = "customer", customers
 | |
| 	elif suppliers:
 | |
| 		key, parties = "supplier", suppliers
 | |
| 	else:
 | |
| 		key, parties = "customer", []
 | |
| 
 | |
| 	return key, parties
 | |
| 
 | |
| def rfq_transaction_list(parties_doctype, doctype, parties, limit_start, limit_page_length):
 | |
| 	data = frappe.db.sql("""select distinct parent as name, supplier from `tab{doctype}`
 | |
| 			where supplier = '{supplier}' and docstatus=1  order by modified desc limit {start}, {len}""".
 | |
| 			format(doctype=parties_doctype, supplier=parties[0], start=limit_start, len = limit_page_length), as_dict=1)
 | |
| 
 | |
| 	return post_process(doctype, data)
 | |
| 
 | |
| def post_process(doctype, data):
 | |
| 	result = []
 | |
| 	for d in data:
 | |
| 		doc = frappe.get_doc(doctype, d.name)
 | |
| 
 | |
| 		doc.status_percent = 0
 | |
| 		doc.status_display = []
 | |
| 
 | |
| 		if doc.get("per_billed"):
 | |
| 			doc.status_percent += flt(doc.per_billed)
 | |
| 			doc.status_display.append(_("Billed") if doc.per_billed==100 else _("{0}% Billed").format(doc.per_billed))
 | |
| 
 | |
| 		if doc.get("per_delivered"):
 | |
| 			doc.status_percent += flt(doc.per_delivered)
 | |
| 			doc.status_display.append(_("Delivered") if doc.per_delivered==100 else _("{0}% Delivered").format(doc.per_delivered))
 | |
| 
 | |
| 		if hasattr(doc, "set_indicator"):
 | |
| 			doc.set_indicator()
 | |
| 
 | |
| 		doc.status_display = ", ".join(doc.status_display)
 | |
| 		doc.items_preview = ", ".join([d.item_name for d in doc.items if d.item_name])
 | |
| 		result.append(doc)
 | |
| 
 | |
| 	return result
 | |
| 
 | |
| def get_customers_suppliers(doctype, user):
 | |
| 	customers = []
 | |
| 	suppliers = []
 | |
| 	meta = frappe.get_meta(doctype)
 | |
| 
 | |
| 	if has_common(["Supplier", "Customer"], frappe.get_roles(user)):
 | |
| 		contacts = frappe.db.sql("""
 | |
| 			select 
 | |
| 				`tabContact`.email_id,
 | |
| 				`tabDynamic Link`.link_doctype,
 | |
| 				`tabDynamic Link`.link_name
 | |
| 			from 
 | |
| 				`tabContact`, `tabDynamic Link`
 | |
| 			where
 | |
| 				`tabContact`.name=`tabDynamic Link`.parent and `tabContact`.email_id =%s
 | |
| 			""", user, as_dict=1)
 | |
| 		customers = [c.link_name for c in contacts if c.link_doctype == 'Customer'] \
 | |
| 			if meta.get_field("customer") else None
 | |
| 		suppliers = [c.link_name for c in contacts if c.link_doctype == 'Supplier'] \
 | |
| 			if meta.get_field("supplier") else None
 | |
| 	elif frappe.has_permission(doctype, 'read', user=user):
 | |
| 		customers = [customer.name for customer in frappe.get_list("Customer")] \
 | |
| 			if meta.get_field("customer") else None
 | |
| 		suppliers = [supplier.name for supplier in frappe.get_list("Customer")] \
 | |
| 			if meta.get_field("supplier") else None
 | |
| 
 | |
| 	return customers, suppliers
 | |
| 
 | |
| def has_website_permission(doc, ptype, user, verbose=False):
 | |
| 	doctype = doc.doctype
 | |
| 	customers, suppliers = get_customers_suppliers(doctype, user)
 | |
| 	if customers:
 | |
| 		return frappe.get_all(doctype, filters=[(doctype, "customer", "in", customers),
 | |
| 			(doctype, "name", "=", doc.name)]) and True or False
 | |
| 	elif suppliers:
 | |
| 		fieldname = 'suppliers' if doctype == 'Request for Quotation' else 'supplier'
 | |
| 		return frappe.get_all(doctype, filters=[(doctype, fieldname, "in", suppliers),
 | |
| 			(doctype, "name", "=", doc.name)]) and True or False
 | |
| 	else:
 | |
| 		return False
 |