Files
tryton/trytond/tests/test.py
T
Cédric Krier 7ca7f4c6f0 Allow to store Binary field in filestore
Two options are added on Binary field to define the column to use to store the
filestore id and the prefix to use.
Those options are used for Attachment and are configurable with conservative
default values.

issue5692
review25471003
2016-07-29 10:51:53 +02:00

794 lines
22 KiB
Python

# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
import datetime
from decimal import Decimal
from trytond.model import ModelSQL, DictSchemaMixin, fields, Unique
from trytond.pyson import Eval
__all__ = [
'Boolean', 'BooleanDefault',
'Integer', 'IntegerDefault', 'IntegerRequired', 'IntegerDomain',
'Float', 'FloatDefault', 'FloatRequired', 'FloatDigits',
'Numeric', 'NumericDefault', 'NumericRequired', 'NumericDigits',
'Char', 'CharDefault', 'CharRequired', 'CharSize', 'CharTranslate',
'Text', 'TextDefault', 'TextRequired', 'TextSize', 'TextTranslate',
'Date', 'DateDefault', 'DateRequired',
'DateTime', 'DateTimeDefault', 'DateTimeRequired', 'DateTimeFormat',
'Time', 'TimeDefault', 'TimeRequired', 'TimeFormat',
'TimeDelta', 'TimeDeltaDefault', 'TimeDeltaRequired',
'One2One', 'One2OneTarget', 'One2OneRelation', 'One2OneRequired',
'One2OneRequiredRelation', 'One2OneDomain', 'One2OneDomainRelation',
'One2Many', 'One2ManyTarget',
'One2ManyRequired', 'One2ManyRequiredTarget',
'One2ManyReference', 'One2ManyReferenceTarget',
'One2ManySize', 'One2ManySizeTarget',
'One2ManySizePYSON', 'One2ManySizePYSONTarget',
'Many2Many', 'Many2ManyTarget', 'Many2ManyRelation',
'Many2ManyRequired', 'Many2ManyRequiredTarget',
'Many2ManyRequiredRelation',
'Many2ManyReference', 'Many2ManyReferenceTarget',
'Many2ManyReferenceRelation',
'Many2ManySize', 'Many2ManySizeTarget', 'Many2ManySizeRelation',
'Many2ManyTree', 'Many2ManyTreeRelation',
'Reference', 'ReferenceTarget', 'ReferenceRequired',
'Property',
'Selection', 'SelectionRequired',
'DictSchema', 'Dict', 'DictDefault', 'DictRequired',
'Binary', 'BinaryDefault', 'BinaryRequired', 'BinaryFileStorage',
'Many2OneDomainValidation', 'Many2OneTarget', 'Many2OneOrderBy',
'Many2OneSearch', 'Many2OneTree', 'Many2OneMPTT',
]
class Boolean(ModelSQL):
'Boolean'
__name__ = 'test.boolean'
boolean = fields.Boolean(string='Boolean', help='Test boolean')
class BooleanDefault(ModelSQL):
'Boolean Default'
__name__ = 'test.boolean_default'
boolean = fields.Boolean(string='Boolean', help='Test boolean')
@staticmethod
def default_boolean():
return True
class Integer(ModelSQL):
'Integer'
__name__ = 'test.integer'
integer = fields.Integer(string='Integer', help='Test integer',
required=False)
class IntegerDefault(ModelSQL):
'Integer Default'
__name__ = 'test.integer_default'
integer = fields.Integer(string='Integer', help='Test integer',
required=False)
@staticmethod
def default_integer():
return 5
class IntegerRequired(ModelSQL):
'Integer Required'
__name__ = 'test.integer_required'
integer = fields.Integer(string='Integer', help='Test integer',
required=True)
class IntegerDomain(ModelSQL):
'Integer Domain'
__name__ = 'test.integer_domain'
integer = fields.Integer('Integer', domain=[('integer', '>', 42)])
class Float(ModelSQL):
'Float'
__name__ = 'test.float'
float = fields.Float(string='Float', help='Test float',
required=False)
class FloatDefault(ModelSQL):
'Float Default'
__name__ = 'test.float_default'
float = fields.Float(string='Float', help='Test float',
required=False)
@staticmethod
def default_float():
return 5.5
class FloatRequired(ModelSQL):
'Float Required'
__name__ = 'test.float_required'
float = fields.Float(string='Float', help='Test float',
required=True)
class FloatDigits(ModelSQL):
'Float Digits'
__name__ = 'test.float_digits'
digits = fields.Integer('Digits')
float = fields.Float(string='Float', help='Test float',
required=False, digits=(16, Eval('digits', 2)),
depends=['digits'])
class Numeric(ModelSQL):
'Numeric'
__name__ = 'test.numeric'
numeric = fields.Numeric(string='Numeric', help='Test numeric',
required=False)
class NumericDefault(ModelSQL):
'Numeric Default'
__name__ = 'test.numeric_default'
numeric = fields.Numeric(string='Numeric', help='Test numeric',
required=False)
@staticmethod
def default_numeric():
return Decimal('5.5')
class NumericRequired(ModelSQL):
'Numeric Required'
__name__ = 'test.numeric_required'
numeric = fields.Numeric(string='Numeric', help='Test numeric',
required=True)
class NumericDigits(ModelSQL):
'Numeric Digits'
__name__ = 'test.numeric_digits'
digits = fields.Integer('Digits')
numeric = fields.Numeric(string='Numeric', help='Test numeric',
required=False, digits=(16, Eval('digits', 2)),
depends=['digits'])
class Char(ModelSQL):
'Char'
__name__ = 'test.char'
char = fields.Char(string='Char', size=None, help='Test char',
required=False)
class CharDefault(ModelSQL):
'Char Default'
__name__ = 'test.char_default'
char = fields.Char(string='Char', size=None, help='Test char',
required=False)
@staticmethod
def default_char():
return 'Test'
class CharRequired(ModelSQL):
'Char Required'
__name__ = 'test.char_required'
char = fields.Char(string='Char', size=None, help='Test char',
required=True)
class CharSize(ModelSQL):
'Char Size'
__name__ = 'test.char_size'
char = fields.Char(string='Char', size=5, help='Test char',
required=False)
class CharTranslate(ModelSQL):
'Char Translate'
__name__ = 'test.char_translate'
char = fields.Char(string='Char', size=None, help='Test char',
required=False, translate=True)
class Text(ModelSQL):
'Text'
__name__ = 'test.text'
text = fields.Text(string='Text', size=None, help='Test text',
required=False)
class TextDefault(ModelSQL):
'Text Default'
__name__ = 'test.text_default'
text = fields.Text(string='Text', size=None, help='Test text',
required=False)
@staticmethod
def default_text():
return 'Test'
class TextRequired(ModelSQL):
'Text Required'
__name__ = 'test.text_required'
text = fields.Text(string='Text', size=None, help='Test text',
required=True)
class TextSize(ModelSQL):
'Text Size'
__name__ = 'test.text_size'
text = fields.Text(string='Text', size=5, help='Test text',
required=False)
class TextTranslate(ModelSQL):
'Text Translate'
__name__ = 'test.text_translate'
text = fields.Text(string='Text', size=None, help='Test text',
required=False, translate=True)
class Date(ModelSQL):
'Date'
__name__ = 'test.date'
date = fields.Date(string='Date', help='Test date',
required=False)
class DateDefault(ModelSQL):
'Date Default'
__name__ = 'test.date_default'
date = fields.Date(string='Date', help='Test date',
required=False)
@staticmethod
def default_date():
return datetime.date(2000, 1, 1)
class DateRequired(ModelSQL):
'Date Required'
__name__ = 'test.date_required'
date = fields.Date(string='Date', help='Test date',
required=True)
class DateTime(ModelSQL):
'DateTime'
__name__ = 'test.datetime'
datetime = fields.DateTime(string='DateTime', help='Test datetime',
required=False)
class DateTimeDefault(ModelSQL):
'DateTime Default'
__name__ = 'test.datetime_default'
datetime = fields.DateTime(string='DateTime', help='Test datetime',
required=False)
@staticmethod
def default_datetime():
return datetime.datetime(2000, 1, 1, 12, 0, 0, 0)
class DateTimeRequired(ModelSQL):
'DateTime Required'
__name__ = 'test.datetime_required'
datetime = fields.DateTime(string='DateTime', help='Test datetime',
required=True)
class DateTimeFormat(ModelSQL):
'DateTime Format'
__name__ = 'test.datetime_format'
datetime = fields.DateTime(string='DateTime', format='%H:%M')
class Time(ModelSQL):
'Time'
__name__ = 'test.time'
time = fields.Time(string='Time', help='Test time', required=False)
class TimeDefault(ModelSQL):
'Time Default'
__name__ = 'test.time_default'
time = fields.Time(string='Time', help='Test time', required=False)
@staticmethod
def default_time():
return datetime.time(16, 30)
class TimeRequired(ModelSQL):
'Time'
__name__ = 'test.time_required'
time = fields.Time(string='Time', help='Test time', required=True)
class TimeFormat(ModelSQL):
'Time Format'
__name__ = 'test.time_format'
time = fields.Time(string='Time', format='%H:%M')
class TimeDelta(ModelSQL):
'TimeDelta'
__name__ = 'test.timedelta'
timedelta = fields.TimeDelta(string='TimeDelta', help='Test timedelta',
required=False)
class TimeDeltaDefault(ModelSQL):
'TimeDelta Default'
__name__ = 'test.timedelta_default'
timedelta = fields.TimeDelta(string='TimeDelta', help='Test timedelta',
required=False)
@staticmethod
def default_timedelta():
return datetime.timedelta(seconds=3600)
class TimeDeltaRequired(ModelSQL):
'TimeDelta Required'
__name__ = 'test.timedelta_required'
timedelta = fields.TimeDelta(string='TimeDelta', help='Test timedelta',
required=True)
class One2One(ModelSQL):
'One2One'
__name__ = 'test.one2one'
name = fields.Char('Name', required=True)
one2one = fields.One2One('test.one2one.relation', 'origin', 'target',
string='One2One', help='Test one2one', required=False)
class One2OneTarget(ModelSQL):
'One2One Target'
__name__ = 'test.one2one.target'
name = fields.Char('Name', required=True)
class One2OneRelation(ModelSQL):
'One2One Relation'
__name__ = 'test.one2one.relation'
origin = fields.Many2One('test.one2one', 'Origin')
target = fields.Many2One('test.one2one.target', 'Target')
@classmethod
def __setup__(cls):
super(One2OneRelation, cls).__setup__()
table = cls.__table__()
cls._sql_constraints += [
('origin_unique', Unique(table, table.origin),
'Origin must be unique'),
('target_unique', Unique(table, table.target),
'Target must be unique'),
]
class One2OneRequired(ModelSQL):
'One2One'
__name__ = 'test.one2one_required'
name = fields.Char('Name', required=True)
one2one = fields.One2One('test.one2one_required.relation', 'origin',
'target', string='One2One', help='Test one2one', required=True)
class One2OneRequiredRelation(ModelSQL):
'One2One Relation'
__name__ = 'test.one2one_required.relation'
origin = fields.Many2One('test.one2one_required', 'Origin')
target = fields.Many2One('test.one2one.target', 'Target')
@classmethod
def __setup__(cls):
super(One2OneRequiredRelation, cls).__setup__()
table = cls.__table__()
cls._sql_constraints += [
('origin_unique', Unique(table, table.origin),
'Origin must be unique'),
('target_unique', Unique(table, table.target),
'Target must be unique'),
]
class One2OneDomain(ModelSQL):
'One2One'
__name__ = 'test.one2one_domain'
name = fields.Char('Name', required=True)
one2one = fields.One2One('test.one2one_domain.relation', 'origin',
'target', string='One2One', help='Test one2one',
domain=[('name', '=', 'domain')])
class One2OneDomainRelation(ModelSQL):
'One2One Relation'
__name__ = 'test.one2one_domain.relation'
origin = fields.Many2One('test.one2one_domain', 'Origin')
target = fields.Many2One('test.one2one.target', 'Target')
@classmethod
def __setup__(cls):
super(One2OneDomainRelation, cls).__setup__()
table = cls.__table__()
cls._sql_constraints += [
('origin_unique', Unique(table, table.origin),
'Origin must be unique'),
('target_unique', Unique(table, table.target),
'Target must be unique'),
]
class One2Many(ModelSQL):
'One2Many Relation'
__name__ = 'test.one2many'
name = fields.Char('Name', required=True)
targets = fields.One2Many('test.one2many.target', 'origin', 'Targets')
class One2ManyTarget(ModelSQL):
'One2Many Target'
__name__ = 'test.one2many.target'
name = fields.Char('Name', required=True)
origin = fields.Many2One('test.one2many', 'Origin')
class One2ManyRequired(ModelSQL):
'One2Many Required'
__name__ = 'test.one2many_required'
name = fields.Char('Name', required=True)
targets = fields.One2Many('test.one2many_required.target', 'origin',
'Targets', required=True)
class One2ManyRequiredTarget(ModelSQL):
'One2Many Required Target'
__name__ = 'test.one2many_required.target'
name = fields.Char('Name', required=True)
origin = fields.Many2One('test.one2many_required', 'Origin')
class One2ManyReference(ModelSQL):
'One2Many Reference Relation'
__name__ = 'test.one2many_reference'
name = fields.Char('Name', required=True)
targets = fields.One2Many('test.one2many_reference.target', 'origin',
'Targets')
class One2ManyReferenceTarget(ModelSQL):
'One2Many Reference Target'
__name__ = 'test.one2many_reference.target'
name = fields.Char('Name', required=True)
origin = fields.Reference('Origin', [
(None, ''),
('test.one2many_reference', 'One2Many Reference'),
])
class One2ManySize(ModelSQL):
'One2Many Size Relation'
__name__ = 'test.one2many_size'
targets = fields.One2Many('test.one2many_size.target', 'origin', 'Targets',
size=3)
class One2ManySizeTarget(ModelSQL):
'One2Many Size Target'
__name__ = 'test.one2many_size.target'
origin = fields.Many2One('test.one2many_size', 'Origin')
class One2ManySizePYSON(ModelSQL):
'One2Many Size PYSON Relation'
__name__ = 'test.one2many_size_pyson'
limit = fields.Integer('Limit')
targets = fields.One2Many('test.one2many_size_pyson.target', 'origin',
'Targets', size=Eval('limit', 0))
class One2ManySizePYSONTarget(ModelSQL):
'One2Many Size PYSON Target'
__name__ = 'test.one2many_size_pyson.target'
origin = fields.Many2One('test.one2many_size_pyson', 'Origin')
class Many2Many(ModelSQL):
'Many2Many'
__name__ = 'test.many2many'
name = fields.Char('Name', required=True)
targets = fields.Many2Many('test.many2many.relation', 'origin', 'target',
'Targets')
class Many2ManyTarget(ModelSQL):
'Many2Many Target'
__name__ = 'test.many2many.target'
name = fields.Char('Name', required=True)
class Many2ManyRelation(ModelSQL):
'Many2Many Relation'
__name__ = 'test.many2many.relation'
origin = fields.Many2One('test.many2many', 'Origin')
target = fields.Many2One('test.many2many.target', 'Target')
class Many2ManyRequired(ModelSQL):
'Many2Many Required'
__name__ = 'test.many2many_required'
name = fields.Char('Name', required=True)
targets = fields.Many2Many('test.many2many_required.relation', 'origin',
'target', 'Targets', required=True)
class Many2ManyRequiredTarget(ModelSQL):
'Many2Many Required Target'
__name__ = 'test.many2many_required.target'
name = fields.Char('Name', required=True)
class Many2ManyRequiredRelation(ModelSQL):
'Many2Many Required Relation'
__name__ = 'test.many2many_required.relation'
origin = fields.Many2One('test.many2many_required', 'Origin')
target = fields.Many2One('test.many2many_required.target', 'Target')
class Many2ManyReference(ModelSQL):
'Many2Many Reference'
__name__ = 'test.many2many_reference'
name = fields.Char('Name', required=True)
targets = fields.Many2Many('test.many2many_reference.relation', 'origin',
'target', 'Targets')
class Many2ManyReferenceTarget(ModelSQL):
'Many2Many Reference Target'
__name__ = 'test.many2many_reference.target'
name = fields.Char('Name', required=True)
class Many2ManyReferenceRelation(ModelSQL):
'Many2Many Relation'
__name__ = 'test.many2many_reference.relation'
origin = fields.Reference('Origin', [
(None, ''),
('test.many2many_reference', 'Many2Many Reference'),
])
target = fields.Many2One('test.many2many_reference.target',
'Reference Target')
class Many2ManySize(ModelSQL):
'Many2Many Size Relation'
__name__ = 'test.many2many_size'
targets = fields.Many2Many('test.many2many_size.relation', 'origin',
'target', 'Targets', size=5)
class Many2ManySizeTarget(ModelSQL):
'Many2Many Size Target'
__name__ = 'test.many2many_size.target'
name = fields.Char('Name')
class Many2ManySizeRelation(ModelSQL):
'Many2Many Size Relation'
__name__ = 'test.many2many_size.relation'
origin = fields.Many2One('test.many2many_size', 'Origin')
target = fields.Many2One('test.many2many_size.target', 'Target')
class Many2ManyTree(ModelSQL):
'Many2Many Tree'
__name__ = 'test.many2many_tree'
parents = fields.Many2Many('test.many2many_tree.relation',
'child', 'parent', 'Parents')
children = fields.Many2Many('test.many2many_tree.relation',
'parent', 'child', 'Children')
class Many2ManyTreeRelation(ModelSQL):
'Many2Many Tree Relation'
__name__ = 'test.many2many_tree.relation'
parent = fields.Many2One('test.many2many_tree', 'Parent')
child = fields.Many2One('test.many2many_tree', 'Child')
class Reference(ModelSQL):
'Reference'
__name__ = 'test.reference'
name = fields.Char('Name', required=True)
reference = fields.Reference('Reference', selection=[
(None, ''),
('test.reference.target', 'Target'),
])
class ReferenceTarget(ModelSQL):
'Reference Target'
__name__ = 'test.reference.target'
name = fields.Char('Name', required=True)
class ReferenceRequired(ModelSQL):
'Reference Required'
__name__ = 'test.reference_required'
name = fields.Char('Name', required=True)
reference = fields.Reference('Reference', selection=[
(None, ''),
('test.reference.target', 'Target'),
], required=True)
class Property(ModelSQL):
'Property'
__name__ = 'test.property'
char = fields.Property(fields.Char('Test Char'))
many2one = fields.Property(fields.Many2One('test.char',
'Test Many2One'))
numeric = fields.Property(fields.Numeric('Test Numeric'))
selection = fields.Property(fields.Selection([
(None, ''),
('option_a', 'Option A'),
('option_b', 'Option B')
], 'Test Selection'))
class Selection(ModelSQL):
'Selection'
__name__ = 'test.selection'
select = fields.Selection([
('', ''), ('arabic', 'Arabic'), ('hexa', 'Hexadecimal')],
'Selection')
select_string = select.translated('select')
dyn_select = fields.Selection('get_selection',
'Instance Dynamic Selection')
dyn_select_static = fields.Selection('static_selection',
'Static Selection')
@fields.depends('select')
def get_selection(self):
if self.select == 'arabic':
return [('', '')] + [(str(i), str(i)) for i in range(1, 11)]
else:
return [('', '')] + [(hex(i), hex(i)) for i in range(1, 11)]
@staticmethod
def static_selection():
return [('', '')] + [(str(i), str(i)) for i in range(1, 11)]
class SelectionRequired(ModelSQL):
'Selection Required'
__name__ = 'test.selection_required'
select = fields.Selection([('arabic', 'Arabic'), ('latin', 'Latin')],
'Selection', required=True)
class DictSchema(DictSchemaMixin, ModelSQL):
'Dict Schema'
__name__ = 'test.dict.schema'
class Dict(ModelSQL):
'Dict'
__name__ = 'test.dict'
dico = fields.Dict('test.dict.schema', 'Test Dict')
dico_string = dico.translated('dico')
dico_string_keys = dico.translated('dico', 'keys')
class DictDefault(ModelSQL):
'Dict Default'
__name__ = 'test.dict_default'
dico = fields.Dict(None, 'Test Dict')
@staticmethod
def default_dico():
return dict(a=1)
class DictRequired(ModelSQL):
'Dict Required'
__name__ = 'test.dict_required'
dico = fields.Dict(None, 'Test Dict', required=True)
class Binary(ModelSQL):
'Binary'
__name__ = 'test.binary'
binary = fields.Binary('Binary')
class BinaryDefault(ModelSQL):
'Binary Default'
__name__ = 'test.binary_default'
binary = fields.Binary('Binary Default')
@staticmethod
def default_binary():
return b'default'
class BinaryRequired(ModelSQL):
'Binary Required'
__name__ = 'test.binary_required'
binary = fields.Binary('Binary Required', required=True)
class BinaryFileStorage(ModelSQL):
"Binary in FileStorage"
__name__ = 'test.binary_filestorage'
binary = fields.Binary('Binary', file_id='binary_id')
binary_id = fields.Char('Binary ID')
class Many2OneTarget(ModelSQL):
"Many2One Domain Validation Target"
__name__ = 'test.many2one_target'
_order_name = 'value'
active = fields.Boolean('Active')
value = fields.Integer('Value')
@staticmethod
def default_active():
return True
class Many2OneDomainValidation(ModelSQL):
"Many2One Domain Validation"
__name__ = 'test.many2one_domainvalidation'
many2one = fields.Many2One('test.many2one_target',
'many2one',
domain=[
('value', '>', 5),
])
dummy = fields.Char('Dummy')
class Many2OneOrderBy(ModelSQL):
"Many2One OrderBy"
__name__ = 'test.many2one_orderby'
many2one = fields.Many2One('test.many2one_target', 'many2one')
class Many2OneSearch(ModelSQL):
"Many2One Search"
__name__ = 'test.many2one_search'
many2one = fields.Many2One('test.many2one_target', 'many2one')
class Many2OneTree(ModelSQL):
'Many2One Tree'
__name__ = 'test.many2one_tree'
many2one = fields.Many2One('test.many2one_tree', 'many2one')
class Many2OneMPTT(ModelSQL):
'Many2One MPTT'
__name__ = 'test.many2one_mptt'
many2one = fields.Many2One('test.many2one_mptt', 'many2one',
left='left', right='right')
left = fields.Integer('Left', required=True)
right = fields.Integer('Right', required=True)
@classmethod
def default_left(cls):
return 0
@classmethod
def default_right(cls):
return 0