Browse Source

Feb 14 : [ADD] Initial Commit 'website_product_customization'

pull/267/merge
RisvanaCybro 1 year ago
parent
commit
0d327be001
  1. 48
      website_product_customization/README.rst
  2. 23
      website_product_customization/__init__.py
  3. 53
      website_product_customization/__manifest__.py
  4. 22
      website_product_customization/controllers/__init__.py
  5. 181
      website_product_customization/controllers/website_product_customization.py
  6. 5
      website_product_customization/doc/RELEASE_NOTES.md
  7. 24
      website_product_customization/models/__init__.py
  8. 35
      website_product_customization/models/product_design.py
  9. 58
      website_product_customization/models/sale_order.py
  10. 36
      website_product_customization/models/sale_order_line.py
  11. 2
      website_product_customization/security/ir.model.access.csv
  12. BIN
      website_product_customization/static/description/assets/icons/check.png
  13. BIN
      website_product_customization/static/description/assets/icons/chevron.png
  14. BIN
      website_product_customization/static/description/assets/icons/cogs.png
  15. BIN
      website_product_customization/static/description/assets/icons/consultation.png
  16. BIN
      website_product_customization/static/description/assets/icons/ecom-black.png
  17. BIN
      website_product_customization/static/description/assets/icons/education-black.png
  18. BIN
      website_product_customization/static/description/assets/icons/hotel-black.png
  19. BIN
      website_product_customization/static/description/assets/icons/license.png
  20. BIN
      website_product_customization/static/description/assets/icons/lifebuoy.png
  21. BIN
      website_product_customization/static/description/assets/icons/manufacturing-black.png
  22. BIN
      website_product_customization/static/description/assets/icons/pos-black.png
  23. BIN
      website_product_customization/static/description/assets/icons/puzzle.png
  24. BIN
      website_product_customization/static/description/assets/icons/restaurant-black.png
  25. BIN
      website_product_customization/static/description/assets/icons/service-black.png
  26. BIN
      website_product_customization/static/description/assets/icons/trading-black.png
  27. BIN
      website_product_customization/static/description/assets/icons/training.png
  28. BIN
      website_product_customization/static/description/assets/icons/update.png
  29. BIN
      website_product_customization/static/description/assets/icons/user.png
  30. BIN
      website_product_customization/static/description/assets/icons/wrench.png
  31. BIN
      website_product_customization/static/description/assets/misc/categories.png
  32. BIN
      website_product_customization/static/description/assets/misc/check-box.png
  33. BIN
      website_product_customization/static/description/assets/misc/compass.png
  34. BIN
      website_product_customization/static/description/assets/misc/corporate.png
  35. BIN
      website_product_customization/static/description/assets/misc/customer-support.png
  36. BIN
      website_product_customization/static/description/assets/misc/cybrosys-logo.png
  37. BIN
      website_product_customization/static/description/assets/misc/features.png
  38. BIN
      website_product_customization/static/description/assets/misc/logo.png
  39. BIN
      website_product_customization/static/description/assets/misc/pictures.png
  40. BIN
      website_product_customization/static/description/assets/misc/pie-chart.png
  41. BIN
      website_product_customization/static/description/assets/misc/right-arrow.png
  42. BIN
      website_product_customization/static/description/assets/misc/star.png
  43. BIN
      website_product_customization/static/description/assets/misc/support.png
  44. BIN
      website_product_customization/static/description/assets/misc/whatsapp.png
  45. BIN
      website_product_customization/static/description/assets/modules/1.png
  46. BIN
      website_product_customization/static/description/assets/modules/2.png
  47. BIN
      website_product_customization/static/description/assets/modules/3.png
  48. BIN
      website_product_customization/static/description/assets/modules/4.png
  49. BIN
      website_product_customization/static/description/assets/modules/5.gif
  50. BIN
      website_product_customization/static/description/assets/modules/6.png
  51. BIN
      website_product_customization/static/description/assets/screenshots/hero1.gif
  52. BIN
      website_product_customization/static/description/assets/screenshots/web_cust_01.png
  53. BIN
      website_product_customization/static/description/assets/screenshots/web_cust_02.png
  54. BIN
      website_product_customization/static/description/assets/screenshots/web_cust_03.png
  55. BIN
      website_product_customization/static/description/assets/screenshots/web_cust_04.png
  56. BIN
      website_product_customization/static/description/assets/screenshots/web_cust_05.png
  57. BIN
      website_product_customization/static/description/assets/screenshots/web_cust_06.png
  58. BIN
      website_product_customization/static/description/assets/screenshots/web_cust_07.png
  59. BIN
      website_product_customization/static/description/banner.jpg
  60. BIN
      website_product_customization/static/description/icon.png
  61. 710
      website_product_customization/static/description/index.html
  62. 44
      website_product_customization/static/src/css/style.css
  63. 58
      website_product_customization/static/src/js/website_product_custom.js
  64. 72
      website_product_customization/static/src/js/website_sale.js
  65. 1
      website_product_customization/static/src/lib/js/Fabric/fabric.js
  66. 48
      website_product_customization/views/product_design_views.xml
  67. 19
      website_product_customization/views/sale_order_views.xml
  68. 95
      website_product_customization/views/website_sale_templates.xml

