Search code examples
odooodoo-12

How to have a compute field's value in domain action of a smart-button


In my model i've a compute field that give the ID of the active contract of this user :

id_ultimo_contratto = fields.Integer(compute="_compute_last_contratto", store=True)

this is the function that i use to calculate the id (and it's correct i've the right value) :

@api.multi
@api.depends()
def _compute_last_contratto(self):
    id_utenza=self.id
    contratto_attivo = ''   
    for AttivitaSvoltaEE in self.env['utilitypower.attivitasvolta_ee'].search([('id_utenza_ee','=',id_utenza)]):
        id_attivita = AttivitaSvoltaEE.id
        for Contratto in self.env['utilitypower.contratti_ee'].search([('attivitasvolte_ids','=',id_attivita)]):
            if Contratto.stato==1:
               #find it :
               id_contratto_attivo = Contratto.id
               id_ultima_attivita = id_attivita
               contratto_attivo=Contratto.nome_contratto               
    for UtenzeEE in self:
        UtenzeEE.last_contratto = contratto_attivo
        UtenzeEE.id_ultimo_contratto = id_contratto_attivo
        UtenzeEE.id_ultima_attivita = id_ultima_attivita

I use this id in a smart-button and i want to open the view of the contract with an action linked at the smart-button :

<button class="oe_stat_button" 
         icon = "fa-file-text-o" 
         type = "action" 
         name="action_view_contrattoattivo_ee" 
         options="{}"> 
            <span><field name="id_ultimo_contratto"/></span> 
</button>

The problem is that i can't understand how to pass the id_ultimocontratto field_value in the domain/context of the action:

<act_window id="action_view_contrattoattivo_ee" 
            name="Contratto Attivo"
            res_model="utilitypower.contratti_ee"
            view_type="tree,form"
            view_mode="tree"
            domain="[]"
/>

How do I pass the calculated field into the domain? and how i can refer to the id (odoo) of the final model?


Solution

  • You can use the below button code

    <button class="oe_stat_button" 
         icon = "fa-file-text-o" 
         type = "object" 
         name="action_view_contrattoattivo_ee" 
         options="{}"> 
            <span><field name="id_ultimo_contratto"/></span> 
    

    in the py file write below code

          @api.multi
          def action_view_contrattoattivo_ee(self):
    
            action = self.env.ref('module_name.action_view_contrattoattivo_ee')
            result = action.read()[0]
            result['domain'] = domain
            return result
    

    module_name: It should be the module in which you have written the action. domain: domain you want to specify.

    You can give the integer field non store as below:

    id_ultimo_contratto = fields.Integer(compute="_compute_last_contratto")
    
    @api.multi
    def _compute_last_contratto(self):
        id_utenza=self.id
        contratto_attivo = ''   
        for AttivitaSvoltaEE in self.env['utilitypower.attivitasvolta_ee'].search([('id_utenza_ee','=',id_utenza)]):
            id_attivita = AttivitaSvoltaEE.id
            for Contratto in self.env['utilitypower.contratti_ee'].search([('attivitasvolte_ids','=',id_attivita)]):
                if Contratto.stato==1:
                   #find it :
                   id_contratto_attivo = Contratto.id
                   id_ultima_attivita = id_attivita
                   contratto_attivo=Contratto.nome_contratto               
        for UtenzeEE in self:
            UtenzeEE.last_contratto = contratto_attivo
            UtenzeEE.id_ultimo_contratto = id_contratto_attivo
            UtenzeEE.id_ultima_attivita = id_ultima_attivita
    

    Please be informed that, if you are calling any action through button, you have to write the code as below

    <button class="oe_stat_button" 
         icon = "fa-file-text-o" 
         type = "action" 
         name="%(action_view_contrattoattivo_ee)d" 
         options="{}"> 
            <span><field name="id_ultimo_contratto"/></span>