diff --git a/theme_shopping/README.rst b/theme_shopping/README.rst
new file mode 100755
index 000000000..5cf728d96
--- /dev/null
+++ b/theme_shopping/README.rst
@@ -0,0 +1,76 @@
+.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg
+ :target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
+ :alt: License: AGPL-3
+
+Theme Shopping
+==============
+Theme Shopping module provide attractive and unique front end theme mainly
+suitable for eCommerce website
+
+Configuration
+=============
+Top Deal product Flow:
+ - Enabling and Managing 'Top Deal' for a Product:
+ * Navigate to: Products -> Top Deal
+ * Enable the 'Top Deal' boolean field for the desired product
+
+ - Setting Deal Details
+ * Once enabled, new fields appear under Products -> General Information:
+ - Offer Price
+ - Planned Date
+ * Set the offer price
+ * Select the time period for the event
+ * Click the 'Apply' button to confirm the date
+
+ - Deal Visibility and Duration
+ * The product is added to the Top Deal carousel for the specified period
+ * When the time period ends, the product is automatically removed from the carousel
+
+ - Product Detail Page Display
+ * The Top Deal offer price is shown
+ * The original price is displayed with a strikethrough
+
+Winter Collections :
+ Adding Products to the Winter Collection:
+ - Navigate to: Products -> General Information -> Category
+ - Under the "Category" section, select "Winter Collection" from the product category options.
+ - Add the desired products to this category.
+ - These products will be available in the Winter Collection snippets.
+Testimonial Snippet:
+ -Only admin allowed users can submit their testimonials.
+ -All submited testimonials will be displayed for all users.
+
+License
+-------
+General Public License, Version 3 (AGPL v3).
+(https://www.gnu.org/licenses/agpl-3.0-standalone.html)
+
+Company
+-------
+* `Cybrosys Techno Solutions `__
+
+Credits
+-------
+Developer: (V17) Sabeel B, V(17) Shikhil Raj, (V18) Anaswara S Sunil
+Contact: odoo@cybrosys.com
+
+Contacts
+--------
+* Mail Contact : odoo@cybrosys.com
+* Website : https://cybrosys.com
+
+Bug Tracker
+-----------
+Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
+
+Maintainer
+==========
+.. image:: https://cybrosys.com/images/logo.png
+ :target: https://cybrosys.com
+This module is maintained by Cybrosys Technologies.
+
+For support and more information, please visit `Our Website `__
+
+Further information
+===================
+HTML Description: ``__
diff --git a/theme_shopping/__init__.py b/theme_shopping/__init__.py
new file mode 100644
index 000000000..14b11c674
--- /dev/null
+++ b/theme_shopping/__init__.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+###############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2025-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions (odoo@cybrosys.com)
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+###############################################################################
+from . import controllers
+from . import models
diff --git a/theme_shopping/__manifest__.py b/theme_shopping/__manifest__.py
new file mode 100644
index 000000000..b8ab5d604
--- /dev/null
+++ b/theme_shopping/__manifest__.py
@@ -0,0 +1,93 @@
+# -*- coding: utf-8 -*-
+###############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2025-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions (odoo@cybrosys.com)
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+###############################################################################
+{
+ 'name': 'Theme Shopping',
+ 'version': '18.0.1.0.0',
+ 'category': 'Theme/eCommerce',
+ 'summary': "Theme Shopping is an attractive and modern eCommerce Website "
+ "theme",
+ 'description': "Theme Shopping is new kind of Theme.The theme is very "
+ "user-friendly"
+ "and suitable for your eCommerce website with blog",
+ 'author': 'Cybrosys Techno Solutions',
+ 'company': 'Cybrosys Techno Solutions',
+ 'maintainer': 'Cybrosys Techno Solutions',
+ 'website': "https://www.cybrosys.com",
+ 'depends': ['base','sale_management', 'website_blog', 'website_sale_wishlist',
+ 'website_sale','website',
+ 'website_sale_comparison', 'website_mass_mailing'],
+ 'data': [
+ 'security/ir.model.access.csv',
+ 'security/security_groups.xml',
+ 'views/header_templates.xml',
+ 'views/footer_templates.xml',
+ 'views/add_testimonial.xml',
+ 'views/about_us_views.xml',
+ 'views/blog_templates.xml',
+ 'views/snippets/frequently_asked.xml',
+ 'views/snippets/our_team.xml',
+ 'views/snippets/new_testimonial_snippet.xml',
+ 'views/snippets/offers.xml',
+ 'views/snippets/winter_collections.xml',
+ 'views/snippets/price_collection.xml',
+ 'views/snippets/subscription.xml',
+ 'views/shop_templates.xml',
+ 'views/snippets.xml',
+ 'views/product_template_views.xml',
+ 'views/snippets/top_deal_carousal_templates.xml',
+ 'views/website_sale_wishlist_template.xml',
+ 'data/ir_cron.xml',
+ 'views/homepage_snippets.xml'
+ ],
+ 'demo': ['data/product_category_data.xml'],
+ 'assets': {
+ 'web.assets_frontend': [
+ "theme_shopping/static/src/js/top_deal_carousel/top_deal_content.xml",
+ "theme_shopping/static/src/js/top_deal_carousel/top_deal_carousal.js",
+ "theme_shopping/static/src/js/winter_collection_carousel/winter_products_content.xml",
+ "theme_shopping/static/src/js/winter_collection_carousel/winter_products_carousel.js",
+ "theme_shopping/static/src/js/testimonial.js",
+ "theme_shopping/static/src/js/subscription/subscription.js",
+ "theme_shopping/static/src/js/snippet_carousel.js",
+ "theme_shopping/static/src/css/main.css",
+ "theme_shopping/static/src/css/owl.carousel.min.css",
+ "theme_shopping/static/src/css/owl.theme.default.min.css",
+ "theme_shopping/static/src/js/owl.carousel.js",
+ "theme_shopping/static/src/js/owl.carousel.min.js",
+ "theme_shopping/static/src/js/product_review.js",
+ ],
+ 'web.assets_backend': [
+ "theme_shopping/static/src/js/welcome_message.js"
+ ],
+ },
+ 'images': [
+ 'static/description/banner.jpg',
+ 'static/description/theme_screenshot.jpg',
+ ],
+ 'images_preview_theme': {
+ 'website.s_cover_default_image': '/theme_shopping/static/description/images/banner.jpg',
+ },
+ 'license': 'AGPL-3',
+ 'installable': True,
+ 'auto_install': False,
+ 'application': False,
+}
diff --git a/theme_shopping/controllers/__init__.py b/theme_shopping/controllers/__init__.py
new file mode 100644
index 000000000..8319aacb3
--- /dev/null
+++ b/theme_shopping/controllers/__init__.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+###############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2025-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions (odoo@cybrosys.com)
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+###############################################################################
+from . import dynamic_snippets
+from . import theme_shopping
+from . import testimonial
+
diff --git a/theme_shopping/controllers/dynamic_snippets.py b/theme_shopping/controllers/dynamic_snippets.py
new file mode 100644
index 000000000..ea4e38e3f
--- /dev/null
+++ b/theme_shopping/controllers/dynamic_snippets.py
@@ -0,0 +1,74 @@
+# -*- coding: utf-8 -*-
+###############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2025-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions (odoo@cybrosys.com)
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+###############################################################################
+from odoo import http
+from odoo.http import request
+
+
+class DynamicSnippets(http.Controller):
+ """This class is for the getting values for dynamic product snippets
+ """
+ @http.route('/top_deal_product_snippet', auth='public', type='json',
+ website=True)
+ def get_best_products(self):
+ """Controller to reflect chosen products in 'Top Deal'
+ snippet"""
+ products = []
+ products_search_read = request.env['product.product'].with_user(
+ 1).search_read(
+ [('is_published', '=', True),
+ ('is_top_deal_product', '=', True),
+ ('ready_to_top_deal', '=', True)],
+ ['name', 'image_1920', 'website_id',
+ 'sales_count', 'list_price','actual_price', 'offer_price', 'product_tmpl_id', 'website_url'])
+ unique_products = []
+ seen_tmpl_ids = set()
+ for product in products_search_read:
+ if product['product_tmpl_id'][0] not in seen_tmpl_ids:
+ unique_products.append(product)
+ seen_tmpl_ids.add(product['product_tmpl_id'][0])
+ for product in unique_products:
+ products.append(product)
+ response = http.Response(
+ template='theme_shopping.best_deal_product_carousel_snippet',
+ qcontext={'products': products})
+ return products
+
+ @http.route('/get_winter_product_snippet', auth='public', type='json',
+ website=True)
+ def get_winter_products(self):
+ """Controller to reflect chosen products in 'Winter Collection'
+ snippet"""
+ products = []
+ products_search_read = request.env['product.product'].with_user(
+ 1).search_read(
+ [('is_published', '=', True),
+ ('categ_id', '=', request.env.ref(
+ 'theme_shopping.product_category_winter').id)],
+ ['name', 'image_1920', 'website_id',
+ 'sales_count', 'list_price', 'website_url'])
+ for product in products_search_read:
+ products.append(product)
+
+ response = http.Response(
+ template='theme_shopping.winter_product_carousel_snippet',
+ qcontext={'products': products})
+ return products
diff --git a/theme_shopping/controllers/testimonial.py b/theme_shopping/controllers/testimonial.py
new file mode 100644
index 000000000..6fa798b7c
--- /dev/null
+++ b/theme_shopping/controllers/testimonial.py
@@ -0,0 +1,64 @@
+# -*- coding: utf-8 -*-
+###############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2025-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions (odoo@cybrosys.com)
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+###############################################################################
+from odoo import http
+from odoo.http import request
+
+
+class WebsiteTestimonialController(http.Controller):
+ @http.route('/website/testimonials/fetch', type='json', auth='public')
+ def fetch_testimonials(self):
+ """Fetch all testimonials"""
+ try:
+ testimonials = request.env['website.testimonial'].sudo().search([])
+ return [{
+ 'user_name': testimonial.user_id.name,
+ 'testimonial': testimonial.testimonial,
+ 'image': testimonial.image,
+ } for testimonial in testimonials]
+ except Exception as e:
+ return {'status': 'error', 'message': str(e)}
+
+ @http.route('/fetch_user_group', type='json', auth='public', methods=['POST'])
+ def check_user_group(self, userId, **kwargs):
+ """Check the user group of current logged-in user"""
+ user_group = request.env['res.users'].search([('id', '=', userId)])
+ user_has_group = (
+ user_group.has_group('theme_shopping.testimonial_user') or
+ user_group.has_group('website.group_website_designer')
+ )
+ return user_has_group
+
+ @http.route('/website/testimonial/create', type='json', auth='public', methods=['POST'])
+ def create_testimonial(self, testimonial, **kwargs):
+ """Create a new testimonial record"""
+ try:
+ current_user = request.env.user
+ user_name = current_user.id
+ user_image = current_user.image_1920
+ request.env['website.testimonial'].sudo().create({
+ 'user_id': user_name,
+ 'testimonial': testimonial,
+ 'image': user_image,
+ })
+ return {'status': 'success'}
+ except Exception as e:
+ return {'status': 'error', 'message': str(e)}
\ No newline at end of file
diff --git a/theme_shopping/controllers/theme_shopping.py b/theme_shopping/controllers/theme_shopping.py
new file mode 100644
index 000000000..bcb3f2214
--- /dev/null
+++ b/theme_shopping/controllers/theme_shopping.py
@@ -0,0 +1,100 @@
+# -*- coding: utf-8 -*-
+###############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2025-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions (odoo@cybrosys.com)
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+###############################################################################
+from odoo import http, fields
+from odoo.http import request
+from odoo.addons.payment import utils as payment_utils
+from odoo.tools.json import scriptsafe as json_scriptsafe
+from odoo.addons.website_sale.controllers import main
+
+
+class WebsiteSale(main.WebsiteSale):
+ """Imported and recalled WebsiteSale class to Patch cart_update_json()"""
+ @http.route()
+ def cart_update_json(
+ self, product_id, line_id=None, add_qty=None, set_qty=None,
+ display=True,
+ product_custom_attribute_values=None,
+ no_variant_attribute_values=None, **kw
+ ):
+ """
+ This route is called :
+ - When changing quantity from the cart.
+ - When adding a product from the wishlist.
+ - When adding a product to cart on the same page (without redirection).
+ """
+ order = request.website.sale_get_order(force_create=True)
+ if order.state != 'draft':
+ request.website.sale_reset()
+ if kw.get('force_create'):
+ order = request.website.sale_get_order(force_create=True)
+ else:
+ return {}
+
+ if product_custom_attribute_values:
+ product_custom_attribute_values = json_scriptsafe.loads(
+ product_custom_attribute_values)
+
+ if no_variant_attribute_values:
+ no_variant_attribute_values = json_scriptsafe.loads(
+ no_variant_attribute_values)
+ values = order._cart_update(
+ product_id=product_id,
+ line_id=line_id,
+ add_qty=add_qty,
+ set_qty=set_qty,
+ product_custom_attribute_values=product_custom_attribute_values,
+ no_variant_attribute_values=no_variant_attribute_values,
+ **kw
+ )
+ for line in order.order_line.filtered(
+ lambda rec: rec.product_id.is_top_deal_product):
+ line.update({"price_unit": line.product_id.offer_price})
+ values['notification_info'] = self._get_cart_notification_information(
+ order, [values['line_id']])
+ values['notification_info']['warning'] = values.pop('warning', '')
+ request.session['website_sale_cart_quantity'] = order.cart_quantity
+ if not order.cart_quantity:
+ request.website.sale_reset()
+ return values
+ values['cart_quantity'] = order.cart_quantity
+ values['minor_amount'] = payment_utils.to_minor_currency_units(
+ order.amount_total, order.currency_id
+ ),
+ if not display:
+ return values
+
+ values['cart_ready'] = order._is_cart_ready()
+ values['website_sale.cart_lines'] = request.env[
+ 'ir.ui.view']._render_template(
+ "website_sale.cart_lines", {
+ 'website_sale_order': order,
+ 'date': fields.Date.today(),
+ 'suggested_products': order._cart_accessories()
+ }
+ )
+ values['website_sale.total'] = request.env[
+ 'ir.ui.view']._render_template(
+ "website_sale.total", {
+ 'website_sale_order': order,
+ }
+ )
+ return values
diff --git a/theme_shopping/data/ir_cron.xml b/theme_shopping/data/ir_cron.xml
new file mode 100644
index 000000000..c6cc789ab
--- /dev/null
+++ b/theme_shopping/data/ir_cron.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+ Top deal Offer Checking
+
+ code
+ model.check_top_deal()
+
+ 1
+ days
+
+
+
diff --git a/theme_shopping/data/product_category_data.xml b/theme_shopping/data/product_category_data.xml
new file mode 100644
index 000000000..ae36d01db
--- /dev/null
+++ b/theme_shopping/data/product_category_data.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+ Winter Collection
+
+
diff --git a/theme_shopping/doc/RELEASE_NOTES.md b/theme_shopping/doc/RELEASE_NOTES.md
new file mode 100755
index 000000000..5f8252815
--- /dev/null
+++ b/theme_shopping/doc/RELEASE_NOTES.md
@@ -0,0 +1,6 @@
+## Module
+
+#### 16.01.2025
+#### Version 18.0.1.0.0
+#### ADD
+- Initial commit for Theme Shopping
diff --git a/theme_shopping/models/__init__.py b/theme_shopping/models/__init__.py
new file mode 100644
index 000000000..81c517c3d
--- /dev/null
+++ b/theme_shopping/models/__init__.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+###############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2025-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions (odoo@cybrosys.com)
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+###############################################################################
+from . import product_template
+from . import product_wishlist
+from . import theme_utils
+from . import website_testimonial
diff --git a/theme_shopping/models/product_template.py b/theme_shopping/models/product_template.py
new file mode 100644
index 000000000..6a285a4ba
--- /dev/null
+++ b/theme_shopping/models/product_template.py
@@ -0,0 +1,103 @@
+# -*- coding: utf-8 -*-
+###############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2025-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions (odoo@cybrosys.com)
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+###############################################################################
+from odoo import api, fields, models
+from odoo.exceptions import ValidationError
+
+class ProductTemplate(models.Model):
+ _inherit = 'product.template'
+
+ is_top_deal_product = fields.Boolean(string="Top Deal Product",
+ help="Whether the product is listed "
+ "in the top deal product",
+ store=True)
+ offer_price = fields.Float(string="Offer Price",
+ help="Set an offer price to price to "
+ "display on website")
+ time_period_from = fields.Date(string="From Date",
+ help="From date for offer price visibility",
+ default=lambda self: fields.Date.today())
+ time_period_end = fields.Date(string="End Date",
+ help="End date for offer price visibility",
+ default=lambda self: fields.Date.today())
+ ready_to_top_deal = fields.Boolean(string="Ready to Top Deal",
+ help="Determine whether the product is ready to be featured as a top deal.")
+ actual_price = fields.Monetary(string="Actual Price")
+
+ def _get_combination_info(self, combination=False, product_id=False,
+ add_qty=1, parent_combination=False,
+ only_template=False):
+ """Return the variant info based on its combination.
+ See `_get_combination_info` for more information.
+ """
+ combination_info = super()._get_combination_info(
+ combination=combination, product_id=product_id, add_qty=add_qty,
+ parent_combination=parent_combination, only_template=only_template)
+ combination_info['offer_price'] = self.offer_price
+ return combination_info
+
+ @api.onchange('is_top_deal_product')
+ def onchange_is_top_deal_product(self):
+ """Set the offer price as new sale price and old sales price saves
+ into new field """
+ if self.is_top_deal_product:
+ self.actual_price = self.list_price
+ self.time_period_from = fields.Date.today()
+ self.time_period_end = fields.Date.today()
+ config = self.env['res.config.settings'].create(
+ {'group_product_price_comparison': True})
+ config.execute()
+ else:
+ self.list_price = self.actual_price
+ self.compare_list_price = 0.0
+ self.ready_to_top_deal = False
+
+ def check_top_deal(self):
+ """Check the timeframe of the top deal offer."""
+ data = self.env['product.template'].search(
+ [('is_top_deal_product', '=', 'True')])
+ today = fields.Date.today()
+ for rec in data:
+ if today > rec.time_period_end:
+ rec.write({'ready_to_top_deal': False,
+ 'list_price': rec.actual_price,
+ 'compare_list_price': 0.0
+ })
+
+ elif rec.time_period_from <= today <= rec.time_period_end:
+ if rec.offer_price < rec.actual_price:
+ rec.write({'ready_to_top_deal': True,
+ 'list_price': rec.offer_price,
+ 'compare_list_price': rec.actual_price})
+ else:
+ rec.write({'ready_to_top_deal': True,
+ 'list_price': rec.actual_price,
+ 'compare_list_price': 0.0
+ })
+ elif rec.time_period_from > rec.time_period_end:
+ rec.write({'ready_to_top_deal': False})
+ raise ValidationError("From date should be less than end date")
+ else:
+ rec.write({'ready_to_top_deal': False})
+
+ def apply_top_deal_time(self):
+ """Method for set time period for top deal products."""
+ self.check_top_deal()
diff --git a/theme_shopping/models/product_wishlist.py b/theme_shopping/models/product_wishlist.py
new file mode 100644
index 000000000..1f78ce764
--- /dev/null
+++ b/theme_shopping/models/product_wishlist.py
@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+###############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2025-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions (odoo@cybrosys.com)
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+###############################################################################
+from odoo import api, models
+
+
+class ProductWishlist(models.Model):
+ """Inherited product_wishlist to overwrite a function"""
+ _inherit = 'product.wishlist'
+
+ @api.model
+ def _add_to_wishlist(self, pricelist_id, currency_id, website_id, price,
+ product_id, partner_id=False):
+ """Over-writing the function to check conditions"""
+ existing_product = self.env['product.wishlist'].search_count([
+ ('product_id', '=', product_id)])
+ if existing_product == 1:
+ return False
+ else:
+ wish = self.env['product.wishlist'].create({
+ 'partner_id': partner_id,
+ 'product_id': product_id,
+ 'currency_id': currency_id,
+ 'pricelist_id': pricelist_id,
+ 'price': price,
+ 'website_id': website_id,
+ })
+ total_wish = self.env['product.wishlist'].search_count([])
+ return wish, total_wish
diff --git a/theme_shopping/models/theme_utils.py b/theme_shopping/models/theme_utils.py
new file mode 100644
index 000000000..bd7f766a9
--- /dev/null
+++ b/theme_shopping/models/theme_utils.py
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+###############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2025-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions (odoo@cybrosys.com)
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+###############################################################################
+from odoo import api, models
+
+
+class ThemeUtils(models.AbstractModel):
+ """ Class for enable and disable templates when using theme shopping"""
+ _inherit = 'theme.utils'
+
+ @api.model
+ def _theme_shopping_post_copy(self, mod):
+ """ Enable and disable templates when using coffee shop theme """
+ self.enable_view("website_sale.products_categories")
+ self.enable_view("website_sale.products_description")
+ self.enable_view("website_sale.products_design_card")
+ self.enable_view("website_sale.products_add_to_cart")
+ self.enable_view("website_sale.product_comment")
+ self.enable_view("website_sale.option_collapse_products_categories")
+ self.enable_view("website_sale.product_buy_now")
+ self.disable_view("website_sale.products_categories_top")
+ self.disable_view("website_sale.products_design_grid")
+ self.disable_view("website_sale_comparison.add_to_compare")
diff --git a/theme_shopping/models/website_testimonial.py b/theme_shopping/models/website_testimonial.py
new file mode 100644
index 000000000..f138d98b1
--- /dev/null
+++ b/theme_shopping/models/website_testimonial.py
@@ -0,0 +1,42 @@
+# -*- coding: utf-8 -*-
+###############################################################################
+#
+# Cybrosys Technologies Pvt. Ltd.
+#
+# Copyright (C) 2025-TODAY Cybrosys Technologies()
+# Author: Cybrosys Techno Solutions (odoo@cybrosys.com)
+#
+# You can modify it under the terms of the GNU AFFERO
+# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
+#
+# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+# (AGPL v3) along with this program.
+# If not, see .
+#
+###############################################################################
+from odoo import api, models,fields
+
+
+class WebsiteTestimonial(models.Model):
+ """ Class for adding testimonials theme shopping"""
+ _name = 'website.testimonial'
+ _description = 'Testimonial Review'
+ _inherit = 'mail.thread'
+ _rec_name ='user_id'
+
+ user_id = fields.Many2one('res.users', required=True,string='User Name')
+ testimonial = fields.Text('Testimonial', required=True)
+ image = fields.Binary() # To store the user's image, if you want to allow image uploads
+
+ @api.onchange('user_id')
+ def _onchange_name(self):
+ """ For setting profile picture while changing the user """
+ if self.user_id and self.user_id.image_1920:
+ self.image = self.user_id.image_1920
+ else:
+ self.image = False
diff --git a/theme_shopping/security/ir.model.access.csv b/theme_shopping/security/ir.model.access.csv
new file mode 100644
index 000000000..19d673fa0
--- /dev/null
+++ b/theme_shopping/security/ir.model.access.csv
@@ -0,0 +1,3 @@
+id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
+
+access_website_testimonial,access.website.testimonial,model_website_testimonial,base.group_user,1,1,1,1
diff --git a/theme_shopping/security/security_groups.xml b/theme_shopping/security/security_groups.xml
new file mode 100644
index 000000000..a26c893f6
--- /dev/null
+++ b/theme_shopping/security/security_groups.xml
@@ -0,0 +1,9 @@
+
+
+
+
+ Testimonial
+
+
+
+
diff --git a/theme_shopping/static/description/banner.jpg b/theme_shopping/static/description/banner.jpg
new file mode 100644
index 000000000..861607597
Binary files /dev/null and b/theme_shopping/static/description/banner.jpg differ
diff --git a/theme_shopping/static/description/icon.png b/theme_shopping/static/description/icon.png
new file mode 100644
index 000000000..7dd50005a
Binary files /dev/null and b/theme_shopping/static/description/icon.png differ
diff --git a/theme_shopping/static/description/images/1.png b/theme_shopping/static/description/images/1.png
new file mode 100644
index 000000000..0d8592be2
Binary files /dev/null and b/theme_shopping/static/description/images/1.png differ
diff --git a/theme_shopping/static/description/images/1_mob.png b/theme_shopping/static/description/images/1_mob.png
new file mode 100644
index 000000000..80933b396
Binary files /dev/null and b/theme_shopping/static/description/images/1_mob.png differ
diff --git a/theme_shopping/static/description/images/2.1_mob.png b/theme_shopping/static/description/images/2.1_mob.png
new file mode 100644
index 000000000..24fe3fd25
Binary files /dev/null and b/theme_shopping/static/description/images/2.1_mob.png differ
diff --git a/theme_shopping/static/description/images/2.png b/theme_shopping/static/description/images/2.png
new file mode 100644
index 000000000..4f1a1b8ea
Binary files /dev/null and b/theme_shopping/static/description/images/2.png differ
diff --git a/theme_shopping/static/description/images/2_mob.png b/theme_shopping/static/description/images/2_mob.png
new file mode 100644
index 000000000..63a268998
Binary files /dev/null and b/theme_shopping/static/description/images/2_mob.png differ
diff --git a/theme_shopping/static/description/images/FAQ.png b/theme_shopping/static/description/images/FAQ.png
new file mode 100644
index 000000000..547db3e04
Binary files /dev/null and b/theme_shopping/static/description/images/FAQ.png differ
diff --git a/theme_shopping/static/description/images/about.png b/theme_shopping/static/description/images/about.png
new file mode 100644
index 000000000..f74a1715c
Binary files /dev/null and b/theme_shopping/static/description/images/about.png differ
diff --git a/theme_shopping/static/description/images/about_mob.png b/theme_shopping/static/description/images/about_mob.png
new file mode 100644
index 000000000..9f019c7e1
Binary files /dev/null and b/theme_shopping/static/description/images/about_mob.png differ
diff --git a/theme_shopping/static/description/images/arrow-black.png b/theme_shopping/static/description/images/arrow-black.png
new file mode 100644
index 000000000..3fd6da801
Binary files /dev/null and b/theme_shopping/static/description/images/arrow-black.png differ
diff --git a/theme_shopping/static/description/images/arrows-repeat.svg b/theme_shopping/static/description/images/arrows-repeat.svg
new file mode 100644
index 000000000..94fb8f7f9
--- /dev/null
+++ b/theme_shopping/static/description/images/arrows-repeat.svg
@@ -0,0 +1,10 @@
+
diff --git a/theme_shopping/static/description/images/banner.jpg b/theme_shopping/static/description/images/banner.jpg
new file mode 100644
index 000000000..861607597
Binary files /dev/null and b/theme_shopping/static/description/images/banner.jpg differ
diff --git a/theme_shopping/static/description/images/blog.png b/theme_shopping/static/description/images/blog.png
new file mode 100644
index 000000000..e4e0fe34c
Binary files /dev/null and b/theme_shopping/static/description/images/blog.png differ
diff --git a/theme_shopping/static/description/images/blog_2_mob.png b/theme_shopping/static/description/images/blog_2_mob.png
new file mode 100644
index 000000000..1c259c1b2
Binary files /dev/null and b/theme_shopping/static/description/images/blog_2_mob.png differ
diff --git a/theme_shopping/static/description/images/blog_mob1.png b/theme_shopping/static/description/images/blog_mob1.png
new file mode 100644
index 000000000..5ef790727
Binary files /dev/null and b/theme_shopping/static/description/images/blog_mob1.png differ
diff --git a/theme_shopping/static/description/images/frequently-asked-snippet.png b/theme_shopping/static/description/images/frequently-asked-snippet.png
new file mode 100644
index 000000000..454866e92
Binary files /dev/null and b/theme_shopping/static/description/images/frequently-asked-snippet.png differ
diff --git a/theme_shopping/static/description/images/gear.svg b/theme_shopping/static/description/images/gear.svg
new file mode 100644
index 000000000..ce383059d
--- /dev/null
+++ b/theme_shopping/static/description/images/gear.svg
@@ -0,0 +1,10 @@
+
diff --git a/theme_shopping/static/description/images/hire-odoo.svg b/theme_shopping/static/description/images/hire-odoo.svg
new file mode 100644
index 000000000..9cfec4e44
--- /dev/null
+++ b/theme_shopping/static/description/images/hire-odoo.svg
@@ -0,0 +1,12 @@
+
diff --git a/theme_shopping/static/description/images/home-mob.png b/theme_shopping/static/description/images/home-mob.png
new file mode 100644
index 000000000..2f0b08ba3
Binary files /dev/null and b/theme_shopping/static/description/images/home-mob.png differ
diff --git a/theme_shopping/static/description/images/home-mobile-2.png b/theme_shopping/static/description/images/home-mobile-2.png
new file mode 100644
index 000000000..1aa94bb33
Binary files /dev/null and b/theme_shopping/static/description/images/home-mobile-2.png differ
diff --git a/theme_shopping/static/description/images/home-mobile-3.png b/theme_shopping/static/description/images/home-mobile-3.png
new file mode 100644
index 000000000..0009216ca
Binary files /dev/null and b/theme_shopping/static/description/images/home-mobile-3.png differ
diff --git a/theme_shopping/static/description/images/home_desk.png b/theme_shopping/static/description/images/home_desk.png
new file mode 100644
index 000000000..5962ada12
Binary files /dev/null and b/theme_shopping/static/description/images/home_desk.png differ
diff --git a/theme_shopping/static/description/images/icon-Compatibility-with-plugins.png b/theme_shopping/static/description/images/icon-Compatibility-with-plugins.png
new file mode 100644
index 000000000..2c0c4015e
Binary files /dev/null and b/theme_shopping/static/description/images/icon-Compatibility-with-plugins.png differ
diff --git a/theme_shopping/static/description/images/icon-Up-to-date-development.png b/theme_shopping/static/description/images/icon-Up-to-date-development.png
new file mode 100644
index 000000000..892a490e8
Binary files /dev/null and b/theme_shopping/static/description/images/icon-Up-to-date-development.png differ
diff --git a/theme_shopping/static/description/images/life-ring-icon.svg b/theme_shopping/static/description/images/life-ring-icon.svg
new file mode 100644
index 000000000..b6c797ba1
--- /dev/null
+++ b/theme_shopping/static/description/images/life-ring-icon.svg
@@ -0,0 +1,13 @@
+
diff --git a/theme_shopping/static/description/images/logo-cybro.png b/theme_shopping/static/description/images/logo-cybro.png
new file mode 100644
index 000000000..ecf9b0134
Binary files /dev/null and b/theme_shopping/static/description/images/logo-cybro.png differ
diff --git a/theme_shopping/static/description/images/main.png b/theme_shopping/static/description/images/main.png
new file mode 100644
index 000000000..de6471986
Binary files /dev/null and b/theme_shopping/static/description/images/main.png differ
diff --git a/theme_shopping/static/description/images/mobile-view.jpg b/theme_shopping/static/description/images/mobile-view.jpg
new file mode 100644
index 000000000..f6ef3887b
Binary files /dev/null and b/theme_shopping/static/description/images/mobile-view.jpg differ
diff --git a/theme_shopping/static/description/images/odoo-consultancy.svg b/theme_shopping/static/description/images/odoo-consultancy.svg
new file mode 100644
index 000000000..c2c27e608
--- /dev/null
+++ b/theme_shopping/static/description/images/odoo-consultancy.svg
@@ -0,0 +1,4 @@
+
diff --git a/theme_shopping/static/description/images/odoo-licencing.svg b/theme_shopping/static/description/images/odoo-licencing.svg
new file mode 100644
index 000000000..8a520b40f
--- /dev/null
+++ b/theme_shopping/static/description/images/odoo-licencing.svg
@@ -0,0 +1,3 @@
+
diff --git a/theme_shopping/static/description/images/odoo-logo.png b/theme_shopping/static/description/images/odoo-logo.png
new file mode 100644
index 000000000..36960c38b
Binary files /dev/null and b/theme_shopping/static/description/images/odoo-logo.png differ
diff --git a/theme_shopping/static/description/images/offfers.png b/theme_shopping/static/description/images/offfers.png
new file mode 100644
index 000000000..952330d56
Binary files /dev/null and b/theme_shopping/static/description/images/offfers.png differ
diff --git a/theme_shopping/static/description/images/price-collection.png b/theme_shopping/static/description/images/price-collection.png
new file mode 100644
index 000000000..9f05fb4ed
Binary files /dev/null and b/theme_shopping/static/description/images/price-collection.png differ
diff --git a/theme_shopping/static/description/images/puzzle-piece-icon.svg b/theme_shopping/static/description/images/puzzle-piece-icon.svg
new file mode 100644
index 000000000..ab5e56fa7
--- /dev/null
+++ b/theme_shopping/static/description/images/puzzle-piece-icon.svg
@@ -0,0 +1,10 @@
+
diff --git a/theme_shopping/static/description/images/shop-mob.png b/theme_shopping/static/description/images/shop-mob.png
new file mode 100644
index 000000000..ee6fb9e18
Binary files /dev/null and b/theme_shopping/static/description/images/shop-mob.png differ
diff --git a/theme_shopping/static/description/images/shop.png b/theme_shopping/static/description/images/shop.png
new file mode 100644
index 000000000..c40f14a06
Binary files /dev/null and b/theme_shopping/static/description/images/shop.png differ
diff --git a/theme_shopping/static/description/images/shop_mob_1.png b/theme_shopping/static/description/images/shop_mob_1.png
new file mode 100644
index 000000000..5d1b09827
Binary files /dev/null and b/theme_shopping/static/description/images/shop_mob_1.png differ
diff --git a/theme_shopping/static/description/images/shop_mob_2.png b/theme_shopping/static/description/images/shop_mob_2.png
new file mode 100644
index 000000000..8a8d9420e
Binary files /dev/null and b/theme_shopping/static/description/images/shop_mob_2.png differ
diff --git a/theme_shopping/static/description/images/subscription.png b/theme_shopping/static/description/images/subscription.png
new file mode 100644
index 000000000..1af984f8d
Binary files /dev/null and b/theme_shopping/static/description/images/subscription.png differ
diff --git a/theme_shopping/static/description/images/team.png b/theme_shopping/static/description/images/team.png
new file mode 100644
index 000000000..bdbc18774
Binary files /dev/null and b/theme_shopping/static/description/images/team.png differ
diff --git a/theme_shopping/static/description/images/testimonial.png b/theme_shopping/static/description/images/testimonial.png
new file mode 100644
index 000000000..5b01ec8eb
Binary files /dev/null and b/theme_shopping/static/description/images/testimonial.png differ
diff --git a/theme_shopping/static/description/images/top-deals.png b/theme_shopping/static/description/images/top-deals.png
new file mode 100644
index 000000000..dbb4194e4
Binary files /dev/null and b/theme_shopping/static/description/images/top-deals.png differ
diff --git a/theme_shopping/static/description/images/winter-collection.png b/theme_shopping/static/description/images/winter-collection.png
new file mode 100644
index 000000000..ebe2409a4
Binary files /dev/null and b/theme_shopping/static/description/images/winter-collection.png differ
diff --git a/theme_shopping/static/description/images/wishlist.png b/theme_shopping/static/description/images/wishlist.png
new file mode 100644
index 000000000..6e118b3e6
Binary files /dev/null and b/theme_shopping/static/description/images/wishlist.png differ
diff --git a/theme_shopping/static/description/images/wrench-icon.svg b/theme_shopping/static/description/images/wrench-icon.svg
new file mode 100644
index 000000000..4e0ce1d01
--- /dev/null
+++ b/theme_shopping/static/description/images/wrench-icon.svg
@@ -0,0 +1,10 @@
+
diff --git a/theme_shopping/static/description/index.html b/theme_shopping/static/description/index.html
new file mode 100644
index 000000000..72d22763a
--- /dev/null
+++ b/theme_shopping/static/description/index.html
@@ -0,0 +1,911 @@
+
+
+
+
+
+
+ app index
+
+
+
+
+
+
+
+
+
+
+
A Frequently Asked Questions (FAQ) snippet is a section on a website that provides users with answers to common questions regarding a product, service, or topic.
+