Browse Source

Oct 18 : [FIX] Bug Fixed 'product_visibility_website'

pull/295/head
AjmalCybro 2 years ago
parent
commit
76374a8674
  1. 4
      product_visibility_website/__manifest__.py
  2. 120
      product_visibility_website/controllers/main.py
  3. 5
      product_visibility_website/doc/RELEASE_NOTES.md
  4. 1
      product_visibility_website/models/__init__.py
  5. 107
      product_visibility_website/models/website.py
  6. BIN
      product_visibility_website/static/description/assets/modules/1.png
  7. BIN
      product_visibility_website/static/description/assets/modules/2.png
  8. BIN
      product_visibility_website/static/description/assets/modules/3.png
  9. BIN
      product_visibility_website/static/description/assets/modules/4.png
  10. BIN
      product_visibility_website/static/description/assets/modules/5.gif
  11. BIN
      product_visibility_website/static/description/assets/modules/5.png
  12. BIN
      product_visibility_website/static/description/assets/modules/6.png
  13. 284
      product_visibility_website/static/description/index.html

4
product_visibility_website/__manifest__.py

@ -22,7 +22,7 @@
################################################################################
{
'name': 'Website Product Visibility',
'version': '16.0.1.1.1',
'version': '16.0.1.1.2',
'category': 'Website',
'summary': 'Website Product visibility for Users',
'description': """Website Product visibility for Users""",
@ -35,7 +35,7 @@
'views/website_product_visibility.xml',
'views/res_config_settings_views.xml'
],
'images': ['static/description/1.png'],
'images': ['static/description/banner.png'],
'license': 'AGPL-3',
'installable': True,
'auto_install': False,

120
product_visibility_website/controllers/main.py

@ -357,123 +357,3 @@ class ProductVisibilityCon(WebsiteSale):
partner = request.env['res.partner'].sudo().search(
[('id', '=', user.partner_id.id)])
return partner.website_available_product_ids
# --------------------------------------------------------------------------
# Products Search Bar
# --------------------------------------------------------------------------
@http.route('/shop/products/autocomplete', type='json', auth='public',
website=True)
def products_autocomplete(self, term, options={}, **kwargs):
"""
Returns list of products according to the term and product options
Params:
term (str): search term written by the user
options (dict)
- 'limit' (int), default to 5: number of products to consider
- 'display_description' (bool), default to True
- 'display_price' (bool), default to True
- 'order' (str)
- 'max_nb_chars' (int): max number of characters for the
description if returned
Returns:
dict (or False if no result)
- 'products' (list): products (only their needed field values)
note: the prices will be strings properly formatted and
already containing the currency
- 'products_count' (int): the number of products in the database
that matched the search query
"""
user = request.env['res.users'].sudo().search(
[('id', '=', request.env.user.id)])
available_categ = available_products = ''
if not user:
mode = request.env['ir.config_parameter'].sudo().get_param(
'filter_mode')
products = literal_eval(
request.env['ir.config_parameter'].sudo().get_param(
'website_product_visibility.'
'available_products_for_guest_ids', 'False'))
if mode == 'product_only':
available_products = request.env['product.template'].search(
[('id', 'in', products)])
cat = literal_eval(
request.env['ir.config_parameter'].sudo().get_param(
'website_product_visibility.available_cat_for_guest_ids',
'False'))
available_categ = request.env['product.public.category'].search(
[('id', 'in', cat)])
else:
partner = request.env['res.partner'].sudo().search(
[('id', '=', user.partner_id.id)])
mode = partner.filter_mode
if mode != 'categ_only':
available_products = self.available_products()
available_categ = partner.website_available_cat_ids
ProductTemplate = request.env['product.template']
display_description = options.get('display_description', True)
display_price = options.get('display_price', True)
order = self._get_search_order(options)
max_nb_chars = options.get('max_nb_chars', 999)
category = options.get('category')
attrib_values = options.get('attrib_values')
if not available_categ and not available_products \
and request.env.user.has_group(
'base.group_portal'):
mode = request.env['ir.config_parameter'].sudo().get_param(
'filter_mode_portal')
products = literal_eval(
request.env['ir.config_parameter'].sudo().get_param(
'website_product_visibility.'
'available_products_for_portal_ids', 'False'))
if mode == 'product_only':
available_products = request.env['product.template'].search(
[('id', 'in', products)])
cat = literal_eval(
request.env['ir.config_parameter'].sudo().get_param(
'website_product_visibility.available_cat_for_portal_ids',
'False'))
available_categ = request.env['product.public.category'].search(
[('id', 'in', cat)])
if not available_products and not available_categ \
and not request.env.user.has_group(
'base.group_portal'):
domain = self._get_search_domain(term, category, attrib_values,
display_description)
else:
domain = self.reset_domain(term, available_categ,
available_products, attrib_values,
display_description)
products = ProductTemplate.search(
domain,
limit=min(20, options.get('limit', 5)),
order=order
)
fields = ['id', 'name', 'website_url']
if display_description:
fields.append('description_sale')
res = {
'products': products.read(fields),
'products_count': ProductTemplate.search_count(domain),
}
if display_description:
for res_product in res['products']:
desc = res_product['description_sale']
if desc and len(desc) > max_nb_chars:
res_product['description_sale'] = "%s..." % desc[:(
max_nb_chars - 3)]
if display_price:
FieldMonetary = request.env['ir.qweb.field.monetary']
monetary_options = {
'display_currency':
request.website.get_current_pricelist().currency_id,
}
for res_product, product in zip(res['products'], products):
combination_info = product._get_combination_info(
only_template=True)
res_product.update(combination_info)
res_product['list_price'] = FieldMonetary.value_to_html(
res_product['list_price'], monetary_options)
res_product['price'] = FieldMonetary.value_to_html(
res_product['price'], monetary_options)
return res

