odoo-toolkit 3.2.0__tar.gz → 3.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. odoo_toolkit-3.3.0/.claude/settings.local.json +16 -0
  2. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/PKG-INFO +1 -1
  3. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/common.py +17 -11
  4. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/dev/start.py +49 -51
  5. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/docker/compose.yaml +39 -11
  6. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/docker/odoo/.bash_aliases +6 -5
  7. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/docker/odoo/17.0.Dockerfile +2 -2
  8. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/docker/odoo/18.0.Dockerfile +4 -4
  9. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/docker/odoo/18.4.Dockerfile +4 -4
  10. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/docker/odoo/19.0.Dockerfile +5 -4
  11. odoo_toolkit-3.2.0/odoo_toolkit/docker/odoo/master.Dockerfile → odoo_toolkit-3.3.0/odoo_toolkit/docker/odoo/19.3.Dockerfile +9 -5
  12. odoo_toolkit-3.3.0/odoo_toolkit/docker/odoo/master.Dockerfile +232 -0
  13. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/multiverse_config/.vscode/launch.json +29 -11
  14. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/multiverse_config/.vscode/settings.json +23 -1
  15. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/mv/common.py +1 -1
  16. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/mv/reset.py +12 -3
  17. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/mv/setup.py +208 -154
  18. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/po/create.py +2 -2
  19. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/po/export.py +192 -86
  20. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/po/update.py +2 -2
  21. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/wl/autotranslate.py +72 -64
  22. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/wl/common.py +62 -10
  23. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/wl/config.py +4 -5
  24. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/wl/copy.py +99 -49
  25. odoo_toolkit-3.3.0/odoo_toolkit/wl/download.py +269 -0
  26. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/wl/update_components.py +3 -1
  27. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/wl/upload.py +93 -65
  28. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/pyproject.toml +1 -1
  29. odoo_toolkit-3.3.0/uv.lock +472 -0
  30. odoo_toolkit-3.2.0/odoo_toolkit/wl/download.py +0 -166
  31. odoo_toolkit-3.2.0/uv.lock +0 -470
  32. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/.gitignore +0 -0
  33. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/.vscode/settings.json +0 -0
  34. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/LICENSE +0 -0
  35. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/README.md +0 -0
  36. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/images/mailpit.png +0 -0
  37. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/__init__.py +0 -0
  38. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/__main__.py +0 -0
  39. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/dev/__init__.py +0 -0
  40. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/dev/common.py +0 -0
  41. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/dev/start_db.py +0 -0
  42. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/dev/stop.py +0 -0
  43. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/docker/odoo/append.bashrc +0 -0
  44. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/docker/odoo/starship.toml +0 -0
  45. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/docker/odoo/startup.sh +0 -0
  46. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/docker/pgadmin/servers.json +0 -0
  47. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/main.py +0 -0
  48. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/multiverse_config/.vscode/extensions.json +0 -0
  49. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/multiverse_config/requirements.txt +0 -0
  50. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/multiverse_config/ruff.toml +0 -0
  51. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/mv/__init__.py +0 -0
  52. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/mv/switch.py +0 -0
  53. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/po/__init__.py +0 -0
  54. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/po/cldr-common-47/LICENSE +0 -0
  55. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/po/cldr-common-47/common/dtd/ldmlSupplemental.dtd +0 -0
  56. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/po/cldr-common-47/common/supplemental/plurals.xml +0 -0
  57. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/po/cldr.csv +0 -0
  58. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/po/common.py +0 -0
  59. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/wl/__init__.py +0 -0
  60. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/odoo_toolkit/wl/update_teams.py +0 -0
  61. {odoo_toolkit-3.2.0 → odoo_toolkit-3.3.0}/tests/__init__.py +0 -0
@@ -0,0 +1,16 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "WebFetch(domain:github.com)",
5
+ "WebFetch(domain:docs.weblate.org)",
6
+ "WebSearch",
7
+ "WebFetch(domain:raw.githubusercontent.com)",
8
+ "Bash(curl -s \"https://raw.githubusercontent.com/WeblateOrg/weblate/weblate-5.17/weblate/api/urls.py\")",
9
+ "Bash(curl -s \"https://raw.githubusercontent.com/WeblateOrg/weblate/weblate-5.17/weblate/api/views.py\")",
10
+ "Bash(curl -s \"https://raw.githubusercontent.com/WeblateOrg/weblate/weblate-5.17/weblate/api/pagination.py\")",
11
+ "Bash(curl -s \"https://raw.githubusercontent.com/WeblateOrg/weblate/weblate-5.17/weblate/trans/views/files.py\")",
12
+ "Bash(curl -s \"https://raw.githubusercontent.com/WeblateOrg/weblate/weblate-5.17/weblate/utils/views.py\")",
13
+ "Bash(uv run *)"
14
+ ]
15
+ }
16
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: odoo-toolkit
3
- Version: 3.2.0
3
+ Version: 3.3.0
4
4
  Summary: This toolkit contains a few useful tools for Odoo development.
