Ir al contenido
Menú
Se marcó esta pregunta
1 Responder
2330 Vistas

Buenos dias, tardes, noches, tengo un problema al intentar poner un campo de la tabla con la que se relacion el One2many. Tengo el siguiente código:


class Item(models.Model):
_name = "sst.item"

cycle_id = fields.Many2one('sst.cycle', string="Ciclo")
standard_id = fields.Many2one('sst.standard', string="Estándar")
substandard_id = fields.Many2one('sst.substandard', string="Subestándar")
literal = fields.Char(string="Literal")
weight = fields.Float(string="Peso")
description = fields.Text(string="Descripción")
legal_frame = fields.Text(string="Marco Legal")
criterion = fields.Text(string="Criterio")
verification = fields.Text(string="Verificación")

plan_evaluation_id = fields.Many2one('sst.initial.evaluation.by.cycles')
do_evaluation_id = fields.Many2one('sst.initial.evaluation.by.cycles')
verify_evaluation_id = fields.Many2one('sst.initial.evaluation.by.cycles')
act_evaluation_id = fields.Many2one('sst.initial.evaluation.by.cycles')

cycle_name = fields.Char(related='cycle_id.cycle', string="Ciclo")
standard_name = fields.Text(related='standard_id.description', string='Estándar')
substandard_name = fields.Text(related='substandard_id.description', string='SubEstándar')

def test(self):
# Buscar si ya existe una evaluación para este ítem y ciclo específico
evaluation = self.env['sst.item.evaluation'].search([
('item_id', '=', self.id),
('evaluation_id', '=', self.plan_evaluation_id.id)
# Filtrar por evaluación del año en curso
], limit=1)

if evaluation:
view_mode = 'form'
res_id = evaluation.id
else:
view_mode = 'form'
res_id = None # No se asigna ID para crear uno nuevo

return {
'type': 'ir.actions.act_window',
'name': 'Evaluación del Ítem',
'res_model': 'sst.item.evaluation',
'view_mode': view_mode,
'view_id': self.env.ref('sst.view_item_evaluation_form').id,
'target': 'new',
'res_id': res_id,
'context': {
'default_item_id': self.id,
'default_evaluation_id': self.plan_evaluation_id.id,
# Establecer el evaluation_id al actual
'default_item_weight': self.weight,
}
}


class ItemEvaluation(models.Model):
_name = "sst.item.evaluation"
_description = "Evaluación del Ítem"

item_id = fields.Many2one('sst.item', string="Ítem")
evaluation_id = fields.Many2one('sst.initial.evaluation.by.cycles', string="Evaluación por Ciclos")
date = fields.Date(string="Fecha", default=fields.Date.context_today)

compliance = fields.Selection(
selection=[],
string="Cumplimiento"
)

applies = fields.Selection([
('aplica', 'Aplica'),
('no_aplica', 'No Aplica')
], string="Aplica", default='aplica')

responsible = fields.Char(string="Responsable")
observation = fields.Text(string="Observación")

De acá lo importante es el modelo

sst.item.evaluation

El cual tiene un campo Many2One con sst.item, y sst.item tiene varios campos entre ellos weight

item_id = fields.Many2one('sst.item', string="Ítem")


Lo que yo deseo hacer es que en el compliance una de las opciones del selection sea el campo weight del modelo sst.item. Quiero hacer algo asi:


compliance = fields.Selection([
('weight', item_id.weight),
​], string="Cumplimiento"
)


Pero no he logrado conseguirlo. Me ayudarían mucho, gracias

Avatar
Descartar
Mejor respuesta

Hi,


Using a dynamic value like item_id.weight directly in the Selection field definition isn't possible, as the Selection options are static. However, you can add a related field to get the weight from the related sst.item:

related_item_weight = fields.Float(related='item_id.weight', string="Item Weight")


Keep the compliance field as a Selection field with static options:

compliance = fields.Selection([

    ('weight', 'Weight'),

    ('option1', 'Option 1'),

    ('option2', 'Option 2'),

], string="Cumplimiento")

Add more options as needed instead of option 1 and option 2.


Use a computed field to get the value according to the selected compliance:

compliance_value = fields.Float(string="Compliance Value", compute='_compute_compliance_value', store=True)


@api.depends('compliance', 'related_item_weight')

    def _compute_compliance_value(self):

        for record in self:

            if record.compliance == 'weight':

                record.compliance_value = record.related_item_weight

            else:

                record.compliance_value = 0.0  # or any other default


Also, update your views to include the compliance_value field.


Hope it helps

Avatar
Descartar
Publicaciones relacionadas Respuestas Vistas Actividad
2
abr 24
1622
1
abr 24
2186
2
sept 24
1555
2
jul 24
2166
0
may 24
951