Skip to content

Commit

Permalink
chore: rewrite query using query builder (backport #37310) (#37585)
Browse files Browse the repository at this point in the history
* chore: rewrite query using query builder

(cherry picked from commit 25718f5)

* chore: fix shopping cart tests

(cherry picked from commit fb51cae)

* chore: fix test case

---------

Co-authored-by: Deepesh Garg <[email protected]>
Co-authored-by: rohitwaghchaure <[email protected]>
  • Loading branch information
3 people authored Oct 19, 2023
1 parent 49d0ab5 commit 7e26449
Show file tree
Hide file tree
Showing 2 changed files with 111 additions and 70 deletions.
77 changes: 33 additions & 44 deletions erpnext/crm/report/lead_details/lead_details.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import frappe
from frappe import _
from frappe.query_builder.functions import Concat_ws, Date


def execute(filters=None):
Expand Down Expand Up @@ -69,53 +70,41 @@ def get_columns():


def get_data(filters):
return frappe.db.sql(
"""
SELECT
`tabLead`.name,
`tabLead`.lead_name,
`tabLead`.status,
`tabLead`.lead_owner,
`tabLead`.territory,
`tabLead`.source,
`tabLead`.email_id,
`tabLead`.mobile_no,
`tabLead`.phone,
`tabLead`.owner,
`tabLead`.company,
concat_ws(', ',
trim(',' from `tabAddress`.address_line1),
trim(',' from tabAddress.address_line2)
) AS address,
`tabAddress`.state,
`tabAddress`.pincode,
`tabAddress`.country
FROM
`tabLead` left join `tabDynamic Link` on (
`tabLead`.name = `tabDynamic Link`.link_name and
`tabDynamic Link`.parenttype = 'Address')
left join `tabAddress` on (
`tabAddress`.name=`tabDynamic Link`.parent)
WHERE
company = %(company)s
AND DATE(`tabLead`.creation) BETWEEN %(from_date)s AND %(to_date)s
{conditions}
ORDER BY
`tabLead`.creation asc """.format(
conditions=get_conditions(filters)
),
filters,
as_dict=1,
)

lead = frappe.qb.DocType("Lead")
address = frappe.qb.DocType("Address")
dynamic_link = frappe.qb.DocType("Dynamic Link")

def get_conditions(filters):
conditions = []
query = (
frappe.qb.from_(lead)
.left_join(dynamic_link)
.on((lead.name == dynamic_link.link_name) & (dynamic_link.parenttype == "Address"))
.left_join(address)
.on(address.name == dynamic_link.parent)
.select(
lead.name,
lead.lead_name,
lead.status,
lead.lead_owner,
lead.territory,
lead.source,
lead.email_id,
lead.mobile_no,
lead.phone,
lead.owner,
lead.company,
(Concat_ws(", ", address.address_line1, address.address_line2)).as_("address"),
address.state,
address.pincode,
address.country,
)
.where(lead.company == filters.company)
.where(Date(lead.creation).between(filters.from_date, filters.to_date))
)

if filters.get("territory"):
conditions.append(" and `tabLead`.territory=%(territory)s")
query = query.where(lead.territory == filters.get("territory"))

if filters.get("status"):
conditions.append(" and `tabLead`.status=%(status)s")
query = query.where(lead.status == filters.get("status"))

return " ".join(conditions) if conditions else ""
return query.run(as_dict=1)
104 changes: 78 additions & 26 deletions erpnext/e_commerce/shopping_cart/test_shopping_cart.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
request_for_quotation,
update_cart,
)
from erpnext.tests.utils import create_test_contact_and_address


class TestShoppingCart(unittest.TestCase):
Expand All @@ -28,7 +27,6 @@ class TestShoppingCart(unittest.TestCase):

def setUp(self):
frappe.set_user("Administrator")
create_test_contact_and_address()
self.enable_shopping_cart()
if not frappe.db.exists("Website Item", {"item_code": "_Test Item"}):
make_website_item(frappe.get_cached_doc("Item", "_Test Item"))
Expand All @@ -46,56 +44,65 @@ def tearDownClass(cls):
frappe.db.sql("delete from `tabTax Rule`")

def test_get_cart_new_user(self):
self.login_as_new_user()

self.login_as_customer(
"[email protected]", "_Test Contact 2 For _Test Customer"
)
create_address_and_contact(
address_title="_Test Address for Customer 2",
first_name="_Test Contact for Customer 2",
email="[email protected]",
customer="_Test Customer 2",
)
# test if lead is created and quotation with new lead is fetched
quotation = _get_cart_quotation()
customer = frappe.get_doc("Customer", "_Test Customer 2")
quotation = _get_cart_quotation(party=customer)
self.assertEqual(quotation.quotation_to, "Customer")
self.assertEqual(
quotation.contact_person,
frappe.db.get_value("Contact", dict(email_id="test_cart_user@example.com")),
frappe.db.get_value("Contact", dict(email_id="test_contact_two_customer@example.com")),
)
self.assertEqual(quotation.contact_email, frappe.session.user)

return quotation

