[fixes] minor fix for between operator filter (#3196)

* [fixes] minor fix for between operator filter

* [minor] added a test case for between operator filter
This commit is contained in:
Makarand Bauskar 2017-05-01 14:14:04 +05:30 committed by Rushabh Mehta
parent 7b41d7e5eb
commit 8eeda18692
2 changed files with 54 additions and 2 deletions

View file

@ -299,9 +299,16 @@ class DatabaseQuery(object):
if f.operator.lower() == 'between' and \
(f.fieldname in ('creation', 'modified') or (df and (df.fieldtype=="Date" or df.fieldtype=="Datetime"))):
from_date = None
to_date = None
if f.value and isinstance(f.value, (list, tuple)):
if len(f.value) >= 1: from_date = f.value[0]
if len(f.value) >= 2: to_date = f.value[1]
value = "'%s' AND '%s'" % (
add_to_date(get_datetime(f.value[0]),days=-1).strftime("%Y-%m-%d %H:%M:%S.%f"),
get_datetime(f.value[1]).strftime("%Y-%m-%d %H:%M:%S.%f"))
add_to_date(get_datetime(from_date),days=-1).strftime("%Y-%m-%d %H:%M:%S.%f"),
get_datetime(to_date).strftime("%Y-%m-%d %H:%M:%S.%f"))
fallback = "'0000-00-00 00:00:00'"
elif df and df.fieldtype=="Date":

View file

@ -38,3 +38,48 @@ class TestReportview(unittest.TestCase):
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)
def test_between_filters(self):
""" test case to check between filter for date fields """
frappe.db.sql("delete from tabEvent")
# create events to test the between operator filter
todays_event = create_event()
event = create_event(starts_on="2016-07-06 12:00:00")
# if the values are not passed in filters then todays event should be return
data = DatabaseQuery("Event").execute(
filters={"starts_on": ["between", None]}, fields=["name"])
self.assertTrue({ "name": todays_event.name } in data)
self.assertTrue({ "name": event.name } not in data)
# if both from and to_date values are passed
data = DatabaseQuery("Event").execute(
filters={"starts_on": ["between", ["2016-07-05 12:00:00", "2016-07-07 12:00:00"]]},
fields=["name"])
self.assertTrue({ "name": event.name } in data)
self.assertTrue({ "name": todays_event.name } not in data)
# if only one value is passed in the filter
data = DatabaseQuery("Event").execute(
filters={"starts_on": ["between", ["2016-07-05 12:00:00"]]},
fields=["name"])
self.assertTrue({ "name": todays_event.name } in data)
self.assertTrue({ "name": event.name } in data)
def create_event(subject="_Test Event", starts_on=None):
""" create a test event """
from frappe.utils import get_datetime
event = frappe.get_doc({
"doctype": "Event",
"subject": subject,
"event_type": "Public",
"starts_on": get_datetime(starts_on),
}).insert(ignore_permissions=True)
return event