fix: check_value支持filter_item级别的value_mode
- check_value增加value_mode参数,优先用传入值,回退到field.value_mode
- filter_item遍历时跳过value_mode key
- 提取filter_item.get('value_mode')传给check_value
- 修复between类型filter报invalid literal for int()错误
This commit is contained in:
parent
0d841f078e
commit
7d8fae01ca
@ -128,8 +128,10 @@ def typevalue(v, t):
|
|||||||
return v
|
return v
|
||||||
return f(v)
|
return f(v)
|
||||||
|
|
||||||
def check_value(field, spec_value, data_value):
|
def check_value(field, spec_value, data_value, value_mode=None):
|
||||||
if field.value_mode == 'between':
|
if value_mode is None:
|
||||||
|
value_mode = field.value_mode
|
||||||
|
if value_mode == 'between':
|
||||||
arr = spec_value.strip().split()
|
arr = spec_value.strip().split()
|
||||||
if len(arr) < 2 or len(arr) > 3:
|
if len(arr) < 2 or len(arr) > 3:
|
||||||
e = f'{spec_value=} error'
|
e = f'{spec_value=} error'
|
||||||
@ -159,13 +161,13 @@ def check_value(field, spec_value, data_value):
|
|||||||
exception(e)
|
exception(e)
|
||||||
raise Exception(e)
|
raise Exception(e)
|
||||||
|
|
||||||
if field.value_mode == 'in':
|
if value_mode == 'in':
|
||||||
arr = spec_value.strip().split()
|
arr = spec_value.strip().split()
|
||||||
arr = [ typevalue(a, field.type) for a in arr ]
|
arr = [ typevalue(a, field.type) for a in arr ]
|
||||||
# debug(f'{arr=}, {data_value=}')
|
# debug(f'{arr=}, {data_value=}')
|
||||||
return data_value in arr
|
return data_value in arr
|
||||||
|
|
||||||
mode = field.value_mode
|
mode = value_mode
|
||||||
if not mode or mode == '=':
|
if not mode or mode == '=':
|
||||||
mode = '=='
|
mode = '=='
|
||||||
ns = {
|
ns = {
|
||||||
@ -642,8 +644,9 @@ order by b.enabled_date desc"""
|
|||||||
if 'unit_prices' in filter_item:
|
if 'unit_prices' in filter_item:
|
||||||
continue # tiered定价项,不在此处检查
|
continue # tiered定价项,不在此处检查
|
||||||
item_ok = True
|
item_ok = True
|
||||||
|
item_value_mode = filter_item.get('value_mode')
|
||||||
for fk, fv in filter_item.items():
|
for fk, fv in filter_item.items():
|
||||||
if fk == 'unit_prices':
|
if fk in ('unit_prices', 'value_mode'):
|
||||||
continue
|
continue
|
||||||
f = d.fields.get(fk)
|
f = d.fields.get(fk)
|
||||||
if not f:
|
if not f:
|
||||||
@ -653,7 +656,7 @@ order by b.enabled_date desc"""
|
|||||||
if data_value is None:
|
if data_value is None:
|
||||||
continue # 数据中没有该键,视为匹配
|
continue # 数据中没有该键,视为匹配
|
||||||
try:
|
try:
|
||||||
flg = check_value(f, fv, data_value)
|
flg = check_value(f, fv, data_value, item_value_mode)
|
||||||
if not flg:
|
if not flg:
|
||||||
item_ok = False
|
item_ok = False
|
||||||
break
|
break
|
||||||
@ -681,8 +684,9 @@ order by b.enabled_date desc"""
|
|||||||
# 处理 filters 中的区间定价(查找匹配的 unit_prices)
|
# 处理 filters 中的区间定价(查找匹配的 unit_prices)
|
||||||
if 'filters' in p:
|
if 'filters' in p:
|
||||||
for filter_item in p['filters']:
|
for filter_item in p['filters']:
|
||||||
|
item_value_mode = filter_item.get('value_mode')
|
||||||
for fk, fv in filter_item.items():
|
for fk, fv in filter_item.items():
|
||||||
if fk == 'unit_prices':
|
if fk in ('unit_prices', 'value_mode'):
|
||||||
continue
|
continue
|
||||||
f = d.fields.get(fk)
|
f = d.fields.get(fk)
|
||||||
if not f:
|
if not f:
|
||||||
@ -692,7 +696,7 @@ order by b.enabled_date desc"""
|
|||||||
if data_value is None:
|
if data_value is None:
|
||||||
continue
|
continue
|
||||||
try:
|
try:
|
||||||
flg = check_value(f, fv, data_value)
|
flg = check_value(f, fv, data_value, item_value_mode)
|
||||||
if flg and 'unit_prices' in filter_item:
|
if flg and 'unit_prices' in filter_item:
|
||||||
unit_price = filter_item['unit_prices']
|
unit_price = filter_item['unit_prices']
|
||||||
except:
|
except:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user