diff --git a/product_image_suggestion/README.rst b/product_image_suggestion/README.rst new file mode 100644 index 000000000..ffc4d2ff3 --- /dev/null +++ b/product_image_suggestion/README.rst @@ -0,0 +1,44 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: https://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +Product Image Suggestion +======================== +This module helps by allowing you to search for product images directly from the product form using the Bing Image Downloader tool. Once found, these images can be set as the display image for the product. + +Configuration +============= +* Before going to install, make sure "PIL" and "python-resize-image" python packages are installed on your server +* Linux commands to install packages - ('pip install pillow', 'pip install python-resize-image') + +License +======= +GNU LESSER GENERAL PUBLIC LICENSE, Version 3 (AGPLv3) +(http://www.gnu.org/licenses/agpl.html) + +Company +------- +* `Cybrosys Techno Solutions `__ + +Credits +------- +Developer : (V18) Unnimaya CO, Contact : odoo@cybrosys.com + (V17) Vishnu KP, Contact : odoo@cybrosys.com + + +Bug Tracker +=========== +Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. + +Maintainer +---------- +.. image:: https://cybrosys.com/images/logo.png + :target: https://cybrosys.com + +This module is maintained by Cybrosys Technologies. + +For support and more information, please visit https://www.cybrosys.com. + +Further information +=================== +HTML Description: ``__ diff --git a/product_image_suggestion/__init__.py b/product_image_suggestion/__init__.py new file mode 100644 index 000000000..5ddb890d0 --- /dev/null +++ b/product_image_suggestion/__init__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2025-TODAY Cybrosys Technologies(). +# Author: Unnimaya CO) +# you can modify it under the terms of the GNU AFFERO GENERAL +# PUBLIC LICENSE (AGPL v3), Version 3. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC +# LICENSE (AGPL v3) along with this program. +# If not, see . +# +############################################################################## +from . import models diff --git a/product_image_suggestion/__manifest__.py b/product_image_suggestion/__manifest__.py new file mode 100644 index 000000000..78c30b81d --- /dev/null +++ b/product_image_suggestion/__manifest__.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2025-TODAY Cybrosys Technologies(). +# Author: Unnimaya CO() +# you can modify it under the terms of the GNU AFFERO GENERAL +# PUBLIC LICENSE (AGPL v3), Version 3. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC +# LICENSE (AGPL v3) along with this program. +# If not, see . +# +############################################################################## +{ + 'name': 'Product Image Suggestion', + 'version': '18.0.1.0.0', + 'category': 'Productivity', + 'summary': """Search product images via Bing Image Downloader in the product + form and set as display image.""", + 'description': """This module helps by allowing you to search for product + images directly from the product form using the Bing Image Downloader tool. + Once found, these images can be set as the display image for the + product.""", + 'author': 'Cybrosys Techno Solutions', + 'company': 'Cybrosys Techno Solutions', + 'maintainer': 'Cybrosys Techno Solutions', + 'website': 'https://www.cybrosys.com', + 'depends': ['product'], + 'data': [ + 'security/ir.model.access.csv', + 'views/product_template_views.xml', + ], + 'images': ['static/description/banner.jpg'], + 'external_dependencies': { + 'python': ['Pillow', 'python-resize-image'] + }, + 'license': 'AGPL-3', + 'installable': True, + 'auto_install': False, + 'application': False, +} diff --git a/product_image_suggestion/doc/RELEASE_NOTES.md b/product_image_suggestion/doc/RELEASE_NOTES.md new file mode 100644 index 000000000..111288480 --- /dev/null +++ b/product_image_suggestion/doc/RELEASE_NOTES.md @@ -0,0 +1,6 @@ +## Module + +#### 29.01.2025 +#### Version 18.0.1.0.0 +#### ADD +- Initial commit for Product Image Suggestion diff --git a/product_image_suggestion/models/__init__.py b/product_image_suggestion/models/__init__.py new file mode 100644 index 000000000..5acff9385 --- /dev/null +++ b/product_image_suggestion/models/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2025-TODAY Cybrosys Technologies(). +# Author: Unnimaya C O() +# you can modify it under the terms of the GNU AFFERO GENERAL +# PUBLIC LICENSE (AGPL v3), Version 3. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC +# LICENSE (AGPL v3) along with this program. +# If not, see . +# +############################################################################## +from . import bing +from . import downloader +from . import product_image_suggestion +from . import product_template diff --git a/product_image_suggestion/models/bing.py b/product_image_suggestion/models/bing.py new file mode 100644 index 000000000..69f7c34f8 --- /dev/null +++ b/product_image_suggestion/models/bing.py @@ -0,0 +1,122 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2025-TODAY Cybrosys Technologies(). +# Author: Vishnu kp() +# you can modify it under the terms of the GNU AFFERO GENERAL +# PUBLIC LICENSE (AGPL v3), Version 3. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC +# LICENSE (AGPL v3) along with this program. +# If not, see . +# +############################################################################## +import imghdr +import posixpath +import re +import urllib.request +import urllib + + +class Bing: + """Download images from bing""" + def __init__(self, query, limit, output_dir, adult, timeout, filter='', + verbose=True): + self.download_count = 0 + self.query = query + self.output_dir = output_dir + self.adult = adult + self.filter = filter + self.verbose = verbose + self.seen = set() + assert isinstance(limit, int), "limit must be integer" + self.limit = limit + assert isinstance(timeout, int), "timeout must be integer" + self.timeout = timeout + + self.page_counter = 0 + self.headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) ' + 'AppleWebKit/537.11 (KHTML, like Gecko) ' + 'Chrome/23.0.1271.64 Safari/537.11', + 'Accept': 'text/html,application/xhtml+xml,' + 'application/xml;q=0.9,*/*;q=0.8', + 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', + 'Accept-Encoding': 'none', + 'Accept-Language': 'en-US,en;q=0.8', + 'Connection': 'keep-alive'} + + def get_filter(self, shorthand): + """Get the filter from bing""" + if shorthand in ["line", "linedrawing"]: + return "+filterui:photo-linedrawing" + elif shorthand == "photo": + return "+filterui:photo-photo" + elif shorthand == "clipart": + return "+filterui:photo-clipart" + elif shorthand in ["gif", "animatedgif"]: + return "+filterui:photo-animatedgif" + elif shorthand == "transparent": + return "+filterui:photo-transparent" + else: + return "" + + def save_image(self, link, file_path): + """Save image to directory""" + request = urllib.request.Request(link, None, self.headers) + image = urllib.request.urlopen(request, timeout=self.timeout).read() + if not imghdr.what(None, image): + raise ValueError('Invalid image, not saving {}\n'.format(link)) + with open(str(file_path), 'wb') as path_string: + path_string.write(image) + + def download_image(self, link): + """Download the images using the url obtained""" + self.download_count += 1 + # Get the image link + try: + path = urllib.parse.urlsplit(link).path + filename = posixpath.basename(path).split('?')[0] + file_type = filename.split(".")[-1] + if file_type.lower() not in ["jpe", "jpeg", "jfif", "exif", "tiff", + "gif", "bmp", "png", "webp", "jpg"]: + file_type = "jpg" + + self.save_image(link, self.output_dir.joinpath("Image_{}.{}".format( + str(self.download_count), file_type))) + if self.verbose: + return link + + except Exception: + self.download_count -= 1 + self.seen.remove(link) + + def run(self): + """run the download function""" + while self.download_count < self.limit: + request_url = 'https://www.bing.com/images/async?q=' \ + + urllib.parse.quote_plus(self.query) \ + + '&first=' + str(self.page_counter) + '&count=' \ + + str(self.limit) \ + + '&adlt=' + self.adult + '&qft=' + ( + '' if self.filter is None else self.get_filter( + self.filter)) + request = urllib.request.Request(request_url, None, + headers=self.headers) + response = urllib.request.urlopen(request) + html = response.read().decode('utf8') + if html == "": + break + links = re.findall('murl":"(.*?)"', html) + + for link in links: + if self.download_count < self.limit and link not in self.seen: + self.seen.add(link) + self.download_image(link) + self.page_counter += 1 + return self.seen diff --git a/product_image_suggestion/models/downloader.py b/product_image_suggestion/models/downloader.py new file mode 100644 index 000000000..063450fb3 --- /dev/null +++ b/product_image_suggestion/models/downloader.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2025-TODAY Cybrosys Technologies(). +# Author: Unnimaya CO() +# you can modify it under the terms of the GNU AFFERO GENERAL +# PUBLIC LICENSE (AGPL v3), Version 3. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC +# LICENSE (AGPL v3) along with this program. +# If not, see . +# +############################################################################## +from pathlib import Path +import shutil +import sys + +try: + from bing import Bing +except ImportError: + from .bing import Bing + + +def download(query, limit=100, output_dir='dataset', adult_filter_off=True, + force_replace=False, timeout=60, filter="", verbose=True): + """download the images within the limit provided""" + if adult_filter_off: + adult = 'off' + else: + adult = 'on' + image_dir = Path(output_dir).joinpath(query).absolute() + if force_replace: + if Path.isdir(image_dir): + shutil.rmtree(image_dir) + try: + if not Path.is_dir(image_dir): + Path.mkdir(image_dir, parents=True) + except Exception: + sys.exit(1) + bing = Bing(query, limit, image_dir, adult, timeout, filter, verbose) + return bing.run() diff --git a/product_image_suggestion/models/product_image_suggestion.py b/product_image_suggestion/models/product_image_suggestion.py new file mode 100644 index 000000000..41853bacb --- /dev/null +++ b/product_image_suggestion/models/product_image_suggestion.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2025-TODAY Cybrosys Technologies(). +# Author: Unnimaya CO() +# you can modify it under the terms of the GNU AFFERO GENERAL +# PUBLIC LICENSE (AGPL v3), Version 3. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC +# LICENSE (AGPL v3) along with this program. +# If not, see . +# +############################################################################## +from odoo import fields, models + + +class ProductImageSuggestion(models.TransientModel): + """Creates new model to store the searched image""" + _name = "product.image.suggestion" + _description = "Attach images and set image as the display image of " \ + "product" + + image = fields.Binary(string='Image', attachment=True, + help="image field to store the image") + product_tmpl_id = fields.Many2one('product.template', + string='Related Product', + help="product field to store the id of " + "product from which the image " + "is searched") + + def action_set_image(self): + """Set product images from suggested images""" + for rec in self: + self_image = rec.image + if self_image: + rec.product_tmpl_id.image_1920 = self_image + return { + 'type': 'ir.actions.client', + 'tag': 'reload', } diff --git a/product_image_suggestion/models/product_template.py b/product_image_suggestion/models/product_template.py new file mode 100644 index 000000000..d0a717362 --- /dev/null +++ b/product_image_suggestion/models/product_template.py @@ -0,0 +1,117 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2025-TODAY Cybrosys Technologies(). +# Author: Unnimaya CO() +# you can modify it under the terms of the GNU AFFERO GENERAL +# PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC +# LICENSE (AGPL v3) along with this program. +# If not, see . +# +############################################################################## +import base64 +import logging +import os +from . import downloader +from odoo.exceptions import UserError +from odoo import api, fields, models, _ +from PIL import Image +import requests +from resizeimage import resizeimage +import tempfile + +_logger = logging.getLogger(__name__) + + +class ProductTemplate(models.Model): + """ + Check if the searched image limit is greater than 10 and a warning + message will be raised. + """ + _inherit = 'product.template' + + search_image_ids = fields.One2many('product.image.suggestion', + 'product_tmpl_id', + string='Images', + readonly=True, + help="To show the images downloaded.") + search_field = fields.Char(string='Search Text', + help="Type the text to be searched.") + image_limit = fields.Integer(string='Limit', + default=5, + help="Limit of images to display.") + resize_image = fields.Boolean(string='Resize Image', + default=True, + help="Resize the image.") + + @api.onchange('image_limit') + def _onchange_image_limit(self): + """ + Check if the searched image limit is greater than 10 and a warning + message will be raised. + """ + if self.image_limit > 10: + raise UserError('This may slow down image search..!!! Try to' + 'reset the Limit') + + def action_search_image(self): + """ + Clear search images and add new search + """ + for rec in self: + rec.search_image_ids = [[5, 0, 0]] + if rec.image_limit > 10: + _logger.warning("High limit number slow down the image " + "searches.") + try: + query_string = rec.search_field.replace(" ", "_").replace(",", + "_") + image_datas = downloader.download(query_string, + limit=rec.image_limit, + output_dir='dataset', + adult_filter_off=False, + timeout=60, verbose=True) + except AttributeError: + raise UserError(_('No internet connection available or ' + 'Something wrong.!')) + if image_datas: + for img in image_datas: + temp_name = '' + try: + img_request = requests.get(img.strip()).content + if self.resize_image: + temp_file, temp_name = tempfile.mkstemp(suffix= + '.png') + file = open(temp_name, "wb") + file.write(img_request) + file.close() + img_data = Image.open(temp_name) + img_data = resizeimage.resize_contain(img_data, + [1024, 1024]) + img_data.save(temp_name, img_data.format) + with open(temp_name, "rb") as image_file: + binary_image = base64.b64encode( + image_file.read()) + else: + byte_image = bytearray(img_request) + binary_image = base64.b64encode(byte_image) + vals = { + 'image': binary_image, + 'product_tmpl_id': rec.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.')) diff --git a/product_image_suggestion/security/ir.model.access.csv b/product_image_suggestion/security/ir.model.access.csv new file mode 100644 index 000000000..8a3c26fda --- /dev/null +++ b/product_image_suggestion/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_product_image_suggestion_user,access.product.image.suggestion.user,model_product_image_suggestion,base.group_user,1,1,1,1 diff --git a/product_image_suggestion/static/description/assets/cybro-icon.png b/product_image_suggestion/static/description/assets/cybro-icon.png new file mode 100755 index 000000000..06e73e11d Binary files /dev/null and b/product_image_suggestion/static/description/assets/cybro-icon.png differ diff --git a/product_image_suggestion/static/description/assets/cybro-odoo.png b/product_image_suggestion/static/description/assets/cybro-odoo.png new file mode 100755 index 000000000..ed02e07a4 Binary files /dev/null and b/product_image_suggestion/static/description/assets/cybro-odoo.png differ diff --git a/product_image_suggestion/static/description/assets/h2.png b/product_image_suggestion/static/description/assets/h2.png new file mode 100755 index 000000000..0bfc4707d Binary files /dev/null and b/product_image_suggestion/static/description/assets/h2.png differ diff --git a/product_image_suggestion/static/description/assets/icons/arrows-repeat.svg b/product_image_suggestion/static/description/assets/icons/arrows-repeat.svg new file mode 100755 index 000000000..1d7efabc5 --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/arrows-repeat.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/product_image_suggestion/static/description/assets/icons/banner-1.png b/product_image_suggestion/static/description/assets/icons/banner-1.png new file mode 100755 index 000000000..c180db172 Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/banner-1.png differ diff --git a/product_image_suggestion/static/description/assets/icons/banner-2.svg b/product_image_suggestion/static/description/assets/icons/banner-2.svg new file mode 100755 index 000000000..e606d97d9 --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/banner-2.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/product_image_suggestion/static/description/assets/icons/banner-bg.png b/product_image_suggestion/static/description/assets/icons/banner-bg.png new file mode 100755 index 000000000..a8238d3c0 Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/banner-bg.png differ diff --git a/product_image_suggestion/static/description/assets/icons/banner-bg.svg b/product_image_suggestion/static/description/assets/icons/banner-bg.svg new file mode 100755 index 000000000..b1378103e --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/banner-bg.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/product_image_suggestion/static/description/assets/icons/banner-call.svg b/product_image_suggestion/static/description/assets/icons/banner-call.svg new file mode 100755 index 000000000..96c687e81 --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/banner-call.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/product_image_suggestion/static/description/assets/icons/banner-mail.svg b/product_image_suggestion/static/description/assets/icons/banner-mail.svg new file mode 100755 index 000000000..cbf0d158d --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/banner-mail.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/product_image_suggestion/static/description/assets/icons/banner-pattern.svg b/product_image_suggestion/static/description/assets/icons/banner-pattern.svg new file mode 100755 index 000000000..9c1c7e101 --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/banner-pattern.svg @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/product_image_suggestion/static/description/assets/icons/banner-promo.svg b/product_image_suggestion/static/description/assets/icons/banner-promo.svg new file mode 100755 index 000000000..d52791b11 --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/banner-promo.svg @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/product_image_suggestion/static/description/assets/icons/brand-pair.svg b/product_image_suggestion/static/description/assets/icons/brand-pair.svg new file mode 100755 index 000000000..d8db7fc1e --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/brand-pair.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/product_image_suggestion/static/description/assets/icons/check.png b/product_image_suggestion/static/description/assets/icons/check.png new file mode 100755 index 000000000..c8e85f51d Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/check.png differ diff --git a/product_image_suggestion/static/description/assets/icons/chevron.png b/product_image_suggestion/static/description/assets/icons/chevron.png new file mode 100755 index 000000000..2089293d6 Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/chevron.png differ diff --git a/product_image_suggestion/static/description/assets/icons/close-icon.svg b/product_image_suggestion/static/description/assets/icons/close-icon.svg new file mode 100755 index 000000000..df8cce37a --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/close-icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/product_image_suggestion/static/description/assets/icons/cogs.png b/product_image_suggestion/static/description/assets/icons/cogs.png new file mode 100755 index 000000000..95d0bad62 Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/cogs.png differ diff --git a/product_image_suggestion/static/description/assets/icons/collabarate-icon.svg b/product_image_suggestion/static/description/assets/icons/collabarate-icon.svg new file mode 100755 index 000000000..dd4e10518 --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/collabarate-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/product_image_suggestion/static/description/assets/icons/consultation.png b/product_image_suggestion/static/description/assets/icons/consultation.png new file mode 100755 index 000000000..8319d4baa Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/consultation.png differ diff --git a/product_image_suggestion/static/description/assets/icons/cybro-logo.png b/product_image_suggestion/static/description/assets/icons/cybro-logo.png new file mode 100755 index 000000000..ff4b78220 Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/cybro-logo.png differ diff --git a/product_image_suggestion/static/description/assets/icons/down.svg b/product_image_suggestion/static/description/assets/icons/down.svg new file mode 100755 index 000000000..f21c36271 --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/product_image_suggestion/static/description/assets/icons/ecom-black.png b/product_image_suggestion/static/description/assets/icons/ecom-black.png new file mode 100755 index 000000000..a9385ff13 Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/ecom-black.png differ diff --git a/product_image_suggestion/static/description/assets/icons/education-black.png b/product_image_suggestion/static/description/assets/icons/education-black.png new file mode 100755 index 000000000..3eb09b27b Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/education-black.png differ diff --git a/product_image_suggestion/static/description/assets/icons/faq.png b/product_image_suggestion/static/description/assets/icons/faq.png new file mode 100755 index 000000000..4250b5b81 Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/faq.png differ diff --git a/product_image_suggestion/static/description/assets/icons/feature-icon.svg b/product_image_suggestion/static/description/assets/icons/feature-icon.svg new file mode 100755 index 000000000..fa0ea6850 --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/feature-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/product_image_suggestion/static/description/assets/icons/feature.png b/product_image_suggestion/static/description/assets/icons/feature.png new file mode 100755 index 000000000..ac7a785c0 Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/feature.png differ diff --git a/product_image_suggestion/static/description/assets/icons/gear.svg b/product_image_suggestion/static/description/assets/icons/gear.svg new file mode 100755 index 000000000..0cc66b6ea --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/gear.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/product_image_suggestion/static/description/assets/icons/hero.gif b/product_image_suggestion/static/description/assets/icons/hero.gif new file mode 100755 index 000000000..380654dfe Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/hero.gif differ diff --git a/product_image_suggestion/static/description/assets/icons/hire-odoo.svg b/product_image_suggestion/static/description/assets/icons/hire-odoo.svg new file mode 100755 index 000000000..e1ac089b0 --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/hire-odoo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/product_image_suggestion/static/description/assets/icons/hotel-black.png b/product_image_suggestion/static/description/assets/icons/hotel-black.png new file mode 100755 index 000000000..130f613be Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/hotel-black.png differ diff --git a/product_image_suggestion/static/description/assets/icons/license.png b/product_image_suggestion/static/description/assets/icons/license.png new file mode 100755 index 000000000..a5869797e Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/license.png differ diff --git a/product_image_suggestion/static/description/assets/icons/life-ring-icon.svg b/product_image_suggestion/static/description/assets/icons/life-ring-icon.svg new file mode 100755 index 000000000..3ae6e1d89 --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/life-ring-icon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/product_image_suggestion/static/description/assets/icons/lifebuoy.png b/product_image_suggestion/static/description/assets/icons/lifebuoy.png new file mode 100755 index 000000000..658d56ccc Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/lifebuoy.png differ diff --git a/product_image_suggestion/static/description/assets/icons/mail.svg b/product_image_suggestion/static/description/assets/icons/mail.svg new file mode 100755 index 000000000..1eedde695 --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/mail.svg @@ -0,0 +1,3 @@ + + + diff --git a/product_image_suggestion/static/description/assets/icons/manufacturing-black.png b/product_image_suggestion/static/description/assets/icons/manufacturing-black.png new file mode 100755 index 000000000..697eb0e9f Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/manufacturing-black.png differ diff --git a/product_image_suggestion/static/description/assets/icons/notes.png b/product_image_suggestion/static/description/assets/icons/notes.png new file mode 100755 index 000000000..ee5e95404 Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/notes.png differ diff --git a/product_image_suggestion/static/description/assets/icons/notification icon.svg b/product_image_suggestion/static/description/assets/icons/notification icon.svg new file mode 100755 index 000000000..053189973 --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/notification icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/product_image_suggestion/static/description/assets/icons/odoo-consultancy.svg b/product_image_suggestion/static/description/assets/icons/odoo-consultancy.svg new file mode 100755 index 000000000..e05f65bde --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/odoo-consultancy.svg @@ -0,0 +1,4 @@ + + + + diff --git a/product_image_suggestion/static/description/assets/icons/odoo-licencing.svg b/product_image_suggestion/static/description/assets/icons/odoo-licencing.svg new file mode 100755 index 000000000..2606c88b0 --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/odoo-licencing.svg @@ -0,0 +1,3 @@ + + + diff --git a/product_image_suggestion/static/description/assets/icons/odoo-logo.png b/product_image_suggestion/static/description/assets/icons/odoo-logo.png new file mode 100755 index 000000000..0e4d0eb5a Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/odoo-logo.png differ diff --git a/product_image_suggestion/static/description/assets/icons/patter.svg b/product_image_suggestion/static/description/assets/icons/patter.svg new file mode 100755 index 000000000..25c9c0a8f --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/patter.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/product_image_suggestion/static/description/assets/icons/pattern1.png b/product_image_suggestion/static/description/assets/icons/pattern1.png new file mode 100755 index 000000000..09ab0fb2d Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/pattern1.png differ diff --git a/product_image_suggestion/static/description/assets/icons/pos-black.png b/product_image_suggestion/static/description/assets/icons/pos-black.png new file mode 100755 index 000000000..97c0f90c1 Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/pos-black.png differ diff --git a/product_image_suggestion/static/description/assets/icons/puzzle-piece-icon.svg b/product_image_suggestion/static/description/assets/icons/puzzle-piece-icon.svg new file mode 100755 index 000000000..3e9ad9373 --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/puzzle-piece-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/product_image_suggestion/static/description/assets/icons/puzzle.png b/product_image_suggestion/static/description/assets/icons/puzzle.png new file mode 100755 index 000000000..65cf854e7 Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/puzzle.png differ diff --git a/product_image_suggestion/static/description/assets/icons/replace-icon.svg b/product_image_suggestion/static/description/assets/icons/replace-icon.svg new file mode 100755 index 000000000..d0e3a7af1 --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/replace-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/product_image_suggestion/static/description/assets/icons/restaurant-black.png b/product_image_suggestion/static/description/assets/icons/restaurant-black.png new file mode 100755 index 000000000..4a35eb939 Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/restaurant-black.png differ diff --git a/product_image_suggestion/static/description/assets/icons/screenshot-main.png b/product_image_suggestion/static/description/assets/icons/screenshot-main.png new file mode 100755 index 000000000..575f8e676 Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/screenshot-main.png differ diff --git a/product_image_suggestion/static/description/assets/icons/screenshot.png b/product_image_suggestion/static/description/assets/icons/screenshot.png new file mode 100755 index 000000000..cef272529 Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/screenshot.png differ diff --git a/product_image_suggestion/static/description/assets/icons/service-black.png b/product_image_suggestion/static/description/assets/icons/service-black.png new file mode 100755 index 000000000..301ab51cb Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/service-black.png differ diff --git a/product_image_suggestion/static/description/assets/icons/skype-fill.svg b/product_image_suggestion/static/description/assets/icons/skype-fill.svg new file mode 100755 index 000000000..c17423639 --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/skype-fill.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/product_image_suggestion/static/description/assets/icons/skype.png b/product_image_suggestion/static/description/assets/icons/skype.png new file mode 100755 index 000000000..51b409fb3 Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/skype.png differ diff --git a/product_image_suggestion/static/description/assets/icons/skype.svg b/product_image_suggestion/static/description/assets/icons/skype.svg new file mode 100755 index 000000000..df3dad39b --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/skype.svg @@ -0,0 +1,3 @@ + + + diff --git a/product_image_suggestion/static/description/assets/icons/star-1.svg b/product_image_suggestion/static/description/assets/icons/star-1.svg new file mode 100755 index 000000000..7e55ab162 --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/star-1.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/product_image_suggestion/static/description/assets/icons/star-2.svg b/product_image_suggestion/static/description/assets/icons/star-2.svg new file mode 100755 index 000000000..5ae9f507a --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/star-2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/product_image_suggestion/static/description/assets/icons/support.png b/product_image_suggestion/static/description/assets/icons/support.png new file mode 100755 index 000000000..4f18b8b82 Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/support.png differ diff --git a/product_image_suggestion/static/description/assets/icons/test-1 - Copy.png b/product_image_suggestion/static/description/assets/icons/test-1 - Copy.png new file mode 100755 index 000000000..f6a902663 Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/test-1 - Copy.png differ diff --git a/product_image_suggestion/static/description/assets/icons/test-1.png b/product_image_suggestion/static/description/assets/icons/test-1.png new file mode 100755 index 000000000..0908add2b Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/test-1.png differ diff --git a/product_image_suggestion/static/description/assets/icons/test-2.png b/product_image_suggestion/static/description/assets/icons/test-2.png new file mode 100755 index 000000000..4671fe91e Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/test-2.png differ diff --git a/product_image_suggestion/static/description/assets/icons/trading-black.png b/product_image_suggestion/static/description/assets/icons/trading-black.png new file mode 100755 index 000000000..9398ba2f1 Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/trading-black.png differ diff --git a/product_image_suggestion/static/description/assets/icons/training.png b/product_image_suggestion/static/description/assets/icons/training.png new file mode 100755 index 000000000..884ca024d Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/training.png differ diff --git a/product_image_suggestion/static/description/assets/icons/translate.svg b/product_image_suggestion/static/description/assets/icons/translate.svg new file mode 100755 index 000000000..af9c8a1aa --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/translate.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/product_image_suggestion/static/description/assets/icons/update.png b/product_image_suggestion/static/description/assets/icons/update.png new file mode 100755 index 000000000..ecbc5a01a Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/update.png differ diff --git a/product_image_suggestion/static/description/assets/icons/user.png b/product_image_suggestion/static/description/assets/icons/user.png new file mode 100755 index 000000000..6ffb23d9f Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/user.png differ diff --git a/product_image_suggestion/static/description/assets/icons/video.png b/product_image_suggestion/static/description/assets/icons/video.png new file mode 100755 index 000000000..576705b17 Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/video.png differ diff --git a/product_image_suggestion/static/description/assets/icons/whatsapp.png b/product_image_suggestion/static/description/assets/icons/whatsapp.png new file mode 100755 index 000000000..d513a5356 Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/whatsapp.png differ diff --git a/product_image_suggestion/static/description/assets/icons/wrench-icon.svg b/product_image_suggestion/static/description/assets/icons/wrench-icon.svg new file mode 100755 index 000000000..174b5a465 --- /dev/null +++ b/product_image_suggestion/static/description/assets/icons/wrench-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/product_image_suggestion/static/description/assets/icons/wrench.png b/product_image_suggestion/static/description/assets/icons/wrench.png new file mode 100755 index 000000000..6c04dea0f Binary files /dev/null and b/product_image_suggestion/static/description/assets/icons/wrench.png differ diff --git a/product_image_suggestion/static/description/assets/modules/1.png b/product_image_suggestion/static/description/assets/modules/1.png new file mode 100644 index 000000000..7c1903eb0 Binary files /dev/null and b/product_image_suggestion/static/description/assets/modules/1.png differ diff --git a/product_image_suggestion/static/description/assets/modules/2.png b/product_image_suggestion/static/description/assets/modules/2.png new file mode 100644 index 000000000..f3e5606d8 Binary files /dev/null and b/product_image_suggestion/static/description/assets/modules/2.png differ diff --git a/product_image_suggestion/static/description/assets/modules/3.png b/product_image_suggestion/static/description/assets/modules/3.png new file mode 100644 index 000000000..1dc59b56d Binary files /dev/null and b/product_image_suggestion/static/description/assets/modules/3.png differ diff --git a/product_image_suggestion/static/description/assets/modules/4.png b/product_image_suggestion/static/description/assets/modules/4.png new file mode 100644 index 000000000..be7ecf548 Binary files /dev/null and b/product_image_suggestion/static/description/assets/modules/4.png differ diff --git a/product_image_suggestion/static/description/assets/modules/5.png b/product_image_suggestion/static/description/assets/modules/5.png new file mode 100644 index 000000000..5beb31a75 Binary files /dev/null and b/product_image_suggestion/static/description/assets/modules/5.png differ diff --git a/product_image_suggestion/static/description/assets/modules/6.png b/product_image_suggestion/static/description/assets/modules/6.png new file mode 100644 index 000000000..ec21ccc0d Binary files /dev/null and b/product_image_suggestion/static/description/assets/modules/6.png differ diff --git a/product_image_suggestion/static/description/assets/screenshots/1.png b/product_image_suggestion/static/description/assets/screenshots/1.png new file mode 100644 index 000000000..73dfbcbfb Binary files /dev/null and b/product_image_suggestion/static/description/assets/screenshots/1.png differ diff --git a/product_image_suggestion/static/description/assets/screenshots/2.png b/product_image_suggestion/static/description/assets/screenshots/2.png new file mode 100644 index 000000000..cdc66c0d3 Binary files /dev/null and b/product_image_suggestion/static/description/assets/screenshots/2.png differ diff --git a/product_image_suggestion/static/description/assets/screenshots/3.png b/product_image_suggestion/static/description/assets/screenshots/3.png new file mode 100644 index 000000000..8df12d6a6 Binary files /dev/null and b/product_image_suggestion/static/description/assets/screenshots/3.png differ diff --git a/product_image_suggestion/static/description/assets/screenshots/hero.gif b/product_image_suggestion/static/description/assets/screenshots/hero.gif new file mode 100644 index 000000000..16c98b9c9 Binary files /dev/null and b/product_image_suggestion/static/description/assets/screenshots/hero.gif differ diff --git a/product_image_suggestion/static/description/assets/y18.jpg b/product_image_suggestion/static/description/assets/y18.jpg new file mode 100755 index 000000000..eea1714f2 Binary files /dev/null and b/product_image_suggestion/static/description/assets/y18.jpg differ diff --git a/product_image_suggestion/static/description/banner.jpg b/product_image_suggestion/static/description/banner.jpg new file mode 100644 index 000000000..289e8885f Binary files /dev/null and b/product_image_suggestion/static/description/banner.jpg differ diff --git a/product_image_suggestion/static/description/icon.png b/product_image_suggestion/static/description/icon.png new file mode 100644 index 000000000..fe711c9ff Binary files /dev/null and b/product_image_suggestion/static/description/icon.png differ diff --git a/product_image_suggestion/static/description/index.html b/product_image_suggestion/static/description/index.html new file mode 100644 index 000000000..40c31cc41 --- /dev/null +++ b/product_image_suggestion/static/description/index.html @@ -0,0 +1,955 @@ + + + + + + Product Image Suggestion + + + + + + + + + + +
+
+ + + +
+
+ Community +
+
+ Enterprise +
+
+ Odoo.sh +
+
+
+ +
+
+
+
+