5
product_visibility_website/doc/RELEASE_NOTES.md

@ -13,3 +13,8 @@
#### Version 16.0.1.1.1
##### FIX
- Feature Of Website Product Visibility For Portal Users Is Added
#### 17.10.2023
#### Version 16.0.1.1.2
##### FIX
- The issue with the product/product-category search functionality has been fixed

1
product_visibility_website/models/__init__.py

@ -20,5 +20,6 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
################################################################################
from . import website
from . import res_config_settings
from . import website_product_visibility

107
product_visibility_website/models/website.py

@ -0,0 +1,107 @@
from ast import literal_eval
from odoo import models
from odoo.http import request
class Website(models.Model):
"""
Extends the 'website' model to filter product search.
"""
_inherit = "website"
_description = "Website"
def _search_with_fuzzy(self, search_type, search, limit, order, options):
"""
This method extends the base search functionality to include additional
filtering
"""
res = super()._search_with_fuzzy(
search_type, search, limit, order, options)
response = list(res)
available_products = False
user = request.env['res.users'].sudo().search(
[('id', '=', request.env.user.id)])
if response[1][0] and (response[1][0].get(
'model', '') == 'product.template' or response[1][0].get(
'model', '') == 'product.public.category'):
if not user:
mode = request.env['ir.config_parameter'].sudo().get_param(
'filter_mode')
products = literal_eval(
request.env['ir.config_parameter'].sudo().get_param(
'website_product_visibility.'
'available_products_for_guest_ids', 'False'))
if mode == 'product_only':
available_products = request.env['product.template'].search(
[('id', 'in', products)])
cat = literal_eval(
request.env['ir.config_parameter'].sudo().get_param(
'website_product_visibility.available_cat_for_guest_ids',
'False'))
available_categ = request.env['product.public.category'].search(
[('id', 'in', cat)])
else:
partner = request.env['res.partner'].sudo().search(
[('id', '=', user.partner_id.id)])
mode = partner.filter_mode
if mode == 'product_only':
available_products = self.available_products()
available_categ = partner.website_available_cat_ids
Category_avail = []
Category = request.env['product.public.category']
for ids in available_categ:
if not ids.parent_id.id in available_categ.ids:
Category_avail.append(ids.id)
categ = request.env['product.public.category'].search(
[('id', 'in', Category_avail)])
if mode == 'product_only':
categ = Category.search([('parent_id', '=', False), (
'product_tmpl_ids', 'in', available_products.ids)])
# supering shop***
if not available_categ and not available_products and \
request.env.user.has_group(
'base.group_portal'):
mode = request.env['ir.config_parameter'].sudo().get_param(
'filter_mode_portal')
products = literal_eval(
request.env['ir.config_parameter'].sudo().get_param(
'website_product_visibility.'
'available_products_for_portal_ids', 'False'))
if mode == 'product_only':
available_products = request.env['product.template'].search(
[('id', 'in', products)])
cat = literal_eval(
request.env['ir.config_parameter'].sudo().get_param(
'website_product_visibility.available_cat_for_portal_ids',
'False'))
available_categ = request.env['product.public.category'].search(
[('id', 'in', cat)])
if available_products:
product_category = available_products.mapped('public_categ_ids')
category = set(response[1][0]['results'].ids).intersection(set(
product_category.ids))
products = set(response[1][-1]['results'].ids).intersection(set(
available_products.ids))
response[1][-1]['results'] = request.env[
'product.template'].browse(products)
response[1][0]['results'] = request.env[
'product.public.category'].browse(category)
if available_categ:
categ_products = available_categ.mapped('product_tmpl_ids')
products = set(response[1][-1]['results'].ids).intersection(set(
categ_products.ids))
category = set(response[1][0]['results'].ids).intersection(set(
available_categ.ids))
response[1][0]['results'] = request.env[
'product.public.category'].browse(category)
response[1][-1]['results'] = request.env[
'product.template'].browse(products)
return tuple(response)
def available_products(self):
"""Returns the available product (product.template) ids"""
user = request.env['res.users'].sudo().search(
[('id', '=', request.env.user.id)])
partner = request.env['res.partner'].sudo().search(
[('id', '=', user.partner_id.id)])
return partner.website_available_product_ids

