├── product_alias ├── wizards │ ├── __init__.py │ ├── assign_product_alias.py │ └── assign_product_alias_views.xml ├── __init__.py ├── models │ ├── __init__.py │ ├── product_template.py │ ├── product_product.py │ └── product_alias.py ├── security │ └── ir.model.access.csv ├── views │ ├── product_template_views.xml │ └── product_alias_views.xml ├── __manifest__.py ├── README.md └── i18n │ └── nl.po ├── webshop_public_prices ├── controllers │ ├── __init__.py │ └── main.py ├── __init__.py ├── models │ ├── __init__.py │ ├── website.py │ ├── res_config_settings.py │ └── product_template.py ├── __manifest__.py ├── README.md ├── views │ ├── res_config_settings_views.xml │ └── website_sale_template.xml └── i18n │ └── nl.po ├── webshop_order_customer_reference ├── __init__.py ├── controllers │ ├── __init__.py │ └── website_sale.py ├── __manifest__.py ├── templates │ └── website_sale.xml └── i18n │ └── nl.po ├── webshop_quick_sell_product_accessory_public_prices ├── __init__.py ├── __manifest__.py └── views │ └── optional_product_view.xml ├── website_featured_products ├── __init__.py ├── models │ ├── __init__.py │ └── product_template.py ├── __manifest__.py ├── README.md ├── views │ └── product_views.xml ├── i18n │ └── nl.po └── data │ └── data.xml ├── .gitignore ├── webshop_quick_sell_product_accessory ├── __init__.py ├── controllers │ ├── __init__.py │ └── website_sale_product_accessory.py ├── static │ ├── css │ │ └── product_accessories.scss │ └── js │ │ └── product_accessories.js ├── __manifest__.py ├── README.md ├── i18n │ └── nl.po └── views │ └── optional_product_view.xml ├── .github └── FUNDING.yml └── README.md /product_alias/wizards/__init__.py: -------------------------------------------------------------------------------- 1 | from . import assign_product_alias 2 | -------------------------------------------------------------------------------- /webshop_public_prices/controllers/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | from . import main 3 | -------------------------------------------------------------------------------- /product_alias/__init__.py: -------------------------------------------------------------------------------- 1 | from . import wizards 2 | from . import models 3 | -------------------------------------------------------------------------------- /webshop_order_customer_reference/__init__.py: -------------------------------------------------------------------------------- 1 | from . import controllers 2 | -------------------------------------------------------------------------------- /webshop_order_customer_reference/controllers/__init__.py: -------------------------------------------------------------------------------- 1 | from . import website_sale 2 | -------------------------------------------------------------------------------- /webshop_public_prices/__init__.py: -------------------------------------------------------------------------------- 1 | from . import models 2 | from . import controllers 3 | -------------------------------------------------------------------------------- /webshop_quick_sell_product_accessory_public_prices/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | -------------------------------------------------------------------------------- /website_featured_products/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from . import models 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/* 2 | .idea/ 3 | .vscode 4 | # compiled python files 5 | *.py[co] 6 | __pycache__/ 7 | -------------------------------------------------------------------------------- /webshop_quick_sell_product_accessory/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from . import controllers -------------------------------------------------------------------------------- /webshop_quick_sell_product_accessory/controllers/__init__.py: -------------------------------------------------------------------------------- 1 | from . import website_sale_product_accessory 2 | -------------------------------------------------------------------------------- /website_featured_products/models/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from . import product_template 4 | -------------------------------------------------------------------------------- /product_alias/models/__init__.py: -------------------------------------------------------------------------------- 1 | from . import product_alias 2 | from . import product_template 3 | from . import product_product 4 | -------------------------------------------------------------------------------- /webshop_quick_sell_product_accessory/static/css/product_accessories.scss: -------------------------------------------------------------------------------- 1 | .product-accessories-selector { 2 | margin: auto 0 auto auto; 3 | } -------------------------------------------------------------------------------- /webshop_public_prices/models/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | from . import product_template 3 | from . import website 4 | from . import res_config_settings 5 | -------------------------------------------------------------------------------- /webshop_public_prices/models/website.py: -------------------------------------------------------------------------------- 1 | from odoo import fields, models 2 | 3 | 4 | class Website(models.Model): 5 | _inherit = "website" 6 | 7 | webshop_hide_prices = fields.Boolean( 8 | string='Hide prices/Add to Cart for public users', 9 | readonly=False 10 | ) 11 | -------------------------------------------------------------------------------- /website_featured_products/models/product_template.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from odoo import models, fields 4 | 5 | 6 | class ProductTemplate(models.Model): 7 | _inherit = "product.template" 8 | 9 | show_in_featured_products = fields.Boolean( 10 | string="Featured Products" 11 | ) 12 | 13 | -------------------------------------------------------------------------------- /webshop_public_prices/models/res_config_settings.py: -------------------------------------------------------------------------------- 1 | from odoo import fields, models 2 | 3 | 4 | class ResConfigSettings(models.TransientModel): 5 | _inherit = "res.config.settings" 6 | 7 | webshop_hide_prices = fields.Boolean( 8 | string='Hide prices/Add to Cart for public users', 9 | related='website_id.webshop_hide_prices', 10 | readonly=False 11 | ) 12 | -------------------------------------------------------------------------------- /product_alias/security/ir.model.access.csv: -------------------------------------------------------------------------------- 1 | id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink 2 | access_product_alias_admin,product_alias_admin,model_product_alias,sales_team.group_sale_manager,1,1,1,1 3 | access_product_alias_user,product_alias_user,model_product_alias,base.group_user,1,0,0,0 4 | access_assign_product_alias_admin,product_assign_alias_admin,model_assign_alias,sales_team.group_sale_manager,1,1,1,1 5 | -------------------------------------------------------------------------------- /website_featured_products/__manifest__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | { 3 | 'name': 'Website Featured Products', 4 | 'category': 'Website', 5 | 'version': '15.0.0.1.0', 6 | 'author': 'Mainframe Monkey', 7 | 'website': 'https://www.mainframemonkey.com', 8 | 'summary': 'Website Featured Products', 9 | 'description': """Website Featured Products""", 10 | 'depends': [ 11 | 'product', 12 | 'website_sale', 13 | ], 14 | 'data': [ 15 | 'data/data.xml', 16 | 'views/product_views.xml', 17 | ], 18 | 'license': 'LGPL-3', 19 | } 20 | -------------------------------------------------------------------------------- /website_featured_products/README.md: -------------------------------------------------------------------------------- 1 | ## website_featured_products 2 | Adds support to configure which products should be shown on the website. 3 | This is configurable by checking the option "Featured Products" on or off on the product form: 4 | ![image](https://user-images.githubusercontent.com/6352350/165242952-f67b7520-b440-4cc5-a4d2-3d6c0fec154c.png) 5 | 6 | The option "Featured Products" is configurable once you've dragged the building block onto the website: 7 | ![image](https://user-images.githubusercontent.com/6352350/165243133-5c499e96-2c57-4706-8344-628ab570e359.png) 8 | -------------------------------------------------------------------------------- /webshop_public_prices/__manifest__.py: -------------------------------------------------------------------------------- 1 | { 2 | 'name': 'Webshop Public Prices', 3 | 'category': 'Website', 4 | 'version': '15.0.1.2', 5 | 'author': 'Mainframe Monkey', 6 | 'website': 'https://www.mainframemonkey.com', 7 | 'summary': 'Webshop Public Prices', 8 | 'description': """ 9 | Allow configuring to hide or show prices/add to cart for public users 10 | """, 11 | 'depends': [ 12 | 'website', 13 | 'website_sale', 14 | ], 15 | 'data': [ 16 | 'views/res_config_settings_views.xml', 17 | 'views/website_sale_template.xml', 18 | ], 19 | 'installable': True, 20 | 'license': 'LGPL-3', 21 | } 22 | -------------------------------------------------------------------------------- /webshop_order_customer_reference/controllers/website_sale.py: -------------------------------------------------------------------------------- 1 | from odoo.addons.website_sale.controllers.main import WebsiteSale 2 | from odoo.http import request, route 3 | from odoo import http 4 | 5 | 6 | class WebshopOrderCustomerReference(WebsiteSale): 7 | 8 | @http.route(['/shop/order/customer_reference'], type='http', auth='public', website=True) 9 | def add_customer_reference(self, **post): 10 | order = request.website.sale_get_order() 11 | ref = post.pop('client_order_ref', '') 12 | if ref and order: 13 | order.client_order_ref = ref 14 | return request.redirect('shop/payment') 15 | -------------------------------------------------------------------------------- /product_alias/views/product_template_views.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | product.form.view 5 | product.template 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /webshop_quick_sell_product_accessory_public_prices/__manifest__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | { 3 | 'name': 'Website Sale Product Accessory Public Prices', 4 | 'category': 'Website', 5 | 'version': '15.0.1.0.0', 6 | 'author': 'Mainframe Monkey', 7 | 'website': 'https://www.mainframemonkey.com', 8 | 'summary': 'Website Quick Sell Product accessories with public prices', 9 | 'description': """Website Quick Sell Product accessories with public prices""", 10 | 'depends': [ 11 | 'webshop_public_prices', 12 | 'webshop_quick_sell_product_accessory', 13 | ], 14 | 'data': [ 15 | 'views/optional_product_view.xml', 16 | ], 17 | 'license': 'LGPL-3', 18 | } 19 | -------------------------------------------------------------------------------- /website_featured_products/views/product_views.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | product.template.view.inherited 5 | product.template 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /webshop_public_prices/controllers/main.py: -------------------------------------------------------------------------------- 1 | from odoo import fields, http 2 | from odoo.http import request 3 | from odoo.addons.website.controllers.main import Website 4 | 5 | 6 | class WebsiteHidePrice(Website): 7 | @http.route() 8 | def autocomplete(self, search_type=None, term=None, order=None, limit=5, max_nb_chars=999, options=None): 9 | options = options or {} 10 | if request.website.webshop_hide_prices and request.env.user._is_public(): 11 | options['displayDetail'] = False 12 | else: 13 | options['displayDetail'] = options['displayDetail'] 14 | return super().autocomplete(search_type, term, order, limit, max_nb_chars, options) 15 | -------------------------------------------------------------------------------- /product_alias/__manifest__.py: -------------------------------------------------------------------------------- 1 | { 2 | 'name': 'Product Alias', 3 | 'category': 'Website', 4 | 'version': '15.0.1.0', 5 | 'author': 'Mainframe Monkey', 6 | 'website': 'https://www.mainframemonkey.com', 7 | 'summary': 'Product Alias', 8 | 'description': """ 9 | Add multiple Aliases on Product to search via Alias. 10 | You can use same Alias in Multiple Products. 11 | Search Product using assigned Alias""", 12 | 'depends': [ 13 | 'sale_management', 14 | ], 15 | 'data': [ 16 | 'security/ir.model.access.csv', 17 | 'wizards/assign_product_alias_views.xml', 18 | 'views/product_alias_views.xml', 19 | 'views/product_template_views.xml', 20 | ], 21 | 'installable': True, 22 | 'license': 'LGPL-3', 23 | } 24 | -------------------------------------------------------------------------------- /product_alias/README.md: -------------------------------------------------------------------------------- 1 | ## product_alias 2 | Adds support to configure/add aliases on products so products can be found more easily and with multiple terms. 3 | This support works on any search operation so by default also adds support for the Odoo webshop. 4 | Aliases are configurable on the product itself: 5 | ![image](https://user-images.githubusercontent.com/6352350/177359218-8ed9f4ac-de66-47b1-a82c-75109f1bc9bf.png) 6 | 7 | You can view/edit/manage all aliases from Sales > Configuration > Product Aliases: 8 | ![image](https://user-images.githubusercontent.com/6352350/177359471-fa9e6b8a-017e-4c1a-8629-d99c48d85973.png) 9 | They are only editable, creatable and deletable by sales administrators. Normal users can only read them. 10 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: Yenthe666 # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /webshop_quick_sell_product_accessory/__manifest__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | { 3 | 'name': 'Website Sale Product Accessory', 4 | 'category': 'Website', 5 | 'version': '15.0.1.0.0', 6 | 'author': 'Mainframe Monkey', 7 | 'website': 'https://www.mainframemonkey.com', 8 | 'summary': 'Website Quick Sell Product accessories', 9 | 'description': """Website Quick Sell Product accessories""", 10 | 'depends': [ 11 | 'sale_product_configurator', 12 | 'website_sale', 13 | ], 14 | 'data': [ 15 | 'views/optional_product_view.xml', 16 | ], 17 | 'assets': { 18 | 'web.assets_frontend': [ 19 | 'webshop_quick_sell_product_accessory/static/css/product_accessories.scss', 20 | 'webshop_quick_sell_product_accessory/static/js/product_accessories.js', 21 | ], 22 | }, 23 | 'license': 'LGPL-3', 24 | } 25 | -------------------------------------------------------------------------------- /product_alias/models/product_template.py: -------------------------------------------------------------------------------- 1 | from odoo import api, fields, models 2 | 3 | 4 | class ProductTemplate(models.Model): 5 | _inherit = "product.template" 6 | 7 | product_alias_ids = fields.Many2many( 8 | 'product.alias', 9 | string='Product Aliases', 10 | ondelete='restrict' 11 | ) 12 | product_alias_string = fields.Char( 13 | compute='_compute_product_alias_string', 14 | store=True, 15 | string='Alias String', 16 | help="Technical field used for searching purposes." 17 | ) 18 | 19 | @api.depends('product_alias_ids', 'product_alias_ids.name') 20 | def _compute_product_alias_string(self): 21 | for rec in self: 22 | rec.product_alias_string = '\n'.join([alias.name for alias in rec.product_alias_ids]) 23 | -------------------------------------------------------------------------------- /product_alias/models/product_product.py: -------------------------------------------------------------------------------- 1 | from odoo import fields, models 2 | 3 | 4 | class ProductProduct(models.Model): 5 | _inherit = "product.product" 6 | 7 | def _search(self, args, offset=0, limit=None, order=None, count=False, access_rights_uid=None): 8 | """ Override _search in order to grep search on product_alias_string field """ 9 | if args: 10 | name = '' 11 | for arg in args: 12 | if isinstance(arg, (list, tuple)) and arg[0] == 'default_code' and isinstance(arg[2], str): 13 | name = arg[2] 14 | break 15 | if name: 16 | args = ['|', ('product_alias_string', 'ilike', name)] + args 17 | return super()._search(args, offset=offset, limit=limit, order=order, count=count, access_rights_uid=access_rights_uid) 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Website 2 | Apps related to Odoo it's website/webshop features: 3 | - [webshop_public_prices](webshop_public_prices/README.md): allow configuring to hide or show product prices and add to cart button for public users. 4 | - [website_featured_products](website_featured_products/README.md): allow to define which products should be featured when using the "Products" snippet. 5 | - [webshop_quick_sell_product_accessory](webshop_quick_sell_product_accessory/README.md): allow to quick add accessories to the basket from the product (in the webshop) 6 | - [product_alias](product_alias/README.md): allow to set aliases on products so they can be found with multiple names. 7 | - webshop_order_customer_reference: Customers can add their own reference on a webshop order 8 | - webshop_quick_sell_product_accessory_public_prices: Quick Sell Product accessories with public prices 9 | -------------------------------------------------------------------------------- /webshop_public_prices/README.md: -------------------------------------------------------------------------------- 1 | ## webshop_public_prices 2 | Adds support to configure if the sale price and the 'Add to cart' button is shown on products in the shop or not.
3 | This setting is configurable under Website > Configuration > Settings: 4 | ![image](https://user-images.githubusercontent.com/6352350/157879698-5145fbd6-9c46-4720-922a-096d834d99be.png) 5 | 6 | When this configuration option is checked on we change the following things for public (not logged in) users: 7 | - Hide the sales price on the /shop overview page 8 | 9 | ![image](https://user-images.githubusercontent.com/6352350/157879960-8c712ab9-303b-4519-a048-bd159d509d64.png) 10 | 11 | - Hide the sales price on the /shop/product-xyz page 12 | - Hide the 'Add to Cart' button on the /shop/product-xyz page and show a 'Login to see Price' button 13 | ![image](https://user-images.githubusercontent.com/6352350/157880066-7382e001-592d-4b04-ba40-27f6d0df8dc0.png) -------------------------------------------------------------------------------- /webshop_public_prices/models/product_template.py: -------------------------------------------------------------------------------- 1 | from odoo import models 2 | 3 | 4 | class ProductTemplate(models.Model): 5 | _inherit = 'product.template' 6 | 7 | def _get_combination_info(self, combination=False, product_id=False, add_qty=1, pricelist=False, parent_combination=False, only_template=False): 8 | combination_info = super(ProductTemplate, self)._get_combination_info( 9 | combination=combination, product_id=product_id, add_qty=add_qty, pricelist=pricelist, 10 | parent_combination=parent_combination, only_template=only_template) 11 | if self.env.context.get('website_id'): 12 | current_website = self.env['website'].get_current_website() 13 | if current_website.webshop_hide_prices and self.env.user._is_public(): 14 | combination_info.update({ 15 | 'price_extra': 0, 16 | }) 17 | return combination_info 18 | -------------------------------------------------------------------------------- /webshop_quick_sell_product_accessory/README.md: -------------------------------------------------------------------------------- 1 | ## webshop_quick_sell_product_accessory 2 | Adds support for customers to quick add product accessories to the basket from the product page in the shop: 3 | ![image](https://user-images.githubusercontent.com/6352350/180467473-6f26d47d-fa83-465b-93f4-5064c63ce3db.png) 4 | 5 | Simply install this app and for any product that has accessory products configured on the product they will be 6 | automatically shown/selectable in the shop. 7 | You can configure this on the product form: 8 | ![image](https://user-images.githubusercontent.com/6352350/180467610-00f65191-62ad-4118-b1bd-67e9cc3e1070.png) 9 | 10 | Here's what happens when the customer clicks on the "Add to cart" of the suggested accessory: 11 | - If the product itself is already in the basket we only add the accessory,
13 | - If the accessory is already in the basket we no longer show it 14 | -------------------------------------------------------------------------------- /webshop_order_customer_reference/__manifest__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | { 3 | 'name': "Webshop order customer reference", 4 | 5 | 'summary': """ 6 | Customers can add their own reference on a webshop order 7 | """, 8 | 9 | 'description': """ 10 | Customers can add their own reference on a webshop order 11 | """, 12 | 13 | 'author': "Mainframe Monkey", 14 | 'website': "https://www.mainframemonkey.com", 15 | 16 | # Categories can be used to filter modules in modules listing 17 | # Check https://github.com/odoo/odoo/blob/14.0/odoo/addons/base/data/ir_module_category_data.xml 18 | # for the full list 19 | 'category': 'Uncategorized', 20 | 'version': '15.0.0.0.1', 21 | 22 | # any module necessary for this one to work correctly 23 | 'depends': ['website_sale'], 24 | 25 | # always loaded 26 | 'data': [ 27 | 'templates/website_sale.xml', 28 | ], 29 | 30 | "license": "LGPL-3", 31 | } 32 | -------------------------------------------------------------------------------- /webshop_quick_sell_product_accessory/i18n/nl.po: -------------------------------------------------------------------------------- 1 | # Translation of Odoo Server. 2 | # This file contains the translation of the following modules: 3 | # * webshop_quick_sell_product_accessory 4 | # 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: Odoo Server 15.0+e\n" 8 | "Report-Msgid-Bugs-To: \n" 9 | "POT-Creation-Date: 2022-07-22 14:41+0000\n" 10 | "PO-Revision-Date: 2022-07-22 14:41+0000\n" 11 | "Last-Translator: \n" 12 | "Language-Team: \n" 13 | "MIME-Version: 1.0\n" 14 | "Content-Type: text/plain; charset=UTF-8\n" 15 | "Content-Transfer-Encoding: \n" 16 | "Plural-Forms: \n" 17 | 18 | #. module: webshop_quick_sell_product_accessory 19 | #: model_terms:ir.ui.view,arch_db:webshop_quick_sell_product_accessory.optional_products 20 | msgid "Add to Cart" 21 | msgstr "Toevoegen aan winkelmandje" 22 | 23 | #. module: webshop_quick_sell_product_accessory 24 | #: model_terms:ir.ui.view,arch_db:webshop_quick_sell_product_accessory.optional_products 25 | msgid "Suggested Accessories:" 26 | msgstr "Productaccessoires:" 27 | -------------------------------------------------------------------------------- /webshop_order_customer_reference/templates/website_sale.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | -------------------------------------------------------------------------------- /webshop_quick_sell_product_accessory_public_prices/views/optional_product_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 15 | 16 | -------------------------------------------------------------------------------- /webshop_quick_sell_product_accessory/controllers/website_sale_product_accessory.py: -------------------------------------------------------------------------------- 1 | from odoo import fields, http 2 | from odoo.http import request 3 | from odoo.addons.website_sale.controllers.main import WebsiteSale 4 | 5 | 6 | class WebsiteSaleProductAccessory(WebsiteSale): 7 | def _prepare_product_values(self, product, category, search, **kwargs): 8 | values = super(WebsiteSaleProductAccessory, self)._prepare_product_values(product, category, search, **kwargs) 9 | 10 | # Add order to the product values 11 | order = request.website.sale_get_order() 12 | values.update({ 13 | 'website_sale_order': order 14 | }) 15 | 16 | return values 17 | 18 | @http.route( 19 | "/shop/cart/get_order_details", 20 | type="json", 21 | auth="public", 22 | methods=["POST"], 23 | website=True, 24 | csrf=False, 25 | sitemap=False, 26 | ) 27 | def get_order_details(self): 28 | order = request.website.sale_get_order(force_create=True) 29 | return { 30 | 'product_ids': order.order_line.product_id.ids 31 | } 32 | -------------------------------------------------------------------------------- /website_featured_products/i18n/nl.po: -------------------------------------------------------------------------------- 1 | # Translation of Odoo Server. 2 | # This file contains the translation of the following modules: 3 | # * website_featured_products 4 | # 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: Odoo Server 15.0+e\n" 8 | "Report-Msgid-Bugs-To: \n" 9 | "POT-Creation-Date: 2022-04-26 06:40+0000\n" 10 | "PO-Revision-Date: 2022-04-26 06:40+0000\n" 11 | "Last-Translator: \n" 12 | "Language-Team: \n" 13 | "MIME-Version: 1.0\n" 14 | "Content-Type: text/plain; charset=UTF-8\n" 15 | "Content-Transfer-Encoding: \n" 16 | "Plural-Forms: \n" 17 | 18 | #. module: website_featured_products 19 | #: model:ir.filters,name:website_featured_products.dynamic_snippet_show_featured_products_action 20 | #: model:ir.model.fields,field_description:website_featured_products.field_product_product__show_in_featured_products 21 | #: model:ir.model.fields,field_description:website_featured_products.field_product_template__show_in_featured_products 22 | msgid "Featured Product" 23 | msgstr "Uitgelichte producten" 24 | 25 | #. module: website_featured_products 26 | #: model:ir.model,name:website_featured_products.model_product_template 27 | msgid "Product Template" 28 | msgstr "Productsjabloon" 29 | -------------------------------------------------------------------------------- /website_featured_products/data/data.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Featured Products 6 | product.product 7 | 8 | [('website_published', '=', True),('show_in_featured_products','=',True)] 9 | {'display_default_code': False, 'add2cart_rerender': False} 10 | ['create_date desc'] 11 | 12 | 13 | 14 | 15 | 16 | display_name,description_sale,image_512,price:monetary 17 | 18 | Featured Products 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /webshop_public_prices/views/res_config_settings_views.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | res.config.settings.webshop.hide.prices 5 | res.config.settings 6 | 7 | 8 | 9 |

Hide Prices/Add to Cart for Public Users

10 |
11 |
12 |
13 | 14 |
15 |
16 |
21 |
22 |
23 |
24 |
25 |
26 |
-------------------------------------------------------------------------------- /product_alias/wizards/assign_product_alias.py: -------------------------------------------------------------------------------- 1 | from odoo import fields, models, _ 2 | 3 | 4 | class AssignAlias(models.TransientModel): 5 | _name = 'assign.alias' 6 | _description = 'Assign Product Alias' 7 | 8 | action = fields.Selection([ 9 | ('add', _('Add Aliases')), 10 | ('replace', _('Replace Aliases with selected ones'))], 11 | default='add', 12 | help="Select 'Add Aliases' if you want to add aliases to the existing Aliases. \n" 13 | "Select 'Replace' if you want to Replace all aliases with selected ones.") 14 | 15 | assign_product_alias_ids = fields.Many2many('product.alias', 16 | string='Select Aliases') 17 | 18 | def action_assign(self): 19 | self.ensure_one() 20 | products_ids = self.env[self._context.get('active_model')].browse(self._context.get('active_ids')) 21 | if self.action == "add": 22 | for each_product in products_ids: 23 | for each_alias in self.assign_product_alias_ids: 24 | each_product.product_alias_ids = [(4, each_alias.id)] 25 | elif self.action == "replace": 26 | products_ids.product_alias_ids = [(6, 0, self.assign_product_alias_ids.ids)] 27 | -------------------------------------------------------------------------------- /webshop_order_customer_reference/i18n/nl.po: -------------------------------------------------------------------------------- 1 | # Translation of Odoo Server. 2 | # This file contains the translation of the following modules: 3 | # * webshop_order_customer_reference 4 | # 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: Odoo Server 15.0+e\n" 8 | "Report-Msgid-Bugs-To: \n" 9 | "POT-Creation-Date: 2022-10-18 06:37+0000\n" 10 | "PO-Revision-Date: 2022-10-18 06:37+0000\n" 11 | "Last-Translator: \n" 12 | "Language-Team: \n" 13 | "MIME-Version: 1.0\n" 14 | "Content-Type: text/plain; charset=UTF-8\n" 15 | "Content-Transfer-Encoding: \n" 16 | "Plural-Forms: \n" 17 | 18 | #. module: webshop_order_customer_reference 19 | #: model_terms:ir.ui.view,arch_db:webshop_order_customer_reference.payment_inherit_webshop_order_customer_reference 20 | msgid "Extra info / reference:" 21 | msgstr "Extra info / referentie:" 22 | 23 | #. module: webshop_order_customer_reference 24 | #: model_terms:ir.ui.view,arch_db:webshop_order_customer_reference.payment_inherit_webshop_order_customer_reference 25 | msgid "Add" 26 | msgstr "Toevoegen" 27 | 28 | #. module: webshop_order_customer_reference 29 | #: model_terms:ir.ui.view,arch_db:webshop_order_customer_reference.payment_inherit_webshop_order_customer_reference 30 | msgid "Insert your own reference here..." 31 | msgstr "Voeg uw eigen referentie hier toe..." 32 | -------------------------------------------------------------------------------- /product_alias/models/product_alias.py: -------------------------------------------------------------------------------- 1 | from odoo import fields, models 2 | 3 | 4 | class ProductAlias(models.Model): 5 | _name = "product.alias" 6 | _description = "Product Alias" 7 | _order = 'id DESC' 8 | 9 | name = fields.Char( 10 | string='Name', 11 | translate=True, 12 | required=True 13 | ) 14 | active = fields.Boolean( 15 | default=True 16 | ) 17 | product_count = fields.Integer( 18 | compute='_compute_product_count' 19 | ) 20 | 21 | def _compute_product_count(self): 22 | for alias in self: 23 | alias.product_count = self.env["product.template"].search_count([("product_alias_ids", "=", alias.id)]) 24 | 25 | def action_view_products(self): 26 | self.ensure_one() 27 | action = self.env["ir.actions.actions"]._for_xml_id("sale.product_template_action") 28 | product_template_ids = self.env["product.template"].search_read([("product_alias_ids", "=", self.id)], ['id']) 29 | action['domain'] = [('id', 'in', [product_template['id'] for product_template in product_template_ids])] 30 | return action 31 | 32 | _sql_constraints = [ 33 | ('name_uniq', 'unique (name)', "There's already an alias with this name." 34 | "You cannot create two aliases with the same name.") 35 | ] 36 | -------------------------------------------------------------------------------- /product_alias/wizards/assign_product_alias_views.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | assign.product.alias.form 5 | assign.alias 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 |
18 |
19 |
20 |
21 | 22 | 23 | Assign Aliases 24 | assign.alias 25 | form 26 | new 27 | 28 | list 29 | 30 | 31 | 32 | Assign Aliases 33 | assign.alias 34 | form 35 | new 36 | 37 | list 38 | 39 | 40 |
41 | -------------------------------------------------------------------------------- /product_alias/views/product_alias_views.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | product.alias.form 5 | product.alias 6 | 7 |
8 | 9 |
10 | 14 |
15 | 16 | 17 | 18 | 19 | 20 |
21 |
22 |
23 |
24 | 25 | 26 | product.alias.tree 27 | product.alias 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | Product Alias 37 | product.alias 38 | tree,form 39 | 40 | 41 | 46 | 47 |
48 | -------------------------------------------------------------------------------- /webshop_public_prices/i18n/nl.po: -------------------------------------------------------------------------------- 1 | # Translation of Odoo Server. 2 | # This file contains the translation of the following modules: 3 | # * webshop_public_prices 4 | # 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: Odoo Server 15.0+e\n" 8 | "Report-Msgid-Bugs-To: \n" 9 | "POT-Creation-Date: 2022-03-11 13:50+0000\n" 10 | "PO-Revision-Date: 2022-03-11 13:50+0000\n" 11 | "Last-Translator: \n" 12 | "Language-Team: \n" 13 | "MIME-Version: 1.0\n" 14 | "Content-Type: text/plain; charset=UTF-8\n" 15 | "Content-Transfer-Encoding: \n" 16 | "Plural-Forms: \n" 17 | 18 | #. module: webshop_public_prices 19 | #: model_terms:ir.ui.view,arch_db:webshop_public_prices.products_item_addtocart 20 | msgid "ADD TO CART" 21 | msgstr "TOEVOEGEN AAN WINKELMANDJE" 22 | 23 | #. module: webshop_public_prices 24 | #: model_terms:ir.ui.view,arch_db:webshop_public_prices.products_item_addtocart 25 | msgid " Login to see price" 26 | msgstr " Login om prijzen te zien" 27 | 28 | #. module: webshop_public_prices 29 | #: model:ir.model,name:webshop_public_prices.model_res_config_settings 30 | msgid "Config Settings" 31 | msgstr "Configuratie instellingen" 32 | 33 | #. module: webshop_public_prices 34 | #: model_terms:ir.ui.view,arch_db:webshop_public_prices.res_config_settings_view_form_hide_prices 35 | msgid "Hide Prices/Add to Cart for Public Users" 36 | msgstr "Verberg prijzen/toevoegen aan winkelmandje voor publieke gebruikers" 37 | 38 | #. module: webshop_public_prices 39 | #: model_terms:ir.ui.view,arch_db:webshop_public_prices.res_config_settings_view_form_hide_prices 40 | msgid "Hide Prices/Add to Cart for public users" 41 | msgstr "Verberg prijzen/toevoegen aan winkelmandje voor publieke gebruikers" 42 | 43 | #. module: webshop_public_prices 44 | #: model:ir.model.fields,field_description:webshop_public_prices.field_res_config_settings__webshop_hide_prices 45 | #: model:ir.model.fields,field_description:webshop_public_prices.field_website__webshop_hide_prices 46 | msgid "Hide prices/Add to Cart for public users" 47 | msgstr "Verberg prijzen/toevoegen aan winkelmandje voor publieke gebruikers" 48 | 49 | #. module: webshop_public_prices 50 | #: model_terms:ir.ui.view,arch_db:webshop_public_prices.shop_cart_inherit 51 | msgid "Login to See Prices" 52 | msgstr "Login om prijzen te bekijken" 53 | 54 | #. module: webshop_public_prices 55 | #: model_terms:ir.ui.view,arch_db:webshop_public_prices.shop_cart_inherit 56 | msgid "Login to see prices" 57 | msgstr "Login om prijzen te bekijken" 58 | 59 | #. module: webshop_public_prices 60 | #: model_terms:ir.ui.view,arch_db:webshop_public_prices.shop_cart_inherit 61 | msgid "Shopping cart" 62 | msgstr "Winkelmandje" 63 | 64 | #. module: webshop_public_prices 65 | #: model_terms:ir.ui.view,arch_db:webshop_public_prices.res_config_settings_view_form_hide_prices 66 | msgid "Turn on the option to Hide Prices/Add to Cart for public users." 67 | msgstr "Optie inschakelen om prijzen en toevoegen aan winkelmandje te verbergen." 68 | 69 | #. module: webshop_public_prices 70 | #: model:ir.model,name:webshop_public_prices.model_website 71 | msgid "Website" 72 | msgstr "Website" 73 | -------------------------------------------------------------------------------- /webshop_quick_sell_product_accessory/static/js/product_accessories.js: -------------------------------------------------------------------------------- 1 | odoo.define("webshop_quick_sell_product_accessory.website_shop_product_accessory", function (require) { 2 | 'use strict'; 3 | var sAnimations = require('website.content.snippets.animation'); 4 | var wSaleUtils = require('website_sale.utils'); 5 | 6 | sAnimations.registry.ProductAccessoriesSelector = sAnimations.Class.extend({ 7 | selector: '.product-accessories-selector', 8 | read_events: { 9 | // Detects if we click to mark a tutorial as done or as not done 10 | 'click .product_add_suggested_product': '_onClickAddSuggestedProduct', 11 | }, 12 | events: sAnimations.Class.events, 13 | init: function () { 14 | this._super.apply(this, arguments); 15 | }, 16 | start: function () { 17 | var self = this; 18 | }, 19 | 20 | _onClickAddSuggestedProduct: function (ev) { 21 | var self = this; 22 | var $main_product = $("input[name='product_id']")[0]; 23 | var $product = $(ev.currentTarget).closest('.suggested_product'); 24 | 25 | self._rpc({ 26 | route: "/shop/cart/get_order_details", 27 | }).then(function (order) { 28 | // Add the main product to the cart if it isn't there yet 29 | if (!order['product_ids'].includes(parseInt($main_product.value))) { 30 | self._rpc({ 31 | route: "/shop/cart/update_json", 32 | params: { 33 | product_id: parseInt($main_product.value), 34 | add_qty: 1 35 | }, 36 | }).then(function (data) { 37 | // Update cart in navbar so that the number of products is updated 38 | wSaleUtils.updateCartNavBar(data); 39 | self._addAccessoryToCart(self, $product) 40 | }); 41 | } else { 42 | self._addAccessoryToCart(self, $product) 43 | } 44 | }); 45 | }, 46 | 47 | _addAccessoryToCart: function (self, $product) { 48 | // Add the product to the cart 49 | self._rpc({ 50 | route: "/shop/cart/update_json", 51 | params: { 52 | product_id: $product.find('input[data-product-id]').data('product-id'), 53 | add_qty: 1 54 | }, 55 | }).then(function (data) { 56 | // Remove product from suggested products because it was already added to the cart 57 | $product.remove(); 58 | 59 | // Update total suggestions, if zero, remove the suggestions part 60 | var total_element = $('span[id="total_suggested_products"]'); 61 | var total = parseInt(total_element[0].textContent) - 1; 62 | total_element.text(total); 63 | if (total === 0) { 64 | $('.product-accessories-selector').remove(); 65 | } 66 | 67 | // Update cart in navbar so that the number of products is updated 68 | wSaleUtils.updateCartNavBar(data); 69 | }); 70 | }, 71 | }) 72 | }); -------------------------------------------------------------------------------- /webshop_quick_sell_product_accessory/views/optional_product_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 51 | 52 | -------------------------------------------------------------------------------- /product_alias/i18n/nl.po: -------------------------------------------------------------------------------- 1 | # Translation of Odoo Server. 2 | # This file contains the translation of the following modules: 3 | # * product_alias 4 | # 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: Odoo Server 15.0\n" 8 | "Report-Msgid-Bugs-To: \n" 9 | "POT-Creation-Date: 2022-07-05 10:32+0000\n" 10 | "PO-Revision-Date: 2022-07-05 10:32+0000\n" 11 | "Last-Translator: \n" 12 | "Language-Team: \n" 13 | "MIME-Version: 1.0\n" 14 | "Content-Type: text/plain; charset=UTF-8\n" 15 | "Content-Transfer-Encoding: \n" 16 | "Plural-Forms: \n" 17 | 18 | #. module: product_alias 19 | #: model:ir.model.fields,field_description:product_alias.field_assign_alias__action 20 | msgid "Action" 21 | msgstr "" 22 | 23 | #. module: product_alias 24 | #: model:ir.model.fields,field_description:product_alias.field_product_alias__active 25 | msgid "Active" 26 | msgstr "" 27 | 28 | #. module: product_alias 29 | #: code:addons/product_alias/wizards/assign_product_alias.py:0 30 | #: model:ir.model.fields.selection,name:product_alias.selection__assign_alias__action__add 31 | #, python-format 32 | msgid "Add Aliases" 33 | msgstr "Synoniem toevoegen" 34 | 35 | #. module: product_alias 36 | #: model_terms:ir.ui.view,arch_db:product_alias.product_template_form_view 37 | msgid "Aliases" 38 | msgstr "Synoniemen" 39 | 40 | #. module: product_alias 41 | #: model:ir.model.fields,field_description:product_alias.field_product_product__product_alias_string 42 | #: model:ir.model.fields,field_description:product_alias.field_product_template__product_alias_string 43 | msgid "Alias String" 44 | msgstr "Synoniem string" 45 | 46 | #. module: product_alias 47 | #: model:ir.model.constraint,message:product_alias.constraint_product_alias_name_uniq 48 | msgid "Alias name already exists !" 49 | msgstr "Synoniem bestaat reeds!" 50 | 51 | #. module: product_alias 52 | #: model_terms:ir.ui.view,arch_db:product_alias.view_product_alias_form 53 | msgid "Archived" 54 | msgstr "Gearchiveerd" 55 | 56 | #. module: product_alias 57 | #: model_terms:ir.ui.view,arch_db:product_alias.assign_product_alias_form 58 | msgid "Assign" 59 | msgstr "Toewijzen" 60 | 61 | #. module: product_alias 62 | #: model:ir.actions.act_window,name:product_alias.product_product_assign_alias_action 63 | #: model:ir.actions.act_window,name:product_alias.product_template_assign_alias_action 64 | #: model_terms:ir.ui.view,arch_db:product_alias.assign_product_alias_form 65 | msgid "Assign Aliases" 66 | msgstr "Synoniemen toewijzen" 67 | 68 | #. module: product_alias 69 | #: model:ir.model,name:product_alias.model_assign_alias 70 | msgid "Assign Product Alias" 71 | msgstr "Productsynoniem toewijzen" 72 | 73 | #. module: product_alias 74 | #: model_terms:ir.ui.view,arch_db:product_alias.assign_product_alias_form 75 | msgid "Cancel" 76 | msgstr "Annuleer" 77 | 78 | #. module: product_alias 79 | #: model:ir.model.fields,field_description:product_alias.field_assign_alias__create_uid 80 | #: model:ir.model.fields,field_description:product_alias.field_product_alias__create_uid 81 | msgid "Created by" 82 | msgstr "Aangemaakt door" 83 | 84 | #. module: product_alias 85 | #: model:ir.model.fields,field_description:product_alias.field_assign_alias__create_date 86 | #: model:ir.model.fields,field_description:product_alias.field_product_alias__create_date 87 | msgid "Created on" 88 | msgstr "Aangemaakt op" 89 | 90 | #. module: product_alias 91 | #: model:ir.model.fields,field_description:product_alias.field_assign_alias__display_name 92 | #: model:ir.model.fields,field_description:product_alias.field_product_alias__display_name 93 | msgid "Display Name" 94 | msgstr "Schermnaam" 95 | 96 | #. module: product_alias 97 | #: model:ir.model.fields,field_description:product_alias.field_assign_alias__id 98 | #: model:ir.model.fields,field_description:product_alias.field_product_alias__id 99 | msgid "ID" 100 | msgstr "" 101 | 102 | #. module: product_alias 103 | #: model:ir.model.fields,field_description:product_alias.field_assign_alias____last_update 104 | #: model:ir.model.fields,field_description:product_alias.field_product_alias____last_update 105 | msgid "Last Modified on" 106 | msgstr "Laatst gewijzigd op" 107 | 108 | #. module: product_alias 109 | #: model:ir.model.fields,field_description:product_alias.field_assign_alias__write_uid 110 | #: model:ir.model.fields,field_description:product_alias.field_product_alias__write_uid 111 | msgid "Last Updated by" 112 | msgstr "Laatst bijgewerkt door" 113 | 114 | #. module: product_alias 115 | #: model:ir.model.fields,field_description:product_alias.field_assign_alias__write_date 116 | #: model:ir.model.fields,field_description:product_alias.field_product_alias__write_date 117 | msgid "Last Updated on" 118 | msgstr "Laatst bijgewerkt op" 119 | 120 | #. module: product_alias 121 | #: model:ir.model.fields,field_description:product_alias.field_product_alias__name 122 | msgid "Name" 123 | msgstr "Naam" 124 | 125 | #. module: product_alias 126 | #: model:ir.model,name:product_alias.model_product_product 127 | msgid "Product" 128 | msgstr "" 129 | 130 | #. module: product_alias 131 | #: model:ir.actions.act_window,name:product_alias.product_alias_action 132 | #: model:ir.model,name:product_alias.model_product_alias 133 | #: model:ir.ui.menu,name:product_alias.menu_product_alias 134 | #: model_terms:ir.ui.view,arch_db:product_alias.view_product_alias_form 135 | #: model_terms:ir.ui.view,arch_db:product_alias.view_product_alias_tree 136 | msgid "Product Aliases" 137 | msgstr "Product synoniemen" 138 | 139 | #. module: product_alias 140 | #: model:ir.model.fields,field_description:product_alias.field_product_product__product_alias_ids 141 | #: model:ir.model.fields,field_description:product_alias.field_product_template__product_alias_ids 142 | msgid "Product Aliases" 143 | msgstr "Product synoniemen" 144 | 145 | #. module: product_alias 146 | #: model:ir.model.fields,field_description:product_alias.field_product_alias__product_count 147 | msgid "Product Count" 148 | msgstr "Aantal producten" 149 | 150 | #. module: product_alias 151 | #: model:ir.model,name:product_alias.model_product_template 152 | msgid "Product Template" 153 | msgstr "Productsjabloon" 154 | 155 | #. module: product_alias 156 | #: model_terms:ir.ui.view,arch_db:product_alias.view_product_alias_form 157 | msgid "Products" 158 | msgstr "Producten" 159 | 160 | #. module: product_alias 161 | #: code:addons/product_alias/wizards/assign_product_alias.py:0 162 | #: model:ir.model.fields.selection,name:product_alias.selection__assign_alias__action__replace 163 | #, python-format 164 | msgid "Replace Aliases with selected ones" 165 | msgstr "Vervang synoniemen met geselecteerde synoniemen" 166 | 167 | #. module: product_alias 168 | #: model:ir.model.fields,help:product_alias.field_assign_alias__action 169 | msgid "" 170 | "Select 'Add Aliases' if you want to add aliases to the existing Aliases. \n" 171 | "Select 'Replace' if you want to Replace all aliases with selected ones." 172 | msgstr "Selecteer 'Synoniem toevoegen' indien u synoniemen wilt toevoegen aan de bestaande synoniemen. \n" 173 | "Selecteer 'Vervang synoniemen met geselecteerde synoniemen' indien u alle synoniemen wilt vervangen door de geselecteerde synoniemen." 174 | 175 | #. module: product_alias 176 | #: model:ir.model.fields,field_description:product_alias.field_assign_alias__assign_product_alias_ids 177 | msgid "Select Aliases" 178 | msgstr "Selecteer synoniemen" 179 | 180 | #. module: product_alias 181 | #: model:ir.model.fields,help:product_alias.field_product_product__product_alias_string 182 | #: model:ir.model.fields,help:product_alias.field_product_template__product_alias_string 183 | msgid "Technical field used for searching purposes." 184 | msgstr "Technisch veld gebruikt door de zoekfunctionaliteiten" 185 | -------------------------------------------------------------------------------- /webshop_public_prices/views/website_sale_template.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 22 | 23 | 68 | 69 | 96 | 97 | 118 | 119 | 143 | 144 | --------------------------------------------------------------------------------