add: remove_odoo_enterprise from OCA/server-brand 16.0

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ernad Husremovic 2026-03-19 11:43:19 +01:00
parent 0146a9eabd
commit 0c6d840c00
21 changed files with 1042 additions and 0 deletions

View file

@ -0,0 +1,85 @@
======================
Remove Odoo Enterprise
======================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:a441d892f3c89104da87da994d53530e9ff1ccd4bad2b159ec37cf1ddc7f0bb2
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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%2Fserver--brand-lightgray.png?logo=github
:target: https://github.com/OCA/server-brand/tree/16.0/remove_odoo_enterprise
:alt: OCA/server-brand
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/server-brand-16-0/server-brand-16-0-remove_odoo_enterprise
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/server-brand&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module removes enterprise-only apps and features from all settings views.
It also removes the widget in the General Settings page for downloading the Odoo
mobile apps from Google Play and Apple Store.
**Table of contents**
.. contents::
:local:
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/server-brand/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/OCA/server-brand/issues/new?body=module:%20remove_odoo_enterprise%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
~~~~~~~
* Eska
* Onestein
Contributors
~~~~~~~~~~~~
* Brett Wood <bwood@laslabs.com>
* Michell Stuttgart <michellstut@gmail.com>
* Andrea Stirpe <a.stirpe@onestein.nl>
* Levent Karakaş <leventk@eskayazilim.com.tr>
* Dennis Sluijk <d.sluijk@onestein.nl>
* remi-filament
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/server-brand <https://github.com/OCA/server-brand/tree/16.0/remove_odoo_enterprise>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1,4 @@
# Copyright 2018 Eska Yazılım ve Danışmanlık A.Ş (www.eskayazilim.com.tr)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import models

View file

@ -0,0 +1,14 @@
# Copyright 2018 Eska Yazılım ve Danışmanlık A.Ş (www.eskayazilim.com.tr)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
{
"name": "Remove Odoo Enterprise",
"summary": "Remove enterprise modules and setting items",
"version": "16.0.2.0.4",
"category": "Maintenance",
"author": "Eska, Onestein, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/server-brand",
"license": "AGPL-3",
"depends": ["base_setup"],
"data": ["views/res_config_settings_views.xml"],
"installable": True,
}

View file

@ -0,0 +1,32 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * remove_odoo_enterprise
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-03-17 14:06+0000\n"
"Last-Translator: davidbeckercbl <becker@cbl-computer.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 5.10.2\n"
#. module: remove_odoo_enterprise
#: model:ir.model,name:remove_odoo_enterprise.model_base
msgid "Base"
msgstr "Basis"
#. module: remove_odoo_enterprise
#: model:ir.model,name:remove_odoo_enterprise.model_res_config_settings
msgid "Config Settings"
msgstr "Einstellungen"
#. module: remove_odoo_enterprise
#: model:ir.model,name:remove_odoo_enterprise.model_ir_module_module
msgid "Module"
msgstr "Modul"

View file

@ -0,0 +1,33 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * remove_odoo_enterprise
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-11-18 14:35+0000\n"
"Last-Translator: Bole <bole@dajmi5.com>\n"
"Language-Team: none\n"
"Language: hr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 3.8\n"
#. module: remove_odoo_enterprise
#: model:ir.model,name:remove_odoo_enterprise.model_base
msgid "Base"
msgstr ""
#. module: remove_odoo_enterprise
#: model:ir.model,name:remove_odoo_enterprise.model_res_config_settings
msgid "Config Settings"
msgstr "Postavke"
#. module: remove_odoo_enterprise
#: model:ir.model,name:remove_odoo_enterprise.model_ir_module_module
msgid "Module"
msgstr ""

View file

@ -0,0 +1,32 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * remove_odoo_enterprise
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-01-02 17:34+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
"Language-Team: none\n"
"Language: it\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.17\n"
#. module: remove_odoo_enterprise
#: model:ir.model,name:remove_odoo_enterprise.model_base
msgid "Base"
msgstr "Base"
#. module: remove_odoo_enterprise
#: model:ir.model,name:remove_odoo_enterprise.model_res_config_settings
msgid "Config Settings"
msgstr "Impostazioni configurazione"
#. module: remove_odoo_enterprise
#: model:ir.model,name:remove_odoo_enterprise.model_ir_module_module
msgid "Module"
msgstr "Modulo"

View file

