0
votes

I am trying to add a custom field to Odoo 9 res.partner model using module. I have used scoffold command to generate the module files and added following code to models.py and views.xml.

models/models.py

from openerp import models, fields, api
class SeicoPartner(models.Model):
    _name  = 'res.partner'
    _inherit  = 'res.partner'

   no_of_ac = fields.Integer('No of AC', default=0)
   review = fields.Char('Company Review')

views/views.xml

<openerp>
<data>
    <record id="res_partner_field_ac" model="ir.ui.view">
        <field name="no_of_ac">10</field>
    </record>
</data>
</openerp>

Upon installation of this module from Apps screen, I got the following error:

Traceback (most recent call last):
  ...
  File "C:\Program Files (x86)\Odoo 9.0-20160719\server\openerp\addons\base\ir\ir_ui_view.py", line 344, in create
ParseError: "arch" while parsing file:///C:/Program%20Files%20(x86)/Odoo%209.0-20160719/server/openerp/addons/mymodule1/views/views.xml:4, near
<record id="res_partner_field_ac" model="ir.ui.view">
            <field name="no_of_ac">10</field>

        </record>

From the Settings -> Database Structure -> Fields I can see that res.partner has the no_of_ac field, but the field is not visible while editing any customer details.

3

3 Answers

1
votes

That's because you're missing the arch field with describes the type of view (either xml or html), in most cases xml is just fine,

You're also missing the model name, the view name, so odoo doesn't know which model your view belongs to. you also have to specify the existing model form you want to over-ride and the position where you want the new field to be, in this case i used an xpath expression to display the field after the website field in the parent view, it can be anywhere you want it to be.

<openerp>
<data>
    <record id="res_partner_field_ac" model="ir.ui.view">
      <field name="name">res.partner.form</field>
      <field name="model">res.partner</field>
      <field name="inherit_id" ref="base.view_partner_form"/>
      <field name="arch" type="xml">
        <xpath expr="//field[@name='website']" position="after">
          <field name="no_of_ac" />
        </xpath>
      </field>
    </record>
</data>
</openerp>

also you don't need to specify _name if you just want to extend a model and add extra fields to it, so change your model code to this

from openerp import models, fields, api
class SeicoPartner(models.Model):
    _inherit  = 'res.partner'

   no_of_ac = fields.Integer('No of AC', default=0)
   review = fields.Char('Company Review')
1
votes

If you want to add a data record you should use res.partner as model and define the required fields:

<record id="res_partner_field_ac" model="res.partner">
    <field name="no_of_ac">10</field>
    <field name="name">NEW PARTNER NAME</field>
    <!-- define required fields -->
</record>

To define a view, take a look at Odoo views

1
votes

You are inserting a new record in ir.ui.view data model.

<openerp>
<data>
    <record id="res_partner_field_ac" model="ir.ui.view">
        <field name="no_of_ac">10</field>
    </record>
</data>
</openerp>

But you want to insert data to : res.partner

<openerp>
<data>
    <record id="res_partner_field_ac" model="res.partner">
        <field name="name">a name here because it's required when the field type != 'contact' </field>
        <field name="no_of_ac">10</field>
    </record>
</data>
</openerp>

NOTE :you encountered a problem because arch is a requrired field inir.ui.view model.