[ADD] website_variant_values_visibility

This commit is contained in:
Niels Göttsch 2026-05-26 11:22:13 +02:00 committed by madmooose
parent 4b9796521e
commit 8c3e607077
16 changed files with 694 additions and 0 deletions

View file

@ -0,0 +1,73 @@
.. image:: https://odoo-community.org/readme-banner-image
:target: https://odoo-community.org/get-involved?utm_source=readme
:alt: Odoo Community Association
=================================
Website Variant Values Visibility
=================================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:3b6aaf2b68e397b27d94f5bb02aabb23fd19e14682b50bac025280482e939614
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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/license-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-madmooose%2Fodooapps-lightgray.png?logo=github
:target: https://github.com/madmooose/odooapps/tree/16.0/website_variant_values_visibility
:alt: madmooose/odooapps
|badge1| |badge2| |badge3|
This module allows control over the visibility of product variant values
in the e-commerce website.
**Table of contents**
.. contents::
:local:
Changelog
=========
- 16.0.1.0.0: Adds visibility control for variant values in e-commerce.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/madmooose/odooapps/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/madmooose/odooapps/issues/new?body=module:%20website_variant_values_visibility%0Aversion:%2016.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
-------
* IFE Gesellschaft für Forschung und Entwicklung
* Niels Göttsch
Contributors
------------
- René Greßmann
- Hiren Lakhani
- Niels Göttsch
Maintainers
-----------
This module is part of the `madmooose/odooapps <https://github.com/madmooose/odooapps/tree/16.0/website_variant_values_visibility>`_ project on GitHub.
You are welcome to contribute.

View file

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

View file

@ -0,0 +1,16 @@
{
"name": "Website Variant Values Visibility",
"version": "16.0.1.0.0",
"category": "Product",
"summary": "Adds visibility control for variant values in e-commerce",
"author": "IFE Gesellschaft für Forschung und Entwicklung, Niels Göttsch",
"website": "https://ziemlichoptimal.de",
"depends": ["product", "website_sale"],
"data": [
"views/product_attribute_value_views.xml",
"views/variant_template.xml",
],
"installable": True,
"auto_install": False,
"license": "LGPL-3",
}

View file

@ -0,0 +1,31 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * website_variant_values_visibility
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e-20240411\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-06-12 05:27+0000\n"
"PO-Revision-Date: 2024-06-12 05:27+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: website_variant_values_visibility
#: model:ir.model,name:website_variant_values_visibility.model_product_attribute_value
msgid "Attribute Value"
msgstr "Attributwert"
#. module: website_variant_values_visibility
#: model:ir.model.fields,help:website_variant_values_visibility.field_product_attribute_value__visible_in_ecommerce
msgid "Determines if the variant value is visible in the e-commerce."
msgstr "Ermittelt, ob der Variantenwert im E-Commerce sichtbar ist."
#. module: website_variant_values_visibility
#: model:ir.model.fields,field_description:website_variant_values_visibility.field_product_attribute_value__visible_in_ecommerce
msgid "Visible in e-commerce"
msgstr "Sichtbar in E-Commerce"

View file

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

View file

@ -0,0 +1,16 @@
from odoo import fields, models
class ProductAttributeValue(models.Model):
"""
This class extends the functionality of product attribute values in Odoo.
It adds a boolean field to determine if the variant value is visible in e-commerce.
"""
_inherit = "product.attribute.value"
visible_in_ecommerce = fields.Boolean(
string="Visible in e-commerce",
default=True,
help="Determines if the variant value is visible in the e-commerce.",
)

View file

@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"

View file

@ -0,0 +1,4 @@
- René Greßmann
- Hiren Lakhani
- Niels Göttsch

View file

@ -0,0 +1,2 @@
This module allows control over the visibility of product variant values in the e-commerce website.

View file

@ -0,0 +1 @@
- 16.0.1.0.0: Adds visibility control for variant values in e-commerce.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

View file