@ -0,0 +1,33 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * remove_odoo_enterprise
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-07-10 19:58+0000\n"
"Last-Translator: Rodrigo Sottomaior Macedo "
"<sottomaiormacedotec@sottomaiormacedo.tech>\n"
"Language-Team: none\n"
"Language: pt_BR\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 5.6.2\n"
#. module: remove_odoo_enterprise
#: model:ir.model,name:remove_odoo_enterprise.model_base
msgid "Base"
msgstr "Base"
#. module: remove_odoo_enterprise
#: model:ir.model,name:remove_odoo_enterprise.model_res_config_settings
msgid "Config Settings"
msgstr "Configurações"
#. module: remove_odoo_enterprise
#: model:ir.model,name:remove_odoo_enterprise.model_ir_module_module
msgid "Module"
msgstr "Módulo"

View file

@ -0,0 +1,29 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * remove_odoo_enterprise
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \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: remove_odoo_enterprise
#: model:ir.model,name:remove_odoo_enterprise.model_base
msgid "Base"
msgstr ""
#. module: remove_odoo_enterprise
#: model:ir.model,name:remove_odoo_enterprise.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: remove_odoo_enterprise
#: model:ir.model,name:remove_odoo_enterprise.model_ir_module_module
msgid "Module"
msgstr ""

View file

@ -0,0 +1,41 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * remove_odoo_enterprise
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2021-11-17 10:36+0000\n"
"Last-Translator: Simon S <simon.stromberg@vertel.se>\n"
"Language-Team: none\n"
"Language: sv\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: remove_odoo_enterprise
#: model:ir.model,name:remove_odoo_enterprise.model_base
msgid "Base"
msgstr "Bas"
#. module: remove_odoo_enterprise
#: model:ir.model,name:remove_odoo_enterprise.model_res_config_settings
msgid "Config Settings"
msgstr "Konfigurationsinställningar"
#. module: remove_odoo_enterprise
#: model:ir.model,name:remove_odoo_enterprise.model_ir_module_module
msgid "Module"
msgstr "Modul"
#~ msgid "Display Name"
#~ msgstr "Visningsnamn"
#~ msgid "ID"
#~ msgstr "ID"
#~ msgid "Last Modified on"
#~ msgstr "Senast ändrad den"

View file

@ -0,0 +1,32 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * remove_odoo_enterprise
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-02-19 13:06+0000\n"
"Last-Translator: İsmail Çağan Yılmaz <ismail.cagan.yilmaz@gmail.com>\n"
"Language-Team: none\n"
"Language: tr\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 5.6.2\n"
#. module: remove_odoo_enterprise
#: model:ir.model,name:remove_odoo_enterprise.model_base
msgid "Base"
msgstr "Temel"
#. module: remove_odoo_enterprise
#: model:ir.model,name:remove_odoo_enterprise.model_res_config_settings
msgid "Config Settings"
msgstr "Yapılandırma Ayarları"
#. module: remove_odoo_enterprise
#: model:ir.model,name:remove_odoo_enterprise.model_ir_module_module
msgid "Module"
msgstr "Modül"

View file

@ -0,0 +1,7 @@
# Copyright 2018 Eska Yazılım ve Danışmanlık A.Ş (www.eskayazilim.com.tr)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from . import base
from . import res_config_settings
from . import ir_module_module

View file

@ -0,0 +1,16 @@
# Copyright 2019-2020 Onestein (<https://www.onestein.eu>)
# Copyright 2023 Le Filament (https://le-filament.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import api, models
class Base(models.AbstractModel):
_inherit = "base"
@api.model
def search(self, domain, offset=0, limit=None, order=None, count=False):
res = super().search(domain, offset, limit, order, count)
if not count and self._name == "payment.provider":
res = res.filtered(lambda a: not a.module_to_buy)
return res

View file

@ -0,0 +1,13 @@
# Copyright 2019-2020 Onestein (<https://www.onestein.eu>)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import api, models
class IrModuleModule(models.Model):
_inherit = "ir.module.module"
@api.model
def search(self, domain, offset=0, limit=None, order=None, count=False):
domain += [("to_buy", "=", False)]
return super().search(domain, offset, limit, order, count)

View file