5
5
  Author-email: Dylan Kiss <dyki@odoo.com>
6
6
  License-File: LICENSE
@@ -1,4 +1,5 @@
1
1
  import importlib.util
2
+ import re
2
3
  import time
3
4
  from collections.abc import Callable, Collection, Iterable
4
5
  from concurrent.futures import Future
@@ -213,7 +214,7 @@ def get_valid_modules_to_path_mapping(
213
214
  com_path: Path,
214
215
  ent_path: Path,
215
216
  extra_addons_paths: Iterable[Path] = EMPTY_LIST,
216
- filter_fn: Callable[[Path], bool] | None = None,
217
+ include_path: Callable[[Path], bool] = lambda _: True,
217
218
  ) -> dict[str, Path]:
218
219
  """Determine the valid modules and their directories.
219
220
 
@@ -221,8 +222,8 @@ def get_valid_modules_to_path_mapping(
221
222
  :param com_path: The Odoo Community repository.
222
223
  :param ent_path: The Odoo Enterprise repository.
223
224
  :param extra_addons_paths: Optional extra directories containing Odoo modules, defaults to `[]`.
224
- :param filter_fn: A function to filter the modules when using `all`, `community`, or `enterprise`,
225
- defaults to `None`.
225
+ :param include_path: A function to include modules when using `all`, `community`, or `enterprise`,
226
+ defaults to always `True`.
226
227
  :return: A mapping from all valid modules to their directories.
227
228
  """
228
229
  base_module_path = com_path.expanduser().resolve() / "odoo" / "addons"
