71
75
value = Target(value)
72
76
assert isinstance(value, (Target, NoneType))
73
77
super(Many2One, self).__set__(inst, value)
80
def sql_format(value):
81
if isinstance(value, (Query, Expression)):
85
assert value is not False
89
db_type = CONFIG['db_type']
90
if db_type == 'postgresql':
91
return SQLType('INT4', 'INT4')
92
elif db_type == 'mysql':
93
return SQLType('SIGNED INTEGER', 'BIGINT')
95
return SQLType('INTEGER', 'INTEGER')
97
def convert_domain_child_mptt(self, domain, tables):
98
cursor = Transaction().cursor
99
table, _ = tables[None]
100
name, operator, ids = domain
101
red_sql = reduce_ids(table.id, ids)
102
left = Column(table, self.left)
103
right = Column(table, self.right)
104
cursor.execute(*table.select(left, right, where=red_sql))
106
for l, r in cursor.fetchall():
107
where.append((left >= l) & (right <= r))
108
expression = table.id.in_(table.select(table.id, where=where))
109
if operator == 'not child_of':
113
def convert_domain_child(self, domain, tables):
114
Target = self.get_target()
115
table, _ = tables[None]
116
name, operator, ids = domain
121
children = Target.search([
125
child_ids = get_child([c.id for c in children])
126
return ids + child_ids
127
expression = table.id.in_(ids + get_child(ids))
128
if operator == 'not child_of':
132
def convert_domain(self, domain, tables, Model):
133
Target = self.get_target()
134
table, _ = tables[None]
135
name, operator, value = domain[:3]
136
column = Column(table, name.split('.', 1)[0])
138
if operator in ('child_of', 'not child_of'):
140
query = Target.search([(domain[3], 'child_of', value)],
141
order=[], query=True)
142
expression = column.in_(query)
143
if operator == 'not child_of':
147
if isinstance(value, basestring):
148
targets = Target.search([('rec_name', 'ilike', value)],
150
ids = [t.id for t in targets]
151
elif not isinstance(value, (list, tuple)):
156
expression = column.in_([None])
157
if operator == 'not child_of':
160
elif self.left and self.right:
161
return self.convert_domain_child_mptt(
162
(name, operator, ids), tables)
164
return self.convert_domain_child(
165
(name, operator, ids), tables)
167
if not isinstance(value, basestring):
168
return super(Many2One, self).convert_domain(domain, tables,
171
target_name = 'rec_name'
173
_, target_name = name.split('.', 1)
174
target_domain = [(target_name,) + tuple(domain[1:])]
175
if 'active' in Target._fields:
176
target_domain.append(('active', 'in', [True, False]))
177
query = Target.search(target_domain, order=[], query=True)
178
return column.in_(query)
180
def convert_order(self, name, tables, Model):
181
if getattr(Model, 'order_%s' % name, None):
182
return super(Many2One, self).convert_order(name, tables, Model)
184
Target = self.get_target()
187
if Target._rec_name in Target._fields:
188
oname = Target._rec_name
189
if Target._order_name in Target._fields:
190
oname = Target._order_name
192
ofield = Target._fields[oname]
193
table, _ = tables[None]
194
target_tables = tables.get(name)
195
if target_tables is None:
196
target = Target.__table__()
198
None: (target, target.id == Column(table, name)),
200
tables[name] = target_tables
201
return ofield.convert_order(oname, target_tables, Target)