Tessnim
Tessnim

Reputation: 453

How to allow only create option in many2one field

How can I hide all the items from the many2one field. I want to allow the user only to create a new payment term. We have this code in account module in account_invoice.py:

class AccountInvoice(models.Model):
    _name = "account.invoice"
    payment_term_id = fields.Many2one('account.payment.term', 
                                       string='Payment Terms', 
                                       oldname='payment_term',
                                       readonly=True, 
                                       states={'draft': [('readonly', False)]})

In account_invoice_view.xml we have:

<field name="payment_term_id" 
       options="{'no_create': True}" 
       attrs="{'invisible': [('payment_term_id','=',False)]}"/>

I tried this code {'no_open':True} but it didn't work.

Upvotes: 0

Views: 2235

Answers (2)

Charif DZ
Charif DZ

Reputation: 14721

I think you going to find this solution good for you:

what is suggest is add a field to your model this field is many2many field contains the list of payment_term_id that are created in the current record.

 # this field is for technical purpose 
 create_payment_terms_ids = fields.Many2many(co_model='account.payment.term',
                                             relation='created_payment_rel',
                                             column1= 'invoice_id',
                                             column2= 'paymen_id',
                                             string='Created payment terms')

After this use onchange method to keep track of created payments and add the new Payment terms to this field

@api.onchange('payment_term_id')
def onchange_payment_terms(self):
    """ keep track of created payment from the current
        invoice and show only them in drop down list."""
    if self.payment_term_id:
        # keep list of old ids here
        payment_ids = self.create_payment_terms_ids and self.create_payment_terms_ids.ids or []
        # check if list payment is empty this means that this is the first created payment
        # second check if the selected payment is a new payment that is created 
        # if one of the two is true add the selected value to the list of payment
        if not self.create_payment_terms_ids or self.payment_term_id.id not in payment_ids:
            payment_ids.append(self.payment_term_id.id)
            self.create_payment_terms_ids = [(4, self.payment_term_id.id)]

        # if list is not empty we change the domain to show only payment that exist in the list
        # else we use a special domain to show empty set.
        domain = payment_ids and [('payment_term_id', 'in', payment_ids)] or [('id', '=', -1)]
        return {'domain': {'payment_term_id': domain}}

In your view add the new field with visible = "1" you don't the user to see it's value. you need to put it in the view because you need it's value in onchange event if you don't put it your many2many field will always be empty.

       <field name="create_payment_terms_ids" invisible="1"/>

and remove options="{'no_create':False}" this will remove the create and edit option in the drop down and you don't want that.

Note: when you are in development remove invisible="1" to see if the many2many field contains the list of payment that you have created.

Upvotes: 1

ChesuCR
ChesuCR

Reputation: 9640

If you want to hide all the elements on the list try adding a domain that is always False:

<field name="id" />
<field name="payment_term_id" 
       domain="[('id', '=', -1)]"
       attrs="{'invisible': [('payment_term_id','=',False)]}"/>

With options="{'no_create': True}" you get the opposite of what you want if I understood well

Upvotes: 1

Related Questions