Search code examples
pythonconfigurationsettingsodoo-12

How can i create a setting page (alike general setting) in odoo- witj Many2one relation


I want to create a page look like general setting page in odoo and i have found that I have to use TransientModel class but I have so many fields with many2one relation that is forbidden with TransientModel

I have used TransientModel class but i got error because I used Many2one relation in my code

<record id="your_configuration" model="ir.ui.view">
    <field name="name">Your configuration</field>
    <field name="model">matab.settingtag</field>
    <field name="arch" type="xml">
        <form string="Your configuration" class="oe_form_configuration">
            <header>
                <button string="Save" type="object"
                    name="execute" class="oe_highlight"/>
                or
                <button string="Cancel" type="object"
                    name="cancel" class="oe_link"/>
            </header>
            <group string="Company">
            <!--<label for="id" string="Name &amp; Phone"/>-->
                <div>
                    <div>
                        <field name="active_units"/>
                    </div>
                    <div>
                        <field name="doctor_working_hour_time_control"/>
                    </div>
                </div>
            </group>
        </form>
    </field>
</record>

I want a setting page that open directly and save correctly look like general setting in odoo- i have to use many2one relation in my modules


Solution

  • The Way Odoo 12 handles this is to create the fields on the company_id, then create a related field in the settings.

    class ResCompany(models.Model)
        _inherit = 'res.company'
    
       many2one_field = fields.Many2one('related.model', 'Field Name')
       #Edit for non many2one field setting
       related_default_value_duration = fields.Float(string='Duration', default=0.25)
    
       @api.model
    def get_values(self):
        res = super(ResConfigSettings, self).get_values()
        res['related_default_value_duration'] = float(self.env['ir.config_parameter'].sudo().get_param('settingtag.related_default_value_duration', default=0.25))
        return res
    
    @api.model
    def set_values(self):
        self.env['ir.config_parameter'].sudo().set_param('settingtag.related_default_value_duration', self.max_time)
        super(ResConfigSettings, self).set_values()      
    
    
    
    class ResConfigSettings(models.TransientModel):
        _inherit = 'res.config.settings'
    
        many2one_field = fields.Many2one('related.model', 'Field Name', related='company_id.many2one_field')
    

    Then you should be able to add it to your settings view.

    <?xml version="1.0" encoding="utf-8"?>
    <odoo>
      <!-- Add in configuration items -->
      <record id="res_config_view_name_form" model="ir.ui.view">
        <field name="name">res.config.view.name.form</field>
        <field name="model">res.config.settings</field>
        <field name="inherit_id" ref="base.res_config_settings_view_form" />
        <field name="arch" type="xml">
          <xpath expr="//div[hasclass('settings')]" position="inside">
            <div class="app_settings_block" data-string="Module Name" string="Module Name" data-key="module_name" groups="">
              <h2>Title of Group of Settings</h2>
              <div class="row mt16 o_settings_container">
                <div class="col-12 col-lg-12 o_setting_box">
                  <div class="o_setting_right_pane">
                    <span class="o_form_label">Field Name</span>
                    <div>
                    <field name="many2one_field " class="oe_inline"/>
                  </div>
                </div>
              </div>
            </div>
          </xpath>
        </field>
      </record>
    </odoo>
    

    Please note that "module_name" needs to be the name of the directory (same as in an external id for a view)

    *****IMPORTANT*****

    Please note that if you are running in Multi Company these fields will need to be set for each company individually.