+ An effective and user-friendly method of + suggesting product images via web downloads. +

+

Product Image Suggestion +

+
+
+ +
+ +
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+

Key + Highlights

+
+
+
+
+ +
+
+ Search Product Images From Bing +
+

+ A Seamless and Accurate Search of Product + Images from Bing.

+
+
+
+
+
+ +
+
+ Search Limit Option +
+

+ Prioritizing the image suggestions via + setting the desired search limit. +

+
+
+
+
+
+ +
+
+ Easy Image Editing +
+

+ Easy image editing: Can automatically resize + the image to 1024x1204 px.

+
+
+
+
+ +
+
+
+ Product Image Suggestion +

+ Are you ready to make your business more + organized? +
Improve now! +

+ +
+
+ +
+
+
+ + + +
+
+ +
+
+
+
+ acc_bg +
+ +
+
+
+
+

+ New + + Image Suggestion page +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ + + Search Images +

+
+
+

+ Set the Limit and search for Images. +

+
+
+
+ +
+
+
+
+
+
+
+
+
+

+ + + Set Image On Product +

+
+
+

+ Possible to set up the image on product very easily by clicking the Set Image button

+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+

+ A Seamless and Accurate Search of Product Images from Bing.

+
+
+
+
+
+
+
+ +
+

+ Prioritizing the image suggestions via setting the desired search limit.

