@ -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 <https://cybrosys.com/>`__ |
|||
|
|||
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: `<static/description/index.html>`__ |
@ -0,0 +1,20 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################## |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2025-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
|||
# Author: Unnimaya CO<https://www.cybrosys.com>) |
|||
# 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 <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
from . import models |
@ -0,0 +1,47 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################## |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2025-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
|||
# Author: Unnimaya CO(<https://www.cybrosys.com>) |
|||
# 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 <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
{ |
|||
'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, |
|||
} |
@ -0,0 +1,6 @@ |
|||
## Module <product_image_suggestion> |
|||
|
|||
#### 29.01.2025 |
|||
#### Version 18.0.1.0.0 |
|||
#### ADD |
|||
- Initial commit for Product Image Suggestion |
@ -0,0 +1,23 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################## |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2025-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
|||
# Author: Unnimaya C O(<https://www.cybrosys.com>) |
|||
# 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 <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
from . import bing |
|||
from . import downloader |
|||
from . import product_image_suggestion |
|||
from . import product_template |
@ -0,0 +1,122 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################## |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2025-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
|||
# Author: Vishnu kp(<https://www.cybrosys.com>) |
|||
# 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 <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
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 |
@ -0,0 +1,47 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################## |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2025-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
|||
# Author: Unnimaya CO(<https://www.cybrosys.com>) |
|||
# 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 <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
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() |
@ -0,0 +1,45 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################## |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2025-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
|||
# Author: Unnimaya CO(<https://www.cybrosys.com>) |
|||
# 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 <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
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', } |
@ -0,0 +1,117 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################## |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# Copyright (C) 2025-TODAY Cybrosys Technologies(<http://www.cybrosys.com>). |
|||
# Author: Unnimaya CO(<https://www.cybrosys.com>) |
|||
# 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 <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
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.')) |
|
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 28 KiB |
After Width: | Height: | Size: 628 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 210 KiB |
After Width: | Height: | Size: 209 KiB |
After Width: | Height: | Size: 109 KiB |
After Width: | Height: | Size: 495 B |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 624 B |
After Width: | Height: | Size: 136 KiB |
After Width: | Height: | Size: 214 KiB |
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 310 B |
After Width: | Height: | Size: 929 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 542 B |
After Width: | Height: | Size: 576 B |
After Width: | Height: | Size: 733 B |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 738 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 911 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 600 B |
After Width: | Height: | Size: 673 B |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 462 B |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 926 B |
After Width: | Height: | Size: 9.0 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 7.0 KiB |
After Width: | Height: | Size: 878 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 653 B |
After Width: | Height: | Size: 800 B |
After Width: | Height: | Size: 905 B |
After Width: | Height: | Size: 189 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 839 B |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 5.9 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 34 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 427 B |
After Width: | Height: | Size: 627 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 988 B |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 5.0 KiB |
After Width: | Height: | Size: 875 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 79 KiB |
After Width: | Height: | Size: 82 KiB |
After Width: | Height: | Size: 75 KiB |
After Width: | Height: | Size: 112 KiB |
After Width: | Height: | Size: 112 KiB |
After Width: | Height: | Size: 83 KiB |
After Width: | Height: | Size: 63 KiB |
After Width: | Height: | Size: 92 KiB |
After Width: | Height: | Size: 97 KiB |
After Width: | Height: | Size: 84 KiB |
After Width: | Height: | Size: 880 KiB |
After Width: | Height: | Size: 749 KiB |
After Width: | Height: | Size: 43 KiB |
@ -0,0 +1,955 @@ |
|||
<!DOCTYPE html> |
|||
<html lang="en"> |
|||
<head> |
|||
<meta charset="UTF-8"/> |
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/> |
|||
<title>Product Image Suggestion</title> |
|||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" |
|||
rel="stylesheet"/> |
|||
<link rel="preconnect" href="https://fonts.googleapis.com"> |
|||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> |
|||
<link href="https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap" |
|||
rel="stylesheet"> |
|||
<link rel="stylesheet" |
|||
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.6.0/css/all.min.css"/> |
|||
<link rel="stylesheet" |
|||
href="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.3.4/assets/owl.carousel.min.css"/> |
|||
<style> |
|||
:root { |
|||
--primary-color: #7f54b3; |
|||
--bg-white: #fff; |
|||
--text-color: #121212; |
|||
--text-color-light: #64728f; |
|||
} |
|||
|
|||
body { |
|||
font-family: "Montserrat", sans-serif; |
|||
} |
|||
|
|||
.nav-tabs .nav-item.show .nav-link, .nav-tabs .nav-link.active { |
|||
color: #121212; |
|||
font-family: Montserrat; |
|||
font-size: 16px !important; |
|||
font-weight: 500 !important; |
|||
border-radius: 30px; |
|||
line-height: normal; |
|||
text-transform: capitalize; |
|||
background-color: #F5F5F5; |
|||
border: none; |
|||
margin-bottom: 0; |
|||
padding: 12px 24px; |
|||
} |
|||
|
|||
.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover { |
|||
border-color: transparent; |
|||
isolation: isolate; |
|||
} |
|||
|
|||
.nav-tabs .nav-link:focus-visible { |
|||
border-color: transparent; |
|||
box-shadow: none; |
|||
} |
|||
|
|||
/* owl-carosel */ |
|||
.owl-carousel .owl-nav { |
|||
position: absolute; |
|||
top: 42%; |
|||
width: 100%; |
|||
display: flex; |
|||
justify-content: space-between; |
|||
transform: translateY(-42%); |
|||
} |
|||
|
|||
.owl-carousel .owl-nav button.owl-prev { |
|||
position: absolute; |
|||
right: -36px; |
|||
font-size: 28px; |
|||
background-color: #e4e4e4; |
|||
border-radius: 20px; |
|||
width: 40px; |
|||
height: 40px; |
|||
display: flex; |
|||
justify-content: center; |
|||
align-items: center; |
|||
} |
|||
|
|||
.owl-carousel .owl-nav button.owl-next { |
|||
position: absolute; |
|||
left: -36px; |
|||
font-size: 28px; |
|||
background-color: #e4e4e4; |
|||
border-radius: 20px; |
|||
width: 40px; |
|||
height: 40px; |
|||
display: flex; |
|||
justify-content: center; |
|||
align-items: center; |
|||
|
|||
} |
|||
|
|||
</style> |
|||
</head> |
|||
<body> |
|||
<!-- overview --> |
|||
<div class="container"> |
|||
<div class="my-5"> |
|||
<!-- button tab --> |
|||
<!-- --> |
|||
<!-- version support --> |
|||
<div class="my-3 d-flex align-items-center justify-content-end"> |
|||
<div class="text-center" |
|||
style="background-color:#017E84 !important; font-size:0.8rem !important; color:#fff !important; font-weight:500 !important; padding:4px !important; margin:0 3px !important; border-radius:50px !important; min-width:120px !important"> |
|||
Community |
|||
</div> |
|||
<div class="text-center" |
|||
style="background-color:#875A7B !important; color:#fff !important; font-size:0.8rem !important; font-weight:500 !important; padding:4px !important; margin:0 3px !important; border-radius:50px !important; min-width:120px !important"> |
|||
Enterprise |
|||
</div> |
|||
<div class="text-center" |
|||
style="background-color:#7C7BAD !important; color:#fff !important; font-size:0.8rem !important; font-weight:500 !important; padding:4px !important; margin:0 3px !important; border-radius:50px !important; min-width:120px !important"> |
|||
Odoo.sh |
|||
</div> |
|||
</div> |
|||
<div class="tab-content" id="myTabContent"> |
|||
<!-- description --> |
|||
<div class="tab-pane fade show active" id="home" role="tabpanel" |
|||
aria-labelledby="home-tab"> |
|||
<div class="position-relative" |
|||
style="border-radius: 16px; background: #f8f8f8; padding: 20px 0;"> |
|||
<div class="row " style=" |
|||
padding: 2rem 0rem 0 !important; |
|||
"> |
|||
<div class="col-lg-8 mx-auto gap-4 d-flex flex-column align-items-center"> |
|||
<p class="my-1 text-center text-uppercase" |
|||
style=" |
|||
letter-spacing: 4px !important; |
|||
color: #7f54b3; |
|||
font-weight: bold; |
|||
text-align: center; |
|||
font-size: 14px; |
|||
font-weight: 600; |
|||
line-height: 15.96px; |
|||
text-transform: uppercase; |
|||
"> |
|||
An effective and user-friendly method of |
|||
suggesting product images via web downloads. |
|||
</p> |
|||
<h1 class="text-center text-uppercase my-0" |
|||
style=" |
|||
color: #121212; |
|||
font-size: 46px; |
|||
font-weight: 700; |
|||
line-height: normal; |
|||
">Product Image Suggestion</span> |
|||
</h1> |
|||
</div> |
|||
<div class="col-lg-12 d-flex justify-content-center align-items-center" |
|||
style="margin: 3rem 0;"> |
|||
<img src="./assets/icons/brand-pair.svg" |
|||
width="100%" |
|||
height="auto" |
|||
style="width: 50%" |
|||
class="img-responsive"/> |
|||
</div> |
|||
<div class="col-md-12 text-center"> |
|||
<a href="mailto:odoo@cybrosys.com" |
|||
target="_blank" |
|||
style="background-color: transparent;border-radius: 35px; |
|||
font-family: Montserrat; |
|||
display: inline-block; |
|||
padding: 7px 33px; |
|||
border: 1px solid #7f54b3; |
|||
color: #7f54b3; |
|||
text-decoration: none; |
|||
" |
|||
class="mx-1 mb-2 deep-1 deep_hover"> |
|||
<img class="img" |
|||
style="width: 24px" |
|||
src="./assets/icons/mail.svg"/> |
|||
<span class="pl-2" |
|||
style=" font-size: 16px; vertical-align: middle" |
|||
>Email Us</span |
|||
> |
|||
</a> |
|||
<a href="skype:cybroopenerp?chat" |
|||
target="_blank" |
|||
style=" |
|||
background-color: #7f289b; |
|||
font-family: Montserrat; |
|||
display: inline-block; |
|||
padding: 7px 33px; |
|||
border: 1px solid #7f289b; |
|||
border-radius: 35px; |
|||
text-decoration: none; |
|||
" |
|||
class="mx-1 mb-2 deep-1 deep_hover"> |
|||
<img |
|||
class="img" |
|||
style="width: 24px" |
|||
src="./assets/icons/skype-fill.svg" |
|||
/> |
|||
<span |
|||
class="pl-2" |
|||
style="color: #fff; font-size: 16px; vertical-align: middle" |
|||
>Skype Us</span |
|||
> |
|||
</a> |
|||
</div> |
|||
<div class="d-flex justify-content-center mt-2"> |
|||
<img src="./assets/screenshots/hero.gif" |
|||
class="w-100" |
|||
style="z-index: 3; height: auto;"> |
|||
</div> |
|||
</div> |
|||
<div class="position-absolute bottom-0" |
|||
style="z-index: 1; width: 100%;"> |
|||
<img src="./assets/icons/banner-bg.svg" |
|||
class="img-fluid w-100"> |
|||
</div> |
|||
<div class="position-absolute bottom-0 end-0" |
|||
style=" z-index: 2;"> |
|||
<img src="./assets/icons/patter.svg"> |
|||
</div> |
|||
</div> |
|||
<!-- key-highlight --> |
|||
<div class="" style="border-radius: 16px; |
|||
padding: 60px 40px; |
|||
border: 1px solid #EBEEF2; |
|||
background: #F5F5F7; |
|||
box-shadow: 0px 5px 20px -11px rgba(0, 0, 0, 0.25); "> |
|||
<div class="row"> |
|||
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center"> |
|||
<h2 style=" color: #121212; |
|||
text-align: center; |
|||
font-size: 40px; |
|||
font-weight: 700; |
|||
text-transform: uppercase; padding-bottom: 50px;">Key |
|||
Highlights</h2> |
|||
</div> |
|||
<div class="col-lg-4"> |
|||
<div class="mb-4 d-flex flex-column justify-content-center gap-3" |
|||
style="border-radius: 12px; border: 1px solid #B6BCCD; |
|||
background: #FFF;padding:32px "> |
|||
<div class="d-flex justify-content-center align-items-center" |
|||
style="background-color:#7847D9 !important; border-radius:8px !important; height:42px; width:42px"> |
|||
<img src="./assets/icons/feature-icon.svg" |
|||
class="img-responsive" height="26px" |
|||
width="26px"> |
|||
</div> |
|||
<h5 class="m-0" |
|||
style="color:#000 !important; font-weight:bold"> |
|||
Search Product Images From Bing |
|||
</h5> |
|||
<p class="m-0" |
|||
style="font-size:0.9rem; color:#64728f; font-size: 16px; font-weight: 400;"> |
|||
A Seamless and Accurate Search of Product |
|||
Images from Bing.</p> |
|||
</div> |
|||
</div> |
|||
<div class="col-lg-4"> |
|||
<div class="mb-4 d-flex flex-column justify-content-center gap-3" |
|||
style="border-radius: 12px; |
|||
border: 1px solid #B6BCCD; |
|||
background: #FFF;padding:32px "> |
|||
<div class="d-flex justify-content-center align-items-center" |
|||
style="background-color:#7847D9 !important; border-radius:8px !important; height:42px; width:42px"> |
|||
<img src="./assets/icons/feature-icon.svg" |
|||
class="img-responsive" height="26px" |
|||
width="26px"> |
|||
</div> |
|||
<h5 class="m-0" |
|||
style="color:#000 !important; font-weight:bold"> |
|||
Search Limit Option |
|||
</h5> |
|||
<p class="m-0" |
|||
style="font-size:0.9rem; color:#64728f; font-size: 16px; font-weight: 400;"> |
|||
Prioritizing the image suggestions via |
|||
setting the desired search limit. |
|||
</p> |
|||
</div> |
|||
</div> |
|||
<div class="col-lg-4"> |
|||
<div class="mb-4 d-flex flex-column justify-content-center gap-3" |
|||
style="border-radius: 12px; |
|||
border: 1px solid #B6BCCD; |
|||
background: #FFF;padding:32px "> |
|||
<div class="d-flex justify-content-center align-items-center" |
|||
style="background-color:#7847D9 !important; border-radius:8px !important; height:42px; width:42px"> |
|||
<img src="./assets/icons/feature-icon.svg" |
|||
class="img-responsive" height="26px" |
|||
width="26px"> |
|||
</div> |
|||
<h5 class="m-0" |
|||
style="color:#000 !important; font-weight:bold"> |
|||
Easy Image Editing |
|||
</h5> |
|||
<p class="m-0" |
|||
style="font-size:0.9rem; color:#64728f; font-size: 16px; font-weight: 400;"> |
|||
Easy image editing: Can automatically resize |
|||
the image to 1024x1204 px. </p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!--code --> |
|||
<div class="my-5"> |
|||
<div class="position-relative" |
|||
style=" padding: 5rem 4rem 5rem 4rem; background-color: #0A1425; border-radius: 12px;"> |
|||
<div class="d-flex flex-column gap-4"> |
|||
<span class="wrapper-subtitle" |
|||
style="font-size: 40px; font-weight: 700; color: #fff;line-height: 60px; text-transform: capitalize; width: 450px; font-family: Montserrat;">Product Image Suggestion</span> |
|||
<h3 class="wrapper-details" |
|||
style="font-size: 20px; font-weight: 400; color: #fff; line-height: 32px; "> |
|||
Are you ready to make your business more |
|||
organized? |
|||
<br> Improve now! |
|||
</h3> |
|||
<div class="d-flex gap-3"> |
|||
<a href="mailto:odoo@cybrosys.com" |
|||
class="shop-btn" style="cursor: pointer; border-radius: 16px; display: flex; justify-content: center; align-items: center; gap: 7px; |
|||
border: 1px solid #ffffff33; |
|||
background-color: #ffffff14; |
|||
backdrop-filter: blur(10px); color: #fff; padding: 12px 16px 12px 16px; text-decoration: none;"> |
|||
<span style="border-radius: 12px; |
|||
background-color: #ffffff1a; |
|||
backdrop-filter: blur(6px);padding: 12px; "> |
|||
<img src="./assets/icons/banner-mail.svg"> |
|||
</span> |
|||
<span style="font-weight: 500;font-family: Montserrat;">odoo@cybrosys.com</span> |
|||
</a> |
|||
<a href="tel:+91 9074270811" class="shop-btn" |
|||
style="cursor: pointer; border-radius: 16px; display: flex; justify-content: center; align-items: center; gap: 7px; |
|||
border: 1px solid #ffffff33; |
|||
background-color: #ffffff14; |
|||
backdrop-filter: blur(10px); color: #fff; padding: 12px 22px 12px 18px; text-decoration: none;"> |
|||
<span style="border-radius: 12px; |
|||
background-color: #ffffff1a; |
|||
backdrop-filter: blur(6px);padding: 12px;"> |
|||
<img src="./assets/icons/banner-call.svg"> |
|||
</span> |
|||
<span style="font-weight: 500;font-family: Montserrat;">+91 9074270811</span> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div class="position-absolute bottom-0 end-0"> |
|||
<img src="./assets/icons/banner-pattern.svg" |
|||
style="width: 540px;"> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!-- end-code --> |
|||
<!-- --> |
|||
<!-- screenshot and other --> |
|||
<div class="mb-4 bg-white" |
|||
style=" border: 1px solid #EBEEF2; border-radius: 6px; box-shadow: 0px 8px 20px -4px rgba(0, 0, 0, 0.10); border: 1px solid #EBEEF2;"> |
|||
<div> |
|||
<ul class="nav nav-tabs justify-content-center bg-white py-2" |
|||
id="myTab" role="tablist" |
|||
style="border-radius: 6px 6px 0 0;"> |
|||
<li class="nav-item"> |
|||
<a aria-controls="overview" |
|||
aria-bs-selected="true" |
|||
class="nav-link active" data-bs-toggle="tab" |
|||
href="#overview" id="overview-tab" role="tab" |
|||
style="color:#121212; font-weight:500; font-size:16px"> |
|||
Screenshots</a> |
|||
</li> |
|||
<li class="nav-item"> |
|||
<a aria-controls="feature" |
|||
aria-bs-selected="false" |
|||
class="nav-link py-2" data-bs-toggle="tab" |
|||
href="#feature" id="feature-tab" role="tab" |
|||
style="color:#121212; font-weight:500; font-size:16px">Features</a> |
|||
</li> |
|||
<li class="nav-item"> |
|||
<a aria-controls="faq" aria-bs-selected="false" |
|||
class="nav-link" data-bs-toggle="tab" |
|||
href="#faq" id="faq-tab" role="tab" |
|||
style="color:#121212; font-weight:500; font-size:16px"> |
|||
FAQs</a> |
|||
</li> |
|||
<li class="nav-item"> |
|||
<a aria-controls="releases" |
|||
aria-bs-selected="false" class="nav-link" |
|||
data-bs-toggle="tab" href="#releases" |
|||
id="releases-tab" role="tab" |
|||
style="color:#121212; font-weight:500; font-size:16px">Releases</a> |
|||
</li> |
|||
</ul> |
|||
</div> |
|||
<div class="tab-content p-md-5 p-2 py-3" id="myTabContent"> |
|||
<div aria-labelledby="overview-tab" |
|||
class="tab-pane fade show active" id="overview" |
|||
role="tabpanel"> |
|||
<div class="position-relative mb-4" |
|||
style="border-radius:10px"> |
|||
<img alt="acc_bg" |
|||
class="w-100 h-100 position-absolute img-fluid left_0" |
|||
loading="lazy" |
|||
src="//apps.odoocdn.com/apps/assets/17.0/ks_dashboard_ninja/ai-img/o3.png?007008f" |
|||
style=""> |
|||
</div> |
|||
<!-- screenshots section--> |
|||
<div class="position-relative mb-4" |
|||
style="border-radius:10px; background-color:#f4f4f4"> |
|||
<div class="p-md-5 p-3 position-relative"> |
|||
<div class="row"> |
|||
<div class="col-md-12"> |
|||
<h1 style="font-weight:bold; font-size:calc(1.1rem + 1vw); line-height:120%; text-align:center; text-transform:capitalize; font-size: 40px; |
|||
font-weight: 700;"> |
|||
<span style="color:#121212; font-size:calc(1.1rem + 1vw)">New |
|||
|
|||
<span style="color: #7f54b3; font-size:calc(1.1rem + 1vw)"> Image Suggestion</span> page </span> |
|||
</h1> |
|||
</div> |
|||
<div class="col-md-12 text-center"> |
|||
<div class="d-inline-block p-3 shadow-sm" |
|||
style="background-color:#fff; border-radius:10px"> |
|||
<img alt="" class="img-fluid" |
|||
loading="lazy" |
|||
src="./assets/screenshots/1.png" |
|||
style="min-height: 1px;"> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="position-relative mb-4" |
|||
style="border-radius:10px; background-color:#f4f4f4"> |
|||
<div class="p-md-5 p-3 position-relative"> |
|||
<div class="row"> |
|||
<div class="col-md-12"> |
|||
<h1 style="font-weight:bold; font-size:calc(1.1rem + 1vw); line-height:120%; text-align:center; text-transform:capitalize; font-size: 40px; |
|||
font-weight: 700;"> |
|||
<span style="color:#121212; font-size:calc(1.1rem + 1vw)"> |
|||
|
|||
<span style="color: #7f54b3; font-size:calc(1.1rem + 1vw)"> Search Images</span> </span> |
|||
</h1> |
|||
</div> |
|||
<div class="col-md-12 mb-4"> |
|||
<p style="font-weight:400; font-size:16px; line-height:150%; text-align:center; color:#64728f"> |
|||
Set the Limit and search for Images. |
|||
</p> |
|||
</div> |
|||
<div class="col-md-12 text-center"> |
|||
<div class="d-inline-block p-3 shadow-sm" |
|||
style="background-color:#fff; border-radius:10px"> |
|||
<img alt="" class="img-fluid" |
|||
loading="lazy" |
|||
src="./assets/screenshots/2.png" |
|||
style="min-height: 1px;"> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="position-relative mb-4" |
|||
style="border-radius:10px; background-color:#f4f4f4"> |
|||
<div class="p-md-5 p-3 position-relative"> |
|||
<div class="row"> |
|||
<div class="col-md-12"> |
|||
<h1 style="font-weight:bold; font-size:calc(1.1rem + 1vw); line-height:120%; text-align:center; text-transform:capitalize; font-size: 40px; |
|||
font-weight: 700;"> |
|||
<span style="color:#121212; font-size:calc(1.1rem + 1vw)"> |
|||
</span> |
|||
<span style="color: #7f54b3; font-size:calc(1.1rem + 1vw)">Set Image</span> On Product |
|||
</h1> |
|||
</div> |
|||
<div class="col-md-12 mb-4"> |
|||
<p style="font-weight:400; font-size:16px; line-height:150%; text-align:center; color:#64728f"> |
|||
Possible to set up the image on product very easily by clicking the Set Image button</p> |
|||
</div> |
|||
<div class="col-md-12 text-center"> |
|||
<div class="d-inline-block p-3 shadow-sm" |
|||
style="background-color:#fff; border-radius:10px"> |
|||
<img alt="" class="img-fluid" |
|||
loading="lazy" |
|||
src="./assets/screenshots/3.png" |
|||
style="min-height: 1px;"> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div aria-labelledby="feature-tab" |
|||
class="tab-pane fade show py-1" id="feature" |
|||
role="tabpanel"> |
|||
<div class="row py-4"> |
|||
<!-- Features Section --> |
|||
<div class="col-md-6 col-sm-12 p-3"> |
|||
<div class="d-flex flex-column align-items-start h-100" |
|||
style="padding:30px; border-radius:12px; background-color:#faf8ff"> |
|||
<div class="d-flex align-items-center justify-content-center"> |
|||
<div class="d-flex align-items-center justify-content-center " |
|||
style="width:36px; height:36px; border-radius:50%; background-color:#7847D9 ; margin-right:10px"> |
|||
<i class="fa fa-star " |
|||
style="color:#fff; font-size:14px"></i> |
|||
</div> |
|||
<p style="color:#1A202C; font-weight:600; font-size:1.2rem; margin-bottom:2px"> |
|||
A Seamless and Accurate Search of Product Images from Bing.</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-6 col-sm-12 p-3"> |
|||
<div class="d-flex flex-column align-items-start h-100" |
|||
style="padding:30px; border-radius:12px; background-color:#faf8ff"> |
|||
<div class="d-flex align-items-center justify-content-center"> |
|||
<div class="d-flex align-items-center justify-content-center " |
|||
style="width:36px; height:36px; border-radius:50%; background-color:#7847D9 ; margin-right:10px"> |
|||
<i class="fa fa-star " |
|||
style="color:#fff; font-size:14px"></i> |
|||
</div> |
|||
<p style="color:#1A202C; font-weight:600; font-size:1.2rem; margin-bottom:2px"> |
|||
Prioritizing the image suggestions via setting the desired search limit.</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="col-md-6 col-sm-12 p-3"> |
|||
<div class="d-flex flex-column align-items-start h-100" |
|||
style="padding:30px; border-radius:12px; background-color:#faf8ff"> |
|||
<div class="d-flex align-items-center justify-content-center"> |
|||
<div class="d-flex align-items-center justify-content-center " |
|||
style="width:36px; height:36px; border-radius:50%; background-color:#7847D9 ; margin-right:10px"> |
|||
<i class="fa fa-star " |
|||
style="color:#fff; font-size:14px"></i> |
|||
</div> |
|||
<p style="color:#1A202C; font-weight:600; font-size:1.2rem; margin-bottom:2px"> |
|||
Easy image editing: Can automatically resize the image to 1024x1204 px.</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div aria-labelledby="faq-tab" |
|||
class="tab-pane fade show" id="faq" |
|||
role="tabpanel"> |
|||
<div class="row" |
|||
style=" background-color:#fff !important"> |
|||
<div class="col-md-12" aria-labelledby="faq-tab" |
|||
id="faq" role="tabpanel"> |
|||
<div class="accordion mb-4" id="accordion6"> |
|||
<div style="background-color:#fff"> |
|||
<!-- accordian --> |
|||
<div class="accordion" |
|||
id="accordion_faq"> |
|||
<!-- Question 1 --> |
|||
<div class="" |
|||
style="margin:1rem 0rem"> |
|||
<div aria-expanded="false" |
|||
class=" card-header collapsed" |
|||
data-bs-toggle="collapse" |
|||
data-bs-target="#collapseFAQOne" |
|||
href="#collapseFAQOne" |
|||
aria-controls="collapseFAQOne" |
|||
style="cursor: pointer; background-color:#f8f8f8; border:none; border-top-right-radius:10px; border-top-left-radius:10px; padding: 12px 24px;"> |
|||
<a class="card-title text-decoration-none" |
|||
style=" font-size:18px; line-height:30px; font-weight:500; color:#040f3a"> |
|||
What is the Product Image Suggestion module? |
|||
<img alt="" |
|||
class="float-end" |
|||
src="//apps.odoocdn.com/apps/assets/16.0/index_test_odoo/assets/icons/down.svg?6ef7fd7" |
|||
width="25px"> |
|||
</a> |
|||
</div> |
|||
<div class="accordion-collapse collapse" |
|||
aria-labelledby="collapseFAQOne" |
|||
data-bs-parent="#accordion_faq" |
|||
id="collapseFAQOne" |
|||
style=" box-shadow: rgba(0, 0, 0, 0.05) 0px 6px 24px 0px; border: 1px solid #f8f8f8; border-bottom-right-radius:10px; border-bottom-left-radius:10px"> |
|||
<p style=" padding:0.75rem 1.25rem; font-size:16px; line-height:27px; color:#888; font-weight:normal; border-bottom-right-radius:10px; border-bottom-left-radius:10px"> |
|||
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. |
|||
</p> |
|||
</div> |
|||
</div> |
|||
<!-- Question 2 --> |
|||
<div style="margin:1rem 0rem"> |
|||
<div aria-expanded="false" |
|||
class="cursor-pointer card-header collapsed" |
|||
data-bs-toggle="collapse" |
|||
aria-controls="collapseFAQThree" |
|||
data-bs-target="#collapseFAQThree" |
|||
style="cursor: pointer; background-color:#f8f8f8; border:1px solid #f8f8f8; border-top-right-radius:10px; border-top-left-radius:10px; padding: 12px 24px"> |
|||
<a class="card-title text-decoration-none" |
|||
style=" font-size:18px; line-height:30px; font-weight:500; color:#040f3a"> |
|||
How does the Bing search integration work? |
|||
<img alt="" |
|||
class="float-end" |
|||
src="//apps.odoocdn.com/apps/assets/16.0/index_test_odoo/assets/icons/down.svg?6ef7fd7" |
|||
width="25px"> |
|||
</a> |
|||
</div> |
|||
<div class="accordion-collapse collapse" |
|||
aria-labelledby="collapseFAQThree" |
|||
data-bs-parent="#accordion_faq" |
|||
id="collapseFAQThree" |
|||
style="box-shadow: rgba(0, 0, 0, 0.05) 0px 6px 24px 0px; border: 1px solid #f8f8f8; border-bottom-right-radius:10px; border-bottom-left-radius:10px"> |
|||
<p style="padding:0.75rem 1.25rem; font-size:16px; line-height:27px; color:#888; font-weight:normal; border-bottom-right-radius:10px; border-bottom-left-radius:10px"> |
|||
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. |
|||
</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!-- --> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div aria-labelledby="releases-tab" |
|||
class="tab-pane fade show" id="releases" |
|||
role="tabpanel"> |
|||
<!-- Release Notes --> |
|||
<div class="row pt-5 m-0"> |
|||
<div class="col-md-3"> |
|||
<h4 style="font-size:16px; font-weight:600; color:#514F4F; margin:0; line-height:26px;"> |
|||
Latest Release 18.0.1.0.0 |
|||
</h4> |
|||
<span style="font-size:14px; color:#7A7979; display:block; margin-bottom:20px;"> |
|||
3rd December, 2024 |
|||
</span> |
|||
</div> |
|||
<div class="col-md-8"> |
|||
<div style="padding:0 0 40px"> |
|||
<div style="margin:0 0 10px"> |
|||
<div style="display:inline-block; padding:0px 8px; color:#514F4F; background-color:#FFD8D8; border-radius:20px"> |
|||
Add |
|||
</div> |
|||
</div> |
|||
<div class="d-flex m-0" |
|||
style="color:#7A7979;"> |
|||
<ul class="pl-3 mb-0"> |
|||
<li> |
|||
Initial Commit |
|||
</li> |
|||
</ul> |
|||
</div> |
|||
</div> |
|||
<div style="padding:0 0 0; border-bottom:1px solid #E3E3E3"> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!-- --> |
|||
<!-- related post --> |
|||
<!-- --> |
|||
<section class="oe_container mt32"> |
|||
<h2 style="color: #091E42;font-family: "Montserrat";text-align: center;margin: 25px auto;text-transform: uppercase;" |
|||
class="oe_slogan"> |
|||
<b>Related Products</b> |
|||
</h2> |
|||
<div id="demo" class="row carousel slide mt64 mb32" |
|||
data-bs-ride="carousel"> |
|||
<!-- The slideshow --> |
|||
<div class="carousel-inner"> |
|||
<div class="carousel-item active"> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" |
|||
style="float: left; padding: 10px;"> |
|||
<a href="https://apps.odoo.com/apps/modules/18.0/pdf_report_with_sign" |
|||
target="_blank" |
|||
style="color: #000; text-decoration: none;"> |
|||
<div style="border-radius: 6px; padding: 16px; border: 1px solid #cbcbcb;" |
|||
class="shadow-sm"> |
|||
<img class="img img-responsive center-block" |
|||
style=" max-width: 100%;" |
|||
src="./assets/modules/1.png"/> |
|||
<h4 class="mt0 text-truncate" |
|||
style="text-align:center;width:100% margin-bottom: 8px; font-weight: 600; padding-top: 16px; text-decoration:none;font-size: 18px; padding-bottom: 8px; margin-bottom: 0px"> |
|||
Reports With Signature</h4> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" |
|||
style="float: left; padding: 10px;"> |
|||
<a href="https://apps.odoo.com/apps/modules/18.0/pdf_report_action" |
|||
target="_blank" |
|||
style="color: #000; text-decoration: none;"> |
|||
<div style="border-radius: 6px; padding: 16px; border: 1px solid #cbcbcb;" |
|||
class="shadow-sm"> |
|||
<img class="img img-responsive center-block" |
|||
style=" max-width: 100%;" |
|||
src="./assets/modules/2.png"/> |
|||
<h4 class="mt0 text-truncate" |
|||
style="text-align:center;width:100% margin-bottom: 8px; font-weight: 600; padding-top: 16px; text-decoration:none;font-size: 18px; padding-bottom: 8px; margin-bottom: 0px"> |
|||
Dynamic Report Operations</h4> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" |
|||
style="float: left; padding: 10px;"> |
|||
<a href="https://apps.odoo.com/apps/modules/18.0/magic_note" |
|||
target="_blank" |
|||
style="color: #000; text-decoration: none;"> |
|||
<div style="border-radius: 6px;padding: 16px; border: 1px solid #cbcbcb;" |
|||
class="shadow-sm"> |
|||
<img class="img img-responsive center-block" |
|||
style=" max-width: 100%;" |
|||
src="./assets/modules/3.png"/> |
|||
<h4 class="mt0 text-truncate" |
|||
style="text-align:center;width:100% margin-bottom: 8px; font-weight: 600; padding-top: 16px; text-decoration:none;font-size: 18px; padding-bottom: 8px; margin-bottom: 0px"> |
|||
Magic Note </h4> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
<div class="carousel-item"> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" |
|||
style="float: left; padding: 10px;"> |
|||
<a href="https://apps.odoo.com/apps/modules/18.0/recurring_of_activities" |
|||
target="_blank" |
|||
style="color: #000; text-decoration: none;"> |
|||
<div style="border-radius: 6px; padding: 16px; border: 1px solid #cbcbcb;" |
|||
class="shadow-sm"> |
|||
<img class="img img-responsive center-block" |
|||
style=" max-width: 100%;" |
|||
src="./assets/modules/4.png"/> |
|||
<h4 class="mt0 text-truncate" |
|||
style="text-align:center;width:100% margin-bottom: 8px; font-weight: 600; padding-top: 16px; text-decoration:none;font-size: 18px; padding-bottom: 8px; margin-bottom: 0px"> |
|||
Recurring of Activities</h4> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" |
|||
style="float: left; padding: 10px;"> |
|||
<a href="https://apps.odoo.com/apps/modules/18.0/print_subscription_id_card" |
|||
target="_blank" |
|||
style="color: #000; text-decoration: none;"> |
|||
<div style="border-radius: 6px; padding: 16px; border: 1px solid #cbcbcb;" |
|||
class="shadow-sm"> |
|||
<img class="img img-responsive center-block" |
|||
style=" max-width: 100%;" |
|||
src="./assets/modules/5.png"/> |
|||
<h4 class="mt0 text-truncate" |
|||
style="text-align:center;width:100% margin-bottom: 8px; font-weight: 600; padding-top: 16px; text-decoration:none;font-size: 18px; padding-bottom: 8px; margin-bottom: 0px"> |
|||
Subscription ID Card </h4> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" |
|||
style="float: left; padding: 10px;"> |
|||
<a href="https://apps.odoo.com/apps/modules/18.0/statement_report" |
|||
target="_blank" |
|||
style="color: #000; text-decoration: none;"> |
|||
<div style="border-radius: 6px; padding: 16px; border: 1px solid #cbcbcb;" |
|||
class="shadow-sm"> |
|||
<img class="img img-responsive center-block" |
|||
style=" max-width: 100%;" |
|||
src="./assets/modules/6.png"/> |
|||
<h4 class="mt0 text-truncate" |
|||
style="text-align:center;width:100% margin-bottom: 8px; font-weight: 600; padding-top: 16px; text-decoration:none;font-size: 18px; padding-bottom: 8px; margin-bottom: 0px"> |
|||
Customer/ Supplier Payment Statement Report |
|||
</h4> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!-- Left and right controls --> |
|||
<a class="carousel-control-prev" href="#demo" |
|||
data-bs-slide="prev" |
|||
style="margin-left: -30px;width: 35px;color: #000;"> |
|||
<span class="carousel-control-prev-icon"> |
|||
<i class="fa fa-chevron-left" style="font-size:24px"></i> |
|||
</span> |
|||
</a> |
|||
<a class="carousel-control-next" href="#demo" |
|||
data-bs-slide="next" |
|||
style="margin-right: -30px;width: 35px;color: #000;"> |
|||
<span class="carousel-control-next-icon"> |
|||
<i class="fa fa-chevron-right" style="font-size:24px"></i> |
|||
</span> |
|||
</a> |
|||
</div> |
|||
</section> |
|||
<!-- service-section --> |
|||
|
|||
<section id="services" class="mt-5" style="border-radius: 16px; |
|||
border: 1px solid #EBEEF2; |
|||
background: var(--Neutral-N0, #FFF); |
|||
padding: 60px 40px; |
|||
box-shadow: 0px 5px 20px -11px rgba(0, 0, 0, 0.25);"> |
|||
<div class="text-center mt-4"><h3 class="mb-0" style="color: #000; |
|||
text-align: center; |
|||
font-family: Montserrat; |
|||
font-size: 40px; |
|||
font-style: normal; |
|||
font-weight: 700; |
|||
line-height: normal; |
|||
text-transform: uppercase; |
|||
padding-bottom: 50px;"> |
|||
Our Services</h3></div> |
|||
<div class="row mt-3"> |
|||
<div class="col-lg-3 col-sm-12 mb-3"> |
|||
<a href="#" style="text-decoration:none"> |
|||
<div class="btn-lg btn-block p-4 mb-2 d-flex flex-column justify-content-center align-items-center" |
|||
style="font-size:25px; font-weight:bold;background-color:#FFE2E5; margin:auto; gap: 16px; border-radius: 8px;"> |
|||
<div class="d-flex justify-content-center align-items-center" |
|||
style="background-color:#FA5A7D; border-radius:50%; height:56px; width:56px"> |
|||
<img src="./assets/icons/gear.svg" |
|||
class="img-responsive" |
|||
height="28px" width="28px"> |
|||
</div> |
|||
<span style="font-size: 18px; |
|||
color: var(--text-color); |
|||
font-weight: 600;"> Odoo Customization</span> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-lg-3 col-sm-12 mb-3"> |
|||
<a href="#" style="text-decoration:none"> |
|||
<div class="btn-lg btn-block p-4 mb-2 d-flex flex-column justify-content-center align-items-center" |
|||
style="font-size:25px; font-weight:bold;background-color:#FFF4DE; margin:auto; gap: 16px; border-radius: 8px;"> |
|||
<div class="d-flex justify-content-center align-items-center" |
|||
style="background-color:#FF947A; border-radius:50%; height:56px; width:56px"> |
|||
<img src="./assets/icons/wrench-icon.svg" |
|||
class="img-responsive" |
|||
height="28px" width="28px"> |
|||
</div> |
|||
<span style="font-size: 18px; |
|||
color: var(--text-color); |
|||
font-weight: 600;"> Odoo Implementation</span> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-lg-3 col-sm-12 mb-3"> |
|||
<a href="#" style="text-decoration:none"> |
|||
<div class="btn-lg btn-block p-4 mb-2 d-flex flex-column justify-content-center align-items-center" |
|||
style="font-size:25px; font-weight:bold;background-color:#DCFCE7; margin:auto; gap: 16px; border-radius: 8px;"> |
|||
<div class="d-flex justify-content-center align-items-center" |
|||
style="background-color:#3CD856; border-radius:50%; height:56px; width:56px"> |
|||
<img src="./assets/icons/life-ring-icon.svg" |
|||
class="img-responsive" |
|||
height="28px" width="28px"> |
|||
</div> |
|||
<span style="font-size: 18px; |
|||
color: var(--text-color); |
|||
font-weight: 600;">Odoo Support</span> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-lg-3 col-sm-12 mb-3"> |
|||
<a href="#" style="text-decoration:none"> |
|||
<div class="btn-lg btn-block p-4 mb-2 d-flex flex-column justify-content-center align-items-center" |
|||
style="font-size:25px; font-weight:bold;background-color:#F3E8FF; margin:auto; gap: 16px; border-radius: 8px;"> |
|||
<div class="d-flex justify-content-center align-items-center" |
|||
style="background-color:#BF83FF; border-radius:50%; height:56px; width:56px"> |
|||
<img src="./assets/icons/arrows-repeat.svg" |
|||
class="img-responsive" |
|||
height="28px" width="28px"> |
|||
</div> |
|||
<span style="font-size: 18px; |
|||
color: var(--text-color); |
|||
font-weight: 600;">Odoo Migration</span> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-lg-3 col-sm-12 mb-3"> |
|||
<a href="#" style="text-decoration:none"> |
|||
<div class="btn-lg btn-block p-4 mb-2 d-flex flex-column justify-content-center align-items-center" |
|||
style="font-size:25px; font-weight:bold;background-color:#F1F9FF; margin:auto; gap: 16px; border-radius: 8px;"> |
|||
<div class="d-flex justify-content-center align-items-center" |
|||
style="background-color:#01649C; border-radius:50%; height:56px; width:56px"> |
|||
<img src="./assets/icons/puzzle-piece-icon.svg" |
|||
class="img-responsive" |
|||
height="28px" width="28px"> |
|||
</div> |
|||
<span style="font-size: 18px; |
|||
color: var(--text-color); |
|||
font-weight: 600;">Odoo integration</span> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-lg-3 col-sm-12 mb-3"> |
|||
<a href="#" style="text-decoration:none"> |
|||
<div class="btn-lg btn-block p-4 mb-2 d-flex flex-column justify-content-center align-items-center" |
|||
style="font-size:25px; font-weight:bold;background-color:#EDF8ED; margin:auto; gap: 16px; border-radius: 8px;"> |
|||
|
|||
<div class="d-flex justify-content-center align-items-center" |
|||
style="background-color:#69CC70; border-radius:50%; height:56px; width:56px"> |
|||
<img src="./assets/icons/odoo-consultancy.svg" |
|||
class="img-responsive" |
|||
height="28px" width="28px"> |
|||
</div> |
|||
<span style="font-size: 18px; |
|||
color: var(--text-color); |
|||
font-weight: 600;">Odoo Consultancy</span> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-lg-3 col-sm-12 mb-3"> |
|||
<a href="#" style="text-decoration:none"> |
|||
<div class="btn-lg btn-block p-4 mb-2 d-flex flex-column justify-content-center align-items-center" |
|||
style="font-size:25px; font-weight:bold;background-color:#F1F6FF; margin:auto; gap: 16px; border-radius: 8px;"> |
|||
|
|||
<div class="d-flex justify-content-center align-items-center" |
|||
style="background-color:#2E4556; border-radius:50%; height:56px; width:56px"> |
|||
<img src="./assets/icons/odoo-licencing.svg" |
|||
class="img-responsive" |
|||
height="28px" width="28px"> |
|||
</div> |
|||
<span style="font-size: 18px; |
|||
color: var(--text-color); |
|||
font-weight: 600;">Odoo Licensing</span> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class="col-lg-3 col-sm-12 mb-3"> |
|||
<a href="#" style="text-decoration:none"> |
|||
<div class="btn-lg btn-block p-4 mb-2 d-flex flex-column justify-content-center align-items-center" |
|||
style="font-size:25px; font-weight:bold;background-color:#FAF6EA; margin:auto; gap: 16px; border-radius: 8px;"> |
|||
|
|||
<div class="d-flex justify-content-center align-items-center" |
|||
style="background-color:#FCD12C; border-radius:50%; height:56px; width:56px"> |
|||
<img src="./assets/icons/hire-odoo.svg" |
|||
class="img-responsive" |
|||
height="28px" width="28px"> |
|||
</div> |
|||
<span style="font-size: 18px; |
|||
color: var(--text-color); |
|||
font-weight: 600;">Hire Odoo Developer</span> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!-- licence --> |
|||
<div class="tab-pane fade" id="profile" role="tabpanel" |
|||
aria-labelledby="profile-tab"> |
|||
<div class="px-5"> |
|||
.... |
|||
</div> |
|||
</div> |
|||
<!-- --> |
|||
</div> |
|||
</section> |
|||
<!-- --> |
|||
</div> |
|||
</div> |
|||
</body> |
|||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"></script> |
|||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js" |
|||
integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g==" |
|||
crossorigin="anonymous" referrerpolicy="no-referrer"></script> |
|||
<script src="https://cdnjs.cloudflare.com/ajax/libs/OwlCarousel2/2.3.4/owl.carousel.min.js"></script> |
|||
<script> |
|||
$('.owl-carousel').owlCarousel({ |
|||
rtl: true, |
|||
loop: true, |
|||
margin: 10, |
|||
nav: true, |
|||
responsive: { |
|||
0: { |
|||
items: 1 |
|||
}, |
|||
600: { |
|||
items: 3 |
|||
}, |
|||
1000: { |
|||
items: 3 |
|||
} |
|||
} |
|||
}) |
|||
</script> |
|||
</html> |
@ -0,0 +1,66 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<!-- New page added in product template form view to search image and download it--> |
|||
<record id="product_template_only_form_view" |
|||
model="ir.ui.view"> |
|||
<field name="name"> |
|||
product.template.view.form.inherit.product.image.suggestion |
|||
</field> |
|||
<field name="model">product.template</field> |
|||
<field name="inherit_id" |
|||
ref="product.product_template_only_form_view"/> |
|||
<field name="arch" type="xml"> |
|||
<xpath expr="//notebook[last()]" position="inside"> |
|||
<page string="Image Suggestion"> |
|||
<group> |
|||
<group> |
|||
<group> |
|||
<field name="image_limit"/> |
|||
<field name="resize_image"/> |
|||
</group> |
|||
</group> |
|||
<group> |
|||
<field name="search_field" |
|||
placeholder="Search Here.." nolabel="1" |
|||
style="width:150px"/> |
|||
<button class="oe_stat_button" |
|||
name="action_search_image" |
|||
type="object" icon="fa-search"> |
|||
</button> |
|||
</group> |
|||
</group> |
|||
<!-- Kanban view to show the images downloaded–>--> |
|||
<field name="search_image_ids" mode="kanban" |
|||
context="{'default_name': name}"> |
|||
<kanban string="Suggested Images"> |
|||
<field name="image"/> |
|||
<templates> |
|||
<t t-name="kanban-box"> |
|||
<div class="oe_kanban_global_click"> |
|||
<a t-if="!read_only_mode" |
|||
type="delete" |
|||
class="fa fa-times pull-right"/> |
|||
<div class="o_kanban_image"> |
|||
<img t-if="record.image.raw_value" |
|||
t-att-src="kanban_image('product.image.suggestion', 'image', record.id.raw_value)" |
|||
alt="Product" |
|||
class="o_image_64_contain"/> |
|||
</div> |
|||
<div style="margin-left:160px;"> |
|||
<button name="action_set_image" |
|||
string="Set_Image" |
|||
class="btn btn-primary oe_stat_button pull-right" |
|||
style="height:30px;width:80px" |
|||
type="object">Set Image |
|||
</button> |
|||
</div> |
|||
</div> |
|||
</t> |
|||
</templates> |
|||
</kanban> |
|||
</field> |
|||
</page> |
|||
</xpath> |
|||
</field> |
|||
</record> |
|||
</odoo> |