Odoo Help


Set readonly on a button

Francisco Castro
on 5/16/14, 12:16 PM 4,038 views

Hi guys

I dont know what's going on here I tried to set as readonly two buttons when for example I click on it but this dont work.

I have 5 boolean fields to help and I store the True or False option on a database

I have a funtion to update the fields.


class account_invoice(osv.osv):
    _inherit = 'account.invoice'
    _columns = {
        'impressoori' : fields.boolean('Original ja foi impresso'),
        'impressodupl': fields.boolean('Duplicado Impresso'),
        'impressotri' : fields.boolean('Triplicado ja foi impresso'),
        'impressoall' : fields.boolean('Todas as vias ja foram impressas'),
        'impressoseg' : fields.boolean('Segunda via ja impressa')
    _defaults = {
        'impressodupl': False,
        'impressoori': False,
        'impressotri': False,
        'impressoall': False,
        'impressoseg': False,

def update_field_all(self, cr, uid, ids,context):
        for invoice in self.browse(cr, uid, ids):
             cr.execute("UPDATE account_invoice SET impressoall = True WHERE id = %d" %(invoice.id) )
             cr.execute("UPDATE account_invoice SET impressodupl = True WHERE id = %d" %(invoice.id) )
             cr.execute("UPDATE account_invoice SET impressotri = True WHERE id = %d" %(invoice.id) )
             cr.execute("UPDATE account_invoice SET impressoori = True WHERE id = %d" %(invoice.id) )
             #raise osv.except_osv(_('This is the error title'), _('This is the error message'))
        return True

My Xml file :

record model="ir.ui.view" id="account_invoice_rule_saft_inherit">
            <field name="name">account.invoice.rule.saft.inherit</field>
            <field name="model">account.invoice</field>
            <field name="inherit_id" ref="account.invoice_form"/>
            <field name="arch" type="xml">
        <notebook colspan="4" position="after">
            <!--<button name="%(account.account_invoices)d" position="replace">-->
        <group col="1">
                <field name="impressodupl" nolabel="0" invisible="False" />
                <field name="impressoori" nolabel="0" invisible="False" />
                <field name="impressotri" nolabel="0" invisible="False" />
                <field name="impressoall" nolabel="0" invisible="False" />
          <field name="impressoseg" nolabel="0" invisible="False" />

                  <button name="%(account_invoices_tri_default)d" type="action" string="Triplicado" icon="gtk-print" states="open,paid,proforma,proforma2" attrs="{'readonly':[('impressoall', '=', True)]}"/>

                  <button name="account_invoices_all_default" type="action" string="Todas as Vias" icon="gtk-print" attrs="{'readonly':[('impressoall', '=', True)]}" states="open,paid,proforma,proforma2" />



I don't know if it is possible to set the readonly attribute to a button. Why don't you try to make them invisible instead? If you don't want users to click on buttons, it would be less confusing not to show the buttons at all...


Answering to your question. Working with the invisible attribute might be a little more chalenging (even more if you have a complex condition involving more fields). You have to think this way (it helps me): you previously wanted to lock a button when a condition was true. Now, what you want is to "not show" that same button. So, what you have to do to make it work, is to reverse your previous logic.

This way, where you had `attrs="{'readonly':[('impressoall', '=', True)]}"` you have to deny that and will have `attrs="{'invisible':[('impressoall', '!=', True)]}"` or `attrs="{'invisible':[('impressoall', '=', False)]}"


Yep, you're right! Forgot that you have to remove the `states="open,paid,proforma,proforma2"` part (wich will transform into an 'invisible' attrs) and join that in your attrs declaration. It should look something like

`attrs="{'invisible':['|', ('impressoall', '=', False), ('state', 'not in', ['open','paid','proforma','proforma2'])]}"`

Francisco Castro
On 5/16/14, 12:28 PM

But How? I put ttrs="{'invisible':[('impressoall', '=', True)]}" and it dont work... strange


ok the problem was the state..... It force the buttons apear all the time...

I put the state inside the attrs thx by the way you help me too :)

how did you add the states inside the attrs??

on 7/30/14, 2:11 AM

how did you add the states inside the attrs??

on 7/30/14, 2:11 AM

@alcalinelee, read the final paragraph of my answer above. The `states="some_state` part will be converted into an invisible attribute, so you have to remove it from your button definition and insert it into the attrs part.

Luis Filipe Castanheira
on 8/5/14, 1:35 PM

About This Community

This platform is for beginners and experts willing to share their Odoo knowledge. It's not a forum to discuss ideas, but a knowledge base of questions and their answers.


Odoo Training Center

Access to our E-learning platform and experience all Odoo Apps through learning videos, exercises and Quizz.

Test it now

Question tools

1 follower(s)


Asked: 5/16/14, 12:16 PM
Seen: 4038 times
Last updated: 3/16/15, 8:10 AM