48
website_product_customization/README.rst

@ -0,0 +1,48 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
Website Product Customization
==================================
This Module allows users to customize the the product they buy from website/shop
by applying individual designs.
Configuration
=============
* Add appropriate number of designs in the product.design model for the customer
to choose from the front-end.
License
-------
Affero General Public License v3.0 (AGPL v3)
(https://www.gnu.org/licenses/agpl-3.0-standalone.html)
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
Credits
-------
* Developers: (V16)Vivek @ cybrosys, 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 <https://cybrosys.com/>`__
Further information
===================
HTML Description: `<static/description/index.html>`__

23
website_product_customization/__init__.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Vivek @ cybrosys,(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 <http://www.gnu.org/licenses/>.
#
#############################################################################
from . import controllers
from . import models

53
website_product_customization/__manifest__.py

@ -0,0 +1,53 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Vivek @ cybrosys,(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 <http://www.gnu.org/licenses/>.
#
#############################################################################
{
'name': 'Website Product Customization',
'version': '16.0.1.0.0',
'category': 'Website',
'summary': 'Customize products from website',
'description': 'This module helps to customise the products from website'
'according to the customer wish',
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'website': "https://www.cybrosys.com",
'depends': ['base', 'website_sale', 'website_sale_product_configurator'],
'data': [
'security/ir.model.access.csv',
'views/product_design_views.xml',
'views/website_sale_templates.xml',
'views/sale_order_views.xml',
],
'assets': {
'web.assets_frontend': [
"/website_product_customization/static/src/css/style.css",
"/website_product_customization/static/src/lib/js/Fabric/fabric.js",
"/website_product_customization/static/src/js/website_product_custom.js",
"/website_product_customization/static/src/js/website_sale.js",
],
},
'images': ['static/description/banner.jpg'],
'license': 'AGPL-3',
'installable': True,
'auto_install': False,
'application': True,
}

22
website_product_customization/controllers/__init__.py

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Vivek @ cybrosys,(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 <http://www.gnu.org/licenses/>.
#
#############################################################################
from . import website_product_customization

181
website_product_customization/controllers/website_product_customization.py

@ -0,0 +1,181 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Vivek @ cybrosys,(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 <http://www.gnu.org/licenses/>.
#
#############################################################################
import json
import re
from odoo import http
from odoo.http import request
from odoo.addons.website_sale.controllers.main import WebsiteSale
from odoo.addons.website_sale_product_configurator.controllers import main
class WebsiteProductCustomization(WebsiteSale):
"""
Inheriting 'WebsiteSale' class from 'website_sale.controllers.main' to
modify the method 'cart_update_json'.
"""
@http.route()
def cart_update_json(
self,
product_id,
design_image=None,
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).
"""
res = super(WebsiteProductCustomization, self).cart_update_json(
product_id=product_id,
design_image=design_image,
line_id=line_id,
add_qty=add_qty,
set_qty=set_qty,
display=display,
product_custom_attribute_values=product_custom_attribute_values,
no_variant_attribute_values=no_variant_attribute_values,
**kw
)
order = request.website.sale_get_order(force_create=True)
if design_image:
for record in order.order_line:
if record.id == res["line_id"]:
record.product_design = str(
re.sub("^data:image\/\w+;base64,", "", design_image),
)
record.is_customized_product = True
else:
if not order.order_line.browse(res["line_id"]).product_design:
order.order_line.browse(res["line_id"]).product_design = (
request.env["product.product"].sudo().browse(product_id).image_1920
)
request.session["website_sale_cart_quantity"] = order.cart_quantity
return res
class WebsiteSale(main.WebsiteSale):
"""
Inheriting 'WebsiteSale' class from
'website_sale_product_configurator.controllers.main' to modify the method
'cart_options_update_json'.
"""
@http.route()
def cart_options_update_json(
self, product_and_options, goto_shop=None, lang=None, **kwargs
):
"""This route is called when submitting the optional product modal.
The product without parent is the main product, the other are options.
Options need to be linked to their parents with a unique ID.
The main product is the first product in the list and the options
need to be right after their parent.
product_and_options {
'product_id',
'product_template_id',
'quantity',
'parent_unique_id',
'unique_id',
'product_custom_attribute_values',
'no_variant_attribute_values'
}
"""
if lang:
request.website = request.website.with_context(lang=lang)
order = request.website.sale_get_order(force_create=True)
if order.state != "draft":
request.session["sale_order_id"] = None
order = request.website.sale_get_order(force_create=True)
product_and_options = json.loads(product_and_options)
if product_and_options:
# The main product is the first, optional products are the rest
main_product = product_and_options[0]
design_image = (
main_product["design_image"] if "design_image" in main_product else None
)
value = order._cart_update(
product_id=main_product["product_id"],
add_qty=main_product["quantity"],
product_custom_attribute_values=main_product[
"product_custom_attribute_values"
],
no_variant_attribute_values=main_product["no_variant_attribute_values"],
design_image=design_image,
**kwargs
)
if value["line_id"]:
# Link option with its parent iff line has been created.
option_parent = {main_product["unique_id"]: value["line_id"]}
for option in product_and_options[1:]:
parent_unique_id = option["parent_unique_id"]
option_value = order._cart_update(
product_id=option["product_id"],
set_qty=option["quantity"],
linked_line_id=option_parent[parent_unique_id],
product_custom_attribute_values=option[
"product_custom_attribute_values"
],
no_variant_attribute_values=option[
"no_variant_attribute_values"
],
design_image=design_image,
**kwargs
)
option_parent[option["unique_id"]] = option_value["line_id"]
for record in order.order_line:
if record.id == option_value["line_id"]:
record.product_design = (
request.env["product.product"]
.sudo()
.browse(option["product_id"])
.image_1920
)
if design_image:
for record in order.order_line:
if record.id == value["line_id"]:
record.product_design = str(
re.sub(
"^data:image\/\w+;base64,",
"",
main_product["design_image"],
),
)
record.is_customized_product = True
else:
if not order.order_line.browse(value["line_id"]).product_design:
order.order_line.browse(value["line_id"]).product_design = (
request.env["product.product"]
.sudo()
.browse(main_product["product_id"])
.image_1920
)
request.session["website_sale_cart_quantity"] = order.cart_quantity
return str(order.cart_quantity)

5
website_product_customization/doc/RELEASE_NOTES.md

@ -0,0 +1,5 @@
## Module <website_product_customization>
#### 09.02.2024
#### Version 16.0.1.0.0
#### ADD
- Initial Commit for Website Product Customization.

24
website_product_customization/models/__init__.py

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Vivek @ cybrosys,(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 <http://www.gnu.org/licenses/>.
#
#############################################################################
from . import product_design
from . import sale_order_line
from . import sale_order

35
website_product_customization/models/product_design.py

@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Vivek @ cybrosys,(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 <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import fields, models
class ProductDesign(models.Model):
"""
Creating the product.design model to add product designs in the back-end
"""
_name = 'product.design'
_description = "Product Design"
name = fields.Char(string='Product Customization',
help="Name field for product design")
product_design = fields.Image(string='Design',
help="Binary field for adding product design")

58
website_product_customization/models/sale_order.py

@ -0,0 +1,58 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Vivek @ cybrosys,(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 <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import models
class SaleOrder(models.Model):
"""Inherited the class sale.order to match the order line."""
_inherit = "sale.order"
def _cart_find_product_line(self, product_id, line_id=None, **kwargs):
"""Find the cart line matching the given parameters.
If a product_id is given, the line will match the product only if the
line also has the same special attributes: `no_variant` attributes and
`is_custom` values.
"""
self.ensure_one()
SaleOrderLine = self.env["sale.order.line"]
if not self.order_line:
return SaleOrderLine
product = self.env["product.product"].browse(product_id)
if not line_id and (
product.product_tmpl_id.has_dynamic_attributes()
or product.product_tmpl_id._has_no_variant_attributes()
):
return SaleOrderLine
if kwargs["design_image"]:
return SaleOrderLine
else:
domain = [("order_id", "=", self.id), ("product_id", "=", product_id)]
if line_id:
domain += [("id", "=", line_id)]
else:
domain += [
("product_custom_attribute_value_ids", "=", False),
("is_customized_product", "=", False),
]
return SaleOrderLine.search(domain)

36
website_product_customization/models/sale_order_line.py

@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Vivek @ cybrosys,(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 <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import fields, models
class SaleOrderLine(models.Model):
"""
Inheriting the 'sale.order.line' model add the product_design field
"""
_inherit = 'sale.order.line'
product_design = fields.Binary(string="Product Design",
help="Binary field to show product design")
is_customized_product = fields.Boolean(string="Customized Product"
"product",
help="Is it is a customized product"
" or not", default=False)

2
website_product_customization/security/ir.model.access.csv

@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_product_design,access.product.design,model_product_design,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_product_design access.product.design model_product_design base.group_user 1 1 1 1

BIN
website_product_customization/static/description/assets/icons/check.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
website_product_customization/static/description/assets/icons/chevron.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

BIN
website_product_customization/static/description/assets/icons/cogs.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
website_product_customization/static/description/assets/icons/consultation.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
website_product_customization/static/description/assets/icons/ecom-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

BIN
website_product_customization/static/description/assets/icons/education-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

BIN
website_product_customization/static/description/assets/icons/hotel-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

BIN
website_product_customization/static/description/assets/icons/license.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
website_product_customization/static/description/assets/icons/lifebuoy.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
website_product_customization/static/description/assets/icons/manufacturing-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

BIN
website_product_customization/static/description/assets/icons/pos-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

BIN
website_product_customization/static/description/assets/icons/puzzle.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

BIN
website_product_customization/static/description/assets/icons/restaurant-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

BIN
website_product_customization/static/description/assets/icons/service-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

BIN
website_product_customization/static/description/assets/icons/trading-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

BIN
website_product_customization/static/description/assets/icons/training.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

BIN
website_product_customization/static/description/assets/icons/update.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
website_product_customization/static/description/assets/icons/user.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

BIN
website_product_customization/static/description/assets/icons/wrench.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
website_product_customization/static/description/assets/misc/categories.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
website_product_customization/static/description/assets/misc/check-box.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
website_product_customization/static/description/assets/misc/compass.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
website_product_customization/static/description/assets/misc/corporate.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
website_product_customization/static/description/assets/misc/customer-support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
website_product_customization/static/description/assets/misc/cybrosys-logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
website_product_customization/static/description/assets/misc/features.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

BIN
website_product_customization/static/description/assets/misc/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
website_product_customization/static/description/assets/misc/pictures.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
website_product_customization/static/description/assets/misc/pie-chart.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
website_product_customization/static/description/assets/misc/right-arrow.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 967 B

BIN
website_product_customization/static/description/assets/misc/star.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
website_product_customization/static/description/assets/misc/support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
website_product_customization/static/description/assets/misc/whatsapp.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
website_product_customization/static/description/assets/screenshots/hero1.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

BIN
website_product_customization/static/description/assets/screenshots/web_cust_01.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

BIN
website_product_customization/static/description/assets/screenshots/web_cust_02.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

BIN
website_product_customization/static/description/assets/screenshots/web_cust_03.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

BIN
website_product_customization/static/description/assets/screenshots/web_cust_04.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

BIN
website_product_customization/static/description/assets/screenshots/web_cust_05.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

BIN
website_product_customization/static/description/assets/screenshots/web_cust_06.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

BIN
website_product_customization/static/description/assets/screenshots/web_cust_07.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

BIN
website_product_customization/static/description/banner.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

BIN
website_product_customization/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

710
website_product_customization/static/description/index.html

@ -0,0 +1,710 @@
<div style="background-color: #714B67; min-height: 600px; width: 100%; padding: 15px; position: relative;">
<!-- TITLE BAR -->
<div class="d-flex align-items-center justify-content-between"
style="border-bottom: 1px solid #875A7B; padding: 15px; display: flex; justify-content: space-between; align-items: center;">
<img src="assets/misc/cybrosys-logo.png" width="42" height="42"
style="width: 42px; height: 42px;"/>
<div>
<div style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Community
</div>
<div style="color: #875A7B; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Enterprise
</div>
</div>
</div>
<!-- END OF TITLE BAR -->
<!-- APP HERO -->
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12">
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;">
Website Product Customization</h1>
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;">
Customize Product Design From Website</p>
<!-- END OF APP HERO -->
<img src="assets/screenshots/hero1.gif"
style="width: 100%; margin-left: auto; margin-right: auto;"/>
</div>
</div>
</div>
</div>
<!-- NAVIGATION SECTION -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px; margin-top: 300px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/compass.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Explore This
Module</h2>
</div>
<div class="row my-4" style="font-family: 'Montserrat', sans-serif;">
<div class="col-sm-12 col-md-6 my-3">
<a href="#overview">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Overview</span>
<span
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">Learn
more about this
module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div>
</a>
</div>
<div class="col-sm-12 col-md-6 my-3">
<a href="#configuration">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Configuration</span>
<span
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View configurations of this module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div>
</a>
</div>
<div class="col-sm-12 col-md-6 my-3">
<a href="#features">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Features</span>
<span
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View features of this module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div>
</a>
</div>
<div class="col-sm-12 col-md-6 my-3">
<a href="#screenshots">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Screenshots</span>
<span
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">
See key screenshots of this module
</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36"/>
</div>
</a>
</div>
</div>
<!-- END OF NAVIGATION SECTION -->
<!-- OVERVIEW SECTION -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;"
id="overview">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/pie-chart.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Overview
</h2>
</div>
<div class="row"
style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
<div class="col-sm-12 py-4">
This module allows users to customize products from website by
selecting their preferred product design.
</div>
</div>
<!-- END OF OVERVIEW SECTION -->
<!-- CONFIGURATION SECTION -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;"
id="configuration">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/star.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Configuration
</h2>
</div>
<div class="row"
style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
<div class="col-sm-12 py-4">
In order to choose designs from the website, the designs must be
configured in the backend first. That is, the designs must be stored
in backend model 'product.design'.
</div>
</div>
<!-- END OF CONFIGURATION SECTION -->
<!-- FEATURES SECTION -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;"
id="features">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/features.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Features
</h2>
</div>
<div class="row"
style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
<div class="col-sm-12 col-md-6">
<div class="d-flex align-items-center"
style="margin-top: 40px; margin-bottom: 40px">
<img src="assets/misc/check-box.png" class="mr-2"/>
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Create customized designs</span>
<p style="font-family: 'Roboto', sans-serif !important; font-weight: 450 !important; color: #282F33 !important; font-size: 1rem !important;">
Allows users to customize products by choosing the
designs from front-end and styling them according to their
needs.
</p>
</div>
</div>
</div>
<!-- END OF FEATURES SECTION -->
<!-- SCREENSHOTS SECTION -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;"
id="screenshots">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/pictures.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Screenshots
</h2>
</div>
<div class="row">
<div class="col-sm-12">
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Create designs in the back-end </h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
For the design to be available to the front-end customer,
create the designs in the backend first.
</p>
<img src="assets/screenshots/web_cust_01.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Click on the 'CUSTOMIZE PRODUCT' button</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
Click on the 'CUSTOMIZE PRODUCT' button to customize the design
of the product</p>
<img src="assets/screenshots/web_cust_02.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Choose preferred design</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
Select the preferred design from the available options</p>
<img src="assets/screenshots/web_cust_03.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Design appears on the product</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
After choosing appropriate design, the design will
automatically appear on the product</p>
<img src="assets/screenshots/web_cust_04.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Save the design</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
After customizing the design by moving the design, resizing the
design, or rotating the design etc., save the changes by
clicking on the 'Save' button</p>
<img src="assets/screenshots/web_cust_05.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Click on the 'ADD TO CART' button</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
Click on the 'ADD TO CART' button after saving</p>
<img src="assets/screenshots/web_cust_06.png"
class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">
Updated product in the back-end</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">
Product with design will appear on the associated sale order in
the back-end</p>
<img src="assets/screenshots/web_cust_07.png"
class="img-thumbnail">
</div>
</div>
</div>
<!-- END OF SCREENSHOTS SECTION -->
<!-- RELATED PRODUCTS -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/categories.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Related
Products
</h2>
</div>
<div class="row">
<div class="col-sm-12">
<div id="demo1" class="row carousel slide" data-ride="carousel">
<!-- The slideshow -->
<div class="carousel-inner" style="padding: 30px;">
<div class="carousel-item" style="min-height: 198.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/export_stockinfo_xls/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/1.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/inventory_stock_dashboard_odoo/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/2.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/customer_product_qrcode/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/3.png">
</div>
</a>
</div>
</div>
<div class="carousel-item active"
style="min-height: 198.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/list_view_sticky_header/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/4.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/openai_product_tag_descrption/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/5.gif">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/advanced_vat_invoice/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/6.png">
</div>
</a>
</div>
</div>
</div>
<!-- Left and right controls -->
<a class="carousel-control-prev" href="#demo1" data-slide="prev"
style="width:35px; color:#000"> <span
class="carousel-control-prev-icon"><i
class="fa fa-chevron-left"
style="font-size:24px"></i></span>
</a> <a class="carousel-control-next" href="#demo1"
data-slide="next" style="width:35px; color:#000">
<span class="carousel-control-next-icon"><i
class="fa fa-chevron-right"
style="font-size:24px"></i></span>
</a>
</div>
</div>
</div>
<!-- END OF RELATED PRODUCTS -->
<!-- OUR SERVICES -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/star.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Our Services
</h2>
</div>
<div class="container my-5">
<div class="row">
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/cogs.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Customization</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/wrench.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/lifebuoy.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Support</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/user.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Hire
Odoo
Developer</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #54a0ff !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/puzzle.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Integration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/update.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Migration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/consultation.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Consultancy</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/training.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/license.png" class="img-responsive"
height="48px" width="48px">
</div>
<h6 class="text-center"
style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Licensing Consultancy</h6>
</div>
</div>
</div>
<!-- END OF OUR SERVICES -->
<!-- OUR INDUSTRIES -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/corporate.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Our
Industries
</h2>
</div>
<div class="container my-5">
<div class="row">
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/trading-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Trading
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easily procure
and
sell your products</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/pos-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
POS
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easy
configuration
and convivial experience</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/education-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Education
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
A platform for
educational management</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/manufacturing-black.png"
class="img-responsive mb-3" height="48px"
width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Manufacturing
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Plan, track and
schedule your operations</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/ecom-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
E-commerce &amp; Website
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Mobile
friendly,
awe-inspiring product pages</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/service-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Service Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Keep track of
services and invoice</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/restaurant-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Restaurant
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Run your bar or
restaurant methodically</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/hotel-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Hotel Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
An
all-inclusive
hotel management application</p>
</div>
</div>
</div>
</div>
<!-- END OF OUR INDUSTRIES -->
<!-- SUPPORT -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/customer-support.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Support
</h2>
</div>
<div class="container mt-5">
<div class="row">
<div class="col-sm-12 col-md-6">
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4"
style="background-color: #714B67; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;">
<img src="assets/misc/support.png" height="48" width="48"
style="width: 42px; height: 42px;"/>
</div>
<div>
<h4>Need Help?</h4>
<p style="line-height: 100%;">Got questions or need help?
Get in touch.</p>
<a href="mailto:odoo@cybrosys.com">
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">
odoo@cybrosys.com</p>
</a>
</div>
</div>
</div>
<div class="col-sm-12 col-md-6">
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4"
style="background-color: #2AC44D; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;">
<img src="assets/misc/whatsapp.png" height="52" width="52"
style="width: 52px; height: 52px;"/>
</div>
<div>
<h4>WhatsApp</h4>
<p style="line-height: 100%;">Say hi to us on WhatsApp!</p>
<a href="https://api.whatsapp.com/send?phone=918606827707">
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">
+91 86068
27707</p>
</a>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 my-5 d-flex justify-content-center align-items-center">
<img src="assets/misc/logo.png" width="144" height="31"
style="width:144px; height: 31px; margin-top: 40px;"/>
</div>
</div>
</div>
<!-- END OF SUPPORT -->

44
website_product_customization/static/src/css/style.css

@ -0,0 +1,44 @@
.product_customisation_image{
width:450px;
height:500px;
}
.drawing-area {
position: absolute;
top: 50px;
left: 50px;
z-index: 10;
width: 350px;
height: 400px;
border: 1px solid #ccc;
}
.canvas-container {
width: 350px !important;
height: 400px !important;
position: relative;
user-select: none;
}
#tshirt-div {
width: 450px;
height: 550px;
position: relative;
background-color: #fff;
}
#canvas {
position: absolute;
width: 100px !important;
height: 100px !important;
left: 0px;
top: 0px;
user-select: none;
cursor: default;
}
.oe_structure {
display: grid;
justify-content: center;
}

58
website_product_customization/static/src/js/website_product_custom.js

@ -0,0 +1,58 @@
odoo.define('website_product_customization.website_product_custom', function(require) {
"use strict";
// Import required modules
var publicWidget = require('web.public.widget');
let canvas = new fabric.Canvas('tshirt-canvas');
var count = 0;
// Event listener for the "Delete" key
document.addEventListener("keydown", function(event){
var value = event.key;
if (value=="Delete"){
canvas.remove(canvas.getActiveObject());
}
});
// Define a custom widget
publicWidget.registry.canvasWidget = publicWidget.Widget.extend({
selector: '#product_detail',
events: {
'change #product-design': '_onChangeSelect',
'click .design_save': '_onSave',
'click #product_customize_btn': '_addProductDesign',
},
// Event handler for the change event on the product-design element
_onChangeSelect: function(){
var selectedOption = this.$el.find('#product-design').val().toString();
var design_image = new Image();
design_image.src = '/web/image/product.design/' + selectedOption + '/product_design'
design_image.onload = function () {
var image = new fabric.Image(design_image);
image.scaleToHeight(100);
image.scaleToWidth(100);
canvas.centerObject(image);
canvas.add(image);
canvas.renderAll();
};
},
// Event handler for the click event on elements with the design_save class
_onSave: function(design_image){
var node = design_image.delegateTarget.lastElementChild.querySelector('#tshirt-div');
domtoimage.toPng(node).then(function (dataUrl) {
var img = new Image();
img.classList.add("design_image_doc");
img.src = dataUrl;
document.body.appendChild(img);
alert('Saved your customized Image!!!!!!, Now you can Add it in to the cart')
})
},
// Event handler for the click event on the product_customize_btn element
_addProductDesign: function(ev){
count++
if (count%2 == 0){
ev.target.offsetParent.nextElementSibling.classList.add("d-none");
}
else{
ev.target.offsetParent.nextElementSibling.classList.remove("d-none");
}
},
});
});

72
website_product_customization/static/src/js/website_sale.js

@ -0,0 +1,72 @@
/** @odoo-module **/
import { WebsiteSale } from 'website_sale.website_sale';
import { patch } from '@web/core/utils/patch';
import { useRef, useState } from "@odoo/owl";
var ajax = require('web.ajax');
// Patch the WebsiteSale class with custom modifications
patch(WebsiteSale.prototype, 'custom/website_product_customization/static/src/js/website_sale.js.WebsiteSale',{
// Override the _submitForm method
_submitForm(){
var image_element = document.getElementsByClassName("design_image_doc")
if (parseInt(image_element.length) == parseInt(0)) {
return this._super(...arguments);
}
else {
const params = this.rootProduct;
if (document.getElementsByClassName('design_image_doc')[0]){
var design_image = document.getElementsByClassName('design_image_doc')[0].currentSrc;
}
params.design_image = design_image;
return this._super(...arguments);
};
},
// Override the _onModalSubmit method
_onModalSubmit(goToShop){
const $product = $('#product_detail');
let currency;
if ($product.length) {
currency = $product.data('product-tracking-info')['currency'];
}
else {
// Add to cart from /shop page
currency = this.$('[itemprop="priceCurrency"]').first().text();
}
const productsTrackingInfo = [];
this.$('.js_product.in_cart').each((i, el) => {
productsTrackingInfo.push({
'item_id': el.getElementsByClassName('product_id')[0].value,
'item_name': el.getElementsByClassName('product_display_name')[0].textContent,
'quantity': el.getElementsByClassName('js_quantity')[0].value,
'currency': currency,
'price': el.getElementsByClassName('oe_price')[0].getElementsByClassName('oe_currency_value')[0].textContent,
});
});
if (productsTrackingInfo) {
this.$el.trigger('add_to_cart_event', productsTrackingInfo);
}
this.optionalProductsModal.getAndCreateSelectedProducts()
.then((products) => {
var product_id = products[0].product_id
if (document.getElementsByClassName('design_image_doc')[0]){
products[0].design_image = document.getElementsByClassName('design_image_doc')[0].currentSrc;
}
const productAndOptions = JSON.stringify(products);
// Send a POST request to update the cart options
ajax.post('/shop/cart/update_option', {
product_and_options: productAndOptions,
...this._getOptionalCombinationInfoParam()
}).then(function (quantity) {
if (goToShop) {
window.location.pathname = "/shop/cart";
}
const $quantity = $(".my_cart_quantity");
$quantity.parent().parent().removeClass('d-none');
$quantity.text(quantity).hide().fadeIn(600);
sessionStorage.setItem('website_sale_cart_quantity', quantity);
});
});
}
})

1
website_product_customization/static/src/lib/js/Fabric/fabric.js

File diff suppressed because one or more lines are too long

48
website_product_customization/views/product_design_views.xml

@ -0,0 +1,48 @@
<?xml version="1.0"?>
<odoo>
<!--This code defines a tree view for the "product.design" model, displaying
only the "name" field for each record in the view.-->
<record id="product_design_view_tree" model="ir.ui.view">
<field name="name">product.design.view.tree</field>
<field name="model">product.design</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
</tree>
</field>
</record>
<!--This code defines a form view for the "product.design" model, displaying
the "name" field and an "image" widget field called "product_design"
within a group.-->
<record id="product_design_view_form" model="ir.ui.view">
<field name="name">Product.design.view.form</field>
<field name="model">product.design</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<group>
<field name="name"/>
<field name="product_design" widget="image"
class="oe_avatar"
/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<!--Defines an action for opening the "product.design" model, allowing the
user to view records in both tree view and form view.-->
<record id="product_design_action" model="ir.actions.act_window">
<field name="name">Product Design View</field>
<field name="res_model">product.design</field>
<field name="view_mode">tree,form</field>
</record>
<!--Creates a menu item named "Product Design" that is linked to
the action "product_design_action", providing a way to access the
"product.design" view from the menu.-->
<menuitem id="product_design_menu_action" name="Product Design"
web_icon="website_product_customization,static/description/icon.png"
action="product_design_action"/>
</odoo>

19
website_product_customization/views/sale_order_views.xml

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--Adds an "image" field called "product_design" after
the "name" field in the tree view of the "sale.order" model. It allows
displaying product design images in the order line view.-->
<record id="view_order_form" model="ir.ui.view">
<field name="name">
sale.order.view.tree.inherit.website.product.customisation
</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="/form/sheet/notebook/page/field[@name='order_line']/tree/field[@name='name']" position="after">
<field name="product_design" widget="image" class="oe_avatar"/>
<field name="is_customized_product" invisible="1"/>
</xpath>
</field>
</record>
</odoo>

95
website_product_customization/views/website_sale_templates.xml

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!--This code snippet adds a "CUSTOMIZE PRODUCT" button after a specific
div element on a website page. It also includes functionality for
designing a product by allowing the user to select and change designs.-->
<template id="website_product_customization_product"
inherit_id="website_sale.product"
name="Website Product Customization Product">
<xpath expr="//div[@id='o_wsale_cta_wrapper']" position="after">
<br></br>
<div id="product_customize">
<a role="button" id="product_customize_btn"
t-attf-class="btn btn-primary">
<span style="font-weight: bold">CUSTOMIZE PRODUCT</span>
</a>
</div>
</xpath>
<xpath expr="//section[@id='product_detail']" position="inside">
<div class="oe_structure product_design_body d-none">
<!-- Create the container of the tool -->
<br/>
<div id="tshirt-div">
<script src="https://cdnjs.cloudflare.com/ajax/libs/dom-to-image/2.6.0/dom-to-image.min.js"/>
<img t-att-src="'/web/image/product.template/' + str(product.id) + '/image_1920'"
class="img-responsive product_customisation_image mx-auto"
alt=""/>
<div id="drawingArea" class="drawing-area">
<div class="canvas-container">
<canvas id="tshirt-canvas" width="350"
height="400"/>
</div>
</div>
</div>
<p>To remove a loaded picture, select it and press
the <kbd>DEL</kbd> key.
</p>
<!-- The select that will allow the user to pick one of the static designs -->
<br/>
<label for="product-design">Design:</label>
<div class="product_design">
<select id="product-design">
<option value="">Select one of our designs ...</option>
<option t-foreach="request.env['product.design'].sudo().search([])" t-as="design"
t-att-value="design.id" t-key="design.id">
<t t-esc="design.name"/>
</option>
</select>
</div>
<br/>
<br/>
<div>
<button class="design_save btn-primary">Save</button>
</div>
<br/>
</div>
</xpath>
</template>
<!-- replace the cart images-->
<template id="cart_image" inherit_id="website_sale.cart_lines">
<xpath expr="(//td[hasclass('td-img')])[2]" position="replace">
<td>
<span>
<span t-if="line._is_not_sellable_line() and line.product_id.image_128">
<img t-att-src="image_data_uri(line.order_line_image)"
class="img o_image_64_max rounded"
t-att-alt="line.name_short"/>
</span>
<span t-else=""
t-field="line.product_design"
t-options="{'widget': 'image', 'qweb_img_responsive': False, 'class': 'rounded o_image_64_max'}"
/>
</span>
</td>
</xpath>
</template>
<!-- change popover image-->
<template id="popover_image"
inherit_id="website_sale.cart_popover">
<xpath expr="//div[hasclass('cart_line')]/div" position="replace">
<div class="col-3 text-center">
<span t-if="line._is_not_sellable_line() and line.product_id.image_128">
<img t-att-src="image_data_uri(line.product_id.image_128)"
class="img o_image_64_max rounded mb-2 img-fluid"
t-att-alt="line.name_short"/>
</span>
<span t-else=""
t-field="line.product_design"
t-options="{'widget': 'image', 'qweb_img_responsive': True, 'class': 'rounded o_image_64_max mb-2'}"
/>
</div>
</xpath>
</template>
</odoo>
Loading…
Cancel
Save