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 @@
# Sequence from Python expression
Odoo addon: sequence_python
## Installation
```bash
pip install odoo-bringout-oca-server-tools-sequence_python
```
## Dependencies
This addon depends on:
- base
## Manifest Information
- **Name**: Sequence from Python expression
- **Version**: 16.0.1.0.0
- **Category**: Generic Modules
- **License**: AGPL-3
- **Installable**: False
## Source
Based on [OCA/server-tools](https://github.com/OCA/server-tools) branch 16.0, addon `sequence_python`.
## 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,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 Sequence_python Module - sequence_python
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 sequence_python. 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 sequence_python or install in UI.

View file

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

View file

@ -0,0 +1,12 @@
# Models
Detected core models and extensions in sequence_python.
```mermaid
classDiagram
class ir_sequence
```
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: sequence_python. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon sequence_python
- License: LGPL-3

View file

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

View file

@ -0,0 +1,8 @@
# Security
This module does not define custom security rules or access controls beyond Odoo defaults.
Default Odoo security applies:
- Base user access through standard groups
- Model access inherited from dependencies
- No custom row-level security rules

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 sequence_python
```

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-sequence_python"
version = "16.0.0"
description = "Sequence from Python expression - Calculate a sequence number from a Python expression"
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 = ["sequence_python"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]

View file

@ -0,0 +1,117 @@
===============================
Sequence from Python expression
===============================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:2577b1699eaf32186615d1426d69a461c185cd70423a76700e336c09cf5c7056
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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/sequence_python
: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-sequence_python
: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 allows to generate a sequence by a Python formula expression.
Besides common Python functions and operators, it provides several functions
like 'random' and 'uuid' in the expression, as well as variables such as the
next number in the sequence. These are also listed next to the input field
on the sequence form view.
If you want to add more variables for use in the expression, you can extend
this module.
Use cases for this module could be:
- You want to generate alphanumeric numbering
- You want to apply some math to the number to prevent customers from knowing
their place in the sequence
- You want to use UUID
**Table of contents**
.. contents::
:local:
Usage
=====
To use this module, you need to:
* Go to the form view of an `ir.sequence` record
* Go to the Python tab
* Enable the 'Use Python' checkbox
* Change the default 'number' expression to something more fancy.
Examples:
.. code-block:: python
# To separate the Odoo-generated number with hyphens eg. 0-0-0-0-1
'-'.join(number_padded)
# To have an UUID as the sequence value
uuid.uuid4().hex
# To use an 8-digit binary number
'{0:#010b}'.format(number + 300)[2:]
And so on.
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:%20sequence_python%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
~~~~~~~
* Sunflower IT
Contributors
~~~~~~~~~~~~
* Tom Blauwendraat <tom@sunflowerweb.nl>
* Francesco Apruzzese <cescoap@gmail.com>
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/server-tools <https://github.com/OCA/server-tools/tree/16.0/sequence_python>`_ 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,13 @@
# Copyright 2020 ACSONE SA/NV (<http://acsone.eu>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
{
"name": "Sequence from Python expression",
"summary": """Calculate a sequence number from a Python expression""",
"author": "Sunflower IT,Odoo Community Association (OCA)",
"website": "https://github.com/OCA/server-tools",
"version": "16.0.1.0.0",
"license": "AGPL-3",
"category": "Generic Modules",
"depends": ["base"],
"data": ["views/ir_sequence.xml"],
}

View file

@ -0,0 +1,113 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sequence_python
#
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: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "<code>number</code>: The next number of the sequence (integer)"
msgstr "<code>number</code>: The next number of the sequence (integer)"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"<code>number_padded</code>: Padded string of the next number of the sequence"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"<code>random</code>: The Python random module, eg. to use "
"<code>random.randint(0, 9)</code>"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "<code>sequence</code>: Odoo record of the sequence being used"
msgstr "<code>sequence</code>: Odoo record of the sequence being used"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"<code>string</code>: The Python string module, eg. to use "
"<code>random.choices(string.ascii_letters + string.digits, k=4)</code>"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"<code>uuid</code>: The Python uuid module, eg. to use "
"<code>uuid.uuid4()</code>"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "Aside from this, you may use several"
msgstr "Aside from this, you may use several"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "Help with Python expressions"
msgstr "Pomoć sa Python izrazima"
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__python_code_preview
msgid "Preview"
msgstr "Pregled"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "Python Code"
msgstr "Python Kod"
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__python_code
msgid "Python expression"
msgstr "Python ekspresija"
#. module: sequence_python
#: model:ir.model,name:sequence_python.model_ir_sequence
msgid "Sequence"
msgstr "Sekvenca"
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__smart_search
msgid "Smart Search"
msgstr "Pametna pretraga"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"The expression you type here will be evaluated as the next number. The "
"following variables can be used:"
msgstr ""
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__use_python_code
msgid "Use Python"
msgstr "Use Python"
#. module: sequence_python
#: model:ir.model.fields,help:sequence_python.field_ir_sequence__python_code
msgid "Write Python code that generates the sequence body."
msgstr "Write Python code that generates the sequence body."
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "builtin Python functions"
msgstr "builtin Python functions"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "number"
msgstr "number"

View file

@ -0,0 +1,129 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sequence_python
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "<code>number</code>: The next number of the sequence (integer)"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"<code>number_padded</code>: Padded string of the next number of the sequence"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"<code>random</code>: The Python random module, eg. to use "
"<code>random.randint(0, 9)</code>"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "<code>sequence</code>: Odoo record of the sequence being used"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"<code>string</code>: The Python string module, eg. to use "
"<code>random.choices(string.ascii_letters + string.digits, k=4)</code>"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"<code>uuid</code>: The Python uuid module, eg. to use "
"<code>uuid.uuid4()</code>"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "Aside from this, you may use several"
msgstr ""
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__display_name
msgid "Display Name"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "Help with Python expressions"
msgstr ""
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__id
msgid "ID"
msgstr ""
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence____last_update
msgid "Last Modified on"
msgstr ""
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__python_code_preview
msgid "Preview"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "Python Code"
msgstr ""
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__python_code
msgid "Python expression"
msgstr ""
#. module: sequence_python
#: model:ir.model,name:sequence_python.model_ir_sequence
msgid "Sequence"
msgstr ""
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__smart_search
msgid "Smart Search"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"The expression you type here will be evaluated as the next number. The "
"following variables can be used:"
msgstr ""
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__use_python_code
msgid "Use Python"
msgstr ""
#. module: sequence_python
#: model:ir.model.fields,help:sequence_python.field_ir_sequence__python_code
msgid "Write Python code that generates the sequence body."
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "builtin Python functions"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "number"
msgstr ""

View file

@ -0,0 +1,141 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sequence_python
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2022-09-05 01:07+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: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "<code>number</code>: The next number of the sequence (integer)"
msgstr "<code>number</code>: El siguiente número de la secuencia (entero)"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"<code>number_padded</code>: Padded string of the next number of the sequence"
msgstr ""
"<code>number_padded</code>: Relleno del siguiente número de la secuencia"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"<code>random</code>: The Python random module, eg. to use "
"<code>random.randint(0, 9)</code>"
msgstr ""
"<code>random</code>: El módulo aleatorio de Python, ej. para utilizar "
"<code>random.randint(0, 9)</code>"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "<code>sequence</code>: Odoo record of the sequence being used"
msgstr ""
"<code>sequence</code>: Registro Odoo de la secuencia que se está utilizando"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"<code>string</code>: The Python string module, eg. to use "
"<code>random.choices(string.ascii_letters + string.digits, k=4)</code>"
msgstr ""
"<code>string</code>: El módulo string de Python, ej. para utilizar "
"<code>random.choices(string.ascii_letters + string.digits, k=4)</code>"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"<code>uuid</code>: The Python uuid module, eg. to use "
"<code>uuid.uuid4()</code>"
msgstr ""
"<code>uuid</code>: El módulo uuid de Python, ej. para utilizar <code>uuid."
"uuid4()</code>"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "Aside from this, you may use several"
msgstr "Aparte de esto, puede utilizar varios"
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__display_name
msgid "Display Name"
msgstr "Mostrar Nombre"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "Help with Python expressions"
msgstr "Ayuda con expresiones Python"
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__id
msgid "ID"
msgstr "ID"
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence____last_update
msgid "Last Modified on"
msgstr "Última modificación en"
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__python_code_preview
msgid "Preview"
msgstr "Previsualización"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "Python Code"
msgstr "Código de Python"
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__python_code
msgid "Python expression"
msgstr "Expresión de Python"
#. module: sequence_python
#: model:ir.model,name:sequence_python.model_ir_sequence
msgid "Sequence"
msgstr "Secuencia"
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__smart_search
msgid "Smart Search"
msgstr "Búsqueda Inteligente"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"The expression you type here will be evaluated as the next number. The "
"following variables can be used:"
msgstr ""
"La expresión que escriba acá se evaluará como el siguiente número. Se pueden "
"utilizar las siguientes variables:"
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__use_python_code
msgid "Use Python"
msgstr "Usar Python"
#. module: sequence_python
#: model:ir.model.fields,help:sequence_python.field_ir_sequence__python_code
msgid "Write Python code that generates the sequence body."
msgstr "Escriba el código de Python que genera el cuerpo de la secuencia."
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "builtin Python functions"
msgstr "Funciones de Python incorporadas"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "number"
msgstr "number"

View file

@ -0,0 +1,126 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sequence_python
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-11-13 10: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: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "<code>number</code>: The next number of the sequence (integer)"
msgstr "<code>number</code>: il numero successivo della sequenza (intero)"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"<code>number_padded</code>: Padded string of the next number of the sequence"
msgstr ""
"<code>number_padded</code>: stringa riempita del numero successivo della "
"sequenza"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"<code>random</code>: The Python random module, eg. to use "
"<code>random.randint(0, 9)</code>"
msgstr ""
"<code>random</code>: il modulo random Python, es. da usare <code>random."
"randint(0, 9)</code>"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "<code>sequence</code>: Odoo record of the sequence being used"
msgstr "<code>sequence</code>: record Odoo della sequenza in uso"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"<code>string</code>: The Python string module, eg. to use "
"<code>random.choices(string.ascii_letters + string.digits, k=4)</code>"
msgstr ""
"<code>string</code>: il modulo stringa Python, es.da usare <code>random."
"choices(string.ascii_letters + string.digits, k=4)</code>"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"<code>uuid</code>: The Python uuid module, eg. to use "
"<code>uuid.uuid4()</code>"
msgstr ""
"<code>uuid</code>: il modulo uuid Python da usare, es. da usare <code>uuid."
"uuid4()</code>"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "Aside from this, you may use several"
msgstr "Oltre a questo, si possono usare diversi"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "Help with Python expressions"
msgstr "Aiuto con espressioni Python"
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__python_code_preview
msgid "Preview"
msgstr "Anteprima"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "Python Code"
msgstr "Codice Python"
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__python_code
msgid "Python expression"
msgstr "Espressione Python"
#. module: sequence_python
#: model:ir.model,name:sequence_python.model_ir_sequence
msgid "Sequence"
msgstr "Sequenza"
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__smart_search
msgid "Smart Search"
msgstr "Ricerca intelligente"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"The expression you type here will be evaluated as the next number. The "
"following variables can be used:"
msgstr ""
"L'espressione inserita qui verrà valutata come il numero successivo. Si "
"possono usare le seguenti variabili:"
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__use_python_code
msgid "Use Python"
msgstr "Usa Python"
#. module: sequence_python
#: model:ir.model.fields,help:sequence_python.field_ir_sequence__python_code
msgid "Write Python code that generates the sequence body."
msgstr "Scrivere il codice Python che genera il corpo della sequenza."
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "builtin Python functions"
msgstr "funzioni Python incorporate"
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "number"
msgstr "numero"

View file

@ -0,0 +1,113 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sequence_python
#
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: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "<code>number</code>: The next number of the sequence (integer)"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"<code>number_padded</code>: Padded string of the next number of the sequence"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"<code>random</code>: The Python random module, eg. to use "
"<code>random.randint(0, 9)</code>"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "<code>sequence</code>: Odoo record of the sequence being used"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"<code>string</code>: The Python string module, eg. to use "
"<code>random.choices(string.ascii_letters + string.digits, k=4)</code>"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"<code>uuid</code>: The Python uuid module, eg. to use "
"<code>uuid.uuid4()</code>"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "Aside from this, you may use several"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "Help with Python expressions"
msgstr ""
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__python_code_preview
msgid "Preview"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "Python Code"
msgstr ""
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__python_code
msgid "Python expression"
msgstr ""
#. module: sequence_python
#: model:ir.model,name:sequence_python.model_ir_sequence
msgid "Sequence"
msgstr ""
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__smart_search
msgid "Smart Search"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid ""
"The expression you type here will be evaluated as the next number. The "
"following variables can be used:"
msgstr ""
#. module: sequence_python
#: model:ir.model.fields,field_description:sequence_python.field_ir_sequence__use_python_code
msgid "Use Python"
msgstr ""
#. module: sequence_python
#: model:ir.model.fields,help:sequence_python.field_ir_sequence__python_code
msgid "Write Python code that generates the sequence body."
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "builtin Python functions"
msgstr ""
#. module: sequence_python
#: model_terms:ir.ui.view,arch_db:sequence_python.sequence_view
msgid "number"
msgstr ""

View file

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

View file

@ -0,0 +1,85 @@
# Copyright 2020 Sunflower IT (<https://sunflowerweb.nl>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import logging
import random
import string
import uuid
from inspect import getmembers, isclass, isfunction
from odoo import fields, models
from odoo.tools.safe_eval import safe_eval, wrap_module
_logger = logging.getLogger(__name__)
DEFAULT_PYTHON_CODE = "number_padded"
class IrSequence(models.Model):
"""
Inherit standard ir.sequence to let the possibility of using a Python formula
to calculate the sequence from input variables such as the sequence number.
This allows obfuscation of the order in which sequences are given out,
but can also be used for any other purpose.
"""
_inherit = "ir.sequence"
# Python code
use_python_code = fields.Boolean(string="Use Python", default=False)
python_code = fields.Text(
string="Python expression",
default=DEFAULT_PYTHON_CODE,
help="Write Python code that generates the sequence body.",
)
python_code_preview = fields.Char("Preview", compute="_compute_python_code_preview")
def _get_python_eval_context(self, number_next):
"""
Get the eval context to evaluate the Python code with.
The format is (variable name, description, value)
You can inherit this in your custom module.
:return: tuple
"""
wrap_random = wrap_module(random, random.__all__)
uuid_elements = [e[0] for e in getmembers(uuid, isfunction)] + [
e[0] for e in getmembers(uuid, isclass)
]
wrap_uuid = wrap_module(uuid, uuid_elements)
wrap_string = wrap_module(string, string.__all__)
return {
"number": number_next[0] if isinstance(number_next, tuple) else number_next,
"number_padded": "%%0%sd" % self.padding % number_next,
"sequence": self,
"random": wrap_random,
"uuid": wrap_uuid,
"string": wrap_string,
}
def _get_python_value(self, number_next):
"""
Use the python formula to get the value.
:return: string
"""
eval_context = self._get_python_eval_context(number_next)
return safe_eval(self.python_code.strip(), eval_context)
def _compute_python_code_preview(self):
for this in self:
try:
this.python_code_preview = self.get_next_char(
(self.number_next_actual,)
)
except Exception as e: # noqa
this.python_code_preview = str(e)
def get_next_char(self, number_next):
if self.use_python_code:
interpolated_prefix, interpolated_suffix = self._get_prefix_suffix()
return (
interpolated_prefix
+ self._get_python_value(number_next)
+ interpolated_suffix
)
else:
return super(IrSequence, self).get_next_char(number_next)

View file

@ -0,0 +1,2 @@
* Tom Blauwendraat <tom@sunflowerweb.nl>
* Francesco Apruzzese <cescoap@gmail.com>

View file

@ -0,0 +1,16 @@
This module allows to generate a sequence by a Python formula expression.
Besides common Python functions and operators, it provides several functions
like 'random' and 'uuid' in the expression, as well as variables such as the
next number in the sequence. These are also listed next to the input field
on the sequence form view.
If you want to add more variables for use in the expression, you can extend
this module.
Use cases for this module could be:
- You want to generate alphanumeric numbering
- You want to apply some math to the number to prevent customers from knowing
their place in the sequence
- You want to use UUID

View file

@ -0,0 +1,21 @@
To use this module, you need to:
* Go to the form view of an `ir.sequence` record
* Go to the Python tab
* Enable the 'Use Python' checkbox
* Change the default 'number' expression to something more fancy.
Examples:
.. code-block:: python
# To separate the Odoo-generated number with hyphens eg. 0-0-0-0-1
'-'.join(number_padded)
# To have an UUID as the sequence value
uuid.uuid4().hex
# To use an 8-digit binary number
'{0:#010b}'.format(number + 300)[2:]
And so on.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,460 @@
<!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>Sequence from Python expression</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="sequence-from-python-expression">
<h1 class="title">Sequence from Python expression</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:2577b1699eaf32186615d1426d69a461c185cd70423a76700e336c09cf5c7056
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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/sequence_python"><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-sequence_python"><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 allows to generate a sequence by a Python formula expression.</p>
<p>Besides common Python functions and operators, it provides several functions
like random and uuid in the expression, as well as variables such as the
next number in the sequence. These are also listed next to the input field
on the sequence form view.</p>
<p>If you want to add more variables for use in the expression, you can extend
this module.</p>
<p>Use cases for this module could be:</p>
<ul class="simple">
<li>You want to generate alphanumeric numbering</li>
<li>You want to apply some math to the number to prevent customers from knowing
their place in the sequence</li>
<li>You want to use UUID</li>
</ul>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="toc-entry-1">Usage</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="usage">
<h1><a class="toc-backref" href="#toc-entry-1">Usage</a></h1>
<p>To use this module, you need to:</p>
<ul class="simple">
<li>Go to the form view of an <cite>ir.sequence</cite> record</li>
<li>Go to the Python tab</li>
<li>Enable the Use Python checkbox</li>
<li>Change the default number expression to something more fancy.</li>
</ul>
<p>Examples:</p>
<pre class="code python literal-block">
<span class="c1"># To separate the Odoo-generated number with hyphens eg. 0-0-0-0-1</span><span class="w">
</span><span class="s1">'-'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">number_padded</span><span class="p">)</span><span class="w">
</span><span class="c1"># To have an UUID as the sequence value</span><span class="w">
</span><span class="n">uuid</span><span class="o">.</span><span class="n">uuid4</span><span class="p">()</span><span class="o">.</span><span class="n">hex</span><span class="w">
</span><span class="c1"># To use an 8-digit binary number</span><span class="w">
</span><span class="s1">'</span><span class="si">{0:#010b}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">number</span> <span class="o">+</span> <span class="mi">300</span><span class="p">)[</span><span class="mi">2</span><span class="p">:]</span>
</pre>
<p>And so on.</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-2">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:%20sequence_python%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-3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-4">Authors</a></h2>
<ul class="simple">
<li>Sunflower IT</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-5">Contributors</a></h2>
<ul class="simple">
<li>Tom Blauwendraat &lt;<a class="reference external" href="mailto:tom&#64;sunflowerweb.nl">tom&#64;sunflowerweb.nl</a>&gt;</li>
<li>Francesco Apruzzese &lt;<a class="reference external" href="mailto:cescoap&#64;gmail.com">cescoap&#64;gmail.com</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-6">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/sequence_python">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,3 @@
# Copyright 2020 ACSONE SA/NV (<http://acsone.eu>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import test_ir_sequence

View file

@ -0,0 +1,39 @@
# Copyright 2020 ACSONE SA/NV (<http://acsone.eu>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo.tests.common import TransactionCase
class TestIrSequence(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.Sequence = cls.env["ir.sequence"]
cls.sequence = cls.Sequence.create(
{
"name": "Test sequence",
"implementation": "standard",
"code": "test.python.sequence",
"prefix": "A",
"padding": 2,
"number_next": 1,
"number_increment": 1,
"company_id": False,
"use_python_code": True,
"python_code": "'B' + number_padded + 'C'",
}
)
def test_standard_sequence(self):
self.assertEqual(self.sequence.python_code_preview, "AB01C")
next_number = self.sequence._next()
self.assertEqual(next_number, "AB01C")
next_number = self.sequence._next()
self.assertEqual(next_number, "AB02C")
def test_nogap_sequence(self):
self.sequence.write(dict(implementation="no_gap"))
next_number = self.sequence._next()
self.assertEqual(next_number, "AB01C")
next_number = self.sequence._next()
self.assertEqual(next_number, "AB02C")

View file

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="sequence_view" model="ir.ui.view">
<field name="model">ir.sequence</field>
<field name="inherit_id" ref="base.sequence_view" />
<field name="arch" type="xml">
<xpath expr="//notebook" position="inside">
<page name="code" string="Python Code">
<group>
<field name="use_python_code" />
<field
name="python_code"
widget="ace"
options="{'mode': 'python'}"
placeholder="number"
attrs="{'invisible': [('use_python_code', '=', False)]}"
/>
<field
name="python_code_preview"
attrs="{'invisible': [('use_python_code', '=', False)]}"
/>
</group>
<div style="margin-top: 4px;">
<h3>Help with Python expressions</h3>
<p
>The expression you type here will be evaluated as the next number. The following variables can be used:</p>
<ul>
<li><code
>number</code>: The next number of the sequence (integer)</li>
<li><code
>number_padded</code>: Padded string of the next number of the sequence</li>
<li><code
>sequence</code>: Odoo record of the sequence being used</li>
<li><code
>uuid</code>: The Python uuid module, eg. to use <code
>uuid.uuid4()</code></li>
<li><code
>random</code>: The Python random module, eg. to use <code
>random.randint(0, 9)</code></li>
<li><code
>string</code>: The Python string module, eg. to use <code
>random.choices(string.ascii_letters + string.digits, k=4)</code></li>
</ul>
<p>Aside from this, you may use several <a
href="https://github.com/odoo/odoo/blob/13.0/odoo/tools/safe_eval.py#L271"
>builtin Python functions</a></p>
</div>
</page>
</xpath>
</field>
</record>
</odoo>