@ -0,0 +1,59 @@
# Copyright 2016 LasLabs Inc.
# Copyright 2018-2020 Onestein (<http://www.onestein.eu>)
# Copyright 2023 Le Filament (https://le-filament.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from lxml import etree
from odoo import api, models
class ResConfigSettings(models.TransientModel):
_inherit = "res.config.settings"
@api.model
def get_views(self, views, options=None):
"""Override to hide settings related to enterprise features.
This method modifies the form view for settings to hide options
that require enterprise version of Odoo.
"""
result = super().get_views(views, options)
doc = etree.XML(result["views"]["form"]["arch"])
# Hide all setting boxes containing upgrade_boolean widgets
self._hide_enterprise_settings(doc)
# Hide empty setting containers and their headings
self._hide_empty_containers(doc)
# Update the form view architecture with the modified XML
result["views"]["form"]["arch"] = etree.tostring(doc)
return result
def _hide_enterprise_settings(self, doc):
"""Hide all setting boxes containing upgrade_boolean widgets."""
# Find all setting boxes with upgrade_boolean widgets
query = (
"//div[contains(@class, 'o_setting_box')]"
"[.//field[@widget='upgrade_boolean']]"
)
for setting_box in doc.xpath(query):
setting_box.attrib["class"] = "d-none"
def _hide_empty_containers(self, doc):
"""Hide containers that no longer have any visible setting boxes."""
# Find containers with no visible setting boxes
empty_container_query = (
"//div[contains(@class, 'o_settings_container')]"
"[not(.//div[contains(@class, 'o_setting_box') "
"and not(contains(@class, 'd-none'))])]"
)
for empty_container in doc.xpath(empty_container_query):
# If there's a heading before the container, hide it too
prev_element = empty_container.getprevious()
if prev_element is not None and prev_element.tag == "h2":
prev_element.attrib["class"] = "d-none"
# Hide the empty container
empty_container.attrib["class"] = "d-none"

View file

@ -0,0 +1,6 @@
* Brett Wood <bwood@laslabs.com>
* Michell Stuttgart <michellstut@gmail.com>
* Andrea Stirpe <a.stirpe@onestein.nl>
* Levent Karakaş <leventk@eskayazilim.com.tr>
* Dennis Sluijk <d.sluijk@onestein.nl>
* remi-filament

View file

@ -0,0 +1,4 @@
This module removes enterprise-only apps and features from all settings views.
It also removes the widget in the General Settings page for downloading the Odoo
mobile apps from Google Play and Apple Store.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,431 @@
<!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>Remove Odoo Enterprise</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" id="remove-odoo-enterprise">
<h1 class="title">Remove Odoo Enterprise</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:a441d892f3c89104da87da994d53530e9ff1ccd4bad2b159ec37cf1ddc7f0bb2
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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/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 image-reference" href="https://github.com/OCA/server-brand/tree/16.0/remove_odoo_enterprise"><img alt="OCA/server-brand" src="https://img.shields.io/badge/github-OCA%2Fserver--brand-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/server-brand-16-0/server-brand-16-0-remove_odoo_enterprise"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/server-brand&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module removes enterprise-only apps and features from all settings views.</p>
<p>It also removes the widget in the General Settings page for downloading the Odoo
mobile apps from Google Play and Apple Store.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-1">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-2">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-3">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-4">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-5">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-1">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/server-brand/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/OCA/server-brand/issues/new?body=module:%20remove_odoo_enterprise%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">
<h1><a class="toc-backref" href="#toc-entry-2">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-3">Authors</a></h2>
<ul class="simple">
<li>Eska</li>
<li>Onestein</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-4">Contributors</a></h2>
<ul class="simple">
<li>Brett Wood &lt;<a class="reference external" href="mailto:bwood&#64;laslabs.com">bwood&#64;laslabs.com</a>&gt;</li>
<li>Michell Stuttgart &lt;<a class="reference external" href="mailto:michellstut&#64;gmail.com">michellstut&#64;gmail.com</a>&gt;</li>
<li>Andrea Stirpe &lt;<a class="reference external" href="mailto:a.stirpe&#64;onestein.nl">a.stirpe&#64;onestein.nl</a>&gt;</li>
<li>Levent Karakaş &lt;<a class="reference external" href="mailto:leventk&#64;eskayazilim.com.tr">leventk&#64;eskayazilim.com.tr</a>&gt;</li>
<li>Dennis Sluijk &lt;<a class="reference external" href="mailto:d.sluijk&#64;onestein.nl">d.sluijk&#64;onestein.nl</a>&gt;</li>
<li>remi-filament</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-5">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/server-brand/tree/16.0/remove_odoo_enterprise">OCA/server-brand</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,3 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from . import test_remove_odoo_enterprise

View file

