From df62a9fc1aa24b73519ddc5caacee3f3bd0cca92 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 25 Dec 2013 12:29:48 +0530 Subject: [PATCH] Fixes in Filter conditions in reportview to handle null values --- public/js/wn/ui/filters.js | 2 +- webnotes/widgets/reportview.py | 24 ++++++++++++++++-------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/public/js/wn/ui/filters.js b/public/js/wn/ui/filters.js index 195589d90f..15735782ce 100644 --- a/public/js/wn/ui/filters.js +++ b/public/js/wn/ui/filters.js @@ -272,7 +272,7 @@ wn.ui.Filter = Class.extend({ if ((val.length === 0) || (val.lastIndexOf("%") !== (val.length - 1))) { val = (val || "") + '%'; } - } + } else if(val === '%') val = null; return [me.fieldselect.$select.find('option:selected').attr('table'), me.field.df.fieldname, me.$w.find('.condition').val(), val]; diff --git a/webnotes/widgets/reportview.py b/webnotes/widgets/reportview.py index 5b04cb604b..99b9098a6a 100644 --- a/webnotes/widgets/reportview.py +++ b/webnotes/widgets/reportview.py @@ -160,14 +160,18 @@ def build_conditions(doctype, fields, filters, docstatus): def build_filter_conditions(filters, conditions): """build conditions from user filters""" - from webnotes.utils import cstr + from webnotes.utils import cstr, flt if not getattr(webnotes.local, "reportview_tables", None): webnotes.local.reportview_tables = [] - + + doclist = {} for f in filters: if isinstance(f, basestring): conditions.append(f) else: + # get doclist of given doctype + doclist.setdefault(f[0], webnotes.model.doctype.get(f[0])) + tname = ('`tab' + f[0] + '`') if not tname in webnotes.local.reportview_tables: webnotes.local.reportview_tables.append(tname) @@ -176,14 +180,18 @@ def build_filter_conditions(filters, conditions): if f[2] in ['in', 'not in']: opts = ["'" + t.strip().replace("'", "\\'") + "'" for t in f[3].split(',')] f[3] = "(" + ', '.join(opts) + ")" - conditions.append(tname + '.' + f[1] + " " + f[2] + " " + f[3]) + conditions.append('ifnull(' + tname + '.' + f[1] + ", '') " + f[2] + " " + f[3]) else: - if isinstance(f[3], basestring): - f[3] = "'" + f[3].replace("'", "\\'") + "'" - conditions.append(tname + '.' + f[1] + " " + f[2] + " " + f[3]) + fieldtype = doclist[f[0]].get({"doctype": "DocField", + "fieldname": f[1]})[0].fieldtype + if fieldtype in ["Float", "Int", "Currency", "Percent"]: + conditions.append('ifnull(' + tname + '.' + f[1] + ", 0) " + f[2] \ + + " " + cstr(flt(f[3]))) else: - conditions.append('ifnull(' + tname + '.' + f[1] + ",0) " + f[2] \ - + " " + cstr(f[3])) + f[3] = "'" + f[3].replace("'", "\\'") + "'" + conditions.append('ifnull(' + tname + '.' + f[1] + ", '') " + f[2] + \ + " " + cstr(f[3])) + def build_match_conditions(doctype, fields=None, as_condition=True): """add match conditions if applicable"""