diff --git a/.copier-answers.yml b/.copier-answers.yml
index 8dfaf31bb6..e007d23858 100644
--- a/.copier-answers.yml
+++ b/.copier-answers.yml
@@ -1,5 +1,5 @@
# Do NOT update manually; changes here will be overwritten by Copier
-_commit: v1.26
+_commit: v1.27
_src_path: git+https://github.com/OCA/oca-addons-repo-template
additional_ruff_rules: []
ci: GitHub
diff --git a/.eslintrc.yml b/.eslintrc.yml
deleted file mode 100644
index 0b38203958..0000000000
--- a/.eslintrc.yml
+++ /dev/null
@@ -1,188 +0,0 @@
-env:
- browser: true
- es6: true
-
-# See https://github.com/OCA/odoo-community.org/issues/37#issuecomment-470686449
-parserOptions:
- ecmaVersion: 2022
-
-overrides:
- - files:
- - "**/*.esm.js"
- parserOptions:
- sourceType: module
-
-# Globals available in Odoo that shouldn't produce errorings
-globals:
- _: readonly
- $: readonly
- fuzzy: readonly
- jQuery: readonly
- moment: readonly
- odoo: readonly
- openerp: readonly
- owl: readonly
- luxon: readonly
-
-# Styling is handled by Prettier, so we only need to enable AST rules;
-# see https://github.com/OCA/maintainer-quality-tools/pull/618#issuecomment-558576890
-rules:
- accessor-pairs: warn
- array-callback-return: warn
- callback-return: warn
- capitalized-comments:
- - warn
- - always
- - ignoreConsecutiveComments: true
- ignoreInlineComments: true
- complexity:
- - warn
- - 15
- constructor-super: warn
- dot-notation: warn
- eqeqeq: warn
- global-require: warn
- handle-callback-err: warn
- id-blacklist: warn
- id-match: warn
- init-declarations: error
- max-depth: warn
- max-nested-callbacks: warn
- max-statements-per-line: warn
- no-alert: warn
- no-array-constructor: warn
- no-caller: warn
- no-case-declarations: warn
- no-class-assign: warn
- no-cond-assign: error
- no-const-assign: error
- no-constant-condition: warn
- no-control-regex: warn
- no-debugger: error
- no-delete-var: warn
- no-div-regex: warn
- no-dupe-args: error
- no-dupe-class-members: error
- no-dupe-keys: error
- no-duplicate-case: error
- no-duplicate-imports: error
- no-else-return: warn
- no-empty-character-class: warn
- no-empty-function: error
- no-empty-pattern: error
- no-empty: warn
- no-eq-null: error
- no-eval: error
- no-ex-assign: error
- no-extend-native: warn
- no-extra-bind: warn
- no-extra-boolean-cast: warn
- no-extra-label: warn
- no-fallthrough: warn
- no-func-assign: error
- no-global-assign: error
- no-implicit-coercion:
- - warn
- - allow: ["~"]
- no-implicit-globals: warn
- no-implied-eval: warn
- no-inline-comments: warn
- no-inner-declarations: warn
- no-invalid-regexp: warn
- no-irregular-whitespace: warn
- no-iterator: warn
- no-label-var: warn
- no-labels: warn
- no-lone-blocks: warn
- no-lonely-if: error
- no-mixed-requires: error
- no-multi-str: warn
- no-native-reassign: error
- no-negated-condition: warn
- no-negated-in-lhs: error
- no-new-func: warn
- no-new-object: warn
- no-new-require: warn
- no-new-symbol: warn
- no-new-wrappers: warn
- no-new: warn
- no-obj-calls: warn
- no-octal-escape: warn
- no-octal: warn
- no-param-reassign: warn
- no-path-concat: warn
- no-process-env: warn
- no-process-exit: warn
- no-proto: warn
- no-prototype-builtins: warn
- no-redeclare: warn
- no-regex-spaces: warn
- no-restricted-globals: warn
- no-restricted-imports: warn
- no-restricted-modules: warn
- no-restricted-syntax: warn
- no-return-assign: error
- no-script-url: warn
- no-self-assign: warn
- no-self-compare: warn
- no-sequences: warn
- no-shadow-restricted-names: warn
- no-shadow: warn
- no-sparse-arrays: warn
- no-sync: warn
- no-this-before-super: warn
- no-throw-literal: warn
- no-undef-init: warn
- no-undef: error
- no-unmodified-loop-condition: warn
- no-unneeded-ternary: error
- no-unreachable: error
- no-unsafe-finally: error
- no-unused-expressions: error
- no-unused-labels: error
- no-unused-vars: error
- no-use-before-define: error
- no-useless-call: warn
- no-useless-computed-key: warn
- no-useless-concat: warn
- no-useless-constructor: warn
- no-useless-escape: warn
- no-useless-rename: warn
- no-void: warn
- no-with: warn
- operator-assignment: [error, always]
- prefer-const: warn
- radix: warn
- require-yield: warn
- sort-imports: warn
- spaced-comment: [error, always]
- strict: [error, function]
- use-isnan: error
- valid-jsdoc:
- - warn
- - prefer:
- arg: param
- argument: param
- augments: extends
- constructor: class
- exception: throws
- func: function
- method: function
- prop: property
- return: returns
- virtual: abstract
- yield: yields
- preferType:
- array: Array
- bool: Boolean
- boolean: Boolean
- number: Number
- object: Object
- str: String
- string: String
- requireParamDescription: false
- requireReturn: false
- requireReturnDescription: false
- requireReturnType: false
- valid-typeof: warn
- yoda: warn
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index e9b97490aa..c74099edcf 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -5,7 +5,7 @@ exclude: |
# Files and folders generated by bots, to avoid loops
^setup/|/static/description/index\.html$|
# We don't want to mess with tool-generated files
- .svg$|/tests/([^/]+/)?cassettes/|^.copier-answers.yml$|^.github/|
+ .svg$|/tests/([^/]+/)?cassettes/|^.copier-answers.yml$|^.github/|^eslint.config.cjs|^prettier.config.cjs|
# Maybe reactivate this when all README files include prettier ignore tags?
^README\.md$|
# Library files can have extraneous formatting (even minimized)
@@ -22,7 +22,7 @@ exclude: |
(LICENSE.*|COPYING.*)
default_language_version:
python: python3
- node: "16.17.0"
+ node: "22.9.0"
repos:
- repo: local
hooks:
@@ -66,25 +66,35 @@ repos:
- id: oca-checks-po
args:
- --disable=po-pretty-format
- - repo: https://github.com/pre-commit/mirrors-prettier
- rev: v2.7.1
+ - repo: local
hooks:
- id: prettier
name: prettier (with plugin-xml)
- additional_dependencies:
- - "prettier@2.7.1"
- - "@prettier/plugin-xml@2.2.0"
+ entry: prettier
args:
- - --plugin=@prettier/plugin-xml
+ - --write
+ - --list-different
+ - --ignore-unknown
+ types: [text]
files: \.(css|htm|html|js|json|jsx|less|md|scss|toml|ts|xml|yaml|yml)$
- - repo: https://github.com/pre-commit/mirrors-eslint
- rev: v8.24.0
+ language: node
+ additional_dependencies:
+ - "prettier@3.3.3"
+ - "@prettier/plugin-xml@3.4.1"
+ - repo: local
hooks:
- id: eslint
- verbose: true
+ name: eslint
+ entry: eslint
args:
- --color
- --fix
+ verbose: true
+ types: [javascript]
+ language: node
+ additional_dependencies:
+ - "eslint@9.12.0"
+ - "eslint-plugin-jsdoc@50.3.1"
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.6.0
hooks:
@@ -114,7 +124,7 @@ repos:
args: [--fix, --exit-non-zero-on-fix]
- id: ruff-format
- repo: https://github.com/OCA/pylint-odoo
- rev: v9.0.4
+ rev: v9.1.3
hooks:
- id: pylint_odoo
name: pylint with optional checks
diff --git a/.prettierrc.yml b/.prettierrc.yml
deleted file mode 100644
index 5b6d4b361a..0000000000
--- a/.prettierrc.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-# Defaults for all prettier-supported languages.
-# Prettier will complete this with settings from .editorconfig file.
-bracketSpacing: false
-printWidth: 88
-proseWrap: always
-semi: true
-trailingComma: "es5"
-xmlWhitespaceSensitivity: "strict"
diff --git a/eslint.config.cjs b/eslint.config.cjs
new file mode 100644
index 0000000000..0d5731f89a
--- /dev/null
+++ b/eslint.config.cjs
@@ -0,0 +1,202 @@
+jsdoc = require("eslint-plugin-jsdoc");
+
+const config = [{
+ plugins: {
+ jsdoc,
+ },
+
+ languageOptions: {
+ globals: {
+ _: "readonly",
+ $: "readonly",
+ fuzzy: "readonly",
+ jQuery: "readonly",
+ moment: "readonly",
+ odoo: "readonly",
+ openerp: "readonly",
+ owl: "readonly",
+ luxon: "readonly",
+ },
+
+ ecmaVersion: 2024,
+ sourceType: "script",
+ },
+
+ rules: {
+ "accessor-pairs": "warn",
+ "array-callback-return": "warn",
+ "callback-return": "warn",
+ "capitalized-comments": ["warn", "always", {
+ ignoreConsecutiveComments: true,
+ ignoreInlineComments: true,
+ }],
+ complexity: ["warn", 15],
+ "constructor-super": "warn",
+ "dot-notation": "warn",
+ eqeqeq: "warn",
+ "global-require": "warn",
+ "handle-callback-err": "warn",
+ "id-blacklist": "warn",
+ "id-match": "warn",
+ "init-declarations": "error",
+ "max-depth": "warn",
+ "max-nested-callbacks": "warn",
+ "max-statements-per-line": "warn",
+ "no-alert": "warn",
+ "no-array-constructor": "warn",
+ "no-caller": "warn",
+ "no-case-declarations": "warn",
+ "no-class-assign": "warn",
+ "no-cond-assign": "error",
+ "no-const-assign": "error",
+ "no-constant-condition": "warn",
+ "no-control-regex": "warn",
+ "no-debugger": "error",
+ "no-delete-var": "warn",
+ "no-div-regex": "warn",
+ "no-dupe-args": "error",
+ "no-dupe-class-members": "error",
+ "no-dupe-keys": "error",
+ "no-duplicate-case": "error",
+ "no-duplicate-imports": "error",
+ "no-else-return": "warn",
+ "no-empty-character-class": "warn",
+ "no-empty-function": "error",
+ "no-empty-pattern": "error",
+ "no-empty": "warn",
+ "no-eq-null": "error",
+ "no-eval": "error",
+ "no-ex-assign": "error",
+ "no-extend-native": "warn",
+ "no-extra-bind": "warn",
+ "no-extra-boolean-cast": "warn",
+ "no-extra-label": "warn",
+ "no-fallthrough": "warn",
+ "no-func-assign": "error",
+ "no-global-assign": "error",
+ "no-implicit-coercion": ["warn", {
+ allow: ["~"],
+ }],
+ "no-implicit-globals": "warn",
+ "no-implied-eval": "warn",
+ "no-inline-comments": "warn",
+ "no-inner-declarations": "warn",
+ "no-invalid-regexp": "warn",
+ "no-irregular-whitespace": "warn",
+ "no-iterator": "warn",
+ "no-label-var": "warn",
+ "no-labels": "warn",
+ "no-lone-blocks": "warn",
+ "no-lonely-if": "error",
+ "no-mixed-requires": "error",
+ "no-multi-str": "warn",
+ "no-native-reassign": "error",
+ "no-negated-condition": "warn",
+ "no-negated-in-lhs": "error",
+ "no-new-func": "warn",
+ "no-new-object": "warn",
+ "no-new-require": "warn",
+ "no-new-symbol": "warn",
+ "no-new-wrappers": "warn",
+ "no-new": "warn",
+ "no-obj-calls": "warn",
+ "no-octal-escape": "warn",
+ "no-octal": "warn",
+ "no-param-reassign": "warn",
+ "no-path-concat": "warn",
+ "no-process-env": "warn",
+ "no-process-exit": "warn",
+ "no-proto": "warn",
+ "no-prototype-builtins": "warn",
+ "no-redeclare": "warn",
+ "no-regex-spaces": "warn",
+ "no-restricted-globals": "warn",
+ "no-restricted-imports": "warn",
+ "no-restricted-modules": "warn",
+ "no-restricted-syntax": "warn",
+ "no-return-assign": "error",
+ "no-script-url": "warn",
+ "no-self-assign": "warn",
+ "no-self-compare": "warn",
+ "no-sequences": "warn",
+ "no-shadow-restricted-names": "warn",
+ "no-shadow": "warn",
+ "no-sparse-arrays": "warn",
+ "no-sync": "warn",
+ "no-this-before-super": "warn",
+ "no-throw-literal": "warn",
+ "no-undef-init": "warn",
+ "no-undef": "error",
+ "no-unmodified-loop-condition": "warn",
+ "no-unneeded-ternary": "error",
+ "no-unreachable": "error",
+ "no-unsafe-finally": "error",
+ "no-unused-expressions": "error",
+ "no-unused-labels": "error",
+ "no-unused-vars": "error",
+ "no-use-before-define": "error",
+ "no-useless-call": "warn",
+ "no-useless-computed-key": "warn",
+ "no-useless-concat": "warn",
+ "no-useless-constructor": "warn",
+ "no-useless-escape": "warn",
+ "no-useless-rename": "warn",
+ "no-void": "warn",
+ "no-with": "warn",
+ "operator-assignment": ["error", "always"],
+ "prefer-const": "warn",
+ radix: "warn",
+ "require-yield": "warn",
+ "sort-imports": "warn",
+ "spaced-comment": ["error", "always"],
+ strict: ["error", "function"],
+ "use-isnan": "error",
+
+ "jsdoc/check-tag-names": "warn",
+ "jsdoc/check-types": "warn",
+ "jsdoc/require-param-description": "off",
+ "jsdoc/require-return": "off",
+ "jsdoc/require-return-description": "off",
+ "jsdoc/require-return-type": "off",
+
+ "valid-typeof": "warn",
+ yoda: "warn",
+ },
+
+ settings: {
+ jsdoc: {
+ tagNamePreference: {
+ arg: "param",
+ argument: "param",
+ augments: "extends",
+ constructor: "class",
+ exception: "throws",
+ func: "function",
+ method: "function",
+ prop: "property",
+ return: "returns",
+ virtual: "abstract",
+ yield: "yields",
+ },
+ preferredTypes: {
+ array: "Array",
+ bool: "Boolean",
+ boolean: "Boolean",
+ number: "Number",
+ object: "Object",
+ str: "String",
+ string: "String",
+ },
+ },
+ },
+
+}, {
+ files: ["**/*.esm.js"],
+
+ languageOptions: {
+ ecmaVersion: 2024,
+ sourceType: "module",
+ },
+}];
+
+module.exports = config
diff --git a/prettier.config.cjs b/prettier.config.cjs
new file mode 100644
index 0000000000..e66cd82cc1
--- /dev/null
+++ b/prettier.config.cjs
@@ -0,0 +1,14 @@
+/** @type {import('prettier').Config} */
+
+const config = {
+ // https://github.com/prettier/prettier/issues/15388#issuecomment-1717746872
+ plugins: [require.resolve("@prettier/plugin-xml")],
+ bracketSpacing: false,
+ printWidth: 88,
+ proseWrap: "always",
+ semi: true,
+ trailingComma: "es5",
+ xmlWhitespaceSensitivity: "preserve",
+};
+
+module.exports = config;
diff --git a/queue_job/migrations/18.0.1.0.0/pre-migrate.py b/queue_job/migrations/18.0.1.0.0/pre-migrate.py
index 3f02e7bc75..ce624e14dd 100644
--- a/queue_job/migrations/18.0.1.0.0/pre-migrate.py
+++ b/queue_job/migrations/18.0.1.0.0/pre-migrate.py
@@ -1,5 +1,7 @@
from openupgradelib import openupgrade
+from odoo.tools import SQL
+
def migrate(cr, version):
if not version:
@@ -14,8 +16,14 @@ def migrate(cr, version):
for table, columns in table_column_map.items():
for column in columns:
if openupgrade.column_exists(cr, table, column):
- cr.execute(f"""
- UPDATE {table}
- SET {column} = {column}::jsonb
- WHERE {column} IS NOT NULL
- """)
+ cr.execute(
+ SQL(
+ """
+ UPDATE %(table)s
+ SET %(column)s = %(column)s::jsonb
+ WHERE %(column)s IS NOT NULL
+ """,
+ table=SQL.identifier(table),
+ column=SQL.identifier(column),
+ )
+ )
diff --git a/queue_job/static/src/views/fields/job_direct_graph/job_direct_graph.esm.js b/queue_job/static/src/views/fields/job_direct_graph/job_direct_graph.esm.js
index f5adb3a2d5..c9b69acebb 100644
--- a/queue_job/static/src/views/fields/job_direct_graph/job_direct_graph.esm.js
+++ b/queue_job/static/src/views/fields/job_direct_graph/job_direct_graph.esm.js
@@ -8,6 +8,8 @@ import {useService} from "@web/core/utils/hooks";
const {Component, onWillStart, useEffect, useRef} = owl;
+const {document} = globalThis;
+
class JobDirectGraph extends Component {
static props = {...standardFieldProps};
static template = "queue.JobDirectGraph";
diff --git a/queue_job/views/queue_job_channel_views.xml b/queue_job/views/queue_job_channel_views.xml
index e7a3679ab1..50c245716b 100644
--- a/queue_job/views/queue_job_channel_views.xml
+++ b/queue_job/views/queue_job_channel_views.xml
@@ -1,6 +1,5 @@
-
queue.job.channel.form
queue.job.channel
@@ -56,5 +55,4 @@
{}
-
diff --git a/queue_job/views/queue_job_function_views.xml b/queue_job/views/queue_job_function_views.xml
index a294ce084b..e725920b2c 100644
--- a/queue_job/views/queue_job_function_views.xml
+++ b/queue_job/views/queue_job_function_views.xml
@@ -1,6 +1,5 @@
-
queue.job.function.form
queue.job.function
@@ -54,5 +53,4 @@
{}
-
diff --git a/queue_job/views/queue_job_menus.xml b/queue_job/views/queue_job_menus.xml
index d288d7c0b9..8142605de9 100644
--- a/queue_job/views/queue_job_menus.xml
+++ b/queue_job/views/queue_job_menus.xml
@@ -1,6 +1,5 @@
-
-
diff --git a/queue_job/views/queue_job_views.xml b/queue_job/views/queue_job_views.xml
index bb8d696220..ac53afe6a5 100644
--- a/queue_job/views/queue_job_views.xml
+++ b/queue_job/views/queue_job_views.xml
@@ -1,6 +1,5 @@
-
queue.job.form
queue.job
@@ -92,47 +91,47 @@
If the max. retries is 0, the number of retries is infinite.
+ class="oe_grey oe_inline"
+ > If the max. retries is 0, the number of retries is infinite.
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
@@ -160,7 +159,8 @@
widget="remaining_days"
string="Remaining days to execute"
optional="hide"
- />
+ />
+
@@ -321,5 +321,4 @@
-
diff --git a/queue_job/wizards/queue_jobs_to_cancelled_views.xml b/queue_job/wizards/queue_jobs_to_cancelled_views.xml
index da3e7a077c..c501cf21b5 100644
--- a/queue_job/wizards/queue_jobs_to_cancelled_views.xml
+++ b/queue_job/wizards/queue_jobs_to_cancelled_views.xml
@@ -1,6 +1,5 @@
-
Cancel Jobs
queue.jobs.to.cancelled
@@ -30,5 +29,4 @@
new
-
diff --git a/queue_job/wizards/queue_jobs_to_done_views.xml b/queue_job/wizards/queue_jobs_to_done_views.xml
index 0dd3b6c481..6bc6653327 100644
--- a/queue_job/wizards/queue_jobs_to_done_views.xml
+++ b/queue_job/wizards/queue_jobs_to_done_views.xml
@@ -1,6 +1,5 @@
-
Set Jobs to Done
queue.jobs.to.done
@@ -30,5 +29,4 @@
new
-
diff --git a/queue_job/wizards/queue_requeue_job_views.xml b/queue_job/wizards/queue_requeue_job_views.xml
index acc357e716..cfad7879c0 100644
--- a/queue_job/wizards/queue_requeue_job_views.xml
+++ b/queue_job/wizards/queue_requeue_job_views.xml
@@ -1,6 +1,5 @@
-
Requeue Jobs
queue.requeue.job
@@ -30,5 +29,4 @@
new
-