@ -0,0 +1,156 @@
# Copyright 2020-2023 Onestein (<http://www.onestein.eu>)
# Copyright 2020 Akretion (<http://www.akretion.com>)
# Copyright 2023 Le Filament (https://le-filament.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
import json
from lxml import etree
from odoo.tests import common
class TestRemoveOdooEnterprise(common.TransactionCase):
def test_res_config_settings(self):
"""
This test case checks the XML architecture of res.config.settings view,
specifically searching for div elements with a field element where widget
attribute is 'upgrade_boolean'. If such an element exists, it should have
the class "d-none".
"""
conf = self.env["res.config.settings"].create({})
view = conf.get_views([[False, "form"]])["views"]["form"]
doc = etree.XML(view["arch"])
# Validate, there are no more visible setting boxes in the view,
# which include fields with upgrade_boolean widgets
query_settings_box = (
"//div[contains(@class, 'o_setting_box')]"
"[.//field[@widget='upgrade_boolean']]"
)
setting_boxes = doc.xpath(query_settings_box) or None
self.assertIsNone(setting_boxes)
# Validate, there are no more visible settings containers in the view,
# which only include hidden setting boxes, and therefore appear empty
# and check if they are hidden
query_settings_container = (
"//div[contains(@class, 'o_settings_container')]"
"[not(.//div[contains(@class, 'o_setting_box') "
"and not(contains(@class, 'd-none'))])]"
)
settings_container = doc.xpath(query_settings_container) or None
self.assertIsNone(settings_container)
def test_hide_empty_containers(self):
"""Test the _hide_empty_containers method"""
conf = self.env["res.config.settings"].create({})
# Create a test XML document with empty containers
xml_content = """
<form>
<h2>Heading 1</h2>
<div class="o_settings_container">
<div class="o_setting_box d-none">Hidden setting box</div>
</div>
<h2>Heading 2</h2>
<div class="o_settings_container">
<div class="o_setting_box">Visible setting box</div>
</div>
<h2>Heading 3</h2>
<div class="o_settings_container">
<div class="o_setting_box d-none">Another hidden setting box</div>
</div>
</form>
"""
doc = etree.XML(xml_content)
# Apply the method to hide empty containers
conf._hide_empty_containers(doc)
# Check that empty containers and their headings are hidden
empty_containers = doc.xpath("//div[@class='d-none']")
self.assertEqual(len(empty_containers), 2)
# Check that headings before empty containers are hidden
hidden_headings = doc.xpath("//h2[@class='d-none']")
self.assertEqual(len(hidden_headings), 2)
self.assertEqual(hidden_headings[0].text, "Heading 1")
self.assertEqual(hidden_headings[1].text, "Heading 3")
# Check that containers with visible setting boxes are not hidden
visible_containers = doc.xpath("//div[@class='o_settings_container']")
self.assertEqual(len(visible_containers), 1)
def test_hide_enterprise_settings(self):
"""Test the _hide_enterprise_settings method"""
conf = self.env["res.config.settings"].create({})
# Create a test XML document with upgrade_boolean widgets
xml_content = """
<form>
<div class="o_setting_box">
<div>
<field name="show_effect" widget="upgrade_boolean"/>
</div>
</div>
<div class="o_setting_box">
<div>
<field name="field2"/>
</div>
</div>
</form>
"""
doc = etree.XML(xml_content)
# Apply the method to hide enterprise settings
conf._hide_enterprise_settings(doc)
# Check that setting boxes with upgrade_boolean widgets are hidden
hidden_boxes = doc.xpath("//div[@class='d-none']")
self.assertEqual(len(hidden_boxes), 1)
# Check that other setting boxes are not hidden
visible_boxes = doc.xpath("//div[@class='o_setting_box']")
self.assertEqual(len(visible_boxes), 1)
def test_search_payment_providers(self):
"""
This function checks if there are any payment providers in the database,
fetches them using a search query, and then verifies that none of these
providers have an associated module to buy.
"""
if self.env.get("payment.provider"):
acquirer_ids = self.env["payment.provider"].search([])
self.assertFalse(any([a.module_to_buy for a in acquirer_ids]))
def test_search_ir_module(self):
"""
This function is used to test the search method from 'ir.module.module' model.
It checks if there are any modules without a purchase cost (to_buy = False).
"""
module_ids = self.env["ir.module.module"].search([])
self.assertFalse(any([m.to_buy for m in module_ids]))
def test_appstore_invisible(self):
"""The appstore widget is invisible"""
conf = self.env["res.config.settings"].create({})
view = conf.get_views([[False, "form"]])["views"]["form"]
doc = etree.XML(view["arch"])
query = "//div[@id='appstore']"
for item in doc.xpath(query):
invisible_attrib = json.loads(item.attrib["modifiers"])
self.assertTrue(invisible_attrib["invisible"])
def test_appstore_visible(self):
"""Disabling the view makes the appstore widget visible again"""
conf_form_view = self.env.ref(
"remove_odoo_enterprise.res_config_settings_view_form"
)
conf_form_view.active = False
conf = self.env["res.config.settings"].create({})
view = conf.get_views([[False, "form"]])["views"]["form"]
doc = etree.XML(view["arch"])
query = "//div[@id='appstore']"
for item in doc.xpath(query):
self.assertNotIn("modifiers", item.attrib)

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="base_setup.res_config_settings_view_form" />
<field name="arch" type="xml">
<xpath expr="//div[@id='appstore']" position="attributes">
<attribute name="invisible">1</attribute>
</xpath>
</field>
</record>
</odoo>