def get_condition(sql_type, clause, table): operator = clause[1] value = clause[2] sql_types = [ Numeric('numeric').sql_type().base, Integer('integer').sql_type().base, Float('float').sql_type().base, ] if sql_type in sql_types and value: if isinstance(value, (list, tuple)): value = [Cast(v, sql_type) for v in value] else: value = Cast(value, sql_type) if value is None: value = False column = Cast( Substring(table.value, Position(',', table.value) + Literal(1)), sql_type) Operator = SQL_OPERATORS[operator] # All negative clauses will be negated later if operator in ('in', 'not in'): return column.in_(value) elif ((value is False or value is None) and operator in ('=', '!=')): return column != Null elif operator == 'not like': return column.like(value) elif operator == 'not ilike': return column.ilike(value) elif operator == '!=': return column == value return Operator(column, value)
def get_condition(sql_type, clause, table): operator = clause[1] value = clause[2] sql_types = [ Numeric('numeric').sql_type().base, Integer('integer').sql_type().base, Float('float').sql_type().base, ] if sql_type in sql_types and value: if isinstance(value, (list, tuple)): value = [Cast(v, sql_type) for v in value] else: value = Cast(value, sql_type) if value is None: value = False column = Cast(Substring(table.value, Position(',', table.value) + Literal(1)), sql_type) Operator = SQL_OPERATORS[operator] # All negative clauses will be negated later if operator in ('in', 'not in'): return column.in_(value) elif ((value is False or value is None) and operator in ('=', '!=')): return column != Null elif operator == 'not like': return column.like(value) elif operator == 'not ilike': return column.ilike(value) elif operator == '!=': return column == value return Operator(column, value)
def convert_domain(self, domain, tables, Model): from ..modelsql import convert_from pool = Pool() Rule = pool.get('ir.rule') Target = self.get_target() transaction = Transaction() table, _ = tables[None] name, operator, value = domain[:3] assert operator not in {'where', 'not where'} or '.' not in name if Target._history and transaction.context.get('_datetime'): target = Target.__table_history__() history_where = (Coalesce(target.write_date, target.create_date) <= transaction.context['_datetime']) else: target = Target.__table__() history_where = None origin_field = Target._fields[self.field] origin = getattr(Target, self.field).sql_column(target) origin_where = None if origin_field._type == 'reference': origin_where = origin.like(Model.__name__ + ',%') origin = Cast( Substring(origin, Position(',', origin) + Literal(1)), Target.id.sql_type().base) if '.' not in name: if value is None: where = origin != value if history_where: where &= history_where if origin_where: where &= origin_where if self.filter: query = Target.search(self.filter, order=[], query=True) where &= origin.in_(query) query = target.select(origin, where=where) expression = ~table.id.in_(query) if operator == '!=': return ~expression return expression else: if isinstance(value, str): target_name = 'rec_name' else: target_name = 'id' else: _, target_name = name.split('.', 1) if operator not in {'where', 'not where'}: target_domain = [(target_name, ) + tuple(domain[1:])] else: target_domain = value if origin_field._type == 'reference': target_domain.append((self.field, 'like', Model.__name__ + ',%')) rule_domain = Rule.domain_get(Target.__name__, mode='read') if rule_domain: target_domain = [target_domain, rule_domain] if self.filter: target_domain = [target_domain, self.filter] target_tables = { None: (target, None), } tables, expression = Target.search_domain(target_domain, tables=target_tables) query_table = convert_from(None, target_tables) query = query_table.select(origin, where=expression) expression = table.id.in_(query) if operator == 'not where': expression = ~expression return expression