@@ -239,22 +240,22 @@ def get_valid_modules_to_path_mapping(
239
240
  # Determine all modules to consider.
240
241
  modules_to_consider: dict[str, Path] = {}
241
242
  if "all" in modules:
242
- modules_to_consider.update((m, p) for m, p in all_modules.items() if not filter_fn or filter_fn(p))
243
+ modules_to_consider.update((m, p) for m, p in all_modules.items() if include_path(p))
243
244
  if "community" in modules:
244
- modules_to_consider.update((m, p) for m, p in com_modules.items() if not filter_fn or filter_fn(p))
245
+ modules_to_consider.update((m, p) for m, p in com_modules.items() if include_path(p))
245
246
  if "enterprise" in modules:
246
- modules_to_consider.update((m, p) for m, p in ent_modules.items() if not filter_fn or filter_fn(p))
247
+ modules_to_consider.update((m, p) for m, p in ent_modules.items() if include_path(p))
247
248
  if "community-l10n" in modules:
248
249
  modules_to_consider.update(
249
- (m, p) for m, p in com_modules.items() if is_l10n_module(m) and (not filter_fn or filter_fn(p))
250
+ (m, p) for m, p in com_modules.items() if is_l10n_module(m) and include_path(p)
250
251
  )
251
252
  if "enterprise-l10n" in modules:
252
253
  modules_to_consider.update(
253
- (m, p) for m, p in ent_modules.items() if is_l10n_module(m) and (not filter_fn or filter_fn(p))
254
+ (m, p) for m, p in ent_modules.items() if is_l10n_module(m) and include_path(p)
254
255
  )
255
256
  modules_to_consider.update(
256
257
  (m, p) for m, p in all_modules.items()
257
- if any(fnmatch(m, mp) for mp in modules) and (not filter_fn or filter_fn(p))
258
+ if any(fnmatch(m, mp) for mp in modules) and include_path(p)
258
259
  )
259
260
 
260
261
  return modules_to_consider
@@ -319,8 +320,13 @@ def get_odoo_version(odoo_repo: Path) -> float | None:
319
320
  spec.loader.exec_module(module)
320
321
 
321
322
  if hasattr(module, attribute_name):
322
- raw_version = getattr(module, attribute_name)
323
- return float(raw_version[0] + (raw_version[1] / 10))
323
+ major, minor, *_ = getattr(module, attribute_name)
324
+ if isinstance(major, str):
325
+ match = re.search(r"\d+", major)
326
+ if not match:
327
+ return None
328
+ major = int(match.group())
329
+ return float(major + (minor / 10))
324
330
 
325
331
  return None
326
332
 
@@ -7,6 +7,7 @@ from pathlib import Path
7
7
  from typing import Annotated
8
8
 
9
9
  from python_on_whales import DockerException
10
+ from rich.progress import Progress
10
11
  from typer import Argument, Exit, Option, Typer
11
12
 
12
13
  from odoo_toolkit.common import (
@@ -33,7 +34,7 @@ def start(
33
34
  Argument(
34
35
  help="The Odoo branch to start a development server for, like `19.0`, `saas-19.1`, `master`.",
35
36
  ),
36
- ],
37
+ ] = "master",
37
38
  workspace: Annotated[
38
39
  Path,
39
40
  Option(
@@ -74,8 +75,8 @@ def start(
74
75
  your machine at the location specified by `-w`. Your specified workspace will be sourced in the container at the
75
76
  location `/code` and allows live code updates during local development.\n
76
77
  \n
77
- You can choose to launch a container using Ubuntu 24.04 [`-u noble`] (default, recommended starting from version
78
- 18.0) or 22.04 [`-u jammy`] (for earlier versions).\n
78
+ Depending on the version you're developing for, the right Docker container will be used. It contains the right
79
+ configuration and dependencies for that version.\n
79
80
  \n
80
81
  When you're done with the container, you can exit the session by running the `exit` command. At this point, the
81
82
  container will still be running and you can start a new session using the same `otk dev start` command.
@@ -123,38 +124,7 @@ def start(
123
124
 
124
125
  try:
125
126
  with TransientProgress() as progress:
126
- if build or build_no_cache:
127
- progress_task = progress.add_task("Building Docker image :coffee: ...", total=None)
128
- # Build Docker image if it wasn't already or when forced.
129
- output_generator = DOCKER.compose.build(
130
- [f"odoo-{odoo_version}"],
131
- stream_logs=True,
132
- cache=not build_no_cache,
133
- )
134
- for stream_type, stream_content in output_generator:
135
- # Loop through every output line to check on the progress.
136
- if stream_type != "stdout":
137
- continue
138
- match = re.search(r"(\d+)/(\d+)\]", stream_content.decode())
139
- if match:
140
- completed, total = (int(g) for g in match.groups())
141
- progress.update(
142
- progress_task,
143
- description=f"Building Docker image :coffee: ({completed}/{total + 1}) ...",
144
- total=total + 1,
145
- completed=completed,
146
- )
147
- else:
148
- # (Under)estimate progress update per log line in the longest task.
149
- progress.update(progress_task, advance=0.0002)
150
- progress.update(progress_task, description="Building Docker image :coffee: ...", total=1, completed=1)
151
- print_success("Docker image built")
152
-
153
- if not DOCKER.image.exists(f"dylankiss/odoo-dev:{odoo_version}"):
154
- progress_task = progress.add_task("Pulling Docker image :coffee: ...", total=None)
155
- DOCKER.image.pull([f"dylankiss/odoo-dev:{odoo_version}"], quiet=True, platform="linux/amd64")
156
- progress.update(progress_task, total=1, completed=1)
157
- print_success("Docker image pulled")
127
+ _ensure_docker_image(odoo_version, build, build_no_cache, progress)
158
128
 
159
129
  progress_task = progress.add_task("Starting containers ...", total=None)
160
130
  # Start the container in the background.
@@ -177,25 +147,53 @@ def start(
177
147
  raise Exit from e
178
148
 
179
149
 
150
+ def _ensure_docker_image(odoo_version: str, build: bool, build_no_cache: bool, progress: Progress) -> None:
151
+ """Build or pull the Docker image for the given Odoo version if not already present."""
152
+ if build or build_no_cache:
153
+ progress_task = progress.add_task("Building Docker image :coffee: ...", total=None)
154
+ output_generator = DOCKER.compose.build(
155
+ [f"odoo-{odoo_version}"],
156
+ stream_logs=True,
157
+ cache=not build_no_cache,
158
+ )
159
+ for stream_type, stream_content in output_generator:
160
+ if stream_type != "stdout":
161
+ continue
162
+ match = re.search(r"(\d+)/(\d+)\]", stream_content.decode())
163
+ if match:
164
+ completed, total = (int(g) for g in match.groups())
165
+ progress.update(
166
+ progress_task,
167
+ description=f"Building Docker image :coffee: ({completed}/{total + 1}) ...",
168
+ total=total + 1,
169
+ completed=completed,
170
+ )
171
+ else:
172
+ # (Under)estimate progress update per log line in the longest task.
173
+ progress.update(progress_task, advance=0.0002)
174
+ progress.update(progress_task, description="Building Docker image :coffee: ...", total=1, completed=1)
175
+ print_success("Docker image built")
176
+
177
+ if not DOCKER.image.exists(f"dylankiss/odoo-dev:{odoo_version}"):
178
+ progress_task = progress.add_task("Pulling Docker image :coffee: ...", total=None)
179
+ DOCKER.image.pull([f"dylankiss/odoo-dev:{odoo_version}"], quiet=True, platform="linux/amd64")
180
+ progress.update(progress_task, total=1, completed=1)
181
+ print_success("Docker image pulled")
182
+
183
+
180
184
  def _get_odoo_container_version_from_branch(odoo_branch: str) -> str:
181
185
  """Get the Odoo version to use for the container based on the provided Odoo branch."""
182
186
  if odoo_branch in ("master", "main"):
183
187
  return "master"
184
188
  match = re.search(r"(\d+(\.\d+)?)", odoo_branch)
185
- if match:
186
- version = float(match.group(1))
187
- if version <= 17.0: # noqa: PLR2004
188
- return "17.0"
189
- if version <= 18.0: # noqa: PLR2004
190
- return "18.0"
191
- if version <= 18.4: # noqa: PLR2004
192
- return "18.4"
193
- if version <= 19.0: # noqa: PLR2004
194
- return "19.0"
195
- if version > 19.0: # noqa: PLR2004
196
- return "master"
197
- print_warning(
198
- f"Could not determine Odoo version from branch '{odoo_branch}'. "
199
- "Falling back to 'master' version for the container.",
200
- )
189
+ if not match:
190
+ print_warning(
191
+ f"Could not determine Odoo version from branch '{odoo_branch}'. "
192
+ "Falling back to 'master' version for the container.",
193
+ )
194
+ return "master"
195
+ version = float(match.group(1))
196
+ for max_version, container_version in [(17.0, "17.0"), (18.0, "18.0"), (18.4, "18.4"), (19.0, "19.0"), (19.3, "19.3")]:
197
+ if version <= max_version:
198
+ return container_version
201
199
  return "master"
@@ -9,7 +9,7 @@ services:
9
9
  - linux/amd64
10
10
  image: dylankiss/odoo-dev:master
11
11
  container_name: odoo-master
12
- hostname: odoo-19-1-master
12
+ hostname: odoo-master
13
13
  platform: linux/amd64
14
14
  depends_on:
15
15
  - postgres
@@ -23,8 +23,36 @@ services:
23
23
  - odoo-postgres-sockets:/var/run/postgresql
24
24
  - odoo-ssh-keys:/home/odoo/.ssh
25
25
  ports:
26
- - 5682:5678 # debugpy
27
- - 8074:8074 # odoo
26
+ - 5678:5678 # debugpy
27
+ - 8070:8070 # odoo
28
+ working_dir: /code
29
+ stdin_open: true
30
+ tty: true
31
+
32
+ odoo-19.3:
33
+ build:
34
+ context: ./odoo
35
+ dockerfile: 19.3.Dockerfile
36
+ platforms:
37
+ - linux/amd64
38
+ image: dylankiss/odoo-dev:19.3
39
+ container_name: odoo-19.1-19.3
40
+ hostname: odoo-19-1-19-3
41
+ platform: linux/amd64
42
+ depends_on:
43
+ - postgres
44
+ - mailpit
45
+ - pgadmin
46
+ volumes:
47
+ - ${ODOO_WORKSPACE_DIR:-~}:/code
48
+ - ${GITCONFIG_PATH:-~/.gitconfig}:/home/odoo/.gitconfig
49
+ - odoo-filestore:/home/odoo/.local/share/Odoo
50
+ - odoo-bash-history-data-noble:/home/odoo/.bash_history_data
51
+ - odoo-postgres-sockets:/var/run/postgresql
52
+ - odoo-ssh-keys:/home/odoo/.ssh
53
+ ports:
54
+ - 5683:5678 # debugpy
55
+ - 8075:8075 # odoo
28
56
  working_dir: /code
29
57
  stdin_open: true
30
58
  tty: true
@@ -51,8 +79,8 @@ services:
51
79
  - odoo-postgres-sockets:/var/run/postgresql
52
80
  - odoo-ssh-keys:/home/odoo/.ssh
53
81
  ports:
54
- - 5681:5678 # debugpy
55
- - 8073:8073 # odoo
82
+ - 5682:5678 # debugpy
83
+ - 8074:8074 # odoo
56
84
  working_dir: /code
57
85
  stdin_open: true
58
86
  tty: true
@@ -79,8 +107,8 @@ services:
79
107
  - odoo-postgres-sockets:/var/run/postgresql
80
108
  - odoo-ssh-keys:/home/odoo/.ssh
81
109
  ports:
82
- - 5680:5678 # debugpy
83
- - 8072:8072 # odoo
110
+ - 5681:5678 # debugpy
111
+ - 8073:8073 # odoo
84
112
  working_dir: /code
85
113
  stdin_open: true
86
114
  tty: true
@@ -107,8 +135,8 @@ services:
107
135
  - odoo-postgres-sockets:/var/run/postgresql
108
136
  - odoo-ssh-keys:/home/odoo/.ssh
109
137
  ports:
110
- - 5679:5678 # debugpy
111
- - 8071:8071 # odoo
138
+ - 5680:5678 # debugpy
139
+ - 8072:8072 # odoo
112
140
  working_dir: /code
113
141
  stdin_open: true
114
142
  tty: true
@@ -135,8 +163,8 @@ services:
135
163
  - odoo-postgres-sockets:/var/run/postgresql
136
164
  - odoo-ssh-keys:/home/odoo/.ssh
137
165
  ports:
138
- - 5678:5678 # debugpy
139
- - 8070:8070 # odoo
166
+ - 5679:5678 # debugpy
167
+ - 8071:8071 # odoo
140
168
  working_dir: /code
141
169
  stdin_open: true
142
170
  tty: true
@@ -1,9 +1,10 @@
1
1
  case "$(hostname)" in
2
- "odoo-17") export ODOO_PORT="8070" ;;
3
- "odoo-18") export ODOO_PORT="8071" ;;
4
- "odoo-18-1-18-4") export ODOO_PORT="8072" ;;
5
- "odoo-19") export ODOO_PORT="8073" ;;
6
- *) export ODOO_PORT="8074" ;;
2
+ "odoo-17") export ODOO_PORT="8071" ;;
3
+ "odoo-18") export ODOO_PORT="8072" ;;
4
+ "odoo-18-1-18-4") export ODOO_PORT="8073" ;;
5
+ "odoo-19") export ODOO_PORT="8074" ;;
6
+ "odoo-19-1-19-3") export ODOO_PORT="8075" ;;
7
+ *) export ODOO_PORT="8070" ;;
7
8
  esac