def test_get_cart_customer(self):
def validate_quotation():
def test_get_cart_customer(self, customer="_Test Customer 2"):
def validate_quotation(customer_name):
# test if quotation with customer is fetched
quotation = _get_cart_quotation()
party = frappe.get_doc("Customer", customer_name)
quotation = _get_cart_quotation(party=party)
self.assertEqual(quotation.quotation_to, "Customer")
self.assertEqual(quotation.party_name, "_Test Customer")
self.assertEqual(quotation.party_name, customer_name)
self.assertEqual(quotation.contact_email, frappe.session.user)
return quotation

self.login_as_customer(
"[email protected]", "_Test Contact 2 For _Test Customer"
)
validate_quotation()

self.login_as_customer()
quotation = validate_quotation()

quotation = validate_quotation(customer)
return quotation

def test_add_to_cart(self):
self.login_as_customer()

self.login_as_customer(
"[email protected]", "_Test Contact 2 For _Test Customer"
)
create_address_and_contact(
address_title="_Test Address for Customer 2",
first_name="_Test Contact for Customer 2",
email="[email protected]",
customer="_Test Customer 2",
)
# clear existing quotations
self.clear_existing_quotations()

# add first item
update_cart("_Test Item", 1)

quotation = self.test_get_cart_customer()
quotation = self.test_get_cart_customer("_Test Customer 2")

self.assertEqual(quotation.get("items")[0].item_code, "_Test Item")
self.assertEqual(quotation.get("items")[0].qty, 1)
self.assertEqual(quotation.get("items")[0].amount, 10)

# add second item
update_cart("_Test Item 2", 1)
quotation = self.test_get_cart_customer()
quotation = self.test_get_cart_customer("_Test Customer 2")
self.assertEqual(quotation.get("items")[1].item_code, "_Test Item 2")
self.assertEqual(quotation.get("items")[1].qty, 1)
self.assertEqual(quotation.get("items")[1].amount, 20)
Expand All @@ -108,7 +115,7 @@ def test_update_cart(self):

# update first item
update_cart("_Test Item", 5)
quotation = self.test_get_cart_customer()
quotation = self.test_get_cart_customer("_Test Customer 2")
self.assertEqual(quotation.get("items")[0].item_code, "_Test Item")
self.assertEqual(quotation.get("items")[0].qty, 5)
self.assertEqual(quotation.get("items")[0].amount, 50)
Expand All @@ -121,17 +128,28 @@ def test_remove_from_cart(self):

# remove first item
update_cart("_Test Item", 0)
quotation = self.test_get_cart_customer()
quotation = self.test_get_cart_customer("_Test Customer 2")

self.assertEqual(quotation.get("items")[0].item_code, "_Test Item 2")
self.assertEqual(quotation.get("items")[0].qty, 1)
self.assertEqual(quotation.get("items")[0].amount, 20)
self.assertEqual(quotation.net_total, 20)
self.assertEqual(len(quotation.get("items")), 1)

@unittest.skip("Flaky in CI")
def test_tax_rule(self):
self.create_tax_rule()
self.login_as_customer()

self.login_as_customer(
"[email protected]", "_Test Contact 2 For _Test Customer"
)
create_address_and_contact(
address_title="_Test Address for Customer 2",
first_name="_Test Contact for Customer 2",
email="[email protected]",
customer="_Test Customer 2",
)

quotation = self.create_quotation()

from erpnext.accounts.party import set_taxes
Expand Down Expand Up @@ -319,7 +337,7 @@ def create_user_if_not_exists(self, email, first_name=None):
if frappe.db.exists("User", email):
return

frappe.get_doc(
user = frappe.get_doc(
{
"doctype": "User",
"user_type": "Website User",
Expand All @@ -329,6 +347,40 @@ def create_user_if_not_exists(self, email, first_name=None):
}
).insert(ignore_permissions=True)

user.add_roles("Customer")


def create_address_and_contact(**kwargs):
if not frappe.db.get_value("Address", {"address_title": kwargs.get("address_title")}):
frappe.get_doc(
{
"doctype": "Address",
"address_title": kwargs.get("address_title"),
"address_type": kwargs.get("address_type") or "Office",
"address_line1": kwargs.get("address_line1") or "Station Road",
"city": kwargs.get("city") or "_Test City",
"state": kwargs.get("state") or "Test State",
"country": kwargs.get("country") or "India",
"links": [
{"link_doctype": "Customer", "link_name": kwargs.get("customer") or "_Test Customer"}
],
}
).insert()

if not frappe.db.get_value("Contact", {"first_name": kwargs.get("first_name")}):
contact = frappe.get_doc(
{
"doctype": "Contact",
"first_name": kwargs.get("first_name"),
"links": [
{"link_doctype": "Customer", "link_name": kwargs.get("customer") or "_Test Customer"}
],
}
)
contact.add_email(kwargs.get("email") or "[email protected]", is_primary=True)
contact.add_phone(kwargs.get("phone") or "+91 0000000000", is_primary_phone=True)
contact.insert()


test_dependencies = [
"Sales Taxes and Charges Template",
Expand Down

0 comments on commit 7e26449

Please sign in to comment.