Merge branch 'develop' of github.com:frappe/frappe into v4-hotfix

This commit is contained in:
Nabin Hait 2014-05-07 16:34:26 +05:30
commit 5ef55eb3dc
6 changed files with 50 additions and 27 deletions

View file

@ -540,13 +540,15 @@ def build_match_conditions(doctype, as_condition=True):
import frappe.widgets.reportview
return frappe.widgets.reportview.build_match_conditions(doctype, as_condition)
def get_list(doctype, filters=None, fields=None, docstatus=None,
def get_list(doctype, filters=None, fields=None, or_filters=None, docstatus=None,
group_by=None, order_by=None, limit_start=0, limit_page_length=None,
as_list=False, debug=False, ignore_permissions=False):
import frappe.model.db_query
return frappe.model.db_query.DatabaseQuery(doctype).execute(filters=filters, fields=fields, docstatus=docstatus,
group_by=group_by, order_by=order_by, limit_start=limit_start, limit_page_length=limit_page_length,
as_list=as_list, debug=debug, ignore_permissions=ignore_permissions)
return frappe.model.db_query.DatabaseQuery(doctype).execute(filters=filters,
fields=fields, docstatus=docstatus, or_filters=or_filters,
group_by=group_by, order_by=order_by, limit_start=limit_start,
limit_page_length=limit_page_length, as_list=as_list, debug=debug,
ignore_permissions=ignore_permissions)
run_query = get_list

View file

@ -18,15 +18,17 @@ class DatabaseQuery(object):
self.ignore_permissions = False
self.fields = ["name"]
def execute(self, query=None, filters=None, fields=None, docstatus=None,
group_by=None, order_by=None, limit_start=0, limit_page_length=20,
as_list=False, with_childnames=False, debug=False, ignore_permissions=False):
def execute(self, query=None, filters=None, fields=None, or_filters=None,
docstatus=None, group_by=None, order_by=None, limit_start=0,
limit_page_length=20, as_list=False, with_childnames=False, debug=False,
ignore_permissions=False):
if not frappe.has_permission(self.doctype, "read"):
raise frappe.PermissionError
if fields:
self.fields = fields
self.filters = filters or []
self.or_filters = or_filters or []
self.docstatus = docstatus or []
self.group_by = group_by
self.order_by = order_by
@ -67,6 +69,8 @@ class DatabaseQuery(object):
# query dict
args.tables = ', '.join(self.tables)
if self.or_conditions:
self.conditions.append("({0})".format(" or ".join(self.or_conditions)))
args.conditions = ' and '.join(self.conditions)
args.fields = ', '.join(self.fields)
@ -77,7 +81,6 @@ class DatabaseQuery(object):
return args
def parse_args(self):
if isinstance(self.filters, basestring):
self.filters = json.loads(self.filters)
@ -134,8 +137,10 @@ class DatabaseQuery(object):
def build_conditions(self):
self.conditions = []
self.or_conditions = []
self.add_docstatus_conditions()
self.build_filter_conditions()
self.build_filter_conditions(self.filters, self.conditions)
self.build_filter_conditions(self.or_filters, self.or_conditions)
# join parent, child tables
for tname in self.tables[1:]:
@ -153,11 +158,13 @@ class DatabaseQuery(object):
else:
self.conditions.append(self.tables[0] + '.docstatus < 2')
def build_filter_conditions(self):
def build_filter_conditions(self, filters, conditions):
"""build conditions from user filters"""
for f in self.filters:
if isinstance(filters, dict):
filters = [filters]
for f in filters:
if isinstance(f, basestring):
self.conditions.append(f)
conditions.append(f)
else:
f = self.get_filter_tuple(f)
@ -172,7 +179,7 @@ class DatabaseQuery(object):
opts = f[3].split(",")
opts = ["'" + t.strip().replace("'", "\\'") + "'" for t in opts]
f[3] = "(" + ', '.join(opts) + ")"
self.conditions.append('ifnull(' + tname + '.' + f[1] + ", '') " + f[2] + " " + f[3])
conditions.append('ifnull(' + tname + '.' + f[1] + ", '') " + f[2] + " " + f[3])
else:
df = frappe.get_meta(f[0]).get("fields", {"fieldname": f[1]})
@ -182,7 +189,7 @@ class DatabaseQuery(object):
else:
value, default_val = flt(f[3]), 0
self.conditions.append('ifnull({tname}.{fname}, {default_val}) {operator} {value}'.format(
conditions.append('ifnull({tname}.{fname}, {default_val}) {operator} {value}'.format(
tname=tname, fname=f[1], default_val=default_val, operator=f[2],
value=value))
@ -203,7 +210,7 @@ class DatabaseQuery(object):
"""add match conditions if applicable"""
self.match_filters = {}
self.match_conditions = []
self.or_conditions = []
self.match_or_conditions = []
if not self.tables: self.extract_tables()
@ -214,7 +221,7 @@ class DatabaseQuery(object):
restrictions = frappe.defaults.get_restrictions()
if restricted_by_user:
self.or_conditions.append('`tab{doctype}`.`owner`="{user}"'.format(doctype=self.doctype,
self.match_or_conditions.append('`tab{doctype}`.`owner`="{user}"'.format(doctype=self.doctype,
user=frappe.local.session.user))
self.match_filters["owner"] = frappe.session.user
@ -247,12 +254,12 @@ class DatabaseQuery(object):
if doctype_conditions:
conditions += ' and ' + doctype_conditions if conditions else doctype_conditions
if self.or_conditions:
if self.match_or_conditions:
if conditions:
conditions = '({conditions}) or {or_conditions}'.format(conditions=conditions,
or_conditions = ' or '.join(self.or_conditions))
or_conditions = ' or '.join(self.match_or_conditions))
else:
conditions = " or ".join(self.or_conditions)
conditions = " or ".join(self.match_or_conditions)
return conditions

View file

@ -8,7 +8,7 @@ from frappe.model.db_query import DatabaseQuery
class TestReportview(unittest.TestCase):
def test_basic(self):
self.assertTrue({"name":"DocType"} in DatabaseQuery("DocType").execute(limit_page_length=None))
def test_fields(self):
self.assertTrue({"name":"DocType", "issingle":0} \
in DatabaseQuery("DocType").execute(fields=["name", "issingle"], limit_page_length=None))
@ -16,7 +16,7 @@ class TestReportview(unittest.TestCase):
def test_filters_1(self):
self.assertFalse({"name":"DocType"} \
in DatabaseQuery("DocType").execute(filters=[["DocType", "name", "like", "J%"]]))
def test_filters_2(self):
self.assertFalse({"name":"DocType"} \
in DatabaseQuery("DocType").execute(filters=[{"name": ["like", "J%"]}]))
@ -28,4 +28,12 @@ class TestReportview(unittest.TestCase):
def test_filters_4(self):
self.assertTrue({"name":"DocField"} \
in DatabaseQuery("DocType").execute(filters={"name": "DocField"}))
def test_or_filters(self):
data = DatabaseQuery("DocField").execute(
filters={"parent": "DocType"}, fields=["fieldname", "fieldtype"],
or_filters=[{"fieldtype":"Table"}, {"fieldtype":"Select"}])
self.assertTrue({"fieldtype":"Table", "fieldname":"fields"} in data)
self.assertTrue({"fieldtype":"Select", "fieldname":"document_type"} in data)
self.assertFalse({"fieldtype":"Check", "fieldname":"issingle"} in data)

View file

@ -152,7 +152,6 @@ def set_input(selector, text):
def close():
global _driver, pipe
print "closing selenium"
if _driver:
_driver.quit()
if pipe:

View file

@ -13,10 +13,10 @@ from frappe import _
def get():
return compress(execute(**get_form_params()))
def execute(doctype, query=None, filters=None, fields=None, docstatus=None,
def execute(doctype, query=None, filters=None, fields=None, or_filters=None, docstatus=None,
group_by=None, order_by=None, limit_start=0, limit_page_length=20,
as_list=False, with_childnames=False, debug=False):
return DatabaseQuery(doctype).execute(query, filters, fields, docstatus, group_by,
return DatabaseQuery(doctype).execute(query, filters, fields, or_filters, docstatus, group_by,
order_by, limit_start, limit_page_length, as_list, with_childnames, debug)
def get_form_params():

View file

@ -56,10 +56,16 @@ def search_widget(doctype, txt, query=None, searchfield=None, start=0,
if filters==None:
filters = []
or_filters = []
# build from doctype
if txt:
filters.append([doctype, searchfield or "name", "like", txt + "%"])
if meta.search_fields:
for f in meta.search_fields.split(","):
or_filters.append([doctype, f.strip(), "like", "%" + txt + "%"])
else:
filters.append([doctype, searchfield or "name", "like",
"%" + txt + "%"])
if meta.get("fields", {"fieldname":"enabled", "fieldtype":"Check"}):
filters.append([doctype, "enabled", "=", 1])
if meta.get("fields", {"fieldname":"disabled", "fieldtype":"Check"}):
@ -67,7 +73,8 @@ def search_widget(doctype, txt, query=None, searchfield=None, start=0,
frappe.response["values"] = frappe.widgets.reportview.execute(doctype,
filters=filters, fields = get_std_fields_list(meta, searchfield or "name"),
limit_start = start, limit_page_length=page_len, as_list=True)
or_filters = or_filters, limit_start = start,
limit_page_length=page_len, as_list=True, debug=1)
def get_std_fields_list(meta, key):
# get additional search fields