1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from decimal import Decimal
from sql import Cast, CombiningQuery, Literal, Select
from trytond import backend
from .field import order_method
from .float import Float
class Numeric(Float):
'''
Define a numeric field (``decimal``).
'''
_type = 'numeric'
_sql_type = 'NUMERIC'
_py_type = Decimal
@order_method
def convert_order(self, name, tables, Model):
columns = super().convert_order(name, tables, Model)
if backend.name == 'sqlite':
# Must be cast because Decimal is stored as bytes
columns = [Cast(c, self.sql_type().base) for c in columns]
return columns
def _domain_column(self, operator, column):
column = super()._domain_column(operator, column)
if backend.name == 'sqlite':
# Must be casted as Decimal is stored as bytes
column = Cast(column, self.sql_type().base)
return column
def _domain_value(self, operator, value):
value = super(Numeric, self)._domain_value(operator, value)
if backend.name == 'sqlite':
if isinstance(value, (Select, CombiningQuery)):
return value
# Must be casted as Decimal is adapted to bytes
type_ = self.sql_type().base
if operator in ('in', 'not in'):
return [Cast(Literal(v), type_) for v in value]
elif value is not None:
return Cast(Literal(value), type_)
return value
|