Initial commit: OCA Technical packages (595 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:03 +02:00
commit 2cc02aac6e
24950 changed files with 2318079 additions and 0 deletions

View file

@ -0,0 +1,46 @@
# Conditional Images
Odoo addon: base_conditional_image
## Installation
```bash
pip install odoo-bringout-oca-server-tools-base_conditional_image
```
## Dependencies
This addon depends on:
- base
## Manifest Information
- **Name**: Conditional Images
- **Version**: 16.0.1.0.0
- **Category**: Misc
- **License**: AGPL-3
- **Installable**: True
## Source
Based on [OCA/server-tools](https://github.com/OCA/server-tools) branch 16.0, addon `base_conditional_image`.
## License
This package maintains the original AGPL-3 license from the upstream Odoo project.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Reports: doc/REPORTS.md
- Security: doc/SECURITY.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

View file

@ -0,0 +1,118 @@
==================
Conditional Images
==================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:d173ed24b043dca5005b5821998aa392db4a1a3c69b479385c7307497df1fc93
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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--tools-lightgray.png?logo=github
:target: https://github.com/OCA/server-tools/tree/16.0/base_conditional_image
:alt: OCA/server-tools
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/server-tools-16-0/server-tools-16-0-base_conditional_image
: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-tools&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module extends the functionality of any model to support conditional images
(based on the record attributes) and to manage them either globally or by company.
The main goal behind this module is to avoid storing the same image multiple times.
For example, for every partner, there is a related image (most of the time, it's the default one).
With this module properly set up, it will be stored only one time and you can change it whenever you want for all partners.
**WARNING**: this module cannot be used on the same objects using the module `base_multi_image`.
**Table of contents**
.. contents::
:local:
Installation
============
The sole purpose of this module is to add an abstract model to be inherited.
So, you will not notice any changes on install.
To develop using this module, you have to inherit the abstract model `conditional.image.consumer.mixin`
to the model that needs the conditional images::
class ResPartner(models.Model):
_inherit = ['res.partner', 'conditional.image.consumer.mixin']
_name = 'res.partner'
Then, configure how the images will be selected for each record.
Usage
=====
Go to *Technical Settings > Settings > Images* to configure all the images.
You can define images for specific objects, depending on the attributes and the company of the object.
The `selector` should return a boolean expression. All fields of the object are available to compute the result.
The system will first try to match an image with a company set up, then with the ones without a company.
If your object does not have a `company_id` field, this check will be ignored and only images without a company will be used.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/server-tools/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-tools/issues/new?body=module:%20base_conditional_image%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
~~~~~~~
* Camptocamp
Contributors
~~~~~~~~~~~~
* `Camptocamp <https://camptocamp.com/>`_:
* Patrick Tombez <patrick.tombez@camptocamp.com>
* Denis Leemann <denis.leemann@camptocamp.com>
* `Trobz <https://trobz.com>`_:
* Son Ho <sonhd@trobz.com>
Other credits
~~~~~~~~~~~~~
The migration of this module from 12.0 to 14.0 was financially supported by Camptocamp
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-tools <https://github.com/OCA/server-tools/tree/16.0/base_conditional_image>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

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

View file

@ -0,0 +1,20 @@
# Copyright 2019-2022 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
{
"name": "Conditional Images",
"summary": "This module extends the functionality to support conditional images",
"version": "16.0.1.0.0",
"author": "Camptocamp, Odoo Community Association (OCA)",
"license": "AGPL-3",
"category": "Misc",
"depends": [
"base",
],
"website": "https://github.com/OCA/server-tools",
"data": [
"views/image_view.xml",
"security/ir.model.access.csv",
],
"installable": True,
}

View file

@ -0,0 +1,133 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_conditional_image
#
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: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__company_id
msgid "Company"
msgstr ""
#. module: base_conditional_image
#: model:ir.model.fields,help:base_conditional_image.field_conditional_image__company_id
msgid ""
"Company related check. If inherited object does not have a `company_id` "
"field, it will be ignored. The check will first take the records with a "
"company then, if no match is found, the ones without a company."
msgstr ""
#. module: base_conditional_image
#: model:ir.model,name:base_conditional_image.model_conditional_image
#: model_terms:ir.ui.view,arch_db:base_conditional_image.view_conditional_image_form
msgid "Conditional Image"
msgstr ""
#. module: base_conditional_image
#: model:ir.actions.act_window,name:base_conditional_image.conditional_image_action
#: model:ir.ui.menu,name:base_conditional_image.conditional_image_menu
msgid "Conditional Images"
msgstr ""
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__create_uid
msgid "Created by"
msgstr ""
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__create_date
msgid "Created on"
msgstr ""
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__display_name
msgid "Display Name"
msgstr ""
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__id
msgid "ID"
msgstr ""
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__image_1920
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image_consumer_mixin__image_1920
msgid "Image"
msgstr ""
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__image_1024
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image_consumer_mixin__image_1024
msgid "Image 1024"
msgstr ""
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__image_128
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image_consumer_mixin__image_128
msgid "Image 128"
msgstr ""
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__image_256
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image_consumer_mixin__image_256
msgid "Image 256"
msgstr ""
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__image_512
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image_consumer_mixin__image_512
msgid "Image 512"
msgstr ""
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image____last_update
msgid "Last Modified on"
msgstr ""
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__write_uid
msgid "Last Updated by"
msgstr ""
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__write_date
msgid "Last Updated on"
msgstr ""
#. module: base_conditional_image
#: model:ir.model,name:base_conditional_image.model_conditional_image_consumer_mixin
msgid "Mixin for conditional images consumers"
msgstr ""
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__model_name
msgid "Model Name"
msgstr ""
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__name
msgid "Name"
msgstr ""
#. module: base_conditional_image
#: model:ir.model.fields,help:base_conditional_image.field_conditional_image__selector
msgid ""
"Python expression used as selector when multiple images are usedfor the same"
" object. The variable `object` refers to the actual record on which the "
"expression will be executed. An empty expression will always return `True`."
msgstr ""
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__selector
#: model_terms:ir.ui.view,arch_db:base_conditional_image.view_conditional_image_form
msgid "Selector"
msgstr ""

View file

@ -0,0 +1,133 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_conditional_image
#
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: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__company_id
msgid "Company"
msgstr "Preduzeće"
#. module: base_conditional_image
#: model:ir.model.fields,help:base_conditional_image.field_conditional_image__company_id
msgid ""
"Company related check. If inherited object does not have a `company_id` "
"field, it will be ignored. The check will first take the records with a "
"company then, if no match is found, the ones without a company."
msgstr ""
#. module: base_conditional_image
#: model:ir.model,name:base_conditional_image.model_conditional_image
#: model_terms:ir.ui.view,arch_db:base_conditional_image.view_conditional_image_form
msgid "Conditional Image"
msgstr "Uslovna slika"
#. module: base_conditional_image
#: model:ir.actions.act_window,name:base_conditional_image.conditional_image_action
#: model:ir.ui.menu,name:base_conditional_image.conditional_image_menu
msgid "Conditional Images"
msgstr "Uslovna slika"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__create_uid
msgid "Created by"
msgstr "Kreirao"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__create_date
msgid "Created on"
msgstr "Kreirano"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__display_name
msgid "Display Name"
msgstr "Prikazani naziv"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__id
msgid "ID"
msgstr "ID"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__image_1920
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image_consumer_mixin__image_1920
msgid "Image"
msgstr "Slika"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__image_1024
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image_consumer_mixin__image_1024
msgid "Image 1024"
msgstr "Slika 1024"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__image_128
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image_consumer_mixin__image_128
msgid "Image 128"
msgstr "Slika 128"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__image_256
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image_consumer_mixin__image_256
msgid "Image 256"
msgstr "Slika 256"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__image_512
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image_consumer_mixin__image_512
msgid "Image 512"
msgstr "Slika 512"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image____last_update
msgid "Last Modified on"
msgstr "Zadnje mijenjano"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__write_uid
msgid "Last Updated by"
msgstr "Zadnji ažurirao"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__write_date
msgid "Last Updated on"
msgstr "Zadnje ažurirano"
#. module: base_conditional_image
#: model:ir.model,name:base_conditional_image.model_conditional_image_consumer_mixin
msgid "Mixin for conditional images consumers"
msgstr "Mixin za potrošače uslovnih slika"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__model_name
msgid "Model Name"
msgstr "Naziv modela"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__name
msgid "Name"
msgstr "Naziv:"
#. module: base_conditional_image
#: model:ir.model.fields,help:base_conditional_image.field_conditional_image__selector
msgid ""
"Python expression used as selector when multiple images are usedfor the same"
" object. The variable `object` refers to the actual record on which the "
"expression will be executed. An empty expression will always return `True`."
msgstr ""
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__selector
#: model_terms:ir.ui.view,arch_db:base_conditional_image.view_conditional_image_form
msgid "Selector"
msgstr "Selektor"

View file

@ -0,0 +1,144 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_conditional_image
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 15.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2022-10-09 22:36+0000\n"
"Last-Translator: Ignacio Buioli <ibuioli@gmail.com>\n"
"Language-Team: none\n"
"Language: es_AR\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: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__company_id
msgid "Company"
msgstr "Compañía"
#. module: base_conditional_image
#: model:ir.model.fields,help:base_conditional_image.field_conditional_image__company_id
msgid ""
"Company related check. If inherited object does not have a `company_id` "
"field, it will be ignored. The check will first take the records with a "
"company then, if no match is found, the ones without a company."
msgstr ""
"Verificación de compañía relacionada. Si el objeto heredado no tiene un "
"campo `company_id`, se ignorará. La verificación tomará primero los "
"registros con una compañía y luego, si no se encuentra ninguna coincidencia, "
"los que no tengan una compañía."
#. module: base_conditional_image
#: model:ir.model,name:base_conditional_image.model_conditional_image
#: model_terms:ir.ui.view,arch_db:base_conditional_image.view_conditional_image_form
msgid "Conditional Image"
msgstr "Imagen Condicional"
#. module: base_conditional_image
#: model:ir.actions.act_window,name:base_conditional_image.conditional_image_action
#: model:ir.ui.menu,name:base_conditional_image.conditional_image_menu
msgid "Conditional Images"
msgstr "Imágenes Condicionales"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__create_uid
msgid "Created by"
msgstr "Creado por"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__create_date
msgid "Created on"
msgstr "Creado en"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__display_name
msgid "Display Name"
msgstr "Mostrar Nombre"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__id
msgid "ID"
msgstr "ID"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__image_1920
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image_consumer_mixin__image_1920
msgid "Image"
msgstr "Imagen"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__image_1024
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image_consumer_mixin__image_1024
msgid "Image 1024"
msgstr "Imagen 1024"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__image_128
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image_consumer_mixin__image_128
msgid "Image 128"
msgstr "Imagen 128"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__image_256
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image_consumer_mixin__image_256
msgid "Image 256"
msgstr "Imagen 256"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__image_512
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image_consumer_mixin__image_512
msgid "Image 512"
msgstr "Imagen 512"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image____last_update
msgid "Last Modified on"
msgstr "Última modificación en"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__write_uid
msgid "Last Updated by"
msgstr "Última actualización realizada por"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__write_date
msgid "Last Updated on"
msgstr "Última actualización el"
#. module: base_conditional_image
#: model:ir.model,name:base_conditional_image.model_conditional_image_consumer_mixin
msgid "Mixin for conditional images consumers"
msgstr "Mixin para consumidores de imágenes condicionales"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__model_name
msgid "Model Name"
msgstr "Nombre del Modelo"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__name
msgid "Name"
msgstr "Nombre"
#. module: base_conditional_image
#: model:ir.model.fields,help:base_conditional_image.field_conditional_image__selector
msgid ""
"Python expression used as selector when multiple images are usedfor the same "
"object. The variable `object` refers to the actual record on which the "
"expression will be executed. An empty expression will always return `True`."
msgstr ""
"Expresión de Python utilizada como selector cuando se utilizan varias "
"imágenes para el mismo objeto. La variable `objet` se refiere al registro "
"real en el que se ejecutará la expresión. Una expresión vacía siempre "
"devolverá `True`."
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__selector
#: model_terms:ir.ui.view,arch_db:base_conditional_image.view_conditional_image_form
msgid "Selector"
msgstr "Selector"

View file

@ -0,0 +1,144 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_conditional_image
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-10-24 09:06+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 5.6.2\n"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__company_id
msgid "Company"
msgstr "Azienda"
#. module: base_conditional_image
#: model:ir.model.fields,help:base_conditional_image.field_conditional_image__company_id
msgid ""
"Company related check. If inherited object does not have a `company_id` "
"field, it will be ignored. The check will first take the records with a "
"company then, if no match is found, the ones without a company."
msgstr ""
"Controllo correlato all'azienda. Se l'oggetto ereditato non ha un campo "
"`company_id`, verrà ignorato. Il controllo prenderà prima i record con "
"un'azienda, poi, se non viene trovata alcuna corrispondenza, quelli senza "
"azienda."
#. module: base_conditional_image
#: model:ir.model,name:base_conditional_image.model_conditional_image
#: model_terms:ir.ui.view,arch_db:base_conditional_image.view_conditional_image_form
msgid "Conditional Image"
msgstr "Immagine condizionale"
#. module: base_conditional_image
#: model:ir.actions.act_window,name:base_conditional_image.conditional_image_action
#: model:ir.ui.menu,name:base_conditional_image.conditional_image_menu
msgid "Conditional Images"
msgstr "Immagini condizionali"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__create_uid
msgid "Created by"
msgstr "Creato da"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__create_date
msgid "Created on"
msgstr "Creato il"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__display_name
msgid "Display Name"
msgstr "Nome visualizzato"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__id
msgid "ID"
msgstr "ID"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__image_1920
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image_consumer_mixin__image_1920
msgid "Image"
msgstr "Immagine"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__image_1024
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image_consumer_mixin__image_1024
msgid "Image 1024"
msgstr "Immagine 1024"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__image_128
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image_consumer_mixin__image_128
msgid "Image 128"
msgstr "Immagine 128"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__image_256
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image_consumer_mixin__image_256
msgid "Image 256"
msgstr "Immagine 256"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__image_512
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image_consumer_mixin__image_512
msgid "Image 512"
msgstr "Immagine 512"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image____last_update
msgid "Last Modified on"
msgstr "Ultima modifica il"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__write_uid
msgid "Last Updated by"
msgstr "Ultimo aggiornamento di"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__write_date
msgid "Last Updated on"
msgstr "Ultimo aggiornamento il"
#. module: base_conditional_image
#: model:ir.model,name:base_conditional_image.model_conditional_image_consumer_mixin
msgid "Mixin for conditional images consumers"
msgstr "Mixin per l'impiego delle immagini condizionale"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__model_name
msgid "Model Name"
msgstr "Nome modello"
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__name
msgid "Name"
msgstr "Nome"
#. module: base_conditional_image
#: model:ir.model.fields,help:base_conditional_image.field_conditional_image__selector
msgid ""
"Python expression used as selector when multiple images are usedfor the same"
" object. The variable `object` refers to the actual record on which the "
"expression will be executed. An empty expression will always return `True`."
msgstr ""
"Espressione Python usata come selettore quando più immagini vengono usate "
"per lo stesso oggetto. La variabile `object` si riferisce al record "
"effettivo su cui verrà eseguita l'espressione. Un'espressione vuota "
"restituirà sempre `True`."
#. module: base_conditional_image
#: model:ir.model.fields,field_description:base_conditional_image.field_conditional_image__selector
#: model_terms:ir.ui.view,arch_db:base_conditional_image.view_conditional_image_form
msgid "Selector"
msgstr "Selettore"

View file

@ -0,0 +1,2 @@
from . import conditional_image_consumer_mixin
from . import conditional_image

View file

@ -0,0 +1,27 @@
# Copyright 2022 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from odoo import fields, models
class ConditionalImage(models.Model):
_name = "conditional.image"
_description = "Conditional Image"
_inherit = ["image.mixin"]
name = fields.Char(required=True)
model_name = fields.Char(required=True)
selector = fields.Text(
help="Python expression used as selector when multiple images are used"
"for the same object. The variable `object` refers "
"to the actual record on which the expression will be executed. "
"An empty expression will always return `True`.",
)
company_id = fields.Many2one(
"res.company",
"Company",
help="Company related check. If inherited object does not have a "
"`company_id` field, it will be ignored. "
"The check will first take the records with a company then, "
"if no match is found, the ones without a company.",
)

View file

@ -0,0 +1,67 @@
# Copyright 2022 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from odoo import fields, models
from odoo.tools.safe_eval import safe_eval
class ConditionalImageConsumerMixin(models.AbstractModel):
_name = "conditional.image.consumer.mixin"
_description = "Mixin for conditional images consumers"
_inherit = "image.mixin"
image_1920 = fields.Image(compute="_compute_images", store=False, readonly=True)
image_1024 = fields.Image(compute="_compute_images", store=False, readonly=True)
image_512 = fields.Image(compute="_compute_images", store=False, readonly=True)
image_256 = fields.Image(compute="_compute_images", store=False, readonly=True)
image_128 = fields.Image(compute="_compute_images", store=False, readonly=True)
def _conditional_image_evaluate_selector(self, conditional_image):
self.ensure_one()
if conditional_image.selector:
if (
conditional_image.company_id == self.company_id
or self.company_id
and not conditional_image.company_id
):
return bool(
safe_eval(conditional_image.selector or "True", {"object": self})
)
return False
def _compute_images(self):
if "company_id" in self._fields:
search_clause = [("model_name", "=", self._name)]
else:
# If inherited object doesn't have a `company_id` field,
# remove the items with a company defined and the related checks
search_clause = [
("model_name", "=", self._name),
("company_id", "=", False),
]
conditional_images = self.env["conditional.image"].search(
search_clause, order="company_id, selector"
)
for record in self:
images_found = conditional_images.filtered(
lambda img: record._conditional_image_evaluate_selector(img)
)
values = {
"image_1920": False,
"image_1024": False,
"image_512": False,
"image_256": False,
"image_128": False,
}
if images_found:
image = images_found[0]
values = {
"image_1920": image.image_1920,
"image_1024": image.image_1024,
"image_512": image.image_512,
"image_256": image.image_256,
"image_128": image.image_128,
}
record.update(values)

View file

@ -0,0 +1,5 @@
* `Camptocamp <https://camptocamp.com/>`_:
* Patrick Tombez <patrick.tombez@camptocamp.com>
* Denis Leemann <denis.leemann@camptocamp.com>
* `Trobz <https://trobz.com>`_:
* Son Ho <sonhd@trobz.com>

View file

@ -0,0 +1 @@
The migration of this module from 12.0 to 14.0 was financially supported by Camptocamp

View file

@ -0,0 +1,8 @@
This module extends the functionality of any model to support conditional images
(based on the record attributes) and to manage them either globally or by company.
The main goal behind this module is to avoid storing the same image multiple times.
For example, for every partner, there is a related image (most of the time, it's the default one).
With this module properly set up, it will be stored only one time and you can change it whenever you want for all partners.
**WARNING**: this module cannot be used on the same objects using the module `base_multi_image`.

View file

@ -0,0 +1,11 @@
The sole purpose of this module is to add an abstract model to be inherited.
So, you will not notice any changes on install.
To develop using this module, you have to inherit the abstract model `conditional.image.consumer.mixin`
to the model that needs the conditional images::
class ResPartner(models.Model):
_inherit = ['res.partner', 'conditional.image.consumer.mixin']
_name = 'res.partner'
Then, configure how the images will be selected for each record.

View file

@ -0,0 +1,7 @@
Go to *Technical Settings > Settings > Images* to configure all the images.
You can define images for specific objects, depending on the attributes and the company of the object.
The `selector` should return a boolean expression. All fields of the object are available to compute the result.
The system will first try to match an image with a company set up, then with the ones without a company.
If your object does not have a `company_id` field, this check will be ignored and only images without a company will be used.

View file

@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_conditional_image,Conditional Image,base_conditional_image.model_conditional_image,base.group_no_one,1,1,1,1
access_conditional_image_users,Conditional Image Users,base_conditional_image.model_conditional_image,base.group_user,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_conditional_image Conditional Image base_conditional_image.model_conditional_image base.group_no_one 1 1 1 1
3 access_conditional_image_users Conditional Image Users base_conditional_image.model_conditional_image base.group_user 1 0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,472 @@
<!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>Conditional Images</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="conditional-images">
<h1 class="title">Conditional Images</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:d173ed24b043dca5005b5821998aa392db4a1a3c69b479385c7307497df1fc93
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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-tools/tree/16.0/base_conditional_image"><img alt="OCA/server-tools" src="https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/server-tools-16-0/server-tools-16-0-base_conditional_image"><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-tools&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 extends the functionality of any model to support conditional images
(based on the record attributes) and to manage them either globally or by company.</p>
<p>The main goal behind this module is to avoid storing the same image multiple times.
For example, for every partner, there is a related image (most of the time, its the default one).
With this module properly set up, it will be stored only one time and you can change it whenever you want for all partners.</p>
<p><strong>WARNING</strong>: this module cannot be used on the same objects using the module <cite>base_multi_image</cite>.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#installation" id="toc-entry-1">Installation</a></li>
<li><a class="reference internal" href="#usage" id="toc-entry-2">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-5">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-6">Contributors</a></li>
<li><a class="reference internal" href="#other-credits" id="toc-entry-7">Other credits</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-8">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="installation">
<h1><a class="toc-backref" href="#toc-entry-1">Installation</a></h1>
<p>The sole purpose of this module is to add an abstract model to be inherited.
So, you will not notice any changes on install.</p>
<p>To develop using this module, you have to inherit the abstract model <cite>conditional.image.consumer.mixin</cite>
to the model that needs the conditional images:</p>
<pre class="literal-block">
class ResPartner(models.Model):
_inherit = ['res.partner', 'conditional.image.consumer.mixin']
_name = 'res.partner'
</pre>
<p>Then, configure how the images will be selected for each record.</p>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-2">Usage</a></h1>
<p>Go to <em>Technical Settings &gt; Settings &gt; Images</em> to configure all the images.
You can define images for specific objects, depending on the attributes and the company of the object.</p>
<p>The <cite>selector</cite> should return a boolean expression. All fields of the object are available to compute the result.</p>
<p>The system will first try to match an image with a company set up, then with the ones without a company.
If your object does not have a <cite>company_id</cite> field, this check will be ignored and only images without a company will be used.</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-3">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/server-tools/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-tools/issues/new?body=module:%20base_conditional_image%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-4">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-5">Authors</a></h2>
<ul class="simple">
<li>Camptocamp</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-6">Contributors</a></h2>
<ul class="simple">
<li><dl class="first docutils">
<dt><a class="reference external" href="https://camptocamp.com/">Camptocamp</a>:</dt>
<dd><ul class="first last">
<li>Patrick Tombez &lt;<a class="reference external" href="mailto:patrick.tombez&#64;camptocamp.com">patrick.tombez&#64;camptocamp.com</a>&gt;</li>
<li>Denis Leemann &lt;<a class="reference external" href="mailto:denis.leemann&#64;camptocamp.com">denis.leemann&#64;camptocamp.com</a>&gt;</li>
</ul>
</dd>
</dl>
</li>
<li><dl class="first docutils">
<dt><a class="reference external" href="https://trobz.com">Trobz</a>:</dt>
<dd><ul class="first last">
<li>Son Ho &lt;<a class="reference external" href="mailto:sonhd&#64;trobz.com">sonhd&#64;trobz.com</a>&gt;</li>
</ul>
</dd>
</dl>
</li>
</ul>
</div>
<div class="section" id="other-credits">
<h2><a class="toc-backref" href="#toc-entry-7">Other credits</a></h2>
<p>The migration of this module from 12.0 to 14.0 was financially supported by Camptocamp</p>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-8">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-tools/tree/16.0/base_conditional_image">OCA/server-tools</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,60 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="view_conditional_image_tree" model="ir.ui.view">
<field name="name">conditional.image.tree</field>
<field name="model">conditional.image</field>
<field name="arch" type="xml">
<tree>
<field name="name" />
<field name="model_name" />
<field name="company_id" />
<field name="selector" />
</tree>
</field>
</record>
<record id="view_conditional_image_form" model="ir.ui.view">
<field name="name">conditional.image.form</field>
<field name="model">conditional.image</field>
<field name="arch" type="xml">
<form string="Conditional Image">
<group>
<group>
<field name="name" />
<field name="model_name" />
<field name="company_id" />
</group>
<group>
<field
name="image_1920"
widget='image'
class="oe_avatar"
options='{"preview_image": "image_1920"}'
/>
</group>
<group string="Selector">
<field
name="selector"
nolabel="True"
widget="ace"
options="{'mode': 'python'}"
/>
</group>
</group>
</form>
</field>
</record>
<record id="conditional_image_action" model="ir.actions.act_window">
<field name="name">Conditional Images</field>
<field name="res_model">conditional.image</field>
<field name="view_mode">tree,form</field>
</record>
<record model="ir.ui.menu" id="conditional_image_menu">
<field name="name">Conditional Images</field>
<field name="parent_id" ref="base.menu_ir_property" />
<field name="action" ref="conditional_image_action" />
<field name="sequence" eval="99" />
</record>
</odoo>

View file

@ -0,0 +1,32 @@
# Architecture
```mermaid
flowchart TD
U[Users] -->|HTTP| V[Views and QWeb Templates]
V --> C[Controllers]
V --> W[Wizards Transient Models]
C --> M[Models and ORM]
W --> M
M --> R[Reports]
DX[Data XML] --> M
S[Security ACLs and Groups] -. enforces .-> M
subgraph Base_conditional_image Module - base_conditional_image
direction LR
M:::layer
W:::layer
C:::layer
V:::layer
R:::layer
S:::layer
DX:::layer
end
classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px
```
Notes
- Views include tree/form/kanban templates and report templates.
- Controllers provide website/portal routes when present.
- Wizards are UI flows implemented with `models.TransientModel`.
- Data XML loads data/demo records; Security defines groups and access.

View file

@ -0,0 +1,3 @@
# Configuration
Refer to Odoo settings for base_conditional_image. Configure related models, access rights, and options as needed.

View file

@ -0,0 +1,3 @@
# Controllers
This module does not define custom HTTP controllers.

View file

@ -0,0 +1,5 @@
# Dependencies
This addon depends on:
- base

View file

@ -0,0 +1,4 @@
# FAQ
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
- Q: How to enable? A: Start server with --addon base_conditional_image or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-server-tools-base_conditional_image"
# or
uv pip install odoo-bringout-oca-server-tools-base_conditional_image"
```

View file

@ -0,0 +1,14 @@
# Models
Detected core models and extensions in base_conditional_image.
```mermaid
classDiagram
class conditional_image
class conditional_image_consumer_mixin
class image_mixin
```
Notes
- Classes show model technical names; fields omitted for brevity.
- Items listed under _inherit are extensions of existing models.

View file

@ -0,0 +1,6 @@
# Overview
Packaged Odoo addon: base_conditional_image. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon base_conditional_image
- License: LGPL-3

View file

@ -0,0 +1,3 @@
# Reports
This module does not define custom reports.

View file

@ -0,0 +1,34 @@
# Security
Access control and security definitions in base_conditional_image.
## Access Control Lists (ACLs)
Model access permissions defined in:
- **[ir.model.access.csv](../base_conditional_image/security/ir.model.access.csv)**
- 2 model access rules
## Record Rules
Row-level security rules defined in:
```mermaid
graph TB
subgraph "Security Layers"
A[Users] --> B[Groups]
B --> C[Access Control Lists]
C --> D[Models]
B --> E[Record Rules]
E --> F[Individual Records]
end
```
Security files overview:
- **[ir.model.access.csv](../base_conditional_image/security/ir.model.access.csv)**
- Model access permissions (CRUD rights)
Notes
- Access Control Lists define which groups can access which models
- Record Rules provide row-level security (filter records by user/group)
- Security groups organize users and define permission sets
- All security is enforced at the ORM level by Odoo

View file

@ -0,0 +1,5 @@
# Troubleshooting
- Ensure Python and Odoo environment matches repo guidance.
- Check database connectivity and logs if startup fails.
- Validate that dependent addons listed in DEPENDENCIES.md are installed.

View file

@ -0,0 +1,7 @@
# Usage
Start Odoo including this addon (from repo root):
```bash
python3 scripts/nix_odoo_web_server.py --db-name mydb --addon base_conditional_image
```

View file

@ -0,0 +1,3 @@
# Wizards
This module does not include UI wizards.

View file

@ -0,0 +1,42 @@
[project]
name = "odoo-bringout-oca-server-tools-base_conditional_image"
version = "16.0.0"
description = "Conditional Images - This module extends the functionality to support conditional images"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-base>=16.0.0",
"requests>=2.25.1"
]
readme = "README.md"
requires-python = ">= 3.11"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]
[project.urls]
homepage = "https://github.com/bringout/0"
repository = "https://github.com/bringout/0"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["base_conditional_image"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]