Search code examples
pythonapiodooodoo-11zohobooks

One record in Many2one field having another multiple records in Many2one field in Odoo


Using python requests, I have requested an API form Zoho:

tags = requests.get('https://books.zoho.com/api/v3/setting/tags?organization_id=xx&authtoken=xxx').json()

which return this data:

 "reporting_tag": {
    "tag_id": "1717893000000000335",
    "tag_name": "division",
    "associated_with": "item",
    "is_active": true,
    "status": "active",
    "tag_options": [
        {
            "tag_option_id": "1717893000000123005",
            "tag_option_name": "A",
            "is_active": true,
            "status": "active"
        },
        {
            "tag_option_id": "1717893000000123003",
            "tag_option_name": "B",
            "is_active": true,
            "status": "active"
        },
        {
            "tag_option_id": "1717893000000123007",
            "tag_option_name": "C",
            "is_active": true,
            "status": "active"
        }
    ]  

from the above result, I need to store the (tag_name) and its (tag_option_name). The API may result hundreds of tag_names and their tag_name_options.

so far I have defined Many2one field to store only the tag_name:

x_tag_name = fields.Many2one('zoho.tags', string="Tag Name")

so what I want to do is when I select a tag_name all its tag_option_name should appear in another Many2one field. Similar to one parent having multiple children. I do not know if it is possible or not, I hope you can help me to do similar scenario.

class ZohoTags(models.Model):

  _name = 'zoho.tags'

  name = fields.Char(string="Tags") 
  tag_options = fields.Char(string='Options')
  tag_id = fields.Char(string="Tag Id")

  @api.multi
  def tags_get(self):
      token = ''  
      org_id = ''

      setting_values = self.env['ir.config_parameter'].search([])
      for keys in setting_values:
        if keys.key == 'account.zoho_authtoken_module':
           token = keys.value
           print(keys.value)
        if keys.key == 'account.zoho_organization_module':
           org_id = keys.value
           print(keys.value)


      tags = requests.get('https://books.zoho.com/api/v3/settings/tags?organization_id=xxx&authtoken=xxx').json()
      for data in tags['reporting_tags']:
        tag_name = '%s' % (data['tag_name'])
        tag_ids = '%s' % (data['tag_id'])
        self.env.cr.execute("INSERT INTO zoho_tags (name, tag_id) VALUES ('%s', '%s')" % (tag_name, tag_ids))
        self.env.cr.commit()
        print(tag_name)

class TagsLine(models.Model):

  _name = 'zoho.tags.line'

  x_tag_name = fields.Many2one('zoho.tags', string='Analytic Account')
  x_tags_options = fields.Char(string='Tags Option', related="x_zoho_tags.tag_options")
  rules_id = fields.Many2one('hr.salary.rule')

Solution

  • Yeah your target is certainly achievable.

    so what I want to do is when I select a tag_name all its tag_option_name should appear in another Many2one

    Your tag_option_name, let's suppose the model for this data is zoho.tags.line, will have a Many2one relation tag_id with zoho.tags, not the other way around. zoho.tags will have a reverse One2many relationship tag_option_ids with the zoho.tags.line, with inverse_key set to tag_id. So, for every zoho.tags record, you will get multiple zoho.tags.line record from the field tag_option_ids, which can be shown in tree/list within form view.

      _name = 'zoho.tags'
    
      name = fields.Char(string="Tags") 
      tag_option_ids = fields.One2many(zoho.tags.line, tag_id, string='Options')
      tag_id = fields.Char(string="Tag Id")
    
    
    
      _name = 'zoho.tags.line'
    
      tag_id = fields.Many2one('zoho.tags', string='Analytic Account')
      x_tags_options = fields.Char(string='Tags Option', related="x_zoho_tags.tag_options")
      rules_id = fields.Many2one('hr.salary.rule')