+
+
+
+
+
+
+
+ +
+

+ Easy image editing: Can automatically resize the image to 1024x1204 px.

+
+
+
+
+
+
+
+
+
+
+ +
+ +
+ +
+

+ The Product Image Suggestion module provides an efficient and user-friendly method to search, suggest, and apply product images in Odoo through web downloads using Bing. +

+
+
+ +
+ +
+

+ The module connects with Bing to search for product images based on the product name or keyword. You can customize the number of results using the Search Limit Option for more focused suggestions. +

+
+
+
+ +
+
+
+
+
+
+ +
+
+

+ Latest Release 18.0.1.0.0 +

+ + 3rd December, 2024 + +
+
+
+
+
+ Add +
+
+
+
    +
  • + Initial Commit +
  • +
+
+
+
+
+
+
+
+
+
+ + + +
+

+ Related Products +

+ +
+ + +
+

+ Our Services

+ +
+ +
+
+ .... +
+
+ +
+ + +
+
+ + + + + + diff --git a/product_image_suggestion/views/product_template_views.xml b/product_image_suggestion/views/product_template_views.xml new file mode 100644 index 000000000..80b53efcd --- /dev/null +++ b/product_image_suggestion/views/product_template_views.xml @@ -0,0 +1,66 @@ + + + + + + product.template.view.form.inherit.product.image.suggestion + + product.template + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +