I would like to select and save a group of partners as a many2many field, and then use that field to generate a set of actions. I can get the XML to display and select the partners that i want to save, but i cannot get the m2m field to write in the database. I know that i have to write a create function to save the m2m relationship in my custom module, but i cannot figure out what i am doing wrong.
Can someone please point me to an example of how to write a create function?
I am getting the following error:
Client Traceback (most recent call last):
File "/opt/openerp/web/addons/web/http.py", line 204, in dispatch
response["result"] = method(self, **self.params)
File "/opt/openerp/web/addons/web/controllers/main.py", line 1129, in call_kw
return self._call_kw(req, model, method, args, kwargs)
File "/opt/openerp/web/addons/web/controllers/main.py", line 1121, in _call_kw
return getattr(req.session.model(model), method)(*args, **kwargs)
File "/opt/openerp/web/addons/web/session.py", line 43, in proxy
result = self.proxy.execute_kw(self.session._db, self.session._uid, self.session._password, self.model, method, args, kw)
File "/opt/openerp/web/addons/web/session.py", line 31, in proxy_method
result = self.session.send(self.service_name, method, *args)
File "/opt/openerp/web/addons/web/session.py", line 104, in send
raise xmlrpclib.Fault(openerp.tools.ustr(e), formatted_info)
Server Traceback (most recent call last):
File "/opt/openerp/web/addons/web/session.py", line 90, in send
return openerp.netsvc.dispatch_rpc(service_name, method, args)
File "/opt/openerp/server/openerp/netsvc.py", line 293, in dispatch_rpc
result = ExportService.getService(service_name).dispatch(method, params)
File "/opt/openerp/server/openerp/service/web_services.py", line 626, in dispatch
res = fn(db, uid, *params)
File "/opt/openerp/server/openerp/osv/osv.py", line 188, in execute_kw
return self.execute(db, uid, obj, method, *args, **kw or {})
File "/opt/openerp/server/openerp/osv/osv.py", line 131, in wrapper
return f(self, dbname, *args, **kwargs)
File "/opt/openerp/server/openerp/osv/osv.py", line 197, in execute
res = self.execute_cr(cr, uid, obj, method, *args, **kw)
File "/opt/openerp/server/openerp/osv/osv.py", line 185, in execute_cr
return getattr(object, method)(cr, uid, *args, **kw)
File "/opt/openerp/server/openerp/osv/orm.py", line 4148, in write
for sub_ids in cr.split_for_in_conditions(ids):
File "/opt/openerp/server/openerp/sql_db.py", line 258, in split_for_in_conditions
return tools.misc.split_every(self.IN_MAX, set(ids))
TypeError: unhashable type: 'dict'
How do i properly save a m2m field?
Here is my test code:
m2m_test.py
import netsvc
import tools
import time
from osv import fields
from osv import osv
import pooler
import tools
from tools.translate import _
from base_calendar import base_calendar
import logging
#
#
#
class m2m_test(osv.osv):
_name = "m2m.test"
_description = "Many2Many Test"
_columns = {
'name' : fields.char('M2M Test',size=64,required=True,select="1"),
'partner_id': fields.related('partner_id', select=True, type= 'many2many', relation='res.partner', string='Customer'),
}
_defaults = {
}
def create(self, cr, uid, values, context=None):
if context is None:
context = {}
newid = values
return newid
o2m_test()
m2m_test.xml
<?xml version="1.0"?>
<openerp>
<data>
<menuitem name="Many2Many TEST" id="menu_m2m_test_main" parent="base.menu_config"/>
<record model="ir.ui.view" id="view_m2m_test_form">
<field name="name">m2m.test.form</field>
<field name="model">m2m.test</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Many 2 Many Test" version="7.0">
<sheet>
<group>
<field name="name"/>
</group>
<group>
<field name="partner_id" widget="many2many">
<tree>
<field name="name"/>
<field name="fax"/>
</tree>
</field>
</group>
</sheet>
</form>
</field>
</record>
<record model="ir.ui.view" id="view_m2m_test_tree">
<field name="name">m2m.test.tree</field>
<field name="model">m2m.test</field>
<field name="type">form</field>
<field name="arch" type="xml">
<tree string="Many2 Many Test" >
<field name="name"/>
</tree>
</field>
</record>
<record model="ir.actions.act_window" id="action_m2m_test_form">
<field name="name">Many 2 Many Test</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">m2m.test</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="auto_refresh">20</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to define a new Many2Many Test
</p>
</field>
</record>
<menuitem name="Many 2 Many Test"
id="menu_m2m_test_form"
parent="menu_m2m_test_main"
action="action_m2m_test_form"/>
</data>
</openerp>