Search code examples
pythonodoo

add many2many and one2many record through python code -Odoo 12 / Python 3.7


i am stuck since a couple of days in some many2many and one2many field i am trying to add value to through code. The idea is to consume a web service to get some data from a third party website and re-use these same data in my odoo 12 modules. I was able to parse the JSON request and create entities using model.Models. However, for fields using one2many or many2many i was unable to add their values and link them to my models. Here is my python code. What i want to achieve is after the creation of a record "book.db" i want to also create its category in the same time and link it to the current record. However everytime i run the code only the "book.db" model is created. The category model is never made nor linked. Can someone point me to the right direction or correct my code if possible. Thanks alot.

from odoo import models, fields, api
from . import prestashopproduct
import requests
import json


class Book(models.Model):
    _name = "book.db"

    prestashop_id = fields.Integer('Prestashop ID')
    title = fields.Char(string="book title")
    ean13_code = fields.Char(string="EAN13")
    author = fields.Char(string="book author")
    released = fields.Date(string="Date de publication")
    type = fields.Selection([('Numérique', 'Numérique'), ('Papier', 'Papier')], string="type")
    catalog = fields.Char(string="catalogue")
    collection = fields.Char(string="collection")
    isbn = fields.Char(string="Numero ISBN")
    description = fields.Html("Description")
    distributeur = fields.Char(string="Distribiteur")
    code_distribiture = fields.Char(string="Code distribiteur")
    code_collection = fields.Char(string="Code collection")
    code_dispo = fields.Char(string="Code dispo")
    code_tva1 = fields.Integer("Code tva1")
    code_tva2 = fields.Integer("Code tva2")
    presentation = fields.Html("Presentation")
    type_produit = fields.Char(string="Type de produit")
    theme_edilectre = fields.Char(string="Type de produit")
    categorie = fields.Html("categorie")
    poid = fields.Float("Poid en Gramme")
    prix = fields.Float("Prix")
    largeur = fields.Float("Largeur en MM")
    epaisseur = fields.Float("Epaisseur en MM")
    hauteur = fields.Float("Hauteur en MM")
    image = fields.One2many('product.images', 'product_id', string='Imags du produit')
    cate = fields.Many2many('product.cetegorie', 'product_id', string='Imags du produit')
    image_product = fields.Char("Image")

    @api.one
    def get_books(self):
        jso = prestashopproduct.Product.get_full_stock(self=prestashopproduct.Product())
        for j in jso['products']:
            if self.check_unicity(j['id']):
                book = [{'title': j['name'][1]['value'],
                         'ean13_code': j['ean13'],
                         'isbn': j['isbn'],
                         'epaisseur': j['width'],
                         'largeur': j['depth'],
                         'hauteur': j['height'],
                         'poid': j['weight'],
                         'prestashop_id': j['id'],
                         'description': j['description'][1]['value'],
                         'presentation': j['description_short'][1]['value'],
                         'categorie': j['description_short'][1]['value']}]
                record =  self.create(book)
                print (self.id)
                record.cate.create({'cate': [{'product_id': record.id, 'name': 'absc'}]})

    def check_unicity(self, id):
        if self.search_count([('prestashop_id', '=', id)]) > 0:
            return False
        else:
            return True


class Image(models.Model):
    _name = 'product.images'
    product_id = fields.Many2many('book.db', string='Prestashop ID')
    product_image = fields.Binary('Image du produit')
    product_image_url = fields.Char("product_image")

    def donload_product_image(self, product_id, image_id):
        image = prestashopproduct.Product.get_product_image(prestashopproduct.Product(), id_product=product_id,
                                                            id_image=image_id)
        return image


class Categories(models.Model):
    _name = 'product.cetegorie'
    product_id = fields.Many2many('book.db', string="Categories")
    nb_products_recursive = fields.Integer("nb_products_recursive")
    name = fields.Char("Descriptif")

    @api.one
    def new_record(self, product_id):
        self.create([{'product_id': product_id, 'name': 'a'}])

Solution

  •     @api.model
        def _repare_cate_list(self, cates=[]):
            post_cates = []
            existing_add = []
    
            for cate_name in cates:
                cate_ids = self.env['product.cetegorie'].search([('name', '=', cate_name)])
                if cate_ids:
                    existing_add.append(int(cate_ids[0]))
                else:
                    post_cates.append((0, 0, {'name': cate_name}))
    
            post_cates.insert(0, [6, 0, existing_add])
            return post_cates
    
        @api.one
        def get_books(self):
            jso = prestashopproduct.Product.get_full_stock(self=prestashopproduct.Product())
            for j in jso['products']:
                if self.check_unicity(j['id']):
                    cate_vals = self._repare_cate_list(['absc'])
                    book = [{'title': j['name'][1]['value'],
                             'ean13_code': j['ean13'],
                             'isbn': j['isbn'],
                             'epaisseur': j['width'],
                             'largeur': j['depth'],
                             'hauteur': j['height'],
                             'poid': j['weight'],
                             'prestashop_id': j['id'],
                             'description': j['description'][1]['value'],
                             'presentation': j['description_short'][1]['value'],
                             'categorie': j['description_short'][1]['value'],
                             'cate':cate_vals
                             }]
                    record =  self.create(book)
    

    Also remove line product_id = fields.Many2many('book.db', string="Categories") from the 'product.cetegorie' model its not needed. As Many to many is using separate table to link categories to save them.