how-to-load-images-from-url-in-odoo-13.png
Blogger_637087652304107119.png
By: Mohammed Shahil

How to load images from URL in Odoo 13

Technical Odoo 13

In odoo, Images are stored in binary fields in databases. There is no option in odoo to load images from the URL. We can only upload the image from the system.

For Example:-

from odoo import models
class PartnerImage(models.Model):
   _inherit = res.partner'    
partner_image = fields.Binary(string=Partner Image', attachment=False)

In the code above, we created a binary field called partner_image, which is stored on the res.partner model, not as an attachment. Which set as attachment = False by default. 

So if you look at the table of the database we see a column for the field of the partner_image. It will be in res_partner, in this situation. The contents contain a binary string of the image encoded in base64.

import requests
import base64
class CustomImage():
def load_image_from_url(self, url):
    data = base64.b64encode(requests.get(url.strip()).content).replace(b'\n', b'')
    return data

We have a simple load_image_from_url function in this mixin which takes in a URL pointing to an image and then returns the proper string that we can store in the database.

class CustomImageModel(models.Model, CustomImage):
_name = 'partner.image.model'
    
parner_image_url = fields.Char(string='Partner Image URL', required=True)
image = fields.Binary(string='Image', compute='_compute_image', store=True, attachment=False)
    
@api.depends('partner_image_url')
def _compute_image(self):
    for record in self:
        image = None
        if record.parner_image_url:
            image = self.load_image_from_url(record.partner_image_url)
        record.update({'image': image, })

Here our own custom model called image.custom.model is created here. You can see our CustomImage mixin is used here.

class CustomImageModel(models.Model, CustomImage):

We'll then add a field to save a single Partner URL 

partner_image_url = fields.Char(string=Partner Image URL', required=True)

Rather than manipulating the image with binary strings to display the image, or overriding the write function we can construct a simple compute field that will convert the image URL field automatically as it changes. Our mixer can use this compute feature to clean up the code. 

binary_image = fields.Binary(string='Image', compute='_compute_binary_image', store=True, attachment=False)
    
@api.depends('partner_image_url')
def _compute_binary_image(self):
   """
   Automatically Computes the Binary image per database record from the `partner_image_url`.    
   :return: Returns NoneType
   """
   for record in self:
      image = None
      if record.partner_image_url:
         image = self.load_image_from_url(record.partner_image_url)
      record.update({'image': image, })

Use this code to create or change a record: 

object = self.env['partner.image.model'].create({
   'partner_image_url': 'URL of the image'
})



cybrosys youtube

Comments

1

Ron

Does this only work in Odoo 13? I tried this in odoo 12 and seems like it puts binary in field but gives me can not display image notification ? What am I missing

30/04/2020

-

7:42AM




Leave a comment

 
Calicut

Cybrosys Technologies Pvt. Ltd.
Neospace, Kinfra Techno Park
Kakkancherry, Calicut
Kerala, India - 673635

London

Cybrosys Limited
Alpha House,
100 Borough High Street, London,
SE1 1LB, United Kingdom

Kochi

Cybrosys Technologies Pvt. Ltd.
1st Floor, Thapasya Building,
Infopark, Kakkanad,
Kochi, India - 682030.

Bangalore

Cybrosys Techno Solutions
The Estate, 8th Floor,
Dickenson Road,
Bangalore, India - 560042

Send Us A Message
 
 
 
 
Close
cybrosys