@ -0,0 +1,24 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) |
|||
# |
|||
# You can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
|
|||
from . import models |
|||
from . import controllers |
@ -0,0 +1,89 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) |
|||
# |
|||
# You can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
{ |
|||
'name': 'Theme Boec', |
|||
'description': 'Theme Boec is an attractive and modern eCommerce Website theme', |
|||
'summary': 'Theme Boec is a new kind of Theme. ' |
|||
'The theme is a very user-friendly and is suitable for your eCommerce website with blog.', |
|||
'category': 'Theme/eCommerce', |
|||
'version': '16.0.1.0.0', |
|||
'author': 'Cybrosys Techno Solutions', |
|||
'company': 'Cybrosys Techno Solutions', |
|||
'maintainer': 'Cybrosys Techno Solutions', |
|||
'website': "https://www.cybrosys.com", |
|||
'depends': ['website_blog', 'website_sale_wishlist', 'website_sale', |
|||
'website_sale_comparison', 'website'], |
|||
'data': [ |
|||
'data/boec_config.xml', |
|||
'data/boec_config_data.xml', |
|||
'data/brand_filter.xml', |
|||
'data/brand_inherit.xml', |
|||
'data/hot_deals_button.xml', |
|||
'security/ir.model.access.csv', |
|||
'views/about.xml', |
|||
'views/blog.xml', |
|||
'views/blog_preview.xml', |
|||
'views/cart.xml', |
|||
'views/contact_us.xml', |
|||
'views/footer.xml', |
|||
'views/header.xml', |
|||
'views/layouts.xml', |
|||
'views/pages_top.xml', |
|||
'views/product_view.xml', |
|||
'views/shop.xml', |
|||
'views/sidebar_shop.xml', |
|||
'views/snippets/banner.xml', |
|||
'views/snippets/blog_latest.xml', |
|||
'views/snippets/deal_week.xml', |
|||
'views/snippets/demo_product.xml', |
|||
'views/snippets/insta_feed.xml', |
|||
'views/snippets/product_tab.xml', |
|||
'views/snippets/product_tab_demo.xml', |
|||
], |
|||
'assets': { |
|||
'web.assets_frontend': [ |
|||
('replace', 'website_sale/static/src/js/website_sale_utils.js', |
|||
'theme_boec/static/src/js/sale_utils.js'), |
|||
"/theme_boec/static/src/css/style.css", |
|||
"/theme_boec/static/src/css/style.css.map", |
|||
"/theme_boec/static/src/css/style.scss", |
|||
"/theme_boec/static/src/css/owl_carousel_min.css", |
|||
"/theme_boec/static/src/css/owl_theme_default_min.css", |
|||
"/theme_boec/static/src/js/owl.carousel.js", |
|||
"/theme_boec/static/src/js/owl.carousel.min.js", |
|||
"/theme_boec/static/src/js/jquery.countdown.min.js", |
|||
"/theme_boec/static/src/js/deal_week.js", |
|||
"/theme_boec/static/src/js/product_tab.js", |
|||
"/theme_boec/static/src/js/custom.js", |
|||
"https://fonts.googleapis.com/css2?family=Karla:ital,wght@0,200;0,300;0,400;0,500;0,600;0,700;0,800;1,300;1,500&family=Montserrat&display=swap" |
|||
|
|||
], |
|||
}, |
|||
'images': [ |
|||
'static/description/banner.png', |
|||
'static/description/theme_screenshot.png', |
|||
], |
|||
'license': 'LGPL-3', |
|||
'installable': True, |
|||
'application': False, |
|||
'auto_install': False, |
|||
} |
@ -0,0 +1,26 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) |
|||
# |
|||
# You can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
|
|||
from . import brand_filter_controller |
|||
from . import deal_week |
|||
from . import price_filter |
|||
from . import product_tab |
@ -0,0 +1,242 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) |
|||
# |
|||
# You can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
|
|||
|
|||
from odoo.addons.website_sale.controllers.main import TableCompute, WebsiteSale |
|||
|
|||
from datetime import datetime |
|||
from werkzeug.exceptions import Forbidden, NotFound |
|||
from odoo import fields, http, SUPERUSER_ID, tools, _ |
|||
from odoo.http import request |
|||
from odoo.addons.http_routing.models.ir_http import slug |
|||
from odoo.addons.website.controllers.main import QueryURL |
|||
from odoo.tools import lazy |
|||
from odoo.addons.website.models.ir_http import sitemap_qs2dom |
|||
|
|||
|
|||
class ProductBrand(WebsiteSale): |
|||
|
|||
def sitemap_shop(env, rule, qs): |
|||
if not qs or qs.lower() in '/shop': |
|||
yield {'loc': '/shop'} |
|||
|
|||
Category = env['product.public.category'] |
|||
dom = sitemap_qs2dom(qs, '/shop/category', Category._rec_name) |
|||
dom += env['website'].get_current_website().website_domain() |
|||
for cat in Category.search(dom): |
|||
loc = '/shop/category/%s' % slug(cat) |
|||
if not qs or qs.lower() in loc: |
|||
yield {'loc': loc} |
|||
|
|||
@http.route([ |
|||
'/shop', |
|||
'/shop/page/<int:page>', |
|||
'/shop/category/<model("product.public.category"):category>', |
|||
'/shop/category/<model("product.public.category"):category>/page/<int:page>', |
|||
'/shop/brand/<model("product.brand"):brand>' |
|||
], type='http', auth="public", website=True, sitemap=sitemap_shop) |
|||
def shop(self, brand=None, page=0, category=None, search='', min_price=0.0, max_price=0.0, ppg=False, **post): |
|||
add_qty = int(post.get('add_qty', 1)) |
|||
try: |
|||
min_price = float(min_price) |
|||
except ValueError: |
|||
min_price = 0 |
|||
try: |
|||
max_price = float(max_price) |
|||
except ValueError: |
|||
max_price = 0 |
|||
|
|||
Category = request.env['product.public.category'] |
|||
if category: |
|||
category = Category.search([('id', '=', int(category))], limit=1) |
|||
if not category or not category.can_access_from_current_website(): |
|||
raise NotFound() |
|||
else: |
|||
category = Category |
|||
|
|||
website = request.env['website'].get_current_website() |
|||
if ppg: |
|||
try: |
|||
ppg = int(ppg) |
|||
post['ppg'] = ppg |
|||
except ValueError: |
|||
ppg = False |
|||
if not ppg: |
|||
ppg = website.shop_ppg or 20 |
|||
|
|||
ppr = website.shop_ppr or 4 |
|||
|
|||
attrib_list = request.httprequest.args.getlist('attrib') |
|||
attrib_values = [[int(x) for x in v.split("-")] for v in attrib_list if v] |
|||
attributes_ids = {v[0] for v in attrib_values} |
|||
attrib_set = {v[1] for v in attrib_values} |
|||
|
|||
if not brand: |
|||
keep = QueryURL('/shop', |
|||
**self._shop_get_query_url_kwargs(category and int(category), search, min_price, max_price, |
|||
**post)) |
|||
else: |
|||
keep = QueryURL('shop/brand') |
|||
|
|||
now = datetime.timestamp(datetime.now()) |
|||
pricelist = request.env['product.pricelist'].browse(request.session.get('website_sale_current_pl')) |
|||
if not pricelist or request.session.get('website_sale_pricelist_time', |
|||
0) < now - 60 * 60: # test: 1 hour in session |
|||
pricelist = website.get_current_pricelist() |
|||
request.session['website_sale_pricelist_time'] = now |
|||
request.session['website_sale_current_pl'] = pricelist.id |
|||
|
|||
request.update_context(pricelist=pricelist.id, partner=request.env.user.partner_id) |
|||
|
|||
filter_by_price_enabled = website.is_view_active('website_sale.filter_products_price') |
|||
if filter_by_price_enabled: |
|||
company_currency = website.company_id.currency_id |
|||
conversion_rate = request.env['res.currency']._get_conversion_rate( |
|||
company_currency, pricelist.currency_id, request.website.company_id, fields.Date.today()) |
|||
else: |
|||
conversion_rate = 1 |
|||
|
|||
url = "/shop" |
|||
if search: |
|||
post["search"] = search |
|||
if attrib_list: |
|||
post['attrib'] = attrib_list |
|||
|
|||
options = self._get_search_options( |
|||
category=category, |
|||
attrib_values=attrib_values, |
|||
pricelist=pricelist, |
|||
min_price=min_price, |
|||
max_price=max_price, |
|||
conversion_rate=conversion_rate, |
|||
**post |
|||
) |
|||
fuzzy_search_term, product_count, search_product = self._shop_lookup_products(attrib_set, options, post, search, |
|||
website) |
|||
|
|||
filter_by_price_enabled = website.is_view_active('website_sale.filter_products_price') |
|||
if filter_by_price_enabled: |
|||
# TODO Find an alternative way to obtain the domain through the search metadata. |
|||
Product = request.env['product.template'].with_context(bin_size=True) |
|||
domain = self._get_search_domain(search, category, attrib_values) |
|||
|
|||
# This is ~4 times more efficient than a search for the cheapest and most expensive products |
|||
from_clause, where_clause, where_params = Product._where_calc(domain).get_sql() |
|||
query = f""" |
|||
SELECT COALESCE(MIN(list_price), 0) * {conversion_rate}, COALESCE(MAX(list_price), 0) * {conversion_rate} |
|||
FROM {from_clause} |
|||
WHERE {where_clause} |
|||
""" |
|||
request.env.cr.execute(query, where_params) |
|||
available_min_price, available_max_price = request.env.cr.fetchone() |
|||
|
|||
if min_price or max_price: |
|||
# The if/else condition in the min_price / max_price value assignment |
|||
# tackles the case where we switch to a list of products with different |
|||
# available min / max prices than the ones set in the previous page. |
|||
# In order to have logical results and not yield empty product lists, the |
|||
# price filter is set to their respective available prices when the specified |
|||
# min exceeds the max, and / or the specified max is lower than the available min. |
|||
if min_price: |
|||
min_price = min_price if min_price <= available_max_price else available_min_price |
|||
post['min_price'] = min_price |
|||
if max_price: |
|||
max_price = max_price if max_price >= available_min_price else available_max_price |
|||
post['max_price'] = max_price |
|||
|
|||
website_domain = website.website_domain() |
|||
categs_domain = [('parent_id', '=', False)] + website_domain |
|||
if search: |
|||
search_categories = Category.search( |
|||
[('product_tmpl_ids', 'in', search_product.ids)] + website_domain |
|||
).parents_and_self |
|||
categs_domain.append(('id', 'in', search_categories.ids)) |
|||
else: |
|||
search_categories = Category |
|||
categs = lazy(lambda: Category.search(categs_domain)) |
|||
|
|||
if category: |
|||
url = "/shop/category/%s" % slug(category) |
|||
|
|||
pager = website.pager(url=url, total=product_count, page=page, step=ppg, scope=7, url_args=post) |
|||
offset = pager['offset'] |
|||
if not brand: |
|||
products = search_product[offset:offset + ppg] |
|||
else: |
|||
products = request.env['product.template'].sudo().search([('brand_id', '=', brand.id), |
|||
('website_published', '=', True)], |
|||
order="id desc", |
|||
offset=pager['offset']) |
|||
|
|||
ProductAttribute = request.env['product.attribute'] |
|||
if products: |
|||
# get all products without limit |
|||
attributes = lazy(lambda: ProductAttribute.search([ |
|||
('product_tmpl_ids', 'in', search_product.ids), |
|||
('visibility', '=', 'visible'), |
|||
])) |
|||
else: |
|||
attributes = lazy(lambda: ProductAttribute.browse(attributes_ids)) |
|||
|
|||
layout_mode = request.session.get('website_sale_shop_layout_mode') |
|||
if not layout_mode: |
|||
if website.viewref('website_sale.products_list_view').active: |
|||
layout_mode = 'list' |
|||
else: |
|||
layout_mode = 'grid' |
|||
request.session['website_sale_shop_layout_mode'] = layout_mode |
|||
|
|||
products_prices = lazy(lambda: products._get_sales_prices(pricelist)) |
|||
|
|||
values = { |
|||
'search': fuzzy_search_term or search, |
|||
'original_search': fuzzy_search_term and search, |
|||
'order': post.get('order', ''), |
|||
'category': category, |
|||
'attrib_values': attrib_values, |
|||
'attrib_set': attrib_set, |
|||
'pager': pager, |
|||
'pricelist': pricelist, |
|||
'add_qty': add_qty, |
|||
'products': products, |
|||
'search_count': product_count, # common for all searchbox |
|||
'bins': lazy(lambda: TableCompute().process(products, ppg, ppr)), |
|||
'ppg': ppg, |
|||
'ppr': ppr, |
|||
'categories': categs, |
|||
'attributes': attributes, |
|||
'keep': keep, |
|||
'search_categories_ids': search_categories.ids, |
|||
'layout_mode': layout_mode, |
|||
'products_prices': products_prices, |
|||
'get_product_prices': lambda product: lazy(lambda: products_prices[product.id]), |
|||
'float_round': tools.float_round, |
|||
} |
|||
if filter_by_price_enabled: |
|||
values['min_price'] = min_price or available_min_price |
|||
values['max_price'] = max_price or available_max_price |
|||
values['available_min_price'] = tools.float_round(available_min_price, 2) |
|||
values['available_max_price'] = tools.float_round(available_max_price, 2) |
|||
if category: |
|||
values['main_object'] = category |
|||
values.update(self._get_additional_shop_values(values)) |
|||
return request.render("website_sale.products", values) |
@ -0,0 +1,41 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) |
|||
# |
|||
# You can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
|
|||
from odoo import http |
|||
from odoo.http import request |
|||
|
|||
|
|||
class DealWeek(http.Controller): |
|||
|
|||
@http.route('/get_product', auth='public', type='json', website=True) |
|||
def get_products(self, **kwargs): |
|||
boec_configuration = request.env.ref('theme_boec.boec_config_data') |
|||
product_id = boec_configuration.deal_week_product_id |
|||
values = {'product_id': product_id} |
|||
response = http.Response(template='theme_boec.deal_week', qcontext=values) |
|||
return response.render() |
|||
|
|||
@http.route('/get_countdown', auth='public', type='json', website=True) |
|||
def get_countdown(self, **kwargs): |
|||
boec_configuration = request.env.ref('theme_boec.boec_config_data') |
|||
end_date = boec_configuration.date_end |
|||
return end_date |
@ -0,0 +1,151 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) |
|||
# |
|||
# You can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
|
|||
# from werkzeug.exceptions import NotFound |
|||
# from odoo.addons.http_routing.models.ir_http import slug |
|||
# from odoo.addons.website.controllers.main import QueryURL |
|||
# from odoo.addons.website_sale.controllers.main import TableCompute, WebsiteSale |
|||
# from odoo import http |
|||
# from odoo.http import request |
|||
# |
|||
# |
|||
# class PriceFilter(WebsiteSale): |
|||
# |
|||
# @http.route() |
|||
# def shop(self, page=0, category=None, search='', ppg=False, **post): |
|||
# """Override WebsiteSale shop for Price Filter""" |
|||
# maximum = minimum = 0 |
|||
# add_qty = int(post.get('add_qty', 1)) |
|||
# Category = request.env['product.public.category'] |
|||
# if category: |
|||
# category = Category.search([('id', '=', int(category))], limit=1) |
|||
# if not category or not category.can_access_from_current_website(): |
|||
# raise NotFound() |
|||
# else: |
|||
# category = Category |
|||
# |
|||
# if ppg: |
|||
# try: |
|||
# ppg = int(ppg) |
|||
# post['ppg'] = ppg |
|||
# except ValueError: |
|||
# ppg = False |
|||
# if not ppg: |
|||
# ppg = request.env['website'].get_current_website().shop_ppg or 20 |
|||
# |
|||
# ppr = request.env['website'].get_current_website().shop_ppr or 4 |
|||
# |
|||
# product_ids = request.env['product.template'].search(['&', ('sale_ok', '=', True), ('active', '=', True)]) |
|||
# |
|||
# if product_ids and product_ids.ids: |
|||
# request.cr.execute( |
|||
# 'select min(list_price),max(list_price) from product_template where id in %s', |
|||
# (tuple(product_ids.ids),)) |
|||
# list_prices = request.cr.fetchall() |
|||
# |
|||
# minimum = list_prices[0][0] |
|||
# maximum = list_prices[0][1] |
|||
# |
|||
# attrib_list = request.httprequest.args.getlist('attrib') |
|||
# attrib_values = [[int(x) for x in v.split("-")] for v in attrib_list if v] |
|||
# attributes_ids = {v[0] for v in attrib_values} |
|||
# attrib_set = {v[1] for v in attrib_values} |
|||
# |
|||
# domain = self._get_search_domain(search, category, attrib_values) |
|||
# |
|||
# if post.get('minimum') and post.get('maximum'): |
|||
# domain = domain + [('list_price', '>=', float(post.get('minimum'))), |
|||
# ('list_price', '<=', float(post.get('maximum')))] |
|||
# |
|||
# keep = QueryURL('/shop', category=category and int(category), search=search, attrib=attrib_list, |
|||
# order=post.get('order'), minimum=post.get('minimum'), maximum=post.get('maximum')) |
|||
# |
|||
# pricelist_context, pricelist = self._get_pricelist_context() |
|||
# |
|||
# request.context = dict(request.context, pricelist=pricelist.id, partner=request.env.user.partner_id) |
|||
# |
|||
# url = "/shop" |
|||
# if search: |
|||
# post["search"] = search |
|||
# if attrib_list: |
|||
# post['attrib'] = attrib_list |
|||
# |
|||
# Product = request.env['product.template'].with_context(bin_size=True) |
|||
# |
|||
# search_product = Product.search(domain, order=self._get_search_order(post)) |
|||
# website_domain = request.website.website_domain() |
|||
# categs_domain = [('parent_id', '=', False)] + website_domain |
|||
# if search: |
|||
# search_categories = Category.search( |
|||
# [('product_tmpl_ids', 'in', search_product.ids)] + website_domain).parents_and_self |
|||
# categs_domain.append(('id', 'in', search_categories.ids)) |
|||
# else: |
|||
# search_categories = Category |
|||
# categs = Category.search(categs_domain) |
|||
# |
|||
# if category: |
|||
# url = "/shop/category/%s" % slug(category) |
|||
# |
|||
# product_count = len(search_product) |
|||
# pager = request.website.pager(url=url, total=product_count, page=page, step=ppg, scope=7, url_args=post) |
|||
# offset = pager['offset'] |
|||
# products = search_product[offset: offset + ppg] |
|||
# |
|||
# ProductAttribute = request.env['product.attribute'] |
|||
# if products: |
|||
# # get all products without limit |
|||
# attributes = ProductAttribute.search([('product_tmpl_ids', 'in', search_product.ids)]) |
|||
# else: |
|||
# attributes = ProductAttribute.browse(attributes_ids) |
|||
# |
|||
# layout_mode = request.session.get('website_sale_shop_layout_mode') |
|||
# if not layout_mode: |
|||
# if request.website.viewref('website_sale.products_list_view').active: |
|||
# layout_mode = 'list' |
|||
# else: |
|||
# layout_mode = 'grid' |
|||
# |
|||
# values = { |
|||
# 'search': search, |
|||
# 'category': category, |
|||
# 'attrib_values': attrib_values, |
|||
# 'attrib_set': attrib_set, |
|||
# 'pager': pager, |
|||
# 'pricelist': pricelist, |
|||
# 'add_qty': add_qty, |
|||
# 'products': products, |
|||
# 'search_count': product_count, # common for all searchbox |
|||
# 'bins': TableCompute().process(products, ppg, ppr), |
|||
# 'ppg': ppg, |
|||
# 'ppr': ppr, |
|||
# 'categories': categs, |
|||
# 'attributes': attributes, |
|||
# 'keep': keep, |
|||
# 'search_categories_ids': search_categories.ids, |
|||
# 'layout_mode': layout_mode, |
|||
# 'minimum': minimum, |
|||
# 'maximum': maximum, |
|||
# |
|||
# } |
|||
# if category: |
|||
# values['main_object'] = category |
|||
# return request.render("website_sale.products", values) |
@ -0,0 +1,42 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) |
|||
# |
|||
# You can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
|
|||
from odoo import http |
|||
from odoo.http import request |
|||
|
|||
|
|||
class WebsiteProduct(http.Controller): |
|||
|
|||
@http.route('/get_product_tab', auth="public", type='json', website=True) |
|||
def get_product_tab(self): |
|||
|
|||
new_arrivals = request.env['product.template'].sudo().search([('website_published', '=', True)], |
|||
order='create_date desc', limit=12) |
|||
hot_deals = request.env['product.template'].sudo().search([('website_published', '=', True), |
|||
('hot_deals', '=', True)], limit=12) |
|||
|
|||
values = { |
|||
'new_arrivals': new_arrivals, |
|||
'hot_deals': hot_deals |
|||
} |
|||
response = http.Response(template='theme_boec.product_tab', qcontext=values) |
|||
return response.render() |
@ -0,0 +1,25 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<odoo> |
|||
<data noupdate="1"> |
|||
<record id="boec_config_action" model="ir.actions.act_window"> |
|||
<field name="name">Boec Config</field> |
|||
<field name="type">ir.actions.act_window</field> |
|||
<field name="res_model">boec.config</field> |
|||
<field name="view_mode">tree,form</field> |
|||
</record> |
|||
<record id="boec_config_tree" model="ir.ui.view"> |
|||
<field name="name">boec.config.tree</field> |
|||
<field name="model">boec.config</field> |
|||
<field name="arch" type="xml"> |
|||
<tree create="0" delete="false"> |
|||
<field name="name"/> |
|||
</tree> |
|||
</field> |
|||
</record> |
|||
|
|||
<menuitem id="boec_config_menu" name="Boec Configuration" |
|||
parent="website.menu_website_global_configuration" |
|||
sequence="15" |
|||
action="boec_config_action"/> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,9 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<odoo> |
|||
<data noupdate="1"> |
|||
<record id="boec_config_data" model="boec.config"> |
|||
<field name="name">Boec Config</field> |
|||
<!-- <field name="max_price">100000</field>--> |
|||
</record> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,48 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<odoo> |
|||
<data> |
|||
<!--Product Brand views--> |
|||
<record model="ir.ui.view" id="product_brand_tree_view"> |
|||
<field name="name">Product Brand</field> |
|||
<field name="model">product.brand</field> |
|||
<field name="arch" type="xml"> |
|||
<tree string="Products Brands"> |
|||
<field name="brand_name"/> |
|||
</tree> |
|||
</field> |
|||
</record> |
|||
|
|||
<record model="ir.ui.view" id="product_brand_from_view"> |
|||
<field name="name">Product Brand</field> |
|||
<field name="model">product.brand</field> |
|||
<field name="arch" type="xml"> |
|||
<form string="Products Brands"> |
|||
<sheet> |
|||
<group> |
|||
<group> |
|||
<field name="brand_name"/> |
|||
<field name="sequence_no"/> |
|||
<field name="parent_id"/> |
|||
</group> |
|||
</group> |
|||
</sheet> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="action_product_brand" model="ir.actions.act_window"> |
|||
<field name="name">Product Brand</field> |
|||
<field name="type">ir.actions.act_window</field> |
|||
<field name="res_model">product.brand</field> |
|||
<field name="view_mode">tree,form</field> |
|||
<field name="help" type="html"> |
|||
<p class="o_view_nocontent_smiling_face">Create a new record!</p> |
|||
</field> |
|||
</record> |
|||
<!--Adds a menu under configuration in website--> |
|||
<menuitem id="menu_product_brand" |
|||
name="Product Brand" |
|||
parent="website_sale.menu_ecommerce_settings" |
|||
action="action_product_brand"/> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,15 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<odoo> |
|||
<data> |
|||
<record id="view_product_brand_inherited" model="ir.ui.view"> |
|||
<field name="name">Brand view</field> |
|||
<field name="model">product.template</field> |
|||
<field name="inherit_id" ref="product.product_template_form_view"/> |
|||
<field name="arch" type="xml"> |
|||
<field name="website_sequence" position="after"> |
|||
<field name="brand_id"/> |
|||
</field> |
|||
</field> |
|||
</record> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,15 @@ |
|||
<?xml version="1.0" encoding="UTF-8" ?> |
|||
<odoo> |
|||
<data> |
|||
<record id="hot_deals" model="ir.ui.view"> |
|||
<field name="name">Hot Deals</field> |
|||
<field name="model">product.template</field> |
|||
<field name="inherit_id" ref="product.product_template_only_form_view"/> |
|||
<field name="arch" type="xml"> |
|||
<field name="website_ribbon_id" position="after"> |
|||
<field name="hot_deals" string="Hot Sale"/> |
|||
</field> |
|||
</field> |
|||
</record> |
|||
</data> |
|||
</odoo> |
@ -0,0 +1,24 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) |
|||
# |
|||
# You can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
|
|||
from . import theme_boec |
|||
from . import brand_filter_model |
@ -0,0 +1,48 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) |
|||
# |
|||
# You can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
|
|||
from odoo import models, fields |
|||
|
|||
|
|||
class ProductBrand(models.Model): |
|||
_name = 'product.brand' |
|||
_description = "Product Brand" |
|||
_rec_name = 'brand_name' |
|||
brand_name = fields.Char(required=True) |
|||
sequence_no = fields.Integer(string="Sequence no") |
|||
parent_id = fields.Many2one('product.brand', string='Parent Brand', |
|||
index=True) |
|||
|
|||
|
|||
class DiscountPrizeTag(models.Model): |
|||
_inherit = 'product.template' |
|||
|
|||
brand_id = fields.Many2one('product.brand', string="Product Brand") |
|||
|
|||
|
|||
class Website(models.Model): |
|||
_inherit = "website" |
|||
|
|||
def get_brands(self): |
|||
brand = self.env['product.brand'].search([]) |
|||
print('brand', brand) |
|||
return brand |
@ -0,0 +1,73 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################# |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
|||
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) |
|||
# |
|||
# You can modify it under the terms of the GNU LESSER |
|||
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. |
|||
# |
|||
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE |
|||
# (LGPL v3) along with this program. |
|||
# If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################# |
|||
|
|||
from odoo import models, fields |
|||
|
|||
|
|||
class BoecConfig(models.Model): |
|||
_name = 'boec.config' |
|||
|
|||
name = fields.Char('Name') |
|||
deal_week_product_id = fields.Many2one('product.product', domain=[('is_published', '=', True)], |
|||
string='Deal of the Week Product') |
|||
date_end = fields.Datetime(string='Counter End Date') |
|||
# max_price = fields.Integer(string="Maximum Price", default=10000) |
|||
|
|||
|
|||
class ThemeBoec(models.AbstractModel): |
|||
_inherit = 'theme.utils' |
|||
|
|||
def _theme_boec_post_copy(self, mod): |
|||
|
|||
self.enable_view('theme_boec.boec_header') |
|||
# |
|||
self.disable_view('website_sale.products_add_to_cart') |
|||
self.disable_view('website_sale_comparison.add_to_compare') |
|||
self.disable_view('website_sale.product_buy_now') |
|||
self.disable_view('website_sale_wishlist.add_to_wishlist') |
|||
self.disable_view('website_sale.add_grid_or_list_option') |
|||
# self.disable_view('website_sale.products_images_full') |
|||
self.disable_view('website_sale.products_list_view') |
|||
self.disable_view('website_sale.alternative_products') |
|||
self.disable_view('website_sale.product_buy_now') |
|||
self.disable_view('website_sale.product_comment') |
|||
self.disable_view('website_sale.product_picture_magnify_both') |
|||
self.disable_view('website_sale.product_variants') |
|||
self.disable_view('website_sale_comparison.product_attributes_body') |
|||
self.disable_view('website_sale.ecom_show_extra_fields') |
|||
self.disable_view('website_sale.product_custom_text') |
|||
self.disable_view('website_sale_wishlist.product_add_to_wishlist') |
|||
self.disable_view('website_blog.opt_posts_loop_show_author') |
|||
self.disable_view('website_blog.opt_posts_loop_show_stats') |
|||
self.disable_view('website_blog.opt_posts_loop_show_stats') |
|||
self.disable_view('website_blog.opt_blog_list_view') |
|||
self.disable_view('website_blog.opt_blog_cards_design') |
|||
self.disable_view('website_blog.opt_blog_cover_post') |
|||
self.disable_view('website_blog.opt_blog_cover_post_fullwidth_design') |
|||
self.disable_view('website_blog.opt_blog_post_breadcrumb') |
|||
self.disable_view('website_blog.opt_blog_post_sidebar') |
|||
|
|||
|
|||
class ProductInherited(models.Model): |
|||
_inherit = "product.template" |
|||
|
|||
hot_deals = fields.Boolean(string="Hot Sale") |
|
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 4.7 KiB |
After Width: | Height: | Size: 323 KiB |
After Width: | Height: | Size: 277 KiB |
After Width: | Height: | Size: 491 KiB |
After Width: | Height: | Size: 146 KiB |
After Width: | Height: | Size: 272 KiB |
After Width: | Height: | Size: 236 KiB |
After Width: | Height: | Size: 51 KiB |
After Width: | Height: | Size: 415 KiB |
After Width: | Height: | Size: 596 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 28 KiB |
After Width: | Height: | Size: 261 KiB |
After Width: | Height: | Size: 348 KiB |
After Width: | Height: | Size: 231 KiB |
After Width: | Height: | Size: 386 KiB |
After Width: | Height: | Size: 360 KiB |
After Width: | Height: | Size: 380 KiB |
After Width: | Height: | Size: 542 KiB |
After Width: | Height: | Size: 323 KiB |
After Width: | Height: | Size: 632 KiB |
@ -0,0 +1,360 @@ |
|||
<div class="oe_styling_v8"> |
|||
<!-- Hero Section --> |
|||
<div class="container pt-4 mt-4 rounded" style="background-color: #fff; font-family: Montserrat, 'sans-serif';"> |
|||
<div class="row"> |
|||
<div class="col-lg-12 mb-4"> |
|||
<img src="images/Cybrosys.png" alt="Cybrosys Logo" style="width: 120px; height: auto;"> |
|||
<hr style="border-color: #e1e5e9;" /> |
|||
</div> |
|||
</div> |
|||
<div class="row"> |
|||
<div class="col-lg-12 text-center"> |
|||
<img src="images/hero.png" width=60% height="auto" class="mb-4" alt="Theme Screenshot"> |
|||
</div> |
|||
<div class="col-lg-12 text-center"> |
|||
<h1 class="mt-4">Theme Boec</h1> |
|||
<p class="lead mb-4" style="max-width: 700px; margin: 0 auto;"> |
|||
Theme Boec is a new kind of Theme. The theme is a very user-friendly and is suitable for your |
|||
eCommerce website with blog. |
|||
It is the most powerful, easy to use theme. Many custom designed snippets facilitates to add |
|||
better |
|||
user experience. |
|||
Contains Hot sales, New arrival and Deal of the week with Counter snippets that are configured |
|||
from |
|||
the backend. |
|||
It have instagram feed snippet and deal of the week snippet with counter. |
|||
It is a fully Responsive Theme with a premium design and attractive front-end theme. |
|||
it contains price filter and brand filter options by default and it easily configure from |
|||
backend. |
|||
This theme is a perfect choice for your online store you are looking for. This theme is fully |
|||
customized |
|||
the eCommerce website, shop view, custom categories view, product view, contact us page, cart, |
|||
blog, |
|||
blog preview...etc. |
|||
</p> |
|||
</div> |
|||
</div> |
|||
|
|||
<!-- End of Hero Section --> |
|||
|
|||
<!-- Alternate Section --> |
|||
<div class="row p-4"> |
|||
<div class="col-lg-6 px-4" style="margin-top: 100px;"> |
|||
<h2>Desktop View</h2> |
|||
<p class="lead"> |
|||
It is easy to customize and use. Just drag and drop the building blocks to make attractive |
|||
webpages. |
|||
</p> |
|||
</div> |
|||
<div class="col-lg-6 px-4"> |
|||
<img style="border-radius: 0.5em;" src="images/laptop-screenshots.jpg" width="90%" height="auto" |
|||
class="mb-4 shadow-sm" alt="Theme Screenshot"> |
|||
</div> |
|||
</div> |
|||
<div class="row p-4"> |
|||
<div class="col-lg-6 px-4"> |
|||
<img style="border-radius: 0.5em;" src="images/phone-screenshots.jpg" width="90%" height="auto" |
|||
class="mb-4 shadow-sm" alt="Theme Screenshot"> |
|||
</div> |
|||
<div class="col-lg-6 px-4" style="margin-top: 100px;"> |
|||
<h2>Mobile View</h2> |
|||
<p class="lead"> |
|||
User friendly and modern looking theme makes your page more Stylish And Beautiful. |
|||
</p> |
|||
</div> |
|||
</div> |
|||
<!-- End of Alternate Section --> |
|||
|
|||
<!-- Two Columns Section --> |
|||
<div class="row p-4"> |
|||
<!-- Column 1 --> |
|||
<div class="col-lg-6"> |
|||
<div class="row"> |
|||
<div class="col-lg-12"> |
|||
<img style="border-radius: 0.5em;" src="images/1.jpg" width="100%" height="auto" |
|||
class="mb-4 shadow-sm" alt="Theme Screenshot"> |
|||
</div> |
|||
<div class="col-lg-12 mt-4"> |
|||
<h2 class="text-center">Home Page</h2> |
|||
<p class="lead text-center"> |
|||
It is easy to customize and use. Just drag and drop the building blocks to make |
|||
attractive |
|||
webpages.Customizable building blocks in home page design helps you to edit them as per |
|||
needs. </p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!-- End of Column 1 --> |
|||
|
|||
<!-- Column 2 --> |
|||
<div class="col-lg-6"> |
|||
<div class="row"> |
|||
<div class="col-lg-12"> |
|||
<img style="border-radius: 0.5em;" src="images/2.jpg" width="100%" height="auto" |
|||
class="mb-4 shadow-sm" alt="Theme Screenshot"> |
|||
</div> |
|||
<div class="col-lg-12 mt-4"> |
|||
<h2 class="text-center">Shop Page</h2> |
|||
<p class="lead text-center"> |
|||
The shop display you products in a stylish way. It displaying 3 products in a row and it |
|||
will attract your customers. |
|||
Also the Category side are customized in collapsible style. Display high quality images |
|||
for |
|||
your products |
|||
</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!-- End of Column 2 --> |
|||
</div> |
|||
<!-- End of Two Columns Section --> |
|||
|
|||
|
|||
<!-- One Column Section --> |
|||
<div class="row p-4"> |
|||
<div class="col-lg-6"> |
|||
<img style="border-radius: 0.5em;" src="images/3.jpg" width="90%" height="auto" class="mb-4 shadow-sm" |
|||
alt="Theme Screenshot"> |
|||
</div> |
|||
<div class="col-lg-6" style="padding-top: 100px;"> |
|||
<h2>Overview</h2> |
|||
<p class="lead"> |
|||
It is an attractive and modern eCommerce Website theme. It make your eCommerce website is |
|||
attractive. |
|||
Just drag & drop the building blocks you need to easily build your layout. |
|||
Theme Boec is a perfect choice for your online store you are looking for. |
|||
</p> |
|||
</div> |
|||
</div> |
|||
<!-- End of One Columns Section --> |
|||
|
|||
|
|||
<!-- New Arrivals Section --> |
|||
<div class="row p-4"> |
|||
<div class="col-lg-6" style="padding-top: 100px;"> |
|||
<h2>Hot Sales and New Arrivals</h2> |
|||
<p class="lead"> |
|||
Hot sales and New arrivals are the snippets that are configured from the backend. You can easily add products |
|||
to the Hot sales. New arrivals are automatically taken the newly arrived products. |
|||
</p> |
|||
</div> |
|||
<div class="col-lg-6"> |
|||
<img style="border-radius: 0.5em;" src="images/new_arrivals.jpg" width="90%" height="auto" |
|||
class="mb-4 shadow-sm" alt="Theme Screenshot"> |
|||
</div> |
|||
</div> |
|||
<!-- End of New Section --> |
|||
|
|||
|
|||
<!-- Deal Section --> |
|||
<div class="row p-4"> |
|||
<div class="col-lg-12 px-4"> |
|||
<img class="shadow" style="border-radius: 0.5rem;" src="images/boec_deal.png" width="100%" |
|||
height="auto"> |
|||
</div> |
|||
<div class="col-lg-12 my-4 d-flex flex-column justify-content-center align-items-center"> |
|||
<h2 class="mt-4">Deal of the Week</h2> |
|||
<p class="lead text-center"> |
|||
Deal of the week snippet have Counter for giving a premium look the deal of the week product and its counter |
|||
are easily configurable from the backend. |
|||
</p> |
|||
</div> |
|||
</div> |
|||
<!-- End of Deal Section --> |
|||
|
|||
<!-- Three Columns Section --> |
|||
<div class="row p-4"> |
|||
<!-- Column 1 --> |
|||
<div class="col-lg-4"> |
|||
<div class="row"> |
|||
<div class="col-lg-12"> |
|||
<img style="border-radius: 0.5em;" src="images/4.jpg" width="100%" height="auto" |
|||
class="mb-4 shadow-sm" alt="Theme Screenshot"> |
|||
</div> |
|||
<div class="col-lg-12 mt-4"> |
|||
<h2 class="text-center">Cart</h2> |
|||
<p class="lead text-center"> |
|||
The cart display your products in a stylish way. it will display the all needed details |
|||
of |
|||
the product |
|||
</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!-- End of Column 1 --> |
|||
|
|||
|
|||
|
|||
<!-- Column 2 --> |
|||
<div class="col-lg-4"> |
|||
<div class="row"> |
|||
<div class="col-lg-12"> |
|||
<img style="border-radius: 0.5em;" src="images/5.jpg" width="100%" height="auto" |
|||
class="mb-4 shadow-sm" alt="Theme Screenshot"> |
|||
</div> |
|||
<div class="col-lg-12 mt-4"> |
|||
<h2 class="text-center">Blog Preview</h2> |
|||
<p class="lead text-center"> |
|||
Theme Boec have a fully customized blog preview with big cover image of the blog with |
|||
share |
|||
buttons. |
|||
</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!-- End of Column 2 --> |
|||
|
|||
|
|||
<!-- Column 4 --> |
|||
<div class="col-lg-4"> |
|||
<div class="row"> |
|||
<div class="col-lg-12"> |
|||
<img style="border-radius: 0.5em;" src="images/6.jpg" width="100%" height="auto" |
|||
class="mb-4 shadow-sm" alt="Theme Screenshot"> |
|||
</div> |
|||
<div class="col-lg-12 mt-4"> |
|||
<h2 class="text-center">Product Preview</h2> |
|||
<p class="lead text-center"> |
|||
It have a fully customized Product preview with full details of the product with an |
|||
attractive design. |
|||
</p> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<!-- End of Column 4 --> |
|||
</div> |
|||
<!-- End of Three Columns Section --> |
|||
|
|||
<!--<!– Video Section –>--> |
|||
<!--<div class="row p-4">--> |
|||
<!-- <div class="col-lg-12 d-flex flex-column justify-content-center">--> |
|||
<!-- <h4 class="mt-4 text-center">Video</h4>--> |
|||
<!-- <hr style="border-width: 3px; border-color: #0984e3; width: 100px;">--> |
|||
<!-- </div>--> |
|||
<!-- <div class="col-lg-12 d-flex justify-content-center mt-4">--> |
|||
<!-- <div class="s_panel_video" data-video-id="peAp2Tx_XIs?rel=0" style="cursor:pointer;">--> |
|||
<!-- <img class="img-fluid s_tooltip_tabs_tooltip_image s_figure_link pb0"--> |
|||
<!-- src="images/your-video-cover.jpg" alt="Cybrosys Cover Video" style="max-width:100%;">--> |
|||
<!-- </div>--> |
|||
<!-- </div>--> |
|||
<!--</div>--> |
|||
<!--<!– End of Video Section–>--> |
|||
|
|||
<!-- Demo Pages --> |
|||
<section class="oe_container"> |
|||
<div class="row" style="margin: 60px auto -30px;"> |
|||
<div class="col-lg-12 text-center"> |
|||
<h4 class="mt-4">Demo Pages</h4> |
|||
<hr style="border-width: 3px; border-color: #0984e3; width: 100px;"> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="row" style="margin: 40px auto; border-radius: 15px; padding: 38px;"> |
|||
<div class="col-sm-6 col-md-4 px-2"> |
|||
<div class="bg-white shadow overflow-hidden mb32" |
|||
style="border-radius: 15px; width: 300px; padding-bottom: 0; margin-right: 30px;"> |
|||
<img src="./images/demo-1.jpg" width="300px" height="auto"> |
|||
<h6 class="text-center my-3">Home</h6> |
|||
<hr style="border-width: 5px; border-color: #0984e3; width: 150px; margin-bottom: 0;"> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-sm-6 col-md-4 px-2"> |
|||
<div class="bg-white shadow overflow-hidden mb32" |
|||
style="border-radius: 15px; width: 300px; padding-bottom: 0;"> |
|||
<img src="./images/demo-2.jpg" width="300px" height="auto"> |
|||
<h6 class="text-center my-3">Blog Preview</h6> |
|||
<hr style="border-width: 5px; border-color: #05c46b; width: 150px; margin-bottom: 0;"> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-sm-6 col-md-4 px-2"> |
|||
<div class="bg-white shadow overflow-hidden mb32" |
|||
style="border-radius: 15px; width: 300px; padding-bottom: 0;"> |
|||
<img src="./images/demo-3.jpg" width="300px" height="auto"> |
|||
<h6 class="text-center my-3">Shop Page</h6> |
|||
<hr style="border-width: 5px; border-color: #f44f52; width: 150px; margin-bottom: 0;"> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="row d-flex justify-content-center" |
|||
style="margin: 40px auto; border-radius: 15px; padding: 38px;"> |
|||
<div class="col-sm-6 col-md-4 px-2"> |
|||
<div class="bg-white shadow overflow-hidden mb32" |
|||
style="border-radius: 15px; width: 300px; padding-bottom: 0;"> |
|||
<img src="./images/demo-4.jpg" width="300px" height="auto"> |
|||
<h6 class="text-center my-3">Blog Page</h6> |
|||
<hr style="border-width: 5px; border-color: #ffa801; width: 150px; margin-bottom: 0;"> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-sm-6 col-md-4 px-2"> |
|||
<div class="bg-white shadow overflow-hidden mb32" |
|||
style="border-radius: 15px; width: 300px; padding-bottom: 0;"> |
|||
<img src="./images/demo-5.jpg" width="300px" height="auto"> |
|||
<h6 class="text-center my-3">About Page</h6> |
|||
<hr style="border-width: 5px; border-color: #3c40c6; width: 150px; margin-bottom: 0;"> |
|||
</div> |
|||
</div> |
|||
|
|||
</div> |
|||
</section> |
|||
<!-- End of Demo Pages --> |
|||
|
|||
<!-- Footer --> |
|||
<div class="row" style="margin-top: 4rem;"> |
|||
<div class="col-lg-12 text-center"> |
|||
<h2>Get Help</h2> |
|||
<hr style=" border: 2px solid #b22126; margin-top: 2px;" width="40px"> |
|||
<p class="text-center" style="max-width: 650px; margin: 0 auto;">If you have anything to share with |
|||
us |
|||
based |
|||
on |
|||
your use of this module, please let us know. We are ready to offer our support.</p> |
|||
</div> |
|||
</div> |
|||
<div class="row"> |
|||
<div class="col px-4 pt-3 pb-2 shadow-sm" |
|||
style="background-color: #fff; max-width: 450px; border-radius: 0.5em; margin: 1em auto;"> |
|||
<div class="row"> |
|||
<div class="col-lg-8"> |
|||
<h6><a href="mailto:odoo@cybrosys.com" target="_blank" |
|||
style="color: #050505; text-decoration: none;"><i |
|||
class="fa fa-envelope mr-2"></i>odoo@cybrosys.com</a></h6> |
|||
</div> |
|||
<div class="col-lg-4 d-flex justify-content-end" style="position: relative;"> |
|||
<h6><a href="mailto:odoo@cybrosys.com" target="_blank" |
|||
style="color: #050505; text-decoration: none;"><i class="fa fa-chevron-right"></i></a> |
|||
</h6> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="row"> |
|||
<div class="col px-4 pt-3 pb-2 shadow-sm" |
|||
style="background-color: #fff; max-width: 450px; border-radius: 0.5em; margin: 1em auto;"> |
|||
<div class="row"> |
|||
<div class="col-lg-8"> |
|||
<h6><a href="https://www.cybrosys.com" target="_blank" |
|||
style="color: #050505; text-decoration: none;"><i |
|||
class="fa fa-globe mr-2"></i>www.cybrosys.com</a></h6> |
|||
</div> |
|||
<div class="col-lg-4 d-flex justify-content-end" style="position: relative;"> |
|||
<h6><a href="https://www.cybrosys.com" target="_blank" |
|||
style="color: #050505; text-decoration: none;"><i class="fa fa-chevron-right"></i></a> |
|||
</h6> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div class="row"> |
|||
<div class="col-lg-12 mt-4 mb-2 text-center"> |
|||
<p style="font-weight: bold">A Quality Theme From</p> |
|||
</div> |
|||
<div class="col-lg-12 text-center"> |
|||
<img src="images/cybro-logo-oca.png" width="80px" height="auto"> |
|||
</div> |
|||
</div> |
|||
<!-- End of Footer --> |
|||
</div> |
|||
</div> |
After Width: | Height: | Size: 152 KiB |
@ -0,0 +1,183 @@ |
|||
/** |
|||
* Owl Carousel v2.3.4 |
|||
* Copyright 2013-2018 David Deutsch |
|||
* Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE |
|||
*/ |
|||
.owl-carousel, |
|||
.owl-carousel .owl-item { |
|||
-webkit-tap-highlight-color: transparent; |
|||
position: relative; |
|||
} |
|||
.owl-carousel { |
|||
display: none; |
|||
width: 100%; |
|||
z-index: 1; |
|||
} |
|||
.owl-carousel .owl-stage { |
|||
position: relative; |
|||
-ms-touch-action: pan-Y; |
|||
touch-action: manipulation; |
|||
-moz-backface-visibility: hidden; |
|||
} |
|||
.owl-carousel .owl-stage:after { |
|||
content: "."; |
|||
display: block; |
|||
clear: both; |
|||
visibility: hidden; |
|||
line-height: 0; |
|||
height: 0; |
|||
} |
|||
.owl-carousel .owl-stage-outer { |
|||
position: relative; |
|||
overflow: hidden; |
|||
-webkit-transform: translate3d(0, 0, 0); |
|||
} |
|||
.owl-carousel .owl-item, |
|||
.owl-carousel .owl-wrapper { |
|||
-webkit-backface-visibility: hidden; |
|||
-moz-backface-visibility: hidden; |
|||
-ms-backface-visibility: hidden; |
|||
-webkit-transform: translate3d(0, 0, 0); |
|||
-moz-transform: translate3d(0, 0, 0); |
|||
-ms-transform: translate3d(0, 0, 0); |
|||
} |
|||
.owl-carousel .owl-item { |
|||
min-height: 1px; |
|||
float: left; |
|||
-webkit-backface-visibility: hidden; |
|||
-webkit-touch-callout: none; |
|||
} |
|||
.owl-carousel .owl-item img { |
|||
display: block; |
|||
width: 100%; |
|||
} |
|||
.owl-carousel .owl-dots.disabled, |
|||
.owl-carousel .owl-nav.disabled { |
|||
display: none; |
|||
} |
|||
.no-js .owl-carousel, |
|||
.owl-carousel.owl-loaded { |
|||
display: block; |
|||
} |
|||
.owl-carousel .owl-dot, |
|||
.owl-carousel .owl-nav .owl-next, |
|||
.owl-carousel .owl-nav .owl-prev { |
|||
cursor: pointer; |
|||
-webkit-user-select: none; |
|||
-khtml-user-select: none; |
|||
-moz-user-select: none; |
|||
-ms-user-select: none; |
|||
user-select: none; |
|||
} |
|||
.owl-carousel .owl-nav button.owl-next, |
|||
.owl-carousel .owl-nav button.owl-prev, |
|||
.owl-carousel button.owl-dot { |
|||
background: 0 0; |
|||
color: inherit; |
|||
border: none; |
|||
padding: 0 !important; |
|||
font: inherit; |
|||
} |
|||
.owl-carousel.owl-loading { |
|||
opacity: 0; |
|||
display: block; |
|||
} |
|||
.owl-carousel.owl-hidden { |
|||
opacity: 0; |
|||
} |
|||
.owl-carousel.owl-refresh .owl-item { |
|||
visibility: hidden; |
|||
} |
|||
.owl-carousel.owl-drag .owl-item { |
|||
-ms-touch-action: pan-y; |
|||
touch-action: pan-y; |
|||
-webkit-user-select: none; |
|||
-moz-user-select: none; |
|||
-ms-user-select: none; |
|||
user-select: none; |
|||
} |
|||
.owl-carousel.owl-grab { |
|||
cursor: move; |
|||
cursor: grab; |
|||
} |
|||
.owl-carousel.owl-rtl { |
|||
direction: rtl; |
|||
} |
|||
.owl-carousel.owl-rtl .owl-item { |
|||
float: right; |
|||
} |
|||
.owl-carousel .animated { |
|||
animation-duration: 1s; |
|||
animation-fill-mode: both; |
|||
} |
|||
.owl-carousel .owl-animated-in { |
|||
z-index: 0; |
|||
} |
|||
.owl-carousel .owl-animated-out { |
|||
z-index: 1; |
|||
} |
|||
.owl-carousel .fadeOut { |
|||
animation-name: fadeOut; |
|||
} |
|||
@keyframes fadeOut { |
|||
0% { |
|||
opacity: 1; |
|||
} |
|||
100% { |
|||
opacity: 0; |
|||
} |
|||
} |
|||
.owl-height { |
|||
transition: height 0.5s ease-in-out; |
|||
} |
|||
.owl-carousel .owl-item .owl-lazy { |
|||
opacity: 0; |
|||
transition: opacity 0.4s ease; |
|||
} |
|||
.owl-carousel .owl-item .owl-lazy:not([src]), |
|||
.owl-carousel .owl-item .owl-lazy[src^=""] { |
|||
max-height: 0; |
|||
} |
|||
.owl-carousel .owl-item img.owl-lazy { |
|||
transform-style: preserve-3d; |
|||
} |
|||
.owl-carousel .owl-video-wrapper { |
|||
position: relative; |
|||
height: 100%; |
|||
background: #000; |
|||
} |
|||
.owl-carousel .owl-video-play-icon { |
|||
position: absolute; |
|||
height: 80px; |
|||
width: 80px; |
|||
left: 50%; |
|||
margin-left: -40px; |
|||
margin-top: -40px; |
|||
background: url(owl.video.play.png) no-repeat; |
|||
cursor: pointer; |
|||
z-index: 1; |
|||
-webkit-backface-visibility: hidden; |
|||
transition: transform 0.1s ease; |
|||
} |
|||
.owl-carousel .owl-video-play-icon:hover { |
|||
-ms-transform: scale(1.3, 1.3); |
|||
transform: scale(1.3, 1.3); |
|||
} |
|||
.owl-carousel .owl-video-playing .owl-video-play-icon, |
|||
.owl-carousel .owl-video-playing .owl-video-tn { |
|||
display: none; |
|||
} |
|||
.owl-carousel .owl-video-tn { |
|||
opacity: 0; |
|||
height: 100%; |
|||
background-position: center center; |
|||
background-repeat: no-repeat; |
|||
background-size: contain; |
|||
transition: opacity 0.4s ease; |
|||
} |
|||
.owl-carousel .owl-video-frame { |
|||
position: relative; |
|||
z-index: 1; |
|||
height: 100%; |
|||
width: 100%; |
|||
} |
@ -0,0 +1,6 @@ |
|||
/** |
|||
* Owl Carousel v2.3.4 |
|||
* Copyright 2013-2018 David Deutsch |
|||
* Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE |
|||
*/ |
|||
.owl-theme .owl-dots,.owl-theme .owl-nav{text-align:center;-webkit-tap-highlight-color:transparent}.owl-theme .owl-nav{margin-top:10px}.owl-theme .owl-nav [class*=owl-]{color:#FFF;font-size:14px;margin:5px;padding:4px 7px;background:#D6D6D6;display:inline-block;cursor:pointer;border-radius:3px}.owl-theme .owl-nav [class*=owl-]:hover{background:#869791;color:#FFF;text-decoration:none}.owl-theme .owl-nav .disabled{opacity:.5;cursor:default}.owl-theme .owl-nav.disabled+.owl-dots{margin-top:10px}.owl-theme .owl-dots .owl-dot{display:inline-block;zoom:1}.owl-theme .owl-dots .owl-dot span{width:10px;height:10px;margin:5px 7px;background:#D6D6D6;display:block;-webkit-backface-visibility:visible;transition:opacity .2s ease;border-radius:30px}.owl-theme .owl-dots .owl-dot.active span,.owl-theme .owl-dots .owl-dot:hover span{background:#869791} |
@ -0,0 +1,122 @@ |
|||
body { |
|||
background-color: #f1f1f1; |
|||
padding-top: 20px; |
|||
} |
|||
.young-passion-gradient { |
|||
background: linear-gradient(40deg, #b12a5b, #ff8177); |
|||
} |
|||
|
|||
.title h1 { |
|||
text-align: left; |
|||
color: #353535; |
|||
font-size: 35px; |
|||
} |
|||
|
|||
.hero { |
|||
color: white; |
|||
padding: 39px 5px; |
|||
|
|||
a button{ |
|||
font-size: 17px; |
|||
color: #fff; |
|||
padding: 7px; |
|||
border-radius: 9px; |
|||
border: 2px solid #fff; |
|||
background-color: #ffffff00; |
|||
font-weight: 700; |
|||
margin: 30px 0; |
|||
} |
|||
|
|||
|
|||
#counters_hero { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
vertical-align: middle; |
|||
height: 100%; |
|||
.cont { |
|||
margin: auto; |
|||
.label { |
|||
text-align: center; |
|||
height: 49px; |
|||
line-height: 1.4; |
|||
font-size: 14px; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.circle { |
|||
width: 99px; |
|||
height: 99px; |
|||
background: #cfcfcfb9; |
|||
border-radius: 78px; |
|||
margin: auto; |
|||
.counter { |
|||
font-size: 20px; |
|||
text-align: center; |
|||
color: white; |
|||
line-height: 4.6; |
|||
width: auto; |
|||
} |
|||
} |
|||
|
|||
.description { |
|||
background-color: #e0e0e0; |
|||
padding: 15px; |
|||
color: #3c3c3c; |
|||
p { |
|||
font-weight: 700; |
|||
} |
|||
} |
|||
|
|||
#counters_1, |
|||
#counters_2, |
|||
#counters_3 { |
|||
display: flex; |
|||
justify-content: space-around; |
|||
padding: 33px; |
|||
.counter { |
|||
font-size: 33px; |
|||
font-weight: 600; |
|||
color: #000; |
|||
width: auto; |
|||
} |
|||
p { |
|||
margin-bottom: 0; |
|||
width: 20px; |
|||
float: left; |
|||
color: #04884c; |
|||
font-size: 29px; |
|||
line-height: 1.6; |
|||
} |
|||
.text { |
|||
width: 100px; |
|||
text-align: center; |
|||
text-transform: uppercase; |
|||
font-size: 12px; |
|||
color: #616161; |
|||
} |
|||
.cont .row { |
|||
justify-content: center; |
|||
} |
|||
@media (max-width: 480px) { |
|||
.counter { |
|||
font-size: 25px; |
|||
} |
|||
p { |
|||
font-size: 24px; |
|||
line-height: 1.5; |
|||
} |
|||
.text{ |
|||
font-size: 10px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.distance{ |
|||
margin: 88px 0 160px 0; |
|||
text-align: center; |
|||
font-size: 41px; |
|||
color: #04884c; |
|||
font-weight: 400; |
|||
} |
After Width: | Height: | Size: 280 KiB |
After Width: | Height: | Size: 67 KiB |
After Width: | Height: | Size: 147 KiB |
After Width: | Height: | Size: 114 KiB |
After Width: | Height: | Size: 104 KiB |
After Width: | Height: | Size: 114 KiB |
After Width: | Height: | Size: 42 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 138 KiB |
After Width: | Height: | Size: 85 KiB |
After Width: | Height: | Size: 87 KiB |
After Width: | Height: | Size: 161 KiB |
After Width: | Height: | Size: 87 KiB |
After Width: | Height: | Size: 708 KiB |
After Width: | Height: | Size: 1.5 MiB |
After Width: | Height: | Size: 287 KiB |
After Width: | Height: | Size: 304 KiB |
After Width: | Height: | Size: 267 KiB |
After Width: | Height: | Size: 201 KiB |
After Width: | Height: | Size: 175 KiB |
After Width: | Height: | Size: 136 KiB |
After Width: | Height: | Size: 114 KiB |
After Width: | Height: | Size: 185 KiB |
After Width: | Height: | Size: 169 KiB |
After Width: | Height: | Size: 163 KiB |
After Width: | Height: | Size: 118 KiB |
After Width: | Height: | Size: 209 KiB |
After Width: | Height: | Size: 149 KiB |
After Width: | Height: | Size: 608 KiB |
After Width: | Height: | Size: 71 KiB |
After Width: | Height: | Size: 142 KiB |
After Width: | Height: | Size: 168 KiB |
After Width: | Height: | Size: 198 KiB |
After Width: | Height: | Size: 1006 KiB |
After Width: | Height: | Size: 53 KiB |
After Width: | Height: | Size: 150 KiB |
After Width: | Height: | Size: 123 KiB |
After Width: | Height: | Size: 100 KiB |
After Width: | Height: | Size: 53 KiB |
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 133 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 149 KiB |
After Width: | Height: | Size: 221 KiB |
After Width: | Height: | Size: 530 KiB |
After Width: | Height: | Size: 110 KiB |
After Width: | Height: | Size: 93 KiB |
After Width: | Height: | Size: 98 KiB |
After Width: | Height: | Size: 236 KiB |
After Width: | Height: | Size: 121 KiB |
After Width: | Height: | Size: 161 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 1.5 MiB |