68
68
result[attrs.item(i).localName] = eval(attrs.item(i).nodeValue)
72
def calc_condition(self,model,con):
73
if model and (con[0] in model.mgroup.fields):
74
val = model[con[0]].get(model)
75
if con[1]=="=" or con[1]=="==":
78
elif con[1]=="!=" or con[1]=="<>":
93
elif con[1].lower()=="in":
97
elif con[1].lower()=="not in":
71
def calc_condition(self, model, cond):
74
return ConditionExpr(cond).eval(model)
77
common.error('Wrong attrs Implementation!','You have wrongly specified conditions in attrs %s' %(cond_main,))
79
class ConditionExpr(object):
80
OPERATORS = {'=': lambda x, y, model: model[x].get(model) == y,
81
'!=': lambda x, y, model: model[x].get(model) != y,
82
'<': lambda x, y, model: model[x].get(model) < y,
83
'>': lambda x, y, model: model[x].get(model) > y,
84
'<=': lambda x, y, model: model[x].get(model) <= y,
85
'>=': lambda x, y, model: model[x].get(model) >= y,
86
'in': lambda x, y, model: model[x].get(model) in y,
87
'not in': lambda x, y, model: model[x].get(model) not in y}
89
OPERAND_MAPPER = {'<>': '!=', '==': '='}
91
def __init__(self, condition):
94
def eval(self, context):
96
if isinstance(cond,bool):
98
left, operand, right = cond
99
real_op = self.OPERAND_MAPPER.get(operand.lower(), operand)
100
return self.OPERATORS[real_op](left, right, context)
104
for a in range(len(con)):
108
ind = find_index(self.cond)
110
result = any((evaluate(self.cond[ind+1]),evaluate(self.cond[ind+2])))
111
self.cond.__delslice__(ind,ind+3)
112
self.cond.__setslice__(ind,ind,[result])
113
ind = find_index(self.cond)
114
return all(evaluate(expr) for expr in self.cond)
104
116
def call_log(fun):
105
117
"""Debug decorator
106
118
TODO: Add optionnal execution time