@ -0,0 +1,433 @@
<!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: https://docutils.sourceforge.io/" />
<title>README.rst</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/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: gray; } /* 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, pre.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">
<a class="reference external image-reference" href="https://odoo-community.org/get-involved?utm_source=readme">
<img alt="Odoo Community Association" src="https://odoo-community.org/readme-banner-image" />
</a>
<div class="section" id="website-variant-values-visibility">
<h1>Website Variant Values Visibility</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:3b6aaf2b68e397b27d94f5bb02aabb23fd19e14682b50bac025280482e939614
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" 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 image-reference" href="http://www.gnu.org/licenses/lgpl-3.0-standalone.html"><img alt="License: LGPL-3" src="https://img.shields.io/badge/license-LGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/madmooose/odooapps/tree/16.0/website_variant_values_visibility"><img alt="madmooose/odooapps" src="https://img.shields.io/badge/github-madmooose%2Fodooapps-lightgray.png?logo=github" /></a></p>
<p>This module allows control over the visibility of product variant values
in the e-commerce website.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#changelog" id="toc-entry-1">Changelog</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="changelog">
<h2><a class="toc-backref" href="#toc-entry-1">Changelog</a></h2>
<ul class="simple">
<li>16.0.1.0.0: Adds visibility control for variant values in e-commerce.</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h2><a class="toc-backref" href="#toc-entry-2">Bug Tracker</a></h2>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/madmooose/odooapps/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 to smash it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/madmooose/odooapps/issues/new?body=module:%20website_variant_values_visibility%0Aversion:%2016.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">
<h2><a class="toc-backref" href="#toc-entry-3">Credits</a></h2>
<div class="section" id="authors">
<h3><a class="toc-backref" href="#toc-entry-4">Authors</a></h3>
<ul class="simple">
<li>IFE Gesellschaft für Forschung und Entwicklung</li>
<li>Niels Göttsch</li>
</ul>
</div>
<div class="section" id="contributors">
<h3><a class="toc-backref" href="#toc-entry-5">Contributors</a></h3>
<ul class="simple">
<li>René Greßmann</li>
<li>Hiren Lakhani</li>
<li>Niels Göttsch</li>
</ul>
</div>
<div class="section" id="maintainers">
<h3><a class="toc-backref" href="#toc-entry-6">Maintainers</a></h3>
<p>This module is part of the <a class="reference external" href="https://github.com/madmooose/odooapps/tree/16.0/website_variant_values_visibility">madmooose/odooapps</a> project on GitHub.</p>
<p>You are welcome to contribute.</p>
</div>
</div>
</div>
</div>
</body>
</html>

View file

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

View file

@ -0,0 +1,43 @@
from odoo.tests import TransactionCase
class TestProductAttributeValue(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.env = cls.env(context={**cls.env.context, "tracking_disable": True})
cls.attribute = cls.env["product.attribute"].create({"name": "Color"})
cls.value_red = cls.env["product.attribute.value"].create(
{"name": "Red", "attribute_id": cls.attribute.id}
)
cls.value_blue = cls.env["product.attribute.value"].create(
{"name": "Blue", "attribute_id": cls.attribute.id}
)
# --- visible_in_ecommerce field ---
def test_default_is_true(self):
value = self.env["product.attribute.value"].create(
{"name": "Green", "attribute_id": self.attribute.id}
)
self.assertTrue(value.visible_in_ecommerce)
def test_can_be_set_false_on_create(self):
value = self.env["product.attribute.value"].create(
{
"name": "Yellow",
"attribute_id": self.attribute.id,
"visible_in_ecommerce": False,
}
)
self.assertFalse(value.visible_in_ecommerce)
def test_write_false(self):
self.value_red.write({"visible_in_ecommerce": False})
self.assertFalse(self.value_red.visible_in_ecommerce)
def test_write_toggle(self):
self.value_red.write({"visible_in_ecommerce": False})
self.assertFalse(self.value_red.visible_in_ecommerce)
self.value_red.write({"visible_in_ecommerce": True})
self.assertTrue(self.value_red.visible_in_ecommerce)

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- This XML record extends the product attribute form view to include the 'visible_in_ecommerce' field -->
<record id="view_product_attribute_value_form" model="ir.ui.view">
<field name="name">product.attribute.form</field>
<field name="model">product.attribute</field>
<field name="inherit_id" ref="product.product_attribute_view_form" />
<field name="arch" type="xml">
<xpath expr="//field[@name='is_custom']" position="after">
<field name="visible_in_ecommerce" />
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<template id="products_attributes" inherit_id="website_sale.products_attributes">
<xpath expr="//t[@t-foreach='attributes']/div" position="attributes">
<attribute
name="t-if"
>a.value_ids.filtered(lambda v: v.visible_in_ecommerce) and len(a.value_ids.filtered(lambda v: v.visible_in_ecommerce)) &gt; 1
</attribute>
</xpath>
<xpath
expr="//t[@t-if=&quot;a.display_type == 'select'&quot;]//t"
position="attributes"
>
<attribute
name="t-foreach"
>a.value_ids.filtered(lambda v: v.visible_in_ecommerce)</attribute>
</xpath>
<xpath
expr="//t[@t-if=&quot;a.display_type == 'radio' or a.display_type == 'pills'&quot;]//t"
position="attributes"
>
<attribute
name="t-foreach"
>a.value_ids.filtered(lambda v: v.visible_in_ecommerce)</attribute>
</xpath>
<xpath
expr="//div[@t-if=&quot;a.display_type == 'color'&quot;]//t"
position="attributes"
>
<attribute
name="t-foreach"
>a.value_ids.filtered(lambda v: v.visible_in_ecommerce)</attribute>
</xpath>
</template>
<template id="o_wsale_offcanvas" inherit_id="website_sale.o_wsale_offcanvas">
<xpath expr="//t[@t-foreach='attributes']//div" position="attributes">
<attribute
name="t-if"
>a.value_ids.filtered(lambda v: v.visible_in_ecommerce) and len(a.value_ids.filtered(lambda v: v.visible_in_ecommerce)) &gt; 1</attribute>
</xpath>
<xpath expr="//div[@t-foreach='a.value_ids']" position="attributes">
<attribute
name="t-foreach"
>a.value_ids.filtered(lambda v: v.visible_in_ecommerce)</attribute>
</xpath>
<xpath
expr="//t[@t-foreach='attributes']//div[hasclass('accordion-body')]//t[@t-foreach='a.value_ids']"
position="attributes"
>
<attribute
name="t-foreach"
>a.value_ids.filtered(lambda v: v.visible_in_ecommerce)</attribute>
</xpath>
</template>
</odoo>