BIN
product_visibility_website/static/description/assets/modules/1.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 33 KiB

BIN
product_visibility_website/static/description/assets/modules/2.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 76 KiB

BIN
product_visibility_website/static/description/assets/modules/3.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 74 KiB

BIN
product_visibility_website/static/description/assets/modules/4.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 79 KiB

BIN
product_visibility_website/static/description/assets/modules/5.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

BIN
product_visibility_website/static/description/assets/modules/5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

BIN
product_visibility_website/static/description/assets/modules/6.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 86 KiB

284
product_visibility_website/static/description/index.html

@ -1,35 +1,43 @@
<div style="background-color: #714B67; min-height: 600px; width: 100%; padding: 15px; position: relative;">
<div style="background-color: #714B67; height: 810px; width: 100%; padding: 15px; position: relative;">
<!-- TITLE BAR -->
<div
style="border-bottom: 1px solid #875A7B; padding: 15px; display: flex; justify-content: space-between; align-items: center;">
<div class="d-flex align-items-center justify-content-between"
style="border-bottom: 1px solid #875A7B; padding: 15px; display: flex; justify-content: space-between; align-items: center;">
<img src="assets/misc/cybrosys-logo.png" width="42" height="42"
style="width: 42px; height: 42px;"/>
<div>
<div style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<div
style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Community
</div>
<div style="color: #875A7B; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<div
style="color: #875A7B; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Enterprise
</div>
<div style="color: #017E84; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<div
style="color: #017E84; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Odoo.sh
</div>
</div>
</div>
<!-- END OF TITLE BAR -->
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12">
<!-- APP HERO -->
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;">
Website Product Visibility</h1>
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;">
Website Product Visibility For Logged in, Logged out Users/Visitors and Portal Users</p>
<!-- END OF APP HERO -->
<img src="assets/screenshots/hero.gif" class="img-responsive"
style="width: 100%; margin-left: auto; margin-right: auto;"/>
</div>
</div>
</div>
<!-- APP HERO -->
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;">
Website Product Visibility</h1>
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;">
Website Product visibility for logged in and logged out
users/Visitors</p>
<!-- END OF APP HERO -->
<img src="assets/screenshots/hero.gif"
style="width: 75%; height: auto; position: absolute; margin-left: auto; margin-right: auto; top: 45%; left: 12%; right: auto;"/>
</div>
@ -52,10 +60,9 @@
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Overview</span>
<span
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">Learn
more about this
module</span>
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">Learn
more about this
module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div>
@ -67,10 +74,9 @@
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Features</span>
<span
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View
features of this
module</span>
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View
features of this
module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div>
@ -82,10 +88,9 @@
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Screenshots</span>
<span
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">See
key screenshots of this module
</span>
<span style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View
screenshots for this
module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div>
@ -96,7 +101,8 @@
<!-- OVERVIEW SECTION -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="overview">
style="border-bottom: 2px solid #714B67; padding: 15px 0px;"
id="overview">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/pie-chart.png"/>
@ -110,7 +116,7 @@
style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
<div class="col-sm-12 py-4">
This module helps you to make visible only the filtered products and
product categories for a logged in and logged out users/visitors.
product categories for a logged in logged out users/visitors and Portal Users.
Also, it enables the user to search products and product categories only
from those available products and categories.
</div>
@ -132,31 +138,36 @@
<div class="row"
style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
<div class="col-sm-12 col-md-6">
<div class="d-flex align-items-center"
<div class="d-flex align-items-start"
style="margin-top: 40px; margin-bottom: 40px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Filter according to the logged users</span>
<p style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
Filter product and product categories according to the logged
user.</p>
<img src="/assets/misc/check-box.png" class="mr-2"/>
<div>
<span style="display: block; font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Filter according to the logged users</span>
<p style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
Filter product and product categories according to the logged user.</p>
<span style="display: block; font-family: 'Montserrat', sans-serif; font-size: 12px;"> </span>
</div>
</div>
<div class="d-flex align-items-center"
<div class="d-flex align-items-start"
style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Filter according to the public users/visitors</span>
<p style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
Filter product and product categories according to the public
users/visitors.</p>
<img src="/assets/misc/check-box.png" class="mr-2"/>
<div>
<span style="display: block; font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Filter according to the public users/visitors and portal users</span>
<p style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">Filter product and product categories according to the public users/visitors and portal users.</p>
<span style="display: block; font-family: 'Montserrat', sans-serif; font-size: 14px;"> </span>
</div>
</div>
<div class="d-flex align-items-center"
<div class="d-flex align-items-start"
style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Restrict user searches to available product/category only</span>
<p style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
User can only search product and category among from the
available product/category.</p>
<img src="/assets/misc/check-box.png" class="mr-2"/>
<div>
<span style="display: block; font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Restrict user searches to available product/category only</span>
<p style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">User can only search product and category among from the available product/category.</p>
<span style="display: block; font-family: 'Montserrat', sans-serif; font-size: 14px;"> </span>
</div>
</div>
</div>
</div>
<!-- END OF FEATURES SECTION -->
@ -195,122 +206,107 @@
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Product wise visibility for website shop (Product wise)</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
Product visibility (Product wise) for the logged user in website
shop.</p>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Product visibility (Product wise) for the logged user in website shop.</p>
<img src="assets/screenshots/3.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Category wise filtering for website shop (Logged in Users)</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
Category wise filtering mode for logged user in website
shop.</p>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Category wise filtering mode for logged user in website shop.</p>
<img src="assets/screenshots/4.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Product visibility for website shop (Category wise)</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
Product visibility (Category wise) for the logged user in
website shop.</p>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Product visibility (Category wise) for the logged user in website shop.</p>
<img src="assets/screenshots/5.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Product wise filtering for website shop (Portal Users)</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
Product wise filtering mode for the portal users in the website
shop.</p>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Product wise filtering mode for the portal users in the website shop.</p>
<img src="assets/screenshots/6.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Set filter for a portal user</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
Setting the filtering mode for a portal user as No Filter.</p>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Setting the filtering mode for a portal user as No Filter.</p>
<img src="assets/screenshots/7.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Product wise visibility for website shop (Portal Users)</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
Product visibility (Product wise) for the portal users in
Product wise visibility for website shop (Portal Users)</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Product visibility (Product wise) for the portal users in
website shop when no filter is set for them.</p>
<img src="assets/screenshots/8.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Category wise filtering for website shop (Portal Users)</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
Category wise filtering mode for the portal users in the website
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Category wise filtering mode for the portal users in the website
shop.</p>
<img src="assets/screenshots/9.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Product visibility for website shop portal users (Category
wise)</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
Product visibility (Category wise) for the portal users in
Product visibility for website shop portal users (Categorywise)</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Product visibility (Category wise) for the portal users in
website shop when no filter is set for them.</p>
<img src="assets/screenshots/10.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Product wise filtering for website shop (Visitors)</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
Product wise filtering mode for the visitors in the website
shop.</p>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Product wise filtering mode for the visitors in the website shop.</p>
<img src="assets/screenshots/11.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Product wise visibility for website shop (Visitors)</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
Product visibility (Product wise) for the visitors in website
shop.</p>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Product visibility (Product wise) for the visitors in website shop.</p>
<img src="assets/screenshots/12.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Category wise filtering for website shop (Visitors)</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
Category wise filtering mode for the visitors in the website
shop.</p>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Category wise filtering mode for the visitors in the website shop</p>
<img src="assets/screenshots/13.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Product visibility for website shop visitors (Category
wise)</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
Product visibility (Category wise) for the visitors in website
shop.</p>
Product visibility for website shop visitors (Category wise)</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Product visibility (Category wise) for the visitors in website shop.</p>
<img src="assets/screenshots/14.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Search available product from the list</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
Search product from the available product list.</p>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Search product from the available product list.</p>
<img src="assets/screenshots/15.png" class="img-thumbnail">
</div>
</div>
</div>
<!-- END OF SCREENSHOTS SECTION -->
<!-- RELATED PRODUCTS -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/categories.png"/>
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/categories.png" />
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Related
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Related
Products
</h2>
</div>
@ -320,89 +316,65 @@
<!-- The slideshow -->
<div class="carousel-inner" style="padding: 30px;">
<div class="carousel-item" style="min-height: 198.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/dynamic_accounts_report/"
target="_blank">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/odoo_website_helpdesk/#" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/1.png">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/1.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/custom_gantt_view/"
target="_blank">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/animated_snippet/#" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/2.png">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/2.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/project_custom_gantt/"
target="_blank">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/customer_geolocation/#" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/3.png">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/3.png">
</div>
</a>
</div>
</div>
<div class="carousel-item active"
style="min-height: 198.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/account_reports_xlsx/"
target="_blank">
<div class="carousel-item active" style="min-height: 198.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/insta_feed_snippet/#" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/4.png">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/4.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/base_accounting_kit/"
target="_blank">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/website_signup_approval/#" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/5.png">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/5.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/hr_payroll_community/"
target="_blank">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/refer_friend_and_earn/#" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/6.png">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/6.png">
</div>
</a>
</div>
</div>
</div>
<!-- Left and right controls -->
<a class="carousel-control-prev" href="#demo1" data-slide="prev"
style="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="#demo1"
data-slide="next" style="width:35px; color:#000">
<span class="carousel-control-next-icon"><i
class="fa fa-chevron-right"
<a class="carousel-control-prev" href="#demo1" data-slide="prev" style="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="#demo1" data-slide="next" style="width:35px; color:#000">
<span class="carousel-control-next-icon"><i class="fa fa-chevron-right"
style="font-size:24px"></i></span>
</a>
</a>
</div>
</div>
</div>

Loading…
Cancel
Save