I tried to used negative index -1
(....)
housing_conditions = fields.One2Many('gnuhealth.housing','du',
'Housing Conditions')
critical_housing = fields.Function(fields.Boolean('Vivienda Critica'),
'get_critical_housing',searcher='search_critical_housing')
@classmethod
def search_critical_housing(cls,name,clause):
res = []
value = clause[2]
if(cls.housing_conditions._get_size()!=0):
this_one = cls.housing_conditions[-1].critical_housing
res.append(('this_one',clause[1],value))
return res
(....)
And gave me this error:
(...)
File "/trytond/model/modelsql.py", line 1146, in convert
expression = field.convert_domain(domain, tables, cls)
File "/trytond/model/fields/function.py", line 64, in convert_domain
return getattr(Model, self.searcher)(name, domain)
File "/trytond/modules/z_DU/health.py", line 46, in search_critical_housing
this_one = cls.housing_conditions[-1].critical_housing
TypeError: 'One2Many' object does not support indexing
(...)
I could solved with this
@classmethod
def search_critical_housing(cls, name, clause):
cursor = Transaction().cursor
pool = Pool()
DomiciliaryUnit = pool.get('gnuhealth.du')
HousingConditions = pool.get('gnuhealth.housing')
cursor.execute('SELECT
du.id '
'FROM "' + DomiciliaryUnit._table + '" du '
'INNER JOIN ( '
'SELECT DISTINCT ON (du) du, critical_housing '
'FROM "' + HousingConditions._table + '" '
'ORDER BY du, id DESC '
') last_hc '
'ON
du.id = last_hc.du '
'WHERE last_hc.critical_housing = TRUE')
has_critical_housing = cursor.fetchall()
field, op, operand = clause
if (op, operand) in (('=', True), ('!=', False)):
return [('id', 'in', has_critical_housing)]
elif (op, operand) in (('=', False), ('!=', True)):
return [('id', 'not in', has_critical_housing)]
else:
return []
Thanks anyway :) !!!
Francisco