8
9
 
9
10
  port_opt="--http-port=$ODOO_PORT --http-interface=0.0.0.0"
@@ -1,5 +1,5 @@
1
1
  # Container definition for Odoo <=17.0
2
- # Last updated: 2026-02-25
2
+ # Last updated: 2026-06-06
3
3
 
4
4
  # Use Ubuntu 22.04 LTS (Jammy Jellyfish)
5
5
  FROM ubuntu:jammy
@@ -205,7 +205,7 @@ COPY startup.sh /home/odoo/.local/bin/startup.sh
205
205
  WORKDIR /code
206
206
 
207
207
  # Expose useful ports
208
- EXPOSE 5678 8070 8071 8072 8073 8074
208
+ EXPOSE 5678 8071
209
209
 
210
210
  # Set Tini as the entrypoint
211
211
  ENTRYPOINT ["/usr/bin/tini", "--"]
@@ -1,5 +1,5 @@
1
1
  # Container definition for Odoo >17.0 and <=18.0
2
- # Last updated: 2026-02-25
2
+ # Last updated: 2026-06-06
3
3
 
4
4
  # Use Ubuntu 24.04 LTS (Noble Numbat)
5
5
  FROM ubuntu:noble
@@ -85,6 +85,7 @@ RUN set -x; \
85
85
  python3-xmlsec \
