Smith Smith - 6 months ago 347
Python Question

How to Chage selection field automaticaly in odoo

Hi I'm working on Odoo 8 and i am a beginner, I have a view that contains a set of combo-box type fields and a selection field. I want to make a test on the combo-box fields and if there are all checked then the selection field value should change. Here is what i have so far:

def get_etat_dossier(self,cr,uid,ids,args,fields,context=None):
res = {}
for rec in self.browse(cr,uid,ids):

if rec.casier_judiciare==True: # test field if = true
res[rec.id]= 02 # field etat_dos type selection = Dossier Complet
else:
res[rec.id] = 01

return res



_columns= {

'casier_judiciare' : fields.boolean('Casier Judiciaire'), # field to test

'reference_pro' : fields.boolean('Réferences Professionnelles'),
'certificat_qual' : fields.boolean('Certificat de qualification'),
'extrait_role' : fields.boolean('Extrait de Role'),
'statut_entre' : fields.selection([('eurl','EURL'),('sarl','SARL')],'Statut Entreprise'),
'etat_dos': fields.selection([('complet','Dossier Complet'),('manquant','Dossier Manquant')],'Etat De Dossier'), # field ho change after test
}


enter image description here

Here is the code for my view

<group col='4' name="doss_grp" string="Dossier de Soumission" colspan="4" > <field name="casier_judiciare"/>
<field name="certificat_qual"/>
<field name="extrait_role"/>
<field name="reference_pro"/>
<field name="statut_entre" style="width:20%%"/>
<field name="etat_dos"/>
</group>

Answer

Add an onchange attribute to the casier_judiciare field and then pass all the other fields you want to check as arguments to the method like this

<group col='4' name="doss_grp" string="Dossier de Soumission" colspan="4" >
    <field name="casier_judiciare" on_change="onchange_casier_judiciare(casier_judiciare, certificat_qual, extrait_role, reference_pro)"/> 
    <field name="certificat_qual"/> 
    <field name="extrait_role"/> 
    <field name="reference_pro"/> 
    <field name="statut_entre" style="width:20%%"/> 
    <field name="etat_dos"/> 
</group>

In your model file define the method like this and use an if statement to check if they're all True (That means they have all been checked), if so then you can return a dictionary with any value you want for the selection field, in this case etat_dos will change to Dossier Complet

def onchange_casier_judiciare(self, cr, uid, ids, casier_judiciare, certificat_qual, extrait_role, reference_pro, context=None):
    if casier_judiciare and certificat_qual and extrait_role and reference_pro: # if they're all True (that means they're all checked):
        values = {'value': {'etat_dos': 'complet'}} #set the value of etat_dos field

        return values

Note that the onchange is only triggered on the casier_judiciare field but you can also set onchange on other fields and it should work just fine