Shridhar Ivani
Shridhar Ivani

Reputation: 467

domain filter for many2one fields in odoo?

Below code is asset inherited class . Here i will add 'place' field with 'Karn/Bang/Kengeri' and 'karn/bang/malleshwaram' for 'Karn/Bang/Kengeri' will add 'asset_catg_id' with A and B. then for 'karn/bang/malleshwaram' with Y and Z.

Now at calander inherited class . if i select 'place' with 'Karn/Bang/Kengeri' then next field 'asset_catg_id' i have to get only A and B drop down list. if again 'karn/bang/malleshwaram' then i have to get only Y,Z options . and previous selected 'asset_catg_id' values should get deleted . i have tried with domain filter option got keyvalue error

class asset_asset(osv.osv):
    _inherit = "asset.asset"
    #_name = "asset_asset"
    _rec_name= "folio_num"
    _columns = {
        'name': fields.char('Asset Name', size=64),
        'place': fields.many2one('asset.parentlocation', 'Location'),
        'asset_catg_id' : fields.many2one('asset.catg', 'Asset Catg Selection', select=True, required=True),}

class asset_catg(osv.Model): 
    _name="asset.catg" 
    _rec_name='name1'
    _description="Define Asset Catgs" 
    _columns={ 'name1':fields.char('Asset Catg Names',size=64,required=True),}
asset_catg()
class asset_parentlocation(osv.osv):
    _name="asset.parentlocation"
    _rec_name="location_name"
    _columns = {
        'location_name' : fields.char('Asset Location', required=True),
        'parent_location' : fields.many2one('asset.parentlocation','Parent Location'),
        'nameee':fields.many2one('ir.attachment','Attachments'),}

    def name_get(self, cr, uid, ids, context=None):
        if context is None:
            context = {}
        if not ids:
            return []
        reads = self.read(cr, uid, ids, ['location_name','parent_location'], context=context)
        res = []
        for record in reads:
            name = record['location_name']
            if record['parent_location']:
                name = record['parent_location'][1]+' / '+name
            res.append((record['id'], name))
        return res



**Following code is calendar inherited class** 


class calendar_event(osv.osv):

    _inherit = "calendar.event"
    _rec_name = 'number'

    _columns = {
            'number' : fields.char('Meeting ID',readonly=1),
            #'place' : fields.many2one('stock.location','Substation Location',),

            'place' : fields.many2one('asset.parentlocation','Substation Location',),
            #'location' : fields.selection(STATUS_SELECTION,'Location',  default='Board A'),
            'asset_catg_id' : fields.many2one('asset.catg','Asset Catg Selection', domain="[('asset_catg_id', '=',place)]"),}

Upvotes: 3

Views: 16451

Answers (1)

Andrius
Andrius

Reputation: 21108

First your domain is wrong in a principle. Domain is what is "inside" a field, in other words in its model (for example field name or id in asset.catg model). So you should fix that one first.

If domain depends on another field, you can use onchange method to return domain (used placeholder place_id). Like this:

@api.onchange('place')
def onchange_place(self):
    res = {}
    if self.place:
        res['domain'] = {'asset_catg_id': [('place_id', '=', self.place.id)]}
    return res

P.S. This is example with new v8 api, but same principle applies to old api (you then don't nee to use decorator, also add cr, uid, ids on method and call it through your view. All of this not needed for new api). As it looks like you are still developing on old api.

Update For old api:

def onchange_place(self,cr, uid, ids, place, context=None):
    res = {}
    if self.place: #on old api it will return id, instead of record
        res['domain'] = {'asset_catg_id': [('place_id', '=', self.place)]}
    return res

And then in your view (don't know what kind of view you are using):

<field name="place" on_change="onchange_place(place)"/>

Still you need to define some field in asset.catg so it would be used to match place field. For example:

'place_id': fields.many2one('asset.parentlocation', 'Place')

And then when you define asset category, you set which Place it should belong to. Then when you choose place calendar.event, onchange method will set domain on asset_catg_id field correctly.

Upvotes: 11

Related Questions