You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

87 lines
3.5 KiB

# -*- coding: utf-8 -*-
import base64
import logging
import os
from PIL import Image
import tempfile
from resizeimage import resizeimage
from . import google_images_download
from odoo import models, fields, api, _
from odoo.exceptions import UserError, Warning
_logger = logging.getLogger(__name__)
class ProductImageSelection(models.TransientModel):
_name = "product.image.suggestion"
image = fields.Binary('Image', attachment=True)
product_tmpl_id = fields.Many2one('product.template', 'Related Product', copy=True)
@api.multi
def action_set_image(self):
"""Set product images from suggested images"""
self_image = self.image
if self_image:
self.product_tmpl_id.image = self_image
class ProductTemplate(models.Model):
_inherit = 'product.template'
def get_search_string(self):
for prod in self:
prod.search_field = prod.name
search_image_ids = fields.One2many('product.image.suggestion', 'product_tmpl_id', string='Images', readonly=True)
search_field = fields.Char('Search Text', compute=get_search_string, readonly=False, store=True)
image_limit = fields.Integer('Limit', default=5)
resize_image = fields.Boolean('Resize Image', default=True)
@api.onchange('image_limit')
def war_image_limit(self):
if self.image_limit > 10:
raise Warning(_('This may slow down image search..!! !'))
@api.multi
def search_images_button(self):
"""Search product name from google using google_images_download"""
old_images = self.env['product.image.suggestion'].search([('product_tmpl_id', '=', self.id)])
for old in old_images:
old.unlink()
if self.image_limit > 10:
_logger.warning("High limit number slow down the image searches")
try:
response = google_images_download.googleimagesdownload()
query_string = self.search_field.replace(" ", "_").replace(",", "_")
arguments = {"keywords": query_string, "limit": self.image_limit, "print_urls": False, 'safe_search': True}
image_datas = response.download(arguments) # passing the arguments to the function
except AttributeError:
raise UserError(_('No internet connection available or Something wrong !'))
if image_datas:
for im in image_datas:
temp_name = ''
try:
if self.resize_image:
temp_file, temp_name = tempfile.mkstemp(suffix='.png')
file = open(temp_name, "wb")
file.write(im)
file.close()
img = Image.open(temp_name)
img = resizeimage.resize_contain(img, [1024, 1024])
img.save(temp_name, img.format)
with open(temp_name, "rb") as image_file:
binary_image = base64.b64encode(image_file.read())
else:
b = bytearray(im)
binary_image = base64.b64encode(b)
vals = dict(image=binary_image, product_tmpl_id=self.id)
self.env['product.image.suggestion'].create(vals)
if self.resize_image:
os.remove(temp_name)
except:
_logger.exception(_("failed to display in page"))
continue
else:
raise UserError(_('No image suggestions for this image'))