86
86
  python3-markdown2 \
87
87
  python3-aiosmtpd \
88
+ python3-paramiko \
88
89
  # Moved packages
89
90
  python3-venv \
90
91
  # Extra packages
@@ -120,7 +121,7 @@ RUN curl -sSL https://www.postgresql.org/media/keys/ACCC4CF8.asc -o /etc/apt/tru
120
121
  && rm -rf /var/lib/apt/lists/*
121
122
 
122
123
  # Install Google Chrome
123
- RUN curl -sSL https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_141.0.7390.54-1_amd64.deb -o /tmp/chrome.deb \
124
+ RUN curl -sSL https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_145.0.7632.116-1_amd64.deb -o /tmp/chrome.deb \
124
125
  && apt-get update \
125
126
  && apt-get -y install --no-install-recommends \
126
127
  /tmp/chrome.deb \
@@ -150,7 +151,6 @@ RUN uv pip install --no-cache-dir \
150
151
  pdf417gen==0.7.1 \
151
152
  astroid==3.3.9 \
152
153
  pylint==3.3.6 \
153
- paramiko==2.12.0 \
154
154
  # Extra packages
155
155
  debugpy \
156
156
  pydevd-odoo \
@@ -204,7 +204,7 @@ COPY startup.sh /home/odoo/.local/bin/startup.sh
204
204
  WORKDIR /code
205
205
 
206
206
  # Expose useful ports
207
- EXPOSE 5678 8075 8076 8077 8078 8079
207
+ EXPOSE 5678 8072
208
208
 
209
209
  # Set Tini as the entrypoint
210
210
  ENTRYPOINT ["/usr/bin/tini", "--"]
@@ -1,5 +1,5 @@
1
1
  # Container definition for Odoo >18.0 and <=saas-18.4
2
- # Last updated: 2026-02-25
2
+ # Last updated: 2026-06-06
3
3
 
4
4
  # Use Ubuntu 24.04 LTS (Noble Numbat)
5
5
  FROM ubuntu:noble
@@ -85,6 +85,7 @@ RUN set -x; \
85
85
  python3-xmlsec \
86
86
  python3-markdown2 \
87
87
  python3-aiosmtpd \
88
+ python3-paramiko \
88
89
  # Moved packages
89
90
  python3-venv \
90
91
  # Extra packages
@@ -120,7 +121,7 @@ RUN curl -sSL https://www.postgresql.org/media/keys/ACCC4CF8.asc -o /etc/apt/tru
120
121
  && rm -rf /var/lib/apt/lists/*
121
122
 
122
123
  # Install Google Chrome
123
- RUN curl -sSL https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_141.0.7390.54-1_amd64.deb -o /tmp/chrome.deb \
124
+ RUN curl -sSL https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_145.0.7632.116-1_amd64.deb -o /tmp/chrome.deb \
124
125
  && apt-get update \
125
126
  && apt-get -y install --no-install-recommends \
126
127
  /tmp/chrome.deb \
@@ -151,7 +152,6 @@ RUN uv pip install --no-cache-dir \
151
152
  astroid==3.3.9 \
152
153
  pylint==3.3.8 \
153
154
  unidiff==0.7.3 \
154
- paramiko==2.12.0 \
155
155
  markdown2==2.4.11 \
156
156
  # Extra packages
157
157
  debugpy \
@@ -206,7 +206,7 @@ COPY startup.sh /home/odoo/.local/bin/startup.sh
206
206
  WORKDIR /code
207
207
 
208
208
  # Expose useful ports
209
- EXPOSE 5678 8075 8076 8077 8078 8079
209
+ EXPOSE 5678 8073
210
210
 
211
211
  # Set Tini as the entrypoint
212
212
  ENTRYPOINT ["/usr/bin/tini", "--"]
@@ -1,5 +1,5 @@
1
1
  # Container definition for Odoo >saas-18.4 and <=19.0
2
- # Last updated: 2026-02-25
2
+ # Last updated: 2026-06-06
3
3
 
4
4
  # Use Ubuntu 24.04 LTS (Noble Numbat)
5
5
  FROM ubuntu:noble
@@ -85,6 +85,7 @@ RUN set -x; \
85
85
  python3-xmlsec \
86
86
  python3-markdown2 \
87
87
  python3-aiosmtpd \
88
+ python3-paramiko \
88
89
  # Moved packages
89
90
  python3-venv \
90
91
  # Extra packages
@@ -120,7 +121,7 @@ RUN curl -sSL https://www.postgresql.org/media/keys/ACCC4CF8.asc -o /etc/apt/tru
120
121
  && rm -rf /var/lib/apt/lists/*
121
122
 
122
123
  # Install Google Chrome
123
- RUN curl -sSL https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_141.0.7390.54-1_amd64.deb -o /tmp/chrome.deb \
124
+ RUN curl -sSL https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_145.0.7632.116-1_amd64.deb -o /tmp/chrome.deb \
124
125
  && apt-get update \
125
126
  && apt-get -y install --no-install-recommends \
126
127
  /tmp/chrome.deb \
@@ -150,8 +151,8 @@ RUN uv pip install --no-cache-dir \
150
151
  pdf417gen==0.7.1 \
151
152
  pylint==4.0.3 \
152
153
  unidiff==0.7.3 \
153
- paramiko==2.12.0 \
154
154
  markdown2==2.4.11 \
155
+ coverage==7.4.4 \
155
156
  # Extra packages
156
157
  debugpy \
157
158
  pydevd-odoo \
@@ -205,7 +206,7 @@ COPY startup.sh /home/odoo/.local/bin/startup.sh
205
206
  WORKDIR /code
206
207
 
207
208
  # Expose useful ports
208
- EXPOSE 5678 8075 8076 8077 8078 8079
209
+ EXPOSE 5678 8074
209
210
 
210
211
  # Set Tini as the entrypoint
211
212
  ENTRYPOINT ["/usr/bin/tini", "--"]
@@ -1,5 +1,5 @@
1
- # Container definition for Odoo >19.0 and <=master
2
- # Last updated: 2026-02-25
1
+ # Container definition for Odoo >19.0 and <=saas-19.3
2
+ # Last updated: 2026-06-06
3
3
 
4
4
  # Use Ubuntu 24.04 LTS (Noble Numbat)
5
5
  FROM ubuntu:noble
@@ -8,6 +8,7 @@ ENV LANG=C.UTF-8 \
8
8
  TERM=xterm-256color \
9
9
  PYTHONUNBUFFERED=1 \
10
10
  PYTHONHASHSEED=0 \
11
+ ODOO_RUNBOT=1 \
11
12
  NODE_PATH=/usr/lib/node_modules/ \
12
13
  npm_config_prefix=/usr \
13
14
  PATH="/venv/odoo/bin:/venv/odoo-doc/bin:/home/odoo/.local/bin:$PATH"
@@ -85,6 +86,7 @@ RUN set -x; \
85
86
  python3-xmlsec \
86
87
  python3-markdown2 \
87
88
  python3-aiosmtpd \
89
+ python3-paramiko \
88
90
  # Moved packages
89
91
  python3-venv \
90
92
  # Extra packages
@@ -120,7 +122,7 @@ RUN curl -sSL https://www.postgresql.org/media/keys/ACCC4CF8.asc -o /etc/apt/tru
120
122
  && rm -rf /var/lib/apt/lists/*
121
123
 
122
124
  # Install Google Chrome
123
- RUN curl -sSL https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_141.0.7390.54-1_amd64.deb -o /tmp/chrome.deb \
125
+ RUN curl -sSL https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_145.0.7632.116-1_amd64.deb -o /tmp/chrome.deb \
124
126
  && apt-get update \
125
127
  && apt-get -y install --no-install-recommends \
126
128
  /tmp/chrome.deb \
@@ -150,8 +152,10 @@ RUN uv pip install --no-cache-dir \
150
152
  pdf417gen==0.7.1 \
151
153
  pylint==4.0.3 \
152
154
  unidiff==0.7.3 \
153
- paramiko==2.12.0 \
154
155
  markdown2==2.4.11 \
156
+ semgrep==1.116.0 \
157
+ ruff==0.15.0 \
158
+ coverage==7.4.4 \
155
159
  # Extra packages
156
160
  debugpy \
157
161
  pydevd-odoo \
@@ -218,7 +222,7 @@ COPY startup.sh /home/odoo/.local/bin/startup.sh
218
222
  WORKDIR /code
219
223
 
220
224
  # Expose useful ports
221
- EXPOSE 5678 8075 8076 8077 8078 8079
225
+ EXPOSE 5678 8075
222
226
 
223
227
  # Set Tini as the entrypoint
224
228
  ENTRYPOINT ["/usr/bin/tini", "--"]