Añadidos módulos de OCA/e-commerce para la tienda online

This commit is contained in:
santiky 2021-09-14 14:07:34 +02:00
parent 10bfdb5a49
commit c14ed5b4ef
Signed by: snt
GPG key ID: A9FD34930EADBE71
99 changed files with 5359 additions and 0 deletions

View file

@ -0,0 +1,127 @@
============================
Website Sale Stock Available
============================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github
:target: https://github.com/OCA/e-commerce/tree/12.0/website_sale_stock_available
:alt: OCA/e-commerce
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/e-commerce-12-0/e-commerce-12-0-website_sale_stock_available
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/113/12.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
This module extends the functionality of 'Product Availability' module
(Technical name: website_sale_stock) so that for the 'Website shop' the
'Available' quantity of a product is taken into account instead of
'Forecasted' quantity.
This image shows where you can see those quantities:
.. image:: https://raw.githubusercontent.com/OCA/e-commerce/12.0/website_sale_stock_available/static/description/product_quantities.png
:width: 600 px
:alt: Product quantities
|
If a product is configured to 'prevent sales if not enough stock'
(see configuration section) and its page is accessed in the Website Shop,
the availability messages will be based on the 'Available' quantity instead of
'Forecasted' quantity. And also, the Website shop wont allow you to buy more
products than 'Available' quantity (not 'Forecasted' quantity is taken
into account).
**Table of contents**
.. contents::
:local:
Configuration
=============
To configure this module, you need to:
#. Go to *Inventory > Master Data > Products* and edit a product that
you only want to sell in the website shop if there is enough stock.
#. Navigate to 'Availability' field in the 'eCommerce' tab and set
one of these options:
* Show inventory on website and prevent sales if not enough stock
* Show inventory below a threshold and prevent sales if not enough stock.
#. Go to *Inventory > Configuration > Settings*, navigate to *Stock available
to promise* section and set the desired option. If you do not choose any,
the value of 'Available' quantity will be equal to 'Forecasted' quantity.
Usage
=====
To use this module, you need to:
#. Go to your Website shop.
#. Select a product that you has previously configured to 'prevent sales
if not enough stock' for the web product page.
#. Odoo doesn't allow you to add the product to the car if 'Available'
quantity (not 'Forecasted' quantity) is equal or less than zero.
Besides, availability messages will be based on the 'Available'
quantity instead of the 'Forecasted' quantity.
.. image:: https://raw.githubusercontent.com/OCA/e-commerce/12.0/website_sale_stock_available/static/description/availability_message.png
:width: 600 px
:alt: Availability message
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/e-commerce/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
`feedback <https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_stock_available%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Tecnativa
Contributors
~~~~~~~~~~~~
* `Tecnativa <https://www.tecnativa.com>`_:
* Ernesto Tejeda
* Pedro M. Baeza
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/e-commerce <https://github.com/OCA/e-commerce/tree/12.0/website_sale_stock_available>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1,3 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from . import controllers
from . import models

View file

@ -0,0 +1,19 @@
# Copyright 2020 Tecnativa - Ernesto Tejeda
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
{
"name": "Website Sale Stock Available",
"summary": "Display 'Available to promise' in shop online "
"instead 'Quantity On Hand'",
"version": "12.0.1.0.3",
"category": "Website",
"website": "https://github.com/OCA/e-commerce",
"author": "Tecnativa, Odoo Community Association (OCA)",
"license": "AGPL-3",
"depends": [
"stock_available",
"website_sale_stock",
],
"data": [
],
"installable": True,
}

View file

@ -0,0 +1 @@
from . import main

View file

@ -0,0 +1,14 @@
# Copyright 2020 Tecnativa - David Vidal
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo.addons.website_sale_stock.controllers.main import WebsiteSale
from odoo.http import request, route
class WebsiteSale(WebsiteSale):
@route()
def payment_transaction(self, *args, **kwargs):
"""Inject a context when potencial or promised stock is set"""
request.website = request.website.with_context(
website_sale_stock_available=True)
return super().payment_transaction(*args, **kwargs)

View file

@ -0,0 +1,32 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_sale_stock_available
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2021-01-20 20:45+0000\n"
"Last-Translator: claudiagn <claudia.gargallo@qubiq.es>\n"
"Language-Team: none\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: website_sale_stock_available
#: model:ir.model,name:website_sale_stock_available.model_product_product
msgid "Product"
msgstr "Producte"
#. module: website_sale_stock_available
#: model:ir.model,name:website_sale_stock_available.model_product_template
msgid "Product Template"
msgstr "Plantilla de producte"
#. module: website_sale_stock_available
#: model:ir.model,name:website_sale_stock_available.model_sale_order
msgid "Sale Order"
msgstr "Comanda de venda"

View file

@ -0,0 +1,32 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_sale_stock_available
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2020-11-03 13:08+0000\n"
"Last-Translator: claudiagn <claudia.gargallo@qubiq.es>\n"
"Language-Team: none\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.10\n"
#. module: website_sale_stock_available
#: model:ir.model,name:website_sale_stock_available.model_product_product
msgid "Product"
msgstr "Producto"
#. module: website_sale_stock_available
#: model:ir.model,name:website_sale_stock_available.model_product_template
msgid "Product Template"
msgstr "Plantilla de producto"
#. module: website_sale_stock_available
#: model:ir.model,name:website_sale_stock_available.model_sale_order
msgid "Sale Order"
msgstr "Pedido de venta"

View file

@ -0,0 +1,32 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_sale_stock_available
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2020-05-30 05:19+0000\n"
"Last-Translator: Nelson Ramírez Sánchez <info@konos.cl>\n"
"Language-Team: none\n"
"Language: es_CL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.10\n"
#. module: website_sale_stock_available
#: model:ir.model,name:website_sale_stock_available.model_product_product
msgid "Product"
msgstr "Producto"
#. module: website_sale_stock_available
#: model:ir.model,name:website_sale_stock_available.model_product_template
msgid "Product Template"
msgstr "Plantilla de Producto"
#. module: website_sale_stock_available
#: model:ir.model,name:website_sale_stock_available.model_sale_order
msgid "Sale Order"
msgstr "Nota de Venta"

View file

@ -0,0 +1,32 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_sale_stock_available
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2020-11-23 15:36+0000\n"
"Last-Translator: Yann Papouin <y.papouin@dec-industrie.com>\n"
"Language-Team: none\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 3.10\n"
#. module: website_sale_stock_available
#: model:ir.model,name:website_sale_stock_available.model_product_product
msgid "Product"
msgstr "Article"
#. module: website_sale_stock_available
#: model:ir.model,name:website_sale_stock_available.model_product_template
msgid "Product Template"
msgstr "Modèle d'article"
#. module: website_sale_stock_available
#: model:ir.model,name:website_sale_stock_available.model_sale_order
msgid "Sale Order"
msgstr "Commande client"

View file

@ -0,0 +1,32 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_sale_stock_available
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2020-12-15 13:19+0000\n"
"Last-Translator: Bosd <c5e2fd43-d292-4c90-9d1f-74ff3436329a@anonaddy.me>\n"
"Language-Team: none\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: website_sale_stock_available
#: model:ir.model,name:website_sale_stock_available.model_product_product
msgid "Product"
msgstr "Product"
#. module: website_sale_stock_available
#: model:ir.model,name:website_sale_stock_available.model_product_template
msgid "Product Template"
msgstr "Product Sjabloon"
#. module: website_sale_stock_available
#: model:ir.model,name:website_sale_stock_available.model_sale_order
msgid "Sale Order"
msgstr "Verkoop order"

View file

@ -0,0 +1,5 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import product_product
from . import product_template
from . import sale_order

View file

@ -0,0 +1,19 @@
# Copyright 2020 Tecnativa - Ernesto Tejeda
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models
class Product(models.Model):
_inherit = 'product.product'
def _compute_quantities_dict(self, lot_id, owner_id, package_id,
from_date=False, to_date=False):
res = super()._compute_quantities_dict(
lot_id, owner_id, package_id, from_date, to_date)
if self.env.context.get('website_sale_stock_available'):
for product in self.with_context(
website_sale_stock_available=False):
immediately = product.immediately_usable_qty
res[product.id]['virtual_available'] = immediately
return res

View file

@ -0,0 +1,17 @@
# Copyright 2020 Tecnativa - Ernesto Tejeda
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models, api
class ProductTemplate(models.Model):
_inherit = 'product.template'
@api.multi
def _get_combination_info(self, combination=False, product_id=False,
add_qty=1, pricelist=False,
parent_combination=False, only_template=False):
template = self.with_context(website_sale_stock_available=True)
return super(ProductTemplate, template)._get_combination_info(
combination, product_id, add_qty, pricelist, parent_combination,
only_template)

View file

@ -0,0 +1,15 @@
# Copyright 2020 Tecnativa - Ernesto Tejeda
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import api, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
@api.multi
def _cart_update(self, product_id=None, line_id=None, add_qty=0,
set_qty=0, **kwargs):
order = self.with_context(website_sale_stock_available=True)
return super(SaleOrder, order)._cart_update(
product_id, line_id, add_qty, set_qty, **kwargs)

View file

@ -0,0 +1,12 @@
To configure this module, you need to:
#. Go to *Inventory > Master Data > Products* and edit a product that
you only want to sell in the website shop if there is enough stock.
#. Navigate to 'Availability' field in the 'eCommerce' tab and set
one of these options:
* Show inventory on website and prevent sales if not enough stock
* Show inventory below a threshold and prevent sales if not enough stock.
#. Go to *Inventory > Configuration > Settings*, navigate to *Stock available
to promise* section and set the desired option. If you do not choose any,
the value of 'Available' quantity will be equal to 'Forecasted' quantity.

View file

@ -0,0 +1,4 @@
* `Tecnativa <https://www.tecnativa.com>`_:
* Ernesto Tejeda
* Pedro M. Baeza

View file

@ -0,0 +1,19 @@
This module extends the functionality of 'Product Availability' module
(Technical name: website_sale_stock) so that for the 'Website shop' the
'Available' quantity of a product is taken into account instead of
'Forecasted' quantity.
This image shows where you can see those quantities:
.. image:: ../static/description/product_quantities.png
:width: 600 px
:alt: Product quantities
|
If a product is configured to 'prevent sales if not enough stock'
(see configuration section) and its page is accessed in the Website Shop,
the availability messages will be based on the 'Available' quantity instead of
'Forecasted' quantity. And also, the Website shop wont allow you to buy more
products than 'Available' quantity (not 'Forecasted' quantity is taken
into account).

View file

@ -0,0 +1,13 @@
To use this module, you need to:
#. Go to your Website shop.
#. Select a product that you has previously configured to 'prevent sales
if not enough stock' for the web product page.
#. Odoo doesn't allow you to add the product to the car if 'Available'
quantity (not 'Forecasted' quantity) is equal or less than zero.
Besides, availability messages will be based on the 'Available'
quantity instead of the 'Forecasted' quantity.
.. image:: ../static/description/availability_message.png
:width: 600 px
:alt: Availability message

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,470 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
<title>Website Sale Stock Available</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="website-sale-stock-available">
<h1 class="title">Website Sale Stock Available</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/e-commerce/tree/12.0/website_sale_stock_available"><img alt="OCA/e-commerce" src="https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/e-commerce-12-0/e-commerce-12-0-website_sale_stock_available"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/113/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This module extends the functionality of Product Availability module
(Technical name: website_sale_stock) so that for the Website shop the
Available quantity of a product is taken into account instead of
Forecasted quantity.</p>
<p>This image shows where you can see those quantities:</p>
<img alt="Product quantities" src="https://raw.githubusercontent.com/OCA/e-commerce/12.0/website_sale_stock_available/static/description/product_quantities.png" style="width: 600px;" />
<div class="line-block">
<div class="line"><br /></div>
</div>
<p>If a product is configured to prevent sales if not enough stock
(see configuration section) and its page is accessed in the Website Shop,
the availability messages will be based on the Available quantity instead of
Forecasted quantity. And also, the Website shop wont allow you to buy more
products than Available quantity (not Forecasted quantity is taken
into account).</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="id1">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="id2">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id5">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id6">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id7">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#id1">Configuration</a></h1>
<p>To configure this module, you need to:</p>
<ol class="arabic simple">
<li>Go to <em>Inventory &gt; Master Data &gt; Products</em> and edit a product that
you only want to sell in the website shop if there is enough stock.</li>
<li>Navigate to Availability field in the eCommerce tab and set
one of these options:<ul>
<li>Show inventory on website and prevent sales if not enough stock</li>
<li>Show inventory below a threshold and prevent sales if not enough stock.</li>
</ul>
</li>
<li>Go to <em>Inventory &gt; Configuration &gt; Settings</em>, navigate to <em>Stock available
to promise</em> section and set the desired option. If you do not choose any,
the value of Available quantity will be equal to Forecasted quantity.</li>
</ol>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id2">Usage</a></h1>
<p>To use this module, you need to:</p>
<ol class="arabic simple">
<li>Go to your Website shop.</li>
<li>Select a product that you has previously configured to prevent sales
if not enough stock for the web product page.</li>
<li>Odoo doesnt allow you to add the product to the car if Available
quantity (not Forecasted quantity) is equal or less than zero.
Besides, availability messages will be based on the Available
quantity instead of the Forecasted quantity.</li>
</ol>
<img alt="Availability message" src="https://raw.githubusercontent.com/OCA/e-commerce/12.0/website_sale_stock_available/static/description/availability_message.png" style="width: 600px;" />
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id3">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/e-commerce/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_stock_available%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id4">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id5">Authors</a></h2>
<ul class="simple">
<li>Tecnativa</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id6">Contributors</a></h2>
<ul class="simple">
<li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
<li>Ernesto Tejeda</li>
<li>Pedro M. Baeza</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id7">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/e-commerce/tree/12.0/website_sale_stock_available">OCA/e-commerce</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

