在多公司模式下搜索产品 Odoo

search products in multicompany mode Odoo

受影响的版本: Odoo 10 CE 与多家公司

描述: 我正在尝试将随机字母数字值添加到 default_code 的产品
它在单一公司 Odoo 中运行良好,但在多公司实例中却不行

这是我每晚 运行 在 cron 中调用的函数

@api.multi
def affect_sku(self):
    _logger.info("running affect_sku")
    Product = self.env['product.product']
    _logger.info("Model ::: %s" % Product)
    product_ids = Product.search([('active', '=', True), ('default_code', '=', '')])
    _logger.info("Les Produits ::: %s " % product_ids)
    if product_ids:
        for product_id in product_ids:
            _logger.info("Product id : %s" % product_id)
            product = Product.browse(product_id.id)
            _logger.info("Old Product default code : %s" % product.default_code)
            x = self.randomStringDigits(13)
            y = self.env['product.product'].search([('active', '=', True), ('default_code', '=', x)])
            _logger.info("y = %s" % y)
            while y :
                x = self.randomStringDigits(13)
                y = self.env['product.product'].search([('active', '=', True), ('default_code', '=', x)])
            product.default_code = x
            _logger.info("SKU de %s : %s" % (product.id, product.default_code))

使用SUPER USER因为他有权限查看所有产品,你可以稍微加强一下你的代码:

# and use model for crons
@api.model
def affect_sku(self):
    _logger.info("running affect_sku")
    Product = self.env['product.product'].sudo() # use SUPER USER Jus to skip any access rights
    _logger.info("Model ::: %s" % Product)
    # no need to pass active it's passed by default
    product_ids = Product.search(['|', ('default_code', '=', ''), ('default_code', '=', False)])
    _logger.info("Les Produits ::: %s " % product_ids)
    # no need to check just loop directly
    for product in product_ids:
            _logger.info("Product id : %s" % product)
            # no need to browse it's all ready a record set
            _logger.info("Old Product default code : %s" % product.default_code)
            while True :
                random_code = self.randomStringDigits(13)
                # no need to pass active and use search_count
                if not self.env['product.product'].search_count([('default_code', '=', random_code )]):
                    break
            product.default_code = random_code
            _logger.info("SKU de %s : %s" % (product.id, product.default_code))