View file

@ -0,0 +1,3 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import test_website_sale_stock_available

View file

@ -0,0 +1,73 @@
# Copyright 2020 Tecnativa - Ernesto Tejeda
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo.tests.common import SavepointCase
class SaleStockAvailableInfoPopup(SavepointCase):
@classmethod
def setUpClass(cls):
super(SaleStockAvailableInfoPopup, cls).setUpClass()
user_group_stock_user = cls.env.ref('stock.group_stock_user')
cls.user_stock_user = cls.env['res.users'].create({
'name': 'Pauline Poivraisselle',
'login': 'pauline',
'email': 'p.p@example.com',
'notification_type': 'inbox',
'groups_id': [(6, 0, [user_group_stock_user.id])]})
cls.product = cls.env['product.product'].create({
'name': 'Storable product',
'type': 'product',
})
cls.stock_location = cls.env.ref('stock.stock_location_stock')
cls.customers_location = cls.env.ref('stock.stock_location_customers')
cls.suppliers_location = cls.env.ref('stock.stock_location_suppliers')
cls.env['stock.quant'].create({
'product_id': cls.product.id,
'location_id': cls.stock_location.id,
'quantity': 40.0})
cls.picking_out = cls.env['stock.picking'].create({
'picking_type_id': cls.env.ref('stock.picking_type_out').id,
'location_id': cls.stock_location.id,
'location_dest_id': cls.customers_location.id})
cls.env['stock.move'].create({
'name': 'a move',
'product_id': cls.product.id,
'product_uom_qty': 3.0,
'product_uom': cls.product.uom_id.id,
'picking_id': cls.picking_out.id,
'location_id': cls.stock_location.id,
'location_dest_id': cls.customers_location.id})
cls.picking_in = cls.env['stock.picking'].create({
'picking_type_id': cls.env.ref('stock.picking_type_in').id,
'location_id': cls.suppliers_location.id,
'location_dest_id': cls.stock_location.id})
cls.env['stock.move'].create({
'restrict_partner_id': cls.user_stock_user.partner_id.id,
'name': 'another move',
'product_id': cls.product.id,
'product_uom_qty': 5.0,
'product_uom': cls.product.uom_id.id,
'picking_id': cls.picking_in.id,
'location_id': cls.suppliers_location.id,
'location_dest_id': cls.stock_location.id})
def test_get_combination_info(self):
product_tmpl = self.product.product_tmpl_id
combination_info = product_tmpl.with_context(
website_sale_stock_get_quantity=True,
)._get_combination_info()
self.assertEqual(
combination_info['virtual_available'],
40,
)
self.picking_out.action_confirm()
self.picking_in.action_assign()
combination_info = product_tmpl.with_context(
website_sale_stock_get_quantity=True,
)._get_combination_info()
self.assertEqual(
combination_info['virtual_available'],
self.product.immediately_usable_qty
)

View file

@ -0,0 +1,91 @@
====================================
Website Sale Stock Available Display
====================================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github
:target: https://github.com/OCA/e-commerce/tree/12.0/website_sale_stock_available_display
:alt: OCA/e-commerce
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/e-commerce-12-0/e-commerce-12-0-website_sale_stock_available_display
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/113/12.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
This module extends the functionality of website sale stock module to allow to
display available stock in website products and allow to buy if not enough
stock.
Also re-use the field Custom Message for inform to customer of any message
when stock is less than 0.0 units.
**Table of contents**
.. contents::
:local:
Usage
=====
#. Go to *'Sale > Catalog > Product'*.
#. Set *Show inventory on website and allow sales if not enough stock* in
inventory availability field.
#. You can set a custom message that appears when available stock is less than
0.0 units.
#. Go to Website Shop.
#. Click in any product that you know that no stock available.
#. You will see '*0 units in stock*' but you will buy this product.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/e-commerce/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
`feedback <https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_stock_available_display%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Tecnativa
Contributors
~~~~~~~~~~~~
* `Tecnativa <https://www.tecnativa.com>`_:
* Sergio Teruel <sergio.teruel@tecnativa.com>
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/e-commerce <https://github.com/OCA/e-commerce/tree/12.0/website_sale_stock_available_display>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1,2 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from . import models

View file

@ -0,0 +1,23 @@
# Copyright 2019 Tecnativa - Sergio Teruel
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
{
'name': 'Website Sale Stock Available Display',
'summary': 'Display stock in shop online and allow to sell with no stock '
'available',
'version': '12.0.1.2.1',
'development_status': 'Beta',
'category': 'Website',
'website': 'https://github.com/OCA/e-commerce',
'author': 'Tecnativa, Odoo Community Association (OCA)',
'license': 'AGPL-3',
'application': False,
'installable': True,
'depends': [
'website_sale_stock',
],
'data': [
'views/assets.xml',
'views/product_template_views.xml',
'views/templates.xml',
],
}

View file

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="product_template_wo_qty" model="product.template">
<field name="name">Computer Motherboard</field>
<field name="type">product</field>
<field name="inventory_availability">always_no_lock</field>
<field name="website_published" eval="True"/>
<field name="custom_message">Available in 10 days</field>
</record>
<record id="product_product_w_qty" model="product.product">
<field name="name">Special Mouse</field>
<field name="type">product</field>
<field name="inventory_availability">always_no_lock</field>
<field name="website_published" eval="True"/>
</record>
<record id="product_product_w_qty_quant" model="stock.quant">
<field name="product_id" ref="website_sale_stock_available_display.product_product_w_qty"/>
<field name="product_uom_id" ref="product.product_uom_unit"/>
<field name="location_id" ref="stock.stock_location_stock"/>
<field name="quantity">10.0</field>
</record>
</odoo>

View file

@ -0,0 +1,91 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_sale_stock_available_display
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2021-01-20 20:45+0000\n"
"Last-Translator: claudiagn <claudia.gargallo@qubiq.es>\n"
"Language-Team: none\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: website_sale_stock_available_display
#: model:ir.model.fields,help:website_sale_stock_available_display.field_product_product__inventory_availability
#: model:ir.model.fields,help:website_sale_stock_available_display.field_product_template__inventory_availability
msgid "Adds an inventory availability status on the web product page."
msgstr ""
"Afegeix un estat de disponibilitat dinventari a la pàgina del producte web."
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Block sales on website and display a message custom"
msgstr "Bloqueja les vendes al lloc web i mostra un missatge personalitzat"
#. module: website_sale_stock_available_display
#: model:ir.model,name:website_sale_stock_available_display.model_res_config_settings
msgid "Config Settings"
msgstr "Paràmetres de configuració"
#. module: website_sale_stock_available_display
#: model:ir.model.fields,field_description:website_sale_stock_available_display.field_product_product__inventory_availability
#: model:ir.model.fields,field_description:website_sale_stock_available_display.field_product_template__inventory_availability
#: model:ir.model.fields,field_description:website_sale_stock_available_display.field_res_config_settings__inventory_availability
msgid "Inventory Availability"
msgstr "Disponibilitat d'inventari"
#. module: website_sale_stock_available_display
#: model:ir.model,name:website_sale_stock_available_display.model_product_template
msgid "Product Template"
msgstr "Plantilla de producte"
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Sell regardless of inventory"
msgstr "Vendre independenment del inventari"
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Show inventory below a threshold and prevent sales if not enough stock"
msgstr ""
"Mostra l'inventari per sota d'un llindar i evita les vendes si no hi ha prou "
"existències"
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Show inventory on website and allow sales if not enough stock"
msgstr ""
"Mostra l'inventari al lloc web i permet les vendes si no hi ha prou "
"existències"
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Show inventory on website and prevent sales if not enough stock"
msgstr ""
"Mostra l'inventari al lloc web i evita les vendes si no hi ha prou "
"existències"
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Show product-specific notifications"
msgstr "Mostra les notificacions específiques del producte"
#. module: website_sale_stock_available_display
#. openerp-web
#: code:addons/website_sale_stock_available_display/static/src/xml/website_sale_stock_product_availability.xml:10
#: model_terms:ir.ui.view,arch_db:website_sale_stock_available_display.stock_info
#, python-format
msgid "in stock"
msgstr "en estoc"

View file

@ -0,0 +1,94 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_sale_stock_available_display
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2020-08-11 17:59+0000\n"
"Last-Translator: André Volksdorf <volksdorf@smartpage.de>\n"
"Language-Team: none\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.10\n"
#. module: website_sale_stock_available_display
#: model:ir.model.fields,help:website_sale_stock_available_display.field_product_product__inventory_availability
#: model:ir.model.fields,help:website_sale_stock_available_display.field_product_template__inventory_availability
msgid "Adds an inventory availability status on the web product page."
msgstr ""
"Fügt einen Bestandsverfügbarkeitsstatus auf der Produktseite der Website "
"hinzu."
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Block sales on website and display a message custom"
msgstr ""
"Verkäufe auf der Website blockieren und eine benutzerdefinierte Nachricht "
"anzeigen"
#. module: website_sale_stock_available_display
#: model:ir.model,name:website_sale_stock_available_display.model_res_config_settings
msgid "Config Settings"
msgstr "Konfigurationseinstellungen"
#. module: website_sale_stock_available_display
#: model:ir.model.fields,field_description:website_sale_stock_available_display.field_product_product__inventory_availability
#: model:ir.model.fields,field_description:website_sale_stock_available_display.field_product_template__inventory_availability
#: model:ir.model.fields,field_description:website_sale_stock_available_display.field_res_config_settings__inventory_availability
msgid "Inventory Availability"
msgstr "Verfügbarkeit der Bestände"
#. module: website_sale_stock_available_display
#: model:ir.model,name:website_sale_stock_available_display.model_product_template
msgid "Product Template"
msgstr "Produkt-Vorlage"
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Sell regardless of inventory"
msgstr "Verkaufen unabhängig vom Bestand"
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Show inventory below a threshold and prevent sales if not enough stock"
msgstr ""
"Lagerbestand unter einem Schwellenwert anzeigen und Verkäufe verhindern, "
"wenn nicht genügend Bestand vorhanden ist"
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Show inventory on website and allow sales if not enough stock"
msgstr ""
"Lagerbestand auf der Website anzeigen und Verkäufe zulassen, wenn nicht "
"genug Bestand vorhanden ist"
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Show inventory on website and prevent sales if not enough stock"
msgstr ""
"Lagerbestand auf der Website anzeigen und Verkäufe verhindern, wenn nicht "
"genügend Bestand vorhanden ist"
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Show product-specific notifications"
msgstr "Produktspezifische Benachrichtigungen anzeigen"
#. module: website_sale_stock_available_display
#. openerp-web
#: code:addons/website_sale_stock_available_display/static/src/xml/website_sale_stock_product_availability.xml:10
#: model_terms:ir.ui.view,arch_db:website_sale_stock_available_display.stock_info
#, python-format
msgid "in stock"
msgstr "Auf Lager"

View file

@ -0,0 +1,99 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_sale_stock_available_display
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-05-07 21:58+0000\n"
"PO-Revision-Date: 2020-11-03 13:08+0000\n"
"Last-Translator: claudiagn <claudia.gargallo@qubiq.es>\n"
"Language-Team: \n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.10\n"
#. module: website_sale_stock_available_display
#: model:ir.model.fields,help:website_sale_stock_available_display.field_product_product__inventory_availability
#: model:ir.model.fields,help:website_sale_stock_available_display.field_product_template__inventory_availability
msgid "Adds an inventory availability status on the web product page."
msgstr ""
"Añade un estado de disponibilidad en inventario en la página web del "
"producto."
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Block sales on website and display a message custom"
msgstr "Bloquear la venta en la tienda y mostrar el mensaje personalizado"
#. module: website_sale_stock_available_display
#: model:ir.model,name:website_sale_stock_available_display.model_res_config_settings
msgid "Config Settings"
msgstr "Opciones de Configuración"
#. module: website_sale_stock_available_display
#: model:ir.model.fields,field_description:website_sale_stock_available_display.field_product_product__inventory_availability
#: model:ir.model.fields,field_description:website_sale_stock_available_display.field_product_template__inventory_availability
#: model:ir.model.fields,field_description:website_sale_stock_available_display.field_res_config_settings__inventory_availability
msgid "Inventory Availability"
msgstr "Disponibilidad del inventario"
#. module: website_sale_stock_available_display
#: model:ir.model,name:website_sale_stock_available_display.model_product_template
msgid "Product Template"
msgstr "Plantilla de producto"
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Sell regardless of inventory"
msgstr "Vender independientemente del inventario"
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Show inventory below a threshold and prevent sales if not enough stock"
msgstr ""
"Mostrar el inventario por debajo de un determinado umbral y bloquear las "
"ventas si no hay suficientes existencias"
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Show inventory on website and allow sales if not enough stock"
msgstr ""
"Mostrar el inventario en el sitio web y no bloquear las ventas si no hay \n"
"suficientes existencias"
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Show inventory on website and prevent sales if not enough stock"
msgstr ""
"Mostrar el inventario en el sitio web y bloquear las ventas si no hay "
"suficientes existencias"
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Show product-specific notifications"
msgstr "Mostrar notificaciones sobre el producto"
#. module: website_sale_stock_available_display
#. openerp-web
#: code:addons/website_sale_stock_available_display/static/src/xml/website_sale_stock_product_availability.xml:10
#: model_terms:ir.ui.view,arch_db:website_sale_stock_available_display.stock_info
#, python-format
msgid "in stock"
msgstr "en stock"
#~ msgid "Computer Motherboard"
#~ msgstr "Placa base"
#~ msgid "Special Mouse"
#~ msgstr "Ratón especial"

View file

@ -0,0 +1,91 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_sale_stock_available_display
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2020-11-23 15:36+0000\n"
"Last-Translator: Yann Papouin <y.papouin@dec-industrie.com>\n"
"Language-Team: none\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 3.10\n"
#. module: website_sale_stock_available_display
#: model:ir.model.fields,help:website_sale_stock_available_display.field_product_product__inventory_availability
#: model:ir.model.fields,help:website_sale_stock_available_display.field_product_template__inventory_availability
msgid "Adds an inventory availability status on the web product page."
msgstr "Ajoute une information de disponibilité sur la page Web du produit."
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Block sales on website and display a message custom"
msgstr "Bloquer les ventes sur le site Web et afficher un message personnalisé"
#. module: website_sale_stock_available_display
#: model:ir.model,name:website_sale_stock_available_display.model_res_config_settings
msgid "Config Settings"
msgstr "Paramètres de config"
#. module: website_sale_stock_available_display
#: model:ir.model.fields,field_description:website_sale_stock_available_display.field_product_product__inventory_availability
#: model:ir.model.fields,field_description:website_sale_stock_available_display.field_product_template__inventory_availability
#: model:ir.model.fields,field_description:website_sale_stock_available_display.field_res_config_settings__inventory_availability
msgid "Inventory Availability"
msgstr "Disponibilité"
#. module: website_sale_stock_available_display
#: model:ir.model,name:website_sale_stock_available_display.model_product_template
msgid "Product Template"
msgstr "Modèle d'article"
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Sell regardless of inventory"
msgstr "Vente sans tenir compte du stock"
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Show inventory below a threshold and prevent sales if not enough stock"
msgstr ""
"Indiquer si l'inventaire est inférieur à un certain seuil et bloquer les "
"ventes en cas de stock insuffisant"
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Show inventory on website and allow sales if not enough stock"
msgstr ""
"Afficher l'inventaire sur le site Web et autoriser les ventes en cas de "
"stock insuffisant"
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Show inventory on website and prevent sales if not enough stock"
msgstr ""
"Afficher l'inventaire sur le site Web et bloquer les ventes en cas de stock "
"insuffisant"
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Show product-specific notifications"
msgstr ""
"Afficher un message de disponibilité personnalisé et spécique au produit"
#. module: website_sale_stock_available_display
#. openerp-web
#: code:addons/website_sale_stock_available_display/static/src/xml/website_sale_stock_product_availability.xml:10
#: model_terms:ir.ui.view,arch_db:website_sale_stock_available_display.stock_info
#, python-format
msgid "in stock"
msgstr "en stock"

View file

@ -0,0 +1,86 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_sale_stock_available_display
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2020-12-15 13:19+0000\n"
"Last-Translator: Bosd <c5e2fd43-d292-4c90-9d1f-74ff3436329a@anonaddy.me>\n"
"Language-Team: none\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: website_sale_stock_available_display
#: model:ir.model.fields,help:website_sale_stock_available_display.field_product_product__inventory_availability
#: model:ir.model.fields,help:website_sale_stock_available_display.field_product_template__inventory_availability
msgid "Adds an inventory availability status on the web product page."
msgstr ""
"Voegt een beschikbare voorraad status toe aan de product pagina op de "
"website."
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Block sales on website and display a message custom"
msgstr "Blokkeer verkopen op de website en geef een aangepaste boodschap weer"
#. module: website_sale_stock_available_display
#: model:ir.model,name:website_sale_stock_available_display.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: website_sale_stock_available_display
#: model:ir.model.fields,field_description:website_sale_stock_available_display.field_product_product__inventory_availability
#: model:ir.model.fields,field_description:website_sale_stock_available_display.field_product_template__inventory_availability
#: model:ir.model.fields,field_description:website_sale_stock_available_display.field_res_config_settings__inventory_availability
msgid "Inventory Availability"
msgstr "Beschikbare voorraad"
#. module: website_sale_stock_available_display
#: model:ir.model,name:website_sale_stock_available_display.model_product_template
msgid "Product Template"
msgstr "Product Sjabloon"
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Sell regardless of inventory"
msgstr "Verkoop ongeacht de voorraad"
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Show inventory below a threshold and prevent sales if not enough stock"
msgstr ""
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Show inventory on website and allow sales if not enough stock"
msgstr ""
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Show inventory on website and prevent sales if not enough stock"
msgstr ""
#. module: website_sale_stock_available_display
#: selection:product.template,inventory_availability:0
#: selection:res.config.settings,inventory_availability:0
msgid "Show product-specific notifications"
msgstr ""
#. module: website_sale_stock_available_display
#. openerp-web
#: code:addons/website_sale_stock_available_display/static/src/xml/website_sale_stock_product_availability.xml:10
#: model_terms:ir.ui.view,arch_db:website_sale_stock_available_display.stock_info
#, python-format
msgid "in stock"
msgstr ""

View file

@ -0,0 +1,2 @@
from . import product_template
from . import res_config_settings

View file

@ -0,0 +1,12 @@
# Copyright 2019 Tecnativa - Sergio Teruel
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import fields, models
class ProductTemplate(models.Model):
_inherit = 'product.template'
inventory_availability = fields.Selection(selection_add=[
('always_no_lock',
'Show inventory on website and allow sales if not enough stock'),
])

View file

@ -0,0 +1,13 @@
# Copyright 2019 Tecnativa - Sergio Teruel
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import fields, models
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
inventory_availability = fields.Selection(selection_add=[
('always_no_lock',
'Show inventory on website and allow sales if not enough stock'),
])

View file

@ -0,0 +1,3 @@
* `Tecnativa <https://www.tecnativa.com>`_:
* Sergio Teruel <sergio.teruel@tecnativa.com>

View file

@ -0,0 +1,5 @@
This module extends the functionality of website sale stock module to allow to
display available stock in website products and allow to buy if not enough
stock.
Also re-use the field Custom Message for inform to customer of any message
when stock is less than 0.0 units.

View file

@ -0,0 +1,8 @@
#. Go to *'Sale > Catalog > Product'*.
#. Set *Show inventory on website and allow sales if not enough stock* in
inventory availability field.
#. You can set a custom message that appears when available stock is less than
0.0 units.
#. Go to Website Shop.
#. Click in any product that you know that no stock available.
#. You will see '*0 units in stock*' but you will buy this product.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,443 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
<title>Website Sale Stock Available Display</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="website-sale-stock-available-display">
<h1 class="title">Website Sale Stock Available Display</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/e-commerce/tree/12.0/website_sale_stock_available_display"><img alt="OCA/e-commerce" src="https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/e-commerce-12-0/e-commerce-12-0-website_sale_stock_available_display"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/113/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This module extends the functionality of website sale stock module to allow to
display available stock in website products and allow to buy if not enough
stock.
Also re-use the field Custom Message for inform to customer of any message
when stock is less than 0.0 units.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="id1">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id1">Usage</a></h1>
<ol class="arabic simple">
<li>Go to <em>Sale &gt; Catalog &gt; Product</em>.</li>
<li>Set <em>Show inventory on website and allow sales if not enough stock</em> in
inventory availability field.</li>
<li>You can set a custom message that appears when available stock is less than
0.0 units.</li>
<li>Go to Website Shop.</li>
<li>Click in any product that you know that no stock available.</li>
<li>You will see <em>0 units in stock</em> but you will buy this product.</li>
</ol>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/e-commerce/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_stock_available_display%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id4">Authors</a></h2>
<ul class="simple">
<li>Tecnativa</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id5">Contributors</a></h2>
<ul>
<li><p class="first"><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:</p>
<blockquote>
<ul class="simple">
<li>Sergio Teruel &lt;<a class="reference external" href="mailto:sergio.teruel&#64;tecnativa.com">sergio.teruel&#64;tecnativa.com</a>&gt;</li>
</ul>
</blockquote>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id6">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/e-commerce/tree/12.0/website_sale_stock_available_display">OCA/e-commerce</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,15 @@
odoo.define('website_sale_stock_available_display.load', function (require) {
'use strict';
var ajax = require('web.ajax');
var core = require('web.core');
var ProductConfiguratorMixin = require(
'website_sale_stock.ProductConfiguratorMixin');
var QWeb = core.qweb;
var load_xml = ajax.loadXML(
'/website_sale_stock_available_display/static/src/xml/website_sale_stock_product_availability.xml',
QWeb
);
load_xml.then(function() {
$('.oe_website_sale').find('input[name="add_qty"]').trigger('change');
});
});

View file

@ -0,0 +1,59 @@
/* Copyright 2019 Sergio Teruel
* License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
odoo.define("website_sale_stock_available_display.tour", function (require) {
"use strict";
var tour = require("web_tour.tour");
var base = require("web_editor.base");
var steps = [
{
trigger: "a:contains('Computer Motherboard')",
},
{
trigger: "a#add_to_cart",
extra_trigger: ".availability_messages:has(span:contains('0 Unit(s) in stock')):has(div:contains('Available in 10 days'))",
},
{
trigger: "span:contains('Process Checkout')",
extra_trigger: ".availability_messages:has(span:contains('0 Unit(s) in stock'))",
},
{
trigger: ".btn-primary:contains('Confirm Order')",
},
{
trigger: "a[href='/shop']",
extra_trigger: ".availability_messages:has(span:contains('0 Unit(s) in stock'))",
},
{
trigger: "a:contains('Special Mouse')",
},
{
trigger: "a#add_to_cart",
extra_trigger: ".availability_messages:has(span:contains('10 Unit(s) in stock'))",
},
{
trigger: "span:contains('Process Checkout')",
extra_trigger: ".availability_messages:has(span:contains('10.0 Unit(s) in stock'))",
},
{
trigger: ".btn-primary:contains('Confirm Order')",
},
{
trigger: "a[href='/shop']",
extra_trigger: ".availability_messages:has(span:contains('10.0 Unit(s) in stock'))",
},
];
tour.register("website_sale_stock_available_display",
{
url: "/shop",
test: true,
wait_for: base.ready(),
},
steps
);
return {
steps: steps,
};
});

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates>
<t t-extend="website_sale_stock.product_availability">
<t t-jquery="t:eq(0)" t-operation="after">
<t t-if="product_type == 'product' and _.contains(['always_no_lock'], inventory_availability)">
<div t-attf-class="availability_message_#{product_template} text-#{virtual_available gt 0.0 and 'success' or 'danger'} mt16">
<span>
<t t-if="virtual_available gt 0.0" t-esc="virtual_available"/>
<t t-else="1" t-esc="0.0"/> <t t-esc="uom_name"/> in stock</span>
</div>
<div t-if="virtual_available &lt;= 0.0">
<!-- Re-use this core field -->
<t t-esc="custom_message" />
</div>
</t>
</t>
</t>
</templates>

View file

@ -0,0 +1 @@
from . import test_website_sale_stock_available_display

View file

@ -0,0 +1,57 @@
# Copyright 2019 Tecnativa - Sergio Teruel
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo.tests.common import HttpCase
class websiteSaleStockAvailableDisplay(HttpCase):
def setUp(self):
super().setUp()
# For testing with website_sale_vat_required module, I avoid
# address step to fill partner vat
self.env.ref('base.user_admin').partner_id.write({
'vat': 'BE0477472701',
'phone': '9999999999',
})
self.ProductTemplate = self.env['product.template']
# The website_sequence is set quite high to display this products in
# first page.
# Set list price to 0.0 to avoid payment step because this step has an
# asynchronous call
common_vals = {
'type': 'product',
'website_published': True,
'inventory_availability': 'always_no_lock',
'website_sequence': 5000,
'list_price': 0.0,
}
vals = common_vals.copy()
vals.update({
'name': 'Computer Motherboard',
'custom_message': 'Available in 10 days',
})
self.product_template_wo_qty = self.ProductTemplate.create(vals)
vals = common_vals.copy()
vals.update({
'name': 'Special Mouse',
})
self.product_product_w_qty = self.ProductTemplate.create(vals)
self.env['stock.quant'].create({
'product_id': self.product_product_w_qty.product_variant_ids.id,
'product_uom_id': self.product_product_w_qty.uom_id.id,
'location_id': self.env.ref('stock.stock_location_stock').id,
'quantity': 10.0,
})
def test_ui_website(self):
"""Test frontend tour."""
tour = (
"odoo.__DEBUG__.services['web_tour.tour']",
"website_sale_stock_available_display",
)
self.browser_js(
url_path="/shop",
code="%s.run('%s')" % tour,
ready="%s.tours['%s'].ready" % tour,
login="admin"
)

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="assets_frontend" inherit_id="website.assets_frontend">
<xpath expr=".">
<script type="text/javascript"
src="/website_sale_stock_available_display/static/src/js/website_sale_stock_available_display.js"/>
<script type="text/javascript"
src="/website_sale_stock_available_display/static/src/js/website_sale_stock_available_display_tour.js"/>
</xpath>
</template>
</odoo>

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2019 Tecnativa - Sergio Teruel
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="product_template_form_view" model="ir.ui.view">
<field name="model">product.template</field>
<field name="inherit_id" ref="website_sale_stock.product_template_form_view_inherit_website_sale_stock" />
<field name="arch" type="xml">
<field name="custom_message" position="after">
<field name="custom_message"
attrs="{'invisible': ['|', ('type', 'in', ['service', 'consu']), ('inventory_availability', '!=', 'always_no_lock')]}"/>
</field>
</field>
</record>
</odoo>

View file

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2019 Tecnativa - Sergio Teruel
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<template id="stock_info">
<t t-if="line.product_id.inventory_availability == 'always_no_lock'">
<!--
Compute virtual_available with context key added by
website_sale_stock_available module. Is not needed dependency of it.
-->
<t t-set="virtual_available"
t-value="line.product_id.with_context(website_sale_stock_available=True).virtual_available"/>
<div t-attf-class="availability_messages text-#{virtual_available &gt; 0.0 and 'success' or 'danger'}">
<t t-set="virtual_available" t-value="virtual_available if virtual_available > 0.0 else 0.0"/>
<span><t t-esc="virtual_available"/> <t t-esc="line.product_uom.name"/> in stock</span>
</div>
</t>
</template>
<!-- Shopping Cart Lines -->
<template id="cart_lines" inherit_id="website_sale.cart_lines">
<xpath expr="//td[hasclass('td-qty')]" position="inside">
<t t-call="website_sale_stock_available_display.stock_info"/>
</xpath>
</template>
<!-- Cart Summary -->
<template id="cart_summary" inherit_id="website_sale.cart_summary">
<xpath expr="//table[@id='cart_products']//td[hasclass('td-qty')]" position="inside">
<t t-call="website_sale_stock_available_display.stock_info"/>
</xpath>
</template>
</odoo>

View file

@ -0,0 +1,123 @@
================================
Website Snippet Carousel Product
================================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png
:target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html
:alt: License: LGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github
:target: https://github.com/OCA/e-commerce/tree/12.0/website_snippet_carousel_product
:alt: OCA/e-commerce
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/e-commerce-12-0/e-commerce-12-0-website_snippet_carousel_product
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/113/12.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
Adds a new snippet to insert a products carousel with a custom filter
(which is set through a technical domain).
**Table of contents**
.. contents::
:local:
Configuration
=============
#. Go to website (frontend)
#. Press 'Edit'
#. Select the snippet that you want configure
#. Press 'Customize' dropdown > Here You can see the implemented options for the widget:
* ``Set Domain`` > Sets a new domain to use (Example: [["field", "=", "value"]])
* ``Limit`` > Sets how many products will be fetched at maximum following default product order
* ``Show`` > Sets how many products can be shown per slide
Theming
~~~~~~~
This block uses 'native' bootstrap carousel and the ``website_sale.products_item`` qweb template
CSS Classes:
* ``.s_product_carousel`` > The section of the snippet
Usage
=====
#. Go to website (frontend)
#. Press 'Edit'
#. Drag & Drop the 'Products Carousel' block
#. Write the domain or leave it empty to show all published products
#. Save
Known issues / Roadmap
======================
Odoo doesn't load "pyjs" on the frontend by default. For this reason this
snippet only allows use javascript syntax to write the domain.
* Use/Implement a user-friendly domain selector
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/e-commerce/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
`feedback <https://github.com/OCA/e-commerce/issues/new?body=module:%20website_snippet_carousel_product%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Tecnativa
Contributors
~~~~~~~~~~~~
* `Tecnativa <https://www.tecnativa.com>`__:
* Alexandre D. Díaz
* Pedro M. Baeza
* Jairo Llopis
* David Vidal
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
.. |maintainer-Tardo| image:: https://github.com/Tardo.png?size=40px
:target: https://github.com/Tardo
:alt: Tardo
Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-Tardo|
This module is part of the `OCA/e-commerce <https://github.com/OCA/e-commerce/tree/12.0/website_snippet_carousel_product>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1,2 @@
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
from . import controllers

View file

@ -0,0 +1,15 @@
# Copyright 2020 Tecnativa - Alexandre D. Díaz
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
{
"name": "Website Snippet Carousel Product",
"version": "12.0.1.0.2",
"category": "Website",
"author": "Tecnativa, " "Odoo Community Association (OCA)",
"website": "https://github.com/OCA/e-commerce",
"license": "LGPL-3",
"summary": "Adds a new snippet to insert a carousel of products",
"depends": ["website_sale"],
"data": ["templates/assets.xml", "templates/snippet.xml"],
"installable": True,
"maintainers": ["Tardo"],
}

View file

@ -0,0 +1,2 @@
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
from . import website

View file

@ -0,0 +1,56 @@
# Copyright 2020 Tecnativa - Alexandre Díaz
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
import time
from odoo import http
from odoo.http import request
from odoo.addons.website_sale.controllers.main import WebsiteSale
from odoo.addons.website.controllers.main import QueryURL
class ProductCarouselWebsiteSale(WebsiteSale):
@http.route(
["/website/render_product_carousel"],
type="json",
auth="public",
website=True,
csrf=False,
cache=30,
)
def render_product_carousel(
self, domain=False, limit=12, products_per_slide=4, **kwargs
):
# Snippet options only allow a maximium of 24 records
limit = min(limit, 24)
_pricelist_context, pricelist = self._get_pricelist_context()
# Used this way to follow Odoo implementation
request.context = dict(
request.context,
pricelist=pricelist.id,
partner=request.env.user.partner_id)
records = request.env["product.template"].search(domain or [], limit=limit)
records_grouped = []
record_list = []
for index, record in enumerate(records, 1):
record_list.append(record)
if index % products_per_slide == 0:
records_grouped.append(record_list)
record_list = []
if any(record_list):
records_grouped.append(record_list)
template = "website_snippet_carousel_product.s_product_carousel_items"
return request.website.viewref(template).render(
{
"objects": records_grouped,
"keep": QueryURL("/shop"),
"pager": request.website.pager(
url="/shop", total=limit, scope=7, url_args=kwargs
),
"products_per_slide": products_per_slide,
"num_slides": len(records_grouped),
"uniqueId": "pc-%d" % int(time.time() * 1000),
}
)

View file

@ -0,0 +1,134 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_snippet_carousel_product
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2021-01-20 20:45+0000\n"
"Last-Translator: claudiagn <claudia.gargallo@qubiq.es>\n"
"Language-Team: none\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "10s"
msgstr "10s"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "12"
msgstr "12"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "1s"
msgstr "1s"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "24"
msgstr "24"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "2s"
msgstr "2s"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "3s"
msgstr "3s"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "5s"
msgstr "5s"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_items
msgid "<i class=\"fa fa-2x fa-chevron-left text-black-50\"/>\n"
" <span class=\"sr-only\">Previous</span>"
msgstr ""
"<i class=\"fa fa-2x fa-chevron-left text-black-50\"/>\n"
" <span class=\"sr-only\">Anterior</span>"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_items
msgid "<i class=\"fa fa-2x fa-chevron-right text-black-50\"/>\n"
" <span class=\"sr-only\">Next</span>"
msgstr ""
"<i class=\"fa fa-2x fa-chevron-right text-black-50\"/>\n"
" <span class=\"sr-only\">Següent</span>"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel
msgid "<i class=\"fa fa-circle-o-notch fa-spin fa-3x fa-fwg\"/>\n"
" <span>Loading Product Carousel</span>"
msgstr ""
"<i class=\"fa fa-circle-o-notch fa-spin fa-3x fa-fwg\"/>\n"
" <span>Carregant productes carrussel</span>"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "<i class=\"fa fa-fw fa-bars\"/> Set Domain"
msgstr "<i class=\"fa fa-fw fa-bars\"/> Establir domini"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "<i class=\"fa fa-fw fa-clock-o\"/>Slideshow Speed"
msgstr ""
"<i class=\"fa fa-fw fa-clock-o\"/>Velocitat de presentació d'iniciatives"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "<i class=\"fa fa-fw fa-list-ol\"/> Show"
msgstr "<i class=\"fa fa-fw fa-list-ol\"/> Mostrar"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "<i class=\"fa fa-fw fa-stop-circle-o\"/> Limit"
msgstr "<i class=\"fa fa-fw fa-stop-circle-o\"/> Limitar"
#. module: website_snippet_carousel_product
#. openerp-web
#: code:addons/website_snippet_carousel_product/static/src/js/snippet.options.js:14
#, python-format
msgid "Add a products carousel"
msgstr "Afegueix carrusel de productes"
#. module: website_snippet_carousel_product
#. openerp-web
#: code:addons/website_snippet_carousel_product/static/src/js/s_product_carousel_frontend.js:87
#, python-format
msgid "An error occured with this product carousel block. If the problem persists, please consider deleting it and adding a new one"
msgstr ""
"S'ha produït un error amb aquest bloc de carrusel de producte. Si el "
"problema continua, penseu en suprimir-lo i afegir-ne un de nou"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "Disable autoplay"
msgstr "Desactivar reproducció automàtica"
#. module: website_snippet_carousel_product
#. openerp-web
#: code:addons/website_snippet_carousel_product/static/src/js/snippet.options.js:107
#, python-format
msgid "Domain (can be empty)"
msgstr "Domini ( pot estar buit)"
#. module: website_snippet_carousel_product
#. openerp-web
#: code:addons/website_snippet_carousel_product/static/src/js/s_product_carousel_frontend.js:60
#, python-format
msgid "No products was found. Make sure you have products published on the website."
msgstr ""
"No s'ha trobat cap producte. Assegureu-vos que teniu productes publicats al "
"lloc web."

View file

@ -0,0 +1,134 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_snippet_carousel_product
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2020-11-03 13:08+0000\n"
"Last-Translator: claudiagn <claudia.gargallo@qubiq.es>\n"
"Language-Team: none\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.10\n"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "10s"
msgstr "10s"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "12"
msgstr "12"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "1s"
msgstr "1s"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "24"
msgstr "24"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "2s"
msgstr "2s"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "3s"
msgstr "3s"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "5s"
msgstr "5s"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_items
msgid "<i class=\"fa fa-2x fa-chevron-left text-black-50\"/>\n"
" <span class=\"sr-only\">Previous</span>"
msgstr ""
"<i class=\"fa fa-2x fa-chevron-left text-black-50\"/>\n"
" <span class=\"sr-only\">Previo</span>"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_items
msgid "<i class=\"fa fa-2x fa-chevron-right text-black-50\"/>\n"
" <span class=\"sr-only\">Next</span>"
msgstr ""
"<i class=\"fa fa-2x fa-chevron-right text-black-50\"/>\n"
" <span class=\"sr-only\">Siguiente</span>"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel
msgid "<i class=\"fa fa-circle-o-notch fa-spin fa-3x fa-fwg\"/>\n"
" <span>Loading Product Carousel</span>"
msgstr ""
"<i class=\"fa fa-circle-o-notch fa-spin fa-3x fa-fwg\"/>\n"
" <span>Cargando carrusel de productos</span>"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "<i class=\"fa fa-fw fa-bars\"/> Set Domain"
msgstr "<i class=\"fa fa-fw fa-bars\"/> Establecer dominio"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "<i class=\"fa fa-fw fa-clock-o\"/>Slideshow Speed"
msgstr ""
"<i class=\"fa fa-fw fa-clock-o\"/>Velocidad de presentación de diapositivas"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "<i class=\"fa fa-fw fa-list-ol\"/> Show"
msgstr "<i class=\"fa fa-fw fa-list-ol\"/> Mostrar"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "<i class=\"fa fa-fw fa-stop-circle-o\"/> Limit"
msgstr "<i class=\"fa fa-fw fa-stop-circle-o\"/> Limitar"
#. module: website_snippet_carousel_product
#. openerp-web
#: code:addons/website_snippet_carousel_product/static/src/js/snippet.options.js:14
#, python-format
msgid "Add a products carousel"
msgstr "Añadir un carrusel de productos"
#. module: website_snippet_carousel_product
#. openerp-web
#: code:addons/website_snippet_carousel_product/static/src/js/s_product_carousel_frontend.js:87
#, python-format
msgid "An error occured with this product carousel block. If the problem persists, please consider deleting it and adding a new one"
msgstr ""
"Se produjo un error con este bloque de carrusel de productos. Si el problema "
"persiste, considere eliminarlo y agregar uno nuevo"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "Disable autoplay"
msgstr "Desactivar la reproducción automática"
#. module: website_snippet_carousel_product
#. openerp-web
#: code:addons/website_snippet_carousel_product/static/src/js/snippet.options.js:107
#, python-format
msgid "Domain (can be empty)"
msgstr "Dominio (puede estar vacío)"
#. module: website_snippet_carousel_product
#. openerp-web
#: code:addons/website_snippet_carousel_product/static/src/js/s_product_carousel_frontend.js:60
#, python-format
msgid "No products was found. Make sure you have products published on the website."
msgstr ""
"No se encontraron productos. Asegúrese de tener productos publicados en el "
"sitio web."

View file

@ -0,0 +1,134 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_snippet_carousel_product
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2020-11-23 15:55+0000\n"
"Last-Translator: Yann Papouin <y.papouin@dec-industrie.com>\n"
"Language-Team: none\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 3.10\n"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "10s"
msgstr "10s"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "12"
msgstr "12"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "1s"
msgstr "1s"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "24"
msgstr "24"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "2s"
msgstr "2s"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "3s"
msgstr "3s"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "5s"
msgstr "5s"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_items
msgid "<i class=\"fa fa-2x fa-chevron-left text-black-50\"/>\n"
" <span class=\"sr-only\">Previous</span>"
msgstr ""
"<i class=\"fa fa-2x fa-chevron-left text-black-50\"/>\n"
" <span class=\"sr-only\">Précédent</span>"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_items
msgid "<i class=\"fa fa-2x fa-chevron-right text-black-50\"/>\n"
" <span class=\"sr-only\">Next</span>"
msgstr ""
"<i class=\"fa fa-2x fa-chevron-right text-black-50\"/>\n"
" <span class=\"sr-only\">Suivant</span>"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel
msgid "<i class=\"fa fa-circle-o-notch fa-spin fa-3x fa-fwg\"/>\n"
" <span>Loading Product Carousel</span>"
msgstr ""
"<i class=\"fa fa-circle-o-notch fa-spin fa-3x fa-fwg\"/>\n"
" <span>Chargement du carrousel d'articles</span>"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "<i class=\"fa fa-fw fa-bars\"/> Set Domain"
msgstr "<i class=\"fa fa-fw fa-bars\"/> Définir le domaine"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "<i class=\"fa fa-fw fa-clock-o\"/>Slideshow Speed"
msgstr "<i class=\"fa fa-fw fa-clock-o\"/>Vitesse du diaporama"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "<i class=\"fa fa-fw fa-list-ol\"/> Show"
msgstr "<i class=\"fa fa-fw fa-list-ol\"/> Afficher"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "<i class=\"fa fa-fw fa-stop-circle-o\"/> Limit"
msgstr "<i class=\"fa fa-fw fa-stop-circle-o\"/> Limite"
#. module: website_snippet_carousel_product
#. openerp-web
#: code:addons/website_snippet_carousel_product/static/src/js/snippet.options.js:14
#, python-format
msgid "Add a products carousel"
msgstr "Ajouter carrousel d'articles"
#. module: website_snippet_carousel_product
#. openerp-web
#: code:addons/website_snippet_carousel_product/static/src/js/s_product_carousel_frontend.js:87
#, python-format
msgid "An error occured with this product carousel block. If the problem persists, please consider deleting it and adding a new one"
msgstr ""
"Une erreur est survenue avec ce bloc carrousel d'articles. Si le problème "
"persiste, merci de considérer la suppression de ce bloc et l'ajout d'un "
"nouveau"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "Disable autoplay"
msgstr "Désactiver la lecture automatique"
#. module: website_snippet_carousel_product
#. openerp-web
#: code:addons/website_snippet_carousel_product/static/src/js/snippet.options.js:107
#, python-format
msgid "Domain (can be empty)"
msgstr "Domaine (peut rester vide)"
#. module: website_snippet_carousel_product
#. openerp-web
#: code:addons/website_snippet_carousel_product/static/src/js/s_product_carousel_frontend.js:60
#, python-format
msgid "No products was found. Make sure you have products published on the website."
msgstr ""
"Aucun article n'a été trouvé. Assurez-vous que vos articles sont publiés sur "
"le site Web."

View file

@ -0,0 +1,132 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_snippet_carousel_product
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2020-12-15 13:19+0000\n"
"Last-Translator: Bosd <c5e2fd43-d292-4c90-9d1f-74ff3436329a@anonaddy.me>\n"
"Language-Team: none\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "10s"
msgstr "10s"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "12"
msgstr "12"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "1s"
msgstr "1s"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "24"
msgstr "24"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "2s"
msgstr "2s"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "3s"
msgstr "3s"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "5s"
msgstr "5s"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_items
msgid "<i class=\"fa fa-2x fa-chevron-left text-black-50\"/>\n"
" <span class=\"sr-only\">Previous</span>"
msgstr ""
"<i class=\"fa fa-2x fa-chevron-left text-black-50\"/>\n"
" <span class=\"sr-only\">Vorige</span>"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_items
msgid "<i class=\"fa fa-2x fa-chevron-right text-black-50\"/>\n"
" <span class=\"sr-only\">Next</span>"
msgstr ""
"<i class=\"fa fa-2x fa-chevron-right text-black-50\"/>\n"
" <span class=\"sr-only\">Volgende</span>"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel
msgid "<i class=\"fa fa-circle-o-notch fa-spin fa-3x fa-fwg\"/>\n"
" <span>Loading Product Carousel</span>"
msgstr ""
"<i class=\"fa fa-circle-o-notch fa-spin fa-3x fa-fwg\"/>\n"
" <span> Product Carousel wordt geladen</span>"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
#, fuzzy
msgid "<i class=\"fa fa-fw fa-bars\"/> Set Domain"
msgstr "<i class=\"fa fa-fw fa-bars\"/> Set Domain"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "<i class=\"fa fa-fw fa-clock-o\"/>Slideshow Speed"
msgstr "<i class=\"fa fa-fw fa-clock-o\"/>Snelheid Diavoorstelling"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "<i class=\"fa fa-fw fa-list-ol\"/> Show"
msgstr "<i class=\"fa fa-fw fa-list-ol\"/> Weergeven"
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "<i class=\"fa fa-fw fa-stop-circle-o\"/> Limit"
msgstr "<i class=\"fa fa-fw fa-stop-circle-o\"/> Limiet"
#. module: website_snippet_carousel_product
#. openerp-web
#: code:addons/website_snippet_carousel_product/static/src/js/snippet.options.js:14
#, python-format
msgid "Add a products carousel"
msgstr "Voeg een product toe aan de caroussel"
#. module: website_snippet_carousel_product
#. openerp-web
#: code:addons/website_snippet_carousel_product/static/src/js/s_product_carousel_frontend.js:87
#, python-format
msgid "An error occured with this product carousel block. If the problem persists, please consider deleting it and adding a new one"
msgstr ""
#. module: website_snippet_carousel_product
#: model_terms:ir.ui.view,arch_db:website_snippet_carousel_product.s_product_carousel_options
msgid "Disable autoplay"
msgstr ""
#. module: website_snippet_carousel_product
#. openerp-web
#: code:addons/website_snippet_carousel_product/static/src/js/snippet.options.js:107
#, python-format
msgid "Domain (can be empty)"
msgstr ""
#. module: website_snippet_carousel_product
#. openerp-web
#: code:addons/website_snippet_carousel_product/static/src/js/s_product_carousel_frontend.js:60
#, python-format
msgid "No products was found. Make sure you have products published on the website."
msgstr ""
"Er is geen product gevonden. Zorg er voor dat er producten zijn gepubliseerd "
"op de website."

View file

@ -0,0 +1,15 @@
#. Go to website (frontend)
#. Press 'Edit'
#. Select the snippet that you want configure
#. Press 'Customize' dropdown > Here You can see the implemented options for the widget:
* ``Set Domain`` > Sets a new domain to use (Example: [["field", "=", "value"]])
* ``Limit`` > Sets how many products will be fetched at maximum following default product order
* ``Show`` > Sets how many products can be shown per slide
Theming
~~~~~~~
This block uses 'native' bootstrap carousel and the ``website_sale.products_item`` qweb template
CSS Classes:
* ``.s_product_carousel`` > The section of the snippet

View file

@ -0,0 +1,6 @@
* `Tecnativa <https://www.tecnativa.com>`__:
* Alexandre D. Díaz
* Pedro M. Baeza
* Jairo Llopis
* David Vidal

View file

@ -0,0 +1,2 @@
Adds a new snippet to insert a products carousel with a custom filter
(which is set through a technical domain).

View file

@ -0,0 +1,4 @@
Odoo doesn't load "pyjs" on the frontend by default. For this reason this
snippet only allows use javascript syntax to write the domain.
* Use/Implement a user-friendly domain selector

View file

@ -0,0 +1,5 @@
#. Go to website (frontend)
#. Press 'Edit'
#. Drag & Drop the 'Products Carousel' block
#. Write the domain or leave it empty to show all published products
#. Save

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

View file

@ -0,0 +1,476 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
<title>Website Snippet Carousel Product</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="website-snippet-carousel-product">
<h1 class="title">Website Snippet Carousel Product</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/lgpl-3.0-standalone.html"><img alt="License: LGPL-3" src="https://img.shields.io/badge/licence-LGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/e-commerce/tree/12.0/website_snippet_carousel_product"><img alt="OCA/e-commerce" src="https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/e-commerce-12-0/e-commerce-12-0-website_snippet_carousel_product"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/113/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>Adds a new snippet to insert a products carousel with a custom filter
(which is set through a technical domain).</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="id1">Configuration</a><ul>
<li><a class="reference internal" href="#theming" id="id2">Theming</a></li>
</ul>
</li>
<li><a class="reference internal" href="#usage" id="id3">Usage</a></li>
<li><a class="reference internal" href="#known-issues-roadmap" id="id4">Known issues / Roadmap</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id5">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id6">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id7">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id8">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id9">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#id1">Configuration</a></h1>
<ol class="arabic simple">
<li>Go to website (frontend)</li>
<li>Press Edit</li>
<li>Select the snippet that you want configure</li>
<li><dl class="first docutils">
<dt>Press Customize dropdown &gt; Here You can see the implemented options for the widget:</dt>
<dd><ul class="first last">
<li><tt class="docutils literal">Set Domain</tt> &gt; Sets a new domain to use (Example: [[“field”, “=”, “value”]])</li>
<li><tt class="docutils literal">Limit</tt> &gt; Sets how many products will be fetched at maximum following default product order</li>
<li><tt class="docutils literal">Show</tt> &gt; Sets how many products can be shown per slide</li>
</ul>
</dd>
</dl>
</li>
</ol>
<div class="section" id="theming">
<h2><a class="toc-backref" href="#id2">Theming</a></h2>
<p>This block uses native bootstrap carousel and the <tt class="docutils literal">website_sale.products_item</tt> qweb template</p>
<p>CSS Classes:
* <tt class="docutils literal">.s_product_carousel</tt> &gt; The section of the snippet</p>
</div>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id3">Usage</a></h1>
<ol class="arabic simple">
<li>Go to website (frontend)</li>
<li>Press Edit</li>
<li>Drag &amp; Drop the Products Carousel block</li>
<li>Write the domain or leave it empty to show all published products</li>
<li>Save</li>
</ol>
</div>
<div class="section" id="known-issues-roadmap">
<h1><a class="toc-backref" href="#id4">Known issues / Roadmap</a></h1>
<p>Odoo doesnt load “pyjs” on the frontend by default. For this reason this
snippet only allows use javascript syntax to write the domain.</p>
<ul class="simple">
<li>Use/Implement a user-friendly domain selector</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id5">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/e-commerce/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/e-commerce/issues/new?body=module:%20website_snippet_carousel_product%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id6">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id7">Authors</a></h2>
<ul class="simple">
<li>Tecnativa</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id8">Contributors</a></h2>
<ul class="simple">
<li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
<li>Alexandre D. Díaz</li>
<li>Pedro M. Baeza</li>
<li>Jairo Llopis</li>
<li>David Vidal</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id9">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainer</a>:</p>
<p><a class="reference external" href="https://github.com/Tardo"><img alt="Tardo" src="https://github.com/Tardo.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/e-commerce/tree/12.0/website_snippet_carousel_product">OCA/e-commerce</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,108 @@
// Copyright 2020 Tecnativa - Alexandre Díaz
// License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
odoo.define("website_snippet_carousel_product.s_product_carousel", function (require) {
"use strict";
var core = require("web.core");
var sAnimation = require("website.content.snippets.animation");
var _t = core._t;
sAnimation.registry.js_product_carousel = sAnimation.Class.extend({
selector: ".js_product_carousel",
/**
* @override
*/
start: function () {
var self = this;
var limit = Number(this.$target.attr("data-products-limit")) || 12;
var domain = this.$target.attr("data-domain") || "[]";
var products_per_slide =
Number(this.$target.attr("data-products-per-slide")) || 4;
var interval = Number(this.$target.attr("data-interval"));
if (_.isNaN(interval)) {
interval = 5000;
}
// Prevent user edition
this.$target.attr("contenteditable", "False");
// Loading Indicator
this.$target.html(
$("<div/>", {class: "text-center p-5 my-5 text-muted"})
.append($("<i/>", {
class: "fa fa-circle-o-notch fa-spin fa-3x fa-fwg mr-1"
}))
);
var def = this._rpc({
route: "/website/render_product_carousel",
params: {
limit: limit,
domain: JSON.parse(domain),
products_per_slide: products_per_slide,
},
})
.then(
function (object_html) {
var $object_html = $(object_html);
var count = $object_html
.find("input[name='product_count']")
.val();
if (!count) {
self.$target.append(
$("<div/>", {class: "col-md-6 offset-md-3"}).append(
$("<div/>", {
class:
"alert alert-warning" +
" alert-dismissible text-center",
text: _t(
"No products was found." +
" Make sure you have products" +
" published on the website."
),
})
)
);
return;
}
self.$target.html($object_html);
self.$target.find('.carousel').carousel({
interval: interval,
});
// Initialize 'animations' for the product card.
// This is necessary because the snippet is asynchonously
// rendered on the server.
self.trigger_up('animation_start_demand', {
$target: self.$target.find('.oe_website_sale'),
});
},
function () {
if (self.editableMode) {
self.$target.append(
$("<p/>", {
class: "text-danger",
text: _t(
"An error occured with this product" +
" carousel block. If the problem" +
" persists, please consider deleting" +
" it and adding a new one"
),
})
);
}
}
);
return $.when(this._super.apply(this, arguments), def);
},
/**
* @override
*/
destroy: function () {
this.$target.empty();
this._super.apply(this, arguments);
},
});
});

View file

@ -0,0 +1,144 @@
// Copyright 2020 Tecnativa - Alexandre Díaz
// License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
odoo.define("website_snippet_carousel_product.snippet_options", function (require) {
"use strict";
var core = require("web.core");
var options = require("web_editor.snippets.options");
var wUtils = require("website.utils");
var _t = core._t;
options.registry.js_product_carousel = options.Class.extend({
popup_template_id: "editor_new_product_carousel_domain",
popup_title: _t("Add a products carousel"),
/**
* @override
*/
_onLinkClick: function (ev) {
// Get the selected menu item
var $elm = $(ev.target);
if ($elm.is(".s_carousel_set_domain")) {
this.select_domain();
} else if ($elm.is("[data-products-per-slide]")) {
this.$target.attr(
"data-products-per-slide",
$elm.attr("data-products-per-slide")
);
this._refreshAnimations();
} else if ($elm.is("[data-products-limit]")) {
this.$target.attr(
"data-products-limit",
$elm.attr("data-products-limit")
);
this._refreshAnimations();
} else if ($elm.is("[data-interval]")) {
this.$target.attr(
"data-interval",
$elm.attr("data-interval")
);
this._refreshAnimations();
}
return this._super.apply(this, arguments);
},
/**
* @override
*/
onBuilt: function () {
this._super();
this.select_domain();
},
/**
* @override
*/
_setActive: function () {
var self = this;
this._super.apply(this, arguments);
// Active 'Limit' option
this.$el
.find("[data-products-limit]")
.addBack("[data-products-limit]")
.removeClass("active")
.filter(function () {
var limit = $(this).attr("data-products-limit");
var old_limit =
self.$target.attr("data-products-limit") || '12';
return old_limit === limit;
})
.addClass("active");
// Active 'Show' option
this.$el
.find("[data-products-per-slide]")
.addBack("[data-products-per-slide]")
.removeClass("active")
.filter(function () {
var pps = $(this).attr("data-products-per-slide");
var old_pps =
self.$target.attr("data-products-per-slide") || '4';
return old_pps === pps;
})
.addClass("active");
// Active 'Interval' option
this.$el
.find("[data-interval]")
.addBack("[data-interval]")
.removeClass("active")
.filter(function () {
var interval = $(this).attr("data-interval");
var old_interval =
self.$target.attr("data-interval") || '5000';
return old_interval === interval;
})
.addClass("active");
},
/**
* Open domain selector dialog
* @returns {Promise}
*/
select_domain: function () {
var self = this;
var def = wUtils.prompt({
id: this.popup_template_id,
window_title: this.popup_title,
input: _t("Domain (can be empty)"),
init: function () {
return self.$target.attr("data-domain");
},
});
return def.always(function (domain) {
var sdomain = domain || '';
self.$target.attr("data-domain", sdomain.replace(/'/g, '"'));
self._refreshAnimations();
// The change is made after the option selection, so we
// need send a new "option change" to make sure the new
// changes are saved.
self.__click = true;
self._select(false, self.$target);
self.$target.trigger('snippet-option-change', [self]);
});
},
/**
* @override
*/
cleanForSave: function () {
this._super.apply(this, arguments);
this.$target.empty();
},
/**
* @override
*/
interval: function (previewMode, value) {
this.$target.find('.carousel:first')
.carousel('dispose')
.carousel({
interval: Number(value),
});
},
});
});

View file

@ -0,0 +1,11 @@
// Copyright 2020 Tecnativa - Alexandre Díaz
// License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
.s_product_carousel {
.oe_product {
border-width: 0;
.oe_product_image, .oe_product_image img {
position: unset;
}
}
}

View file

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<template id="assets_frontend" inherit_id="website.assets_frontend">
<xpath expr="link[last()]" position="after">
<link
rel="stylesheet"
type="text/css"
href="/website_snippet_carousel_product/static/src/scss/s_product_carousel.scss"
/>
</xpath>
<xpath expr="script[last()]" position="after">
<script
type="text/javascript"
src="/website_snippet_carousel_product/static/src/js/s_product_carousel_frontend.js"
/>
</xpath>
</template>
<template id="assets_editor" inherit_id="web_editor.assets_editor">
<xpath expr="script[last()]" position="after">
<script
type="text/javascript"
src="/website_snippet_carousel_product/static/src/js/snippet.options.js"
/>
</xpath>
</template>
</odoo>

View file

@ -0,0 +1,196 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<!-- Modify Snippets Menu -->
<template
id="snippets"
inherit_id="website.snippets"
name="Snippet Products Carousel Panel Option"
>
<xpath
expr="//div[@id='snippet_feature']//div[hasclass('o_panel_body')]"
position="inside"
>
<t
t-snippet="website_snippet_carousel_product.s_product_carousel"
t-thumbnail="/website_snippet_carousel_product/static/description/icon.png"
/>
</xpath>
</template>
<!-- Snippet Carousel Product -->
<template id="s_product_carousel" name="Products Carousel">
<div class="oe_structure" />
<section class="s_product_carousel">
<div class="container">
<div class="js_product_carousel">
<div class='text-center'>
<i class='fa fa-circle-o-notch fa-spin fa-3x fa-fwg'></i>
<span>Loading Product Carousel</span>
</div>
</div>
</div>
</section>
</template>
<template id="s_product_carousel_items">
<div class="product_carousel_slider oe_website_sale">
<input
type="hidden"
name="product_count"
t-if="objects"
t-att-value="len(objects)"
/>
<div
t-att-id="uniqueId"
class="carousel slide d-flex"
data-ride="carousel"
>
<a
class="o_product_carousel_control carousel-control-prev position-relative"
t-att-href="'#' + uniqueId"
role="button"
data-slide="prev"
t-if='num_slides > 1'
>
<i class="fa fa-2x fa-chevron-left text-black-50" />
<span class="sr-only">Previous</span>
</a>
<div class="carousel-inner">
<t t-foreach="objects" t-as="products">
<div
t-attf-class="carousel-item #{'' if products_index else 'active'}"
>
<div class="row">
<t t-foreach="products" t-as="product">
<div t-attf-class="col-12 col-sm-6 col-md-#{int(12 / products_per_slide)}">
<div t-attf-class="oe_product #{' '.join(x.html_class for x in product.website_style_ids if x.html_class)}" >
<t t-call="website_sale.products_item"/>
</div>
</div>
</t>
</div>
</div>
</t>
</div>
<a
class="o_product_carousel_control carousel-control-next position-relative"
t-att-href="'#' + uniqueId"
role="button"
data-slide="next"
t-if='num_slides > 1'
>
<i class="fa fa-2x fa-chevron-right text-black-50" />
<span class="sr-only">Next</span>
</a>
</div>
</div>
</template>
<template id="s_product_carousel_options" inherit_id="website.snippet_options">
<xpath expr="." position="inside">
<div data-js="js_product_carousel" data-selector=".js_product_carousel">
<a href="#" class="dropdown-item s_carousel_set_domain"><i
class="fa fa-fw fa-bars"
/> Set Domain</a>
<div class="dropdown-submenu">
<a href="#" class="dropdown-item"><i
class="fa fa-fw fa-stop-circle-o"
/> Limit</a>
<div class="dropdown-menu" role="menu">
<a href="#" class="dropdown-item" data-products-limit="2">2</a>
<a
href="#"
role="menuitem"
class="dropdown-item"
data-products-limit="4"
>4</a>
<a href="#" class="dropdown-item" data-products-limit="8">8</a>
<a
href="#"
role="menuitem"
class="dropdown-item"
data-products-limit="12"
>12</a>
<a
href="#"
role="menuitem"
class="dropdown-item"
data-products-limit="24"
>24</a>
</div>
</div>
<div class="dropdown-submenu">
<a href="#" class="dropdown-item"><i
class="fa fa-fw fa-list-ol"
/> Show</a>
<div class="dropdown-menu" role="menu">
<a
href="#"
role="menuitem"
class="dropdown-item"
data-products-per-slide="2"
>2</a>
<a
href="#"
role="menuitem"
class="dropdown-item"
data-products-per-slide="3"
>3</a>
<a
href="#"
role="menuitem"
class="dropdown-item"
data-products-per-slide="4"
>4</a>
<a
href="#"
role="menuitem"
class="dropdown-item"
data-products-per-slide="6"
>6</a>
</div>
</div>
<div class="dropdown-submenu">
<a href="#" class="dropdown-item"><i
class="fa fa-fw fa-clock-o"
/>Slideshow Speed</a>
<div class="dropdown-menu" role="menu">
<a
href="#"
role="menuitem"
class="dropdown-item"
data-interval="1000"
>1s</a>
<a
href="#"
role="menuitem"
class="dropdown-item"
data-interval="2000"
>2s</a>
<a
href="#"
role="menuitem"
class="dropdown-item"
data-interval="3000"
>3s</a>
<a
href="#"
role="menuitem"
class="dropdown-item"
data-interval="5000"
>5s</a>
<a
href="#"
role="menuitem"
class="dropdown-item"
data-interval="10000"
>10s</a>
<a
href="#"
role="menuitem"
class="dropdown-item"
data-interval="0"
>Disable autoplay</a>
</div>
</div>
</div>
</xpath>
</template>
</odoo>

View file

@ -0,0 +1,136 @@
================================
Website Snippet Product Category
================================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png
:target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html
:alt: License: LGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github
:target: https://github.com/OCA/e-commerce/tree/12.0/website_snippet_product_category
:alt: OCA/e-commerce
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/e-commerce-12-0/e-commerce-12-0-website_snippet_product_category
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/113/12.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
Adds a new snippet to show e-commerce categories
**Table of contents**
.. contents::
:local:
Configuration
=============
You can select what categories can be shown by the snippet and an image for the category:
#. Go to website (backend) > Configuration > Products > eCommerce Categories
#. Create or Edit one
#. You can see two new options "Website Published" and "Category Image"
Usage
=====
#. Go to website (frontend)
#. Press 'Edit' button
#. Drag the 'Product Category' snippet to the place of the website that you want
#. Save changes
Theming
~~~~~~~
CSS Classes:
* ``.categ_container`` > The container per master category
* ``.categ_scroll_wrapper`` > The scrollable container wrapper
* ``.categ_scroll`` > The scrollable container
* ``.categ_tree_level`` > The category row (image + text)
* ``.main_tree_level`` > The first category row level displayed
* ``.categ_link`` > The link of the category row
* ``.categ_img`` > The container of the icon of the category row
You can use 'data-tree-level' attribute to select the category row of a selected
level (1-4 by design).
Also you can replace the entire template replacing the ``data-template`` attribute value
in the ``s_product_category_options`` view. You only need know that the name
of the variable that have all the categories is called ``object``.
Known issues / Roadmap
======================
* The snippet shows a maximum of 4 levels by design.
* Add a option to configure the initial level
* Add a option to select how many levels can be represented
* Handle large amounts of categories
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/e-commerce/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
`feedback <https://github.com/OCA/e-commerce/issues/new?body=module:%20website_snippet_product_category%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Tecnativa
Contributors
~~~~~~~~~~~~
* `Tecnativa <https://www.tecnativa.com>`__:
* Alexandre D. Díaz
* Pedro M. Baeza
Other credits
~~~~~~~~~~~~~
static/img/boxes_32.png - https://www.iconninja.com/box-mario-icon-30561
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
.. |maintainer-Tardo| image:: https://github.com/Tardo.png?size=40px
:target: https://github.com/Tardo
:alt: Tardo
Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-Tardo|
This module is part of the `OCA/e-commerce <https://github.com/OCA/e-commerce/tree/12.0/website_snippet_product_category>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1,2 @@
from . import controllers
from . import models

View file

@ -0,0 +1,23 @@
# Copyright 2020 Tecnativa - Alexandre Díaz
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
{
"name": "Website Snippet Product Category",
"category": "Website",
"summary": "Adds a new snippet to show e-commerce categories",
"version": "12.0.1.2.0",
"license": "LGPL-3",
"website": "https://github.com/OCA/e-commerce",
"author": "Tecnativa, Odoo Community Association (OCA)",
"depends": ["website_sale"],
"data": [
"templates/assets.xml",
"templates/snippets.xml",
"views/product_public_category.xml",
],
"demo": [
"demo/demo.xml",
"demo/pages.xml",
],
"maintainers": ["Tardo"],
"installable": True,
}

View file

@ -0,0 +1 @@
from . import website

View file

@ -0,0 +1,24 @@
# Copyright 2020 Tecnativa - Alexandre Díaz
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import http
from odoo.http import request
from odoo.addons.website.controllers.main import QueryURL
class Website(http.Controller):
@http.route(
["/website_sale/render_product_category"],
type="json",
auth="public",
website=True,
)
def render_product_category(self, template, **kwargs):
categories = request.env["product.public.category"].search(
[("parent_id", "=", False), ("website_published", "=", True)]
)
keep = QueryURL("/shop", category=0)
return request.website.viewref(template).render({
"object": categories,
"keep": keep
})

View file

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<record id="website_sale.Components" model="product.public.category">
<field name="website_published" eval="True"/>
</record>
<record id="website_sale.public_category_boxes" model="product.public.category">
<field name="website_published" eval="True"/>
<field name="image_small" type="base64" file="website_snippet_product_category/static/img/boxes_32.png" />
</record>
<record id="website_sale.public_category_desks" model="product.public.category">
<field name="website_published" eval="True"/>
</record>
<record id="website_sale.public_category_cabinets" model="product.public.category">
<field name="website_published" eval="True"/>
</record>
<record id="website_sale.public_category_bins" model="product.public.category">
<field name="website_published" eval="True"/>
</record>
<record id="website_sale.public_category_chairs" model="product.public.category">
<field name="website_published" eval="True"/>
</record>
<record id="website_sale.public_category_drawers" model="product.public.category">
<field name="website_published" eval="True"/>
</record>
<record id="website_sale.public_category_lamps" model="product.public.category">
<field name="website_published" eval="True"/>
</record>
<record id="website_sale.public_category_multimedia" model="product.public.category">
<field name="website_published" eval="True"/>
</record>
<record id="website_sale.services" model="product.public.category">
<field name="website_published" eval="True"/>
</record>
<record id="public_category_boxes_metal" model="product.public.category">
<field name="name">Metal Box</field>
<field name="parent_id" ref="website_sale.public_category_boxes"/>
<field name="website_published" eval="True"/>
</record>
<record id="public_category_boxes_wooden" model="product.public.category">
<field name="name">Wooden Box</field>
<field name="parent_id" ref="website_sale.public_category_boxes"/>
<field name="website_published" eval="True"/>
</record>
<record id="public_category_boxes_metal_spec_a" model="product.public.category">
<field name="name">Spec A</field>
<field name="parent_id" ref="public_category_boxes_metal"/>
<field name="website_published" eval="True"/>
</record>
<record id="public_category_boxes_metal_spec_b" model="product.public.category">
<field name="name">Spec B</field>
<field name="parent_id" ref="public_category_boxes_metal"/>
<field name="website_published" eval="True"/>
</record>
<record id="public_category_boxes_metal_subspec_b_a" model="product.public.category">
<field name="name">SubSpec B - A</field>
<field name="parent_id" ref="public_category_boxes_metal_spec_b"/>
<field name="website_published" eval="True"/>
</record>
</odoo>

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<template id="snippet_product_category_demo_view" name="Snippet Product Category Test">
<t t-call="website.layout">
<div id="wrap" class="oe_structure oe_empty">
<section class="s_product_category py-4">
<div class="js_product_category col-12" />
</section>
</div>
</t>
</template>
<record id="snippet_product_category_demo_page" model="website.page">
<field name="website_published">True</field>
<field name="url">/website_snippet_product_category.demo_page</field>
<field name="view_id" ref="snippet_product_category_demo_view" />
</record>
<record id="snippet_product_category_demo_page_link" model="website.menu">
<field name="name">Snippet Product Category Demo</field>
<field name="url">/website_snippet_product_category.demo_page</field>
<field name="parent_id" ref="website.main_menu" />
<field name="sequence" type="int">50</field>
<field name="page_id" ref="snippet_product_category_demo_page" />
</record>
</odoo>

View file

@ -0,0 +1,69 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_snippet_product_category
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2021-01-20 20:45+0000\n"
"Last-Translator: claudiagn <claudia.gargallo@qubiq.es>\n"
"Language-Team: none\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: website_snippet_product_category
#. openerp-web
#: code:addons/website_snippet_product_category/static/src/js/frontend.js:64
#, python-format
msgid "An error occured with this product categories block. If the problem persists, please consider deleting it and adding a new one"
msgstr ""
"S'ha produït un error amb aquest bloc de categories de productes. Si el "
"problema continua, penseu en suprimir-lo i afegir-ne un de nou"
#. module: website_snippet_product_category
#: model:product.public.category,name:website_snippet_product_category.public_category_boxes_metal
msgid "Metal Box"
msgstr "Caixa de metall"
#. module: website_snippet_product_category
#. openerp-web
#: code:addons/website_snippet_product_category/static/src/js/frontend.js:46
#, python-format
msgid "No categories were found. Make sure you have categories defined."
msgstr ""
"No s'han trobat categories. Assegureu-vos que teniu categories definides."
#. module: website_snippet_product_category
#: model:website.menu,name:website_snippet_product_category.snippet_product_category_demo_page_link
msgid "Snippet Product Category Demo"
msgstr "Demostració de la categoria de producte del fragment"
#. module: website_snippet_product_category
#: model:product.public.category,name:website_snippet_product_category.public_category_boxes_metal_spec_a
msgid "Spec A"
msgstr "Especificació A"
#. module: website_snippet_product_category
#: model:product.public.category,name:website_snippet_product_category.public_category_boxes_metal_spec_b
msgid "Spec B"
msgstr "Especificació B"
#. module: website_snippet_product_category
#: model:product.public.category,name:website_snippet_product_category.public_category_boxes_metal_subspec_b_a
msgid "SubSpec B - A"
msgstr "Subespecificació B-A"
#. module: website_snippet_product_category
#: model:ir.model,name:website_snippet_product_category.model_product_public_category
msgid "Website Product Category"
msgstr "Categoria de producte del lloc web"
#. module: website_snippet_product_category
#: model:product.public.category,name:website_snippet_product_category.public_category_boxes_wooden
msgid "Wooden Box"
msgstr "Caixa de fusta"

View file

@ -0,0 +1,68 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_snippet_product_category
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2020-11-03 13:08+0000\n"
"Last-Translator: claudiagn <claudia.gargallo@qubiq.es>\n"
"Language-Team: none\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.10\n"
#. module: website_snippet_product_category
#. openerp-web
#: code:addons/website_snippet_product_category/static/src/js/frontend.js:64
#, python-format
msgid "An error occured with this product categories block. If the problem persists, please consider deleting it and adding a new one"
msgstr ""
"Ocurrió un error con este bloque de categorías de productos. Si el problema "
"persiste, considere eliminarlo y agregar uno nuevo"
#. module: website_snippet_product_category
#: model:product.public.category,name:website_snippet_product_category.public_category_boxes_metal
msgid "Metal Box"
msgstr "Caja de metal"
#. module: website_snippet_product_category
#. openerp-web
#: code:addons/website_snippet_product_category/static/src/js/frontend.js:46
#, python-format
msgid "No categories were found. Make sure you have categories defined."
msgstr "No se encontraron categorías. Asegúrese de tener categorías definidas."
#. module: website_snippet_product_category
#: model:website.menu,name:website_snippet_product_category.snippet_product_category_demo_page_link
msgid "Snippet Product Category Demo"
msgstr "Demostración de categoría de producto de fragmento"
#. module: website_snippet_product_category
#: model:product.public.category,name:website_snippet_product_category.public_category_boxes_metal_spec_a
msgid "Spec A"
msgstr "Spec A"
#. module: website_snippet_product_category
#: model:product.public.category,name:website_snippet_product_category.public_category_boxes_metal_spec_b
msgid "Spec B"
msgstr "Spec B"
#. module: website_snippet_product_category
#: model:product.public.category,name:website_snippet_product_category.public_category_boxes_metal_subspec_b_a
msgid "SubSpec B - A"
msgstr "SubSpec B - A"
#. module: website_snippet_product_category
#: model:ir.model,name:website_snippet_product_category.model_product_public_category
msgid "Website Product Category"
msgstr "Categoría de producto para la página web"
#. module: website_snippet_product_category
#: model:product.public.category,name:website_snippet_product_category.public_category_boxes_wooden
msgid "Wooden Box"
msgstr "Caja de madera"

View file

@ -0,0 +1,70 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_snippet_product_category
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2020-11-23 15:55+0000\n"
"Last-Translator: Yann Papouin <y.papouin@dec-industrie.com>\n"
"Language-Team: none\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 3.10\n"
#. module: website_snippet_product_category
#. openerp-web
#: code:addons/website_snippet_product_category/static/src/js/frontend.js:64
#, python-format
msgid "An error occured with this product categories block. If the problem persists, please consider deleting it and adding a new one"
msgstr ""
"Une erreur est survenue avec ce bloc de catégories d'articles. Si le "
"problème persiste, merci de considérer la suppression de ce bloc et l'ajout "
"d'un nouveau"
#. module: website_snippet_product_category
#: model:product.public.category,name:website_snippet_product_category.public_category_boxes_metal
msgid "Metal Box"
msgstr "Boite en métal"
#. module: website_snippet_product_category
#. openerp-web
#: code:addons/website_snippet_product_category/static/src/js/frontend.js:46
#, python-format
msgid "No categories were found. Make sure you have categories defined."
msgstr ""
"Aucune catégorie n'a été trouvée. Assurez-vous d'avoir défini des catégories."
#. module: website_snippet_product_category
#: model:website.menu,name:website_snippet_product_category.snippet_product_category_demo_page_link
msgid "Snippet Product Category Demo"
msgstr "Démonstration du bloc catégorie d'articles"
#. module: website_snippet_product_category
#: model:product.public.category,name:website_snippet_product_category.public_category_boxes_metal_spec_a
msgid "Spec A"
msgstr "Type A"
#. module: website_snippet_product_category
#: model:product.public.category,name:website_snippet_product_category.public_category_boxes_metal_spec_b
msgid "Spec B"
msgstr "Type B"
#. module: website_snippet_product_category
#: model:product.public.category,name:website_snippet_product_category.public_category_boxes_metal_subspec_b_a
msgid "SubSpec B - A"
msgstr "Sous-type B-A"
#. module: website_snippet_product_category
#: model:ir.model,name:website_snippet_product_category.model_product_public_category
msgid "Website Product Category"
msgstr "Catégorie d'articles du site Web"
#. module: website_snippet_product_category
#: model:product.public.category,name:website_snippet_product_category.public_category_boxes_wooden
msgid "Wooden Box"
msgstr "Boite en bois"

View file

@ -0,0 +1,68 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_snippet_product_category
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2020-12-15 13:19+0000\n"
"Last-Translator: Bosd <c5e2fd43-d292-4c90-9d1f-74ff3436329a@anonaddy.me>\n"
"Language-Team: none\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: website_snippet_product_category
#. openerp-web
#: code:addons/website_snippet_product_category/static/src/js/frontend.js:64
#, python-format
msgid "An error occured with this product categories block. If the problem persists, please consider deleting it and adding a new one"
msgstr ""
#. module: website_snippet_product_category
#: model:product.public.category,name:website_snippet_product_category.public_category_boxes_metal
msgid "Metal Box"
msgstr ""
#. module: website_snippet_product_category
#. openerp-web
#: code:addons/website_snippet_product_category/static/src/js/frontend.js:46
#, python-format
msgid "No categories were found. Make sure you have categories defined."
msgstr ""
"Er zijn geen categorieen gevonden. Zorg er voor dat er categorieen zijn "
"aangemaakt."
#. module: website_snippet_product_category
#: model:website.menu,name:website_snippet_product_category.snippet_product_category_demo_page_link
msgid "Snippet Product Category Demo"
msgstr ""
#. module: website_snippet_product_category
#: model:product.public.category,name:website_snippet_product_category.public_category_boxes_metal_spec_a
msgid "Spec A"
msgstr ""
#. module: website_snippet_product_category
#: model:product.public.category,name:website_snippet_product_category.public_category_boxes_metal_spec_b
msgid "Spec B"
msgstr ""
#. module: website_snippet_product_category
#: model:product.public.category,name:website_snippet_product_category.public_category_boxes_metal_subspec_b_a
msgid "SubSpec B - A"
msgstr ""
#. module: website_snippet_product_category
#: model:ir.model,name:website_snippet_product_category.model_product_public_category
msgid "Website Product Category"
msgstr "Website Product Categorie"
#. module: website_snippet_product_category
#: model:product.public.category,name:website_snippet_product_category.public_category_boxes_wooden
msgid "Wooden Box"
msgstr ""

View file

@ -0,0 +1,2 @@
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
from . import product_public_category

View file

@ -0,0 +1,8 @@
# Copyright 2020 Tecnativa - Alexandre Díaz
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models
class ProductPublicCategory(models.Model):
_inherit = ["product.public.category", "website.published.mixin"]
_name = "product.public.category"

View file

@ -0,0 +1,5 @@
You can select what categories can be shown by the snippet and an image for the category:
#. Go to website (backend) > Configuration > Products > eCommerce Categories
#. Create or Edit one
#. You can see two new options "Website Published" and "Category Image"

View file

@ -0,0 +1,4 @@
* `Tecnativa <https://www.tecnativa.com>`__:
* Alexandre D. Díaz
* Pedro M. Baeza

View file

@ -0,0 +1 @@
static/img/boxes_32.png - https://www.iconninja.com/box-mario-icon-30561

View file

@ -0,0 +1 @@
Adds a new snippet to show e-commerce categories

View file

@ -0,0 +1,4 @@
* The snippet shows a maximum of 4 levels by design.
* Add a option to configure the initial level
* Add a option to select how many levels can be represented
* Handle large amounts of categories

View file

@ -0,0 +1,26 @@
#. Go to website (frontend)
#. Press 'Edit' button
#. Drag the 'Product Category' snippet to the place of the website that you want
#. Save changes
Theming
~~~~~~~
CSS Classes:
* ``.categ_container`` > The container per master category
* ``.categ_scroll_wrapper`` > The scrollable container wrapper
* ``.categ_scroll`` > The scrollable container
* ``.categ_tree_level`` > The category row (image + text)
* ``.main_tree_level`` > The first category row level displayed
* ``.categ_link`` > The link of the category row
* ``.categ_img`` > The container of the icon of the category row
You can use 'data-tree-level' attribute to select the category row of a selected
level (1-4 by design).
Also you can replace the entire template replacing the ``data-template`` attribute value
in the ``s_product_category_options`` view. You only need know that the name
of the variable that have all the categories is called ``object``.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,481 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
<title>Website Snippet Product Category</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: grey; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="website-snippet-product-category">
<h1 class="title">Website Snippet Product Category</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/lgpl-3.0-standalone.html"><img alt="License: LGPL-3" src="https://img.shields.io/badge/licence-LGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/e-commerce/tree/12.0/website_snippet_product_category"><img alt="OCA/e-commerce" src="https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/e-commerce-12-0/e-commerce-12-0-website_snippet_product_category"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/113/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>Adds a new snippet to show e-commerce categories</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="id1">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="id2">Usage</a><ul>
<li><a class="reference internal" href="#theming" id="id3">Theming</a></li>
</ul>
</li>
<li><a class="reference internal" href="#known-issues-roadmap" id="id4">Known issues / Roadmap</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id5">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id6">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id7">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id8">Contributors</a></li>
<li><a class="reference internal" href="#other-credits" id="id9">Other credits</a></li>
<li><a class="reference internal" href="#maintainers" id="id10">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#id1">Configuration</a></h1>
<p>You can select what categories can be shown by the snippet and an image for the category:</p>
<ol class="arabic simple">
<li>Go to website (backend) &gt; Configuration &gt; Products &gt; eCommerce Categories</li>
<li>Create or Edit one</li>
<li>You can see two new options “Website Published” and “Category Image”</li>
</ol>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id2">Usage</a></h1>
<ol class="arabic simple">
<li>Go to website (frontend)</li>
<li>Press Edit button</li>
<li>Drag the Product Category snippet to the place of the website that you want</li>
<li>Save changes</li>
</ol>
<div class="section" id="theming">
<h2><a class="toc-backref" href="#id3">Theming</a></h2>
<p>CSS Classes:</p>
<ul class="simple">
<li><tt class="docutils literal">.categ_container</tt> &gt; The container per master category</li>
<li><tt class="docutils literal">.categ_scroll_wrapper</tt> &gt; The scrollable container wrapper</li>
<li><tt class="docutils literal">.categ_scroll</tt> &gt; The scrollable container</li>
<li><tt class="docutils literal">.categ_tree_level</tt> &gt; The category row (image + text)</li>
<li><tt class="docutils literal">.main_tree_level</tt> &gt; The first category row level displayed</li>
<li><tt class="docutils literal">.categ_link</tt> &gt; The link of the category row</li>
<li><tt class="docutils literal">.categ_img</tt> &gt; The container of the icon of the category row</li>
</ul>
<p>You can use data-tree-level attribute to select the category row of a selected
level (1-4 by design).</p>
<p>Also you can replace the entire template replacing the <tt class="docutils literal"><span class="pre">data-template</span></tt> attribute value
in the <tt class="docutils literal">s_product_category_options</tt> view. You only need know that the name
of the variable that have all the categories is called <tt class="docutils literal">object</tt>.</p>
</div>
</div>
<div class="section" id="known-issues-roadmap">
<h1><a class="toc-backref" href="#id4">Known issues / Roadmap</a></h1>
<ul class="simple">
<li>The snippet shows a maximum of 4 levels by design.</li>
<li>Add a option to configure the initial level</li>
<li>Add a option to select how many levels can be represented</li>
<li>Handle large amounts of categories</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id5">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/e-commerce/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/e-commerce/issues/new?body=module:%20website_snippet_product_category%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id6">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id7">Authors</a></h2>
<ul class="simple">
<li>Tecnativa</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id8">Contributors</a></h2>
<ul class="simple">
<li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
<li>Alexandre D. Díaz</li>
<li>Pedro M. Baeza</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="other-credits">
<h2><a class="toc-backref" href="#id9">Other credits</a></h2>
<p>static/img/boxes_32.png - <a class="reference external" href="https://www.iconninja.com/box-mario-icon-30561">https://www.iconninja.com/box-mario-icon-30561</a></p>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id10">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainer</a>:</p>
<p><a class="reference external" href="https://github.com/Tardo"><img alt="Tardo" src="https://github.com/Tardo.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/e-commerce/tree/12.0/website_snippet_product_category">OCA/e-commerce</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 697 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 372 B

View file

@ -0,0 +1,86 @@
// Copyright 2020 Tecnativa - Alexandre Díaz
// License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
odoo.define("website_snippet_product_category.s_product_category", function (require) {
"use strict";
var core = require("web.core");
var sAnimation = require("website.content.snippets.animation");
var _t = core._t;
sAnimation.registry.js_product_category = sAnimation.Class.extend({
selector: ".js_product_category",
/**
* Asynchronous server side template rendering
* @override
*/
start: function () {
var self = this;
var template =
this.$target.data("template") ||
"website_snippet_product_category.s_product_category_items";
// Prevent user edition
this.$target.attr("contenteditable", "False");
var def = this._rpc({
route: "/website_sale/render_product_category",
params: {
template: template,
},
})
.then(
function (object_html) {
var $object_html = $(object_html);
var count = $object_html
.find("input[name='object_count']")
.val();
if (!count) {
self.$target.append(
$("<div/>").append(
$("<div/>", {
class:
"alert alert-warning" +
" alert-dismissible text-center",
text: _t(
"No categories were found. Make" +
" sure you have categories" +
" defined."
),
})
)
);
return;
}
self.$target.html($object_html);
},
function () {
if (self.editableMode) {
self.$target.append(
$("<p/>", {
class: "text-danger",
text: _t(
"An error occured with this product" +
" categories block. If the problem" +
" persists, please consider deleting" +
" it and adding a new one"
),
})
);
}
}
);
return $.when(this._super.apply(this, arguments), def);
},
/**
* @override
*/
destroy: function () {
this.$target.empty();
this._super.apply(this, arguments);
},
});
});

View file

@ -0,0 +1,17 @@
// Copyright 2020 Tecnativa - Alexandre Díaz
// License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
odoo.define("website_snippet_carousel_product.snippet_options", function (require) {
"use strict";
var options = require("web_editor.snippets.options");
options.registry.js_product_category = options.Class.extend({
/**
* @override
*/
cleanForSave: function () {
this._super.apply(this, arguments);
this.$target.empty();
}
});
});

View file

@ -0,0 +1,37 @@
.categ_container {
.categ_scroll_wrapper {
border: 0 solid $border-color;
border-width: 0 1px 0 0;
}
.categ_scroll {
overflow: hidden;
overflow-y: auto;
}
.categ_img img {
width: 1.4em;
}
.categ_tree_level {
&[data-tree-level="2"] {
font-size: 0.9em;
.categ_link {
text-transform: capitalize;
color: $gray-800;
}
}
&[data-tree-level="3"] {
font-size: 0.8em;
.categ_link {
text-transform: capitalize;
color: $gray-700;
}
}
&[data-tree-level="4"] {
font-size: 0.7em;
.categ_link {
text-transform: lowercase;
color: $gray-600;
}
}
}
}

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<template id="assets_frontend" inherit_id="website.assets_frontend">
<xpath expr="link[last()]" position="after">
<link
rel="stylesheet"
type="text/css"
href="/website_snippet_product_category/static/src/scss/snippet.scss"
/>
</xpath>
<xpath expr="." position="inside">
<script
type="text/javascript"
src="/website_snippet_product_category/static/src/js/frontend.js"
/>
</xpath>
</template>
<template id="assets_editor" inherit_id="web_editor.assets_editor">
<xpath expr="script[last()]" position="after">
<script
type="text/javascript"
src="/website_snippet_product_category/static/src/js/snippet.options.js"
/>
</xpath>
</template>
</odoo>

View file

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<template id="snippets" inherit_id="website.snippets">
<xpath
expr="//div[@id='snippet_feature']//div[hasclass('o_panel_body')]"
position="inside"
>
<t
t-snippet="website_snippet_product_category.s_product_category"
t-thumbnail="/website_snippet_product_category/static/src/img/s_product_category.png"
/>
</xpath>
</template>
<!-- Snippet Product Category -->
<template id="s_product_category" name="Product Category">
<section class="s_product_category py-4">
<div class="js_product_category col-12" />
</section>
</template>
<template id="s_product_category_items_recursive">
<t
t-foreach="categories.filtered('website_published')"
t-as="category"
t-if="categories and cur_level &lt;= 4"
>
<div
t-attf-class="categ_tree_level {{'pb-2 main_tree_level text-primary text-uppercase' if cur_level == 1 else ''}} {{cur_level &gt; 2 and 'pl-'+str(min((cur_level-2)*2, 5))}}"
t-att-data-tree-level="cur_level"
>
<div class="d-flex d-flex-row">
<div
t-if="category.image_small"
t-field="category.image_small"
class="categ_img pr-1"
t-options="{'widget': 'image','resize': '24x24' }"
/>
<a
t-att-href="keep('/shop/category/' + slug(category), category=0)"
class="categ_link w-100"
t-field="category.name"
t-att-title="category.name"
/>
</div>
</div>
<t
t-call="website_snippet_product_category.s_product_category_items_recursive"
>
<t t-set="categories" t-value="category.child_id" />
<t t-set="cur_level" t-value="cur_level+1" />
</t>
</t>
</template>
<template id="s_product_category_items">
<div class="container o_not_editable">
<div class="row">
<input
type="hidden"
name="object_count"
t-if="object"
t-att-value="len(object)"
/>
<div t-foreach="object" t-as="categories" class="p-2 col-12 col-md-3 col-lg-2 categ_container">
<div class="categ_scroll_wrapper px-2 h-100">
<div class="categ_scroll">
<t
t-call="website_snippet_product_category.s_product_category_items_recursive"
>
<t t-set="cur_level" t-value="1" />
</t>
</div>
</div>
</div>
</div>
</div>
</template>
<template id="s_product_category_options" inherit_id="website.snippet_options">
<xpath expr="." position="inside">
<div
data-js="js_product_category"
data-selector=".js_product_category"
data-template="website_snippet_product_category.s_product_category_items"
/>
</xpath>
</template>
</odoo>

View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<data>
<record id="product_public_category_form_view" model="ir.ui.view">
<field name="name">public.category.form</field>
<field name="model">product.public.category</field>
<field
name="inherit_id"
ref="website_sale.product_public_category_form_view"
/>
<field name="arch" type="xml">
<field name="image_medium" position="before">
<div class="oe_button_box" name="button_box">
<button class="oe_stat_button" name="website_publish_button" type="object" icon="fa-globe">
<field name="website_published" widget="website_button"/>
</button>
</div>
</field>
</field>
</record>
</data>
</odoo>