diff --git a/.codeclimate.yml b/.codeclimate.yml index 101d522c3e..16009aa6fe 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -2,7 +2,7 @@ languages: JavaScript: true Python: true exclude_paths: -- "__unported__/*" -- "*/__openerp__.py" # because this is fed to eval -- "*/__manifest__.py" -- "*/migrations/*" # without OpenUpgrade, repetitions can be necessary + - "__unported__/*" + - "*/__openerp__.py" # because this is fed to eval + - "*/__manifest__.py" + - "*/migrations/*" # without OpenUpgrade, repetitions can be necessary diff --git a/.copier-answers.yml b/.copier-answers.yml new file mode 100644 index 0000000000..cdf77a9293 --- /dev/null +++ b/.copier-answers.yml @@ -0,0 +1,24 @@ +# Do NOT update manually; changes here will be overwritten by Copier +_commit: v1.29 +_src_path: https://github.com/OCA/oca-addons-repo-template.git +ci: GitHub +convert_readme_fragments_to_markdown: false +enable_checklog_odoo: false +generate_requirements_txt: true +github_check_license: true +github_ci_extra_env: {} +github_enable_codecov: true +github_enable_makepot: true +github_enable_stale_action: true +github_enforce_dev_status_compatibility: true +include_wkhtmltopdf: false +odoo_test_flavor: Both +odoo_version: 13.0 +org_name: Odoo Community Association (OCA) +org_slug: OCA +rebel_module_groups: [] +repo_description: Advanced async job management for Odoo +repo_name: Odoo Queue Modules +repo_slug: queue +repo_website: https://github.com/OCA/queue + diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..bfd7ac53df --- /dev/null +++ b/.editorconfig @@ -0,0 +1,20 @@ +# Configuration for known file extensions +[*.{css,js,json,less,md,py,rst,sass,scss,xml,yaml,yml}] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{json,yml,yaml,rst,md}] +indent_size = 2 + +# Do not configure editor for libs and autogenerated content +[{*/static/{lib,src/lib}/**,*/static/description/index.html,*/readme/../README.rst}] +charset = unset +end_of_line = unset +indent_size = unset +indent_style = unset +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 28a0808b38..0000000000 --- a/.eslintrc +++ /dev/null @@ -1,291 +0,0 @@ -{ - "globals": { - "$": false, - "_": false, - "fuzzy": false, - "jQuery": false, - "moment": false, - "odoo": false, - "openerp": false, - "self": false - }, - "env": { - "browser": true - }, - "rules": { - "no-alert": "warn", - "no-array-constructor": "warn", - "no-bitwise": "off", - "no-caller": "warn", - "no-case-declarations": "warn", - "no-catch-shadow": "warn", - "no-class-assign": "warn", - "no-cond-assign": "warn", - "no-confusing-arrow": "warn", - "no-console": "off", - "no-const-assign": "warn", - "no-constant-condition": "warn", - "no-continue": "off", - "no-control-regex": "warn", - "no-debugger": "warn", - "no-delete-var": "warn", - "no-div-regex": "warn", - "no-dupe-args": "warn", - "no-dupe-class-members": "warn", - "no-dupe-keys": "warn", - "no-duplicate-case": "warn", - "no-duplicate-imports": "warn", - "no-else-return": "warn", - "no-empty": "warn", - "no-empty-character-class": "warn", - "no-empty-function": "warn", - "no-empty-pattern": "warn", - "no-eq-null": "warn", - "no-eval": "warn", - "no-ex-assign": "warn", - "no-extend-native": "warn", - "no-extra-bind": "warn", - "no-extra-boolean-cast": "warn", - "no-extra-label": "warn", - "no-extra-parens": "warn", - "no-extra-semi": "warn", - "no-fallthrough": "warn", - "no-floating-decimal": "warn", - "no-func-assign": "warn", - "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-invalid-this": "off", - "no-irregular-whitespace": "warn", - "no-iterator": "warn", - "no-label-var": "warn", - "no-labels": "warn", - "no-lone-blocks": "warn", - "no-lonely-if": "warn", - "no-loop-func": "off", - "no-magic-numbers": "off", - "no-mixed-operators": "warn", - "no-mixed-requires": "warn", - "no-mixed-spaces-and-tabs": "warn", - "no-multi-spaces": "warn", - "no-multi-str": "warn", - "no-multiple-empty-lines": "warn", - "no-native-reassign": "warn", - "no-negated-condition": "warn", - "no-negated-in-lhs": "warn", - "no-nested-ternary": "off", - "no-new": "warn", - "no-new-func": "warn", - "no-new-object": "warn", - "no-new-require": "warn", - "no-new-symbol": "warn", - "no-new-wrappers": "warn", - "no-obj-calls": "warn", - "no-octal": "warn", - "no-octal-escape": "warn", - "no-param-reassign": "warn", - "no-path-concat": "warn", - "no-plusplus": "off", - "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": "warn", - "no-script-url": "warn", - "no-self-assign": "warn", - "no-self-compare": "warn", - "no-sequences": "warn", - "no-shadow": "warn", - "no-shadow-restricted-names": "warn", - "no-whitespace-before-property": "warn", - "no-spaced-func": "warn", - "no-sparse-arrays": "warn", - "no-sync": "warn", - "no-tabs": "warn", - "no-ternary": "off", - "no-trailing-spaces": "warn", - "no-this-before-super": "warn", - "no-throw-literal": "warn", - "no-undef": "warn", - "no-undef-init": "warn", - "no-undefined": "off", - "no-unexpected-multiline": "warn", - "no-underscore-dangle": "off", - "no-unmodified-loop-condition": "warn", - "no-unneeded-ternary": "warn", - "no-unreachable": "warn", - "no-unsafe-finally": "warn", - "no-unused-expressions": "warn", - "no-unused-labels": "warn", - "no-unused-vars": "warn", - "no-use-before-define": "warn", - "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-var": "off", - "no-warning-comments": "off", - "no-with": "warn", - "array-bracket-spacing": "off", - "array-callback-return": "warn", - "arrow-body-style": "warn", - "arrow-parens": "warn", - "arrow-spacing": "off", - "accessor-pairs": "warn", - "block-scoped-var": "off", - "block-spacing": ["warn", "always"], - "brace-style": "warn", - "callback-return": "warn", - "camelcase": "off", - "capitalized-comments": ["warn", "always", { - "ignoreConsecutiveComments": true, - "ignoreInlineComments": true - }], - "comma-dangle": ["warn", "always-multiline"], - "comma-spacing": ["warn", { - "before": false, - "after": true - }], - "comma-style": "warn", - "complexity": [ - "warn", - 15 - ], - "computed-property-spacing": "off", - "consistent-return": "off", - "consistent-this": "off", - "constructor-super": "warn", - "curly": "warn", - "default-case": "off", - "dot-location": ["warn", "property"], - "dot-notation": "warn", - "eol-last": "warn", - "eqeqeq": "warn", - "func-names": "off", - "func-style": "off", - "generator-star-spacing": "off", - "global-require": "warn", - "guard-for-in": "off", - "handle-callback-err": "warn", - "id-blacklist": "warn", - "id-length": "off", - "id-match": "warn", - "indent": "warn", - "init-declarations": "warn", - "jsx-quotes": "warn", - "key-spacing": "off", - "keyword-spacing": "warn", - "linebreak-style": [ - "warn", - "unix" - ], - "lines-around-comment": "warn", - "max-depth": "warn", - "max-len": ["warn", { - "code": 88, - "ignorePattern": "odoo\\.define\\(", - "tabWidth": 4 - }], - "max-lines": "off", - "max-nested-callbacks": "warn", - "max-params": "off", - "max-statements": "off", - "max-statements-per-line": "warn", - "multiline-ternary": "off", - "new-cap": "off", - "new-parens": "warn", - "newline-after-var": "off", - "newline-before-return": "off", - "newline-per-chained-call": "off", - "object-curly-newline": ["warn", { "consistent": true }], - "object-curly-spacing": ["warn", "never"], - "object-property-newline": ["warn", { - "allowAllPropertiesOnSameLine": true - }], - "object-shorthand": "off", - "one-var": "off", - "one-var-declaration-per-line": "off", - "operator-assignment": "warn", - "operator-linebreak": "warn", - "padded-blocks": "off", - "prefer-arrow-callback": "off", - "prefer-const": "warn", - "prefer-reflect": "off", - "prefer-rest-params": "off", - "prefer-spread": "off", - "prefer-template": "off", - "quote-props": "off", - "quotes": "off", - "radix": "warn", - "require-yield": "warn", - "rest-spread-spacing": "off", - "semi": [ - "warn", - "always" - ], - "semi-spacing": "warn", - "sort-imports": "warn", - "sort-vars": "off", - "space-before-blocks": "warn", - "space-before-function-paren": "warn", - "space-in-parens": "off", - "space-infix-ops": "off", - "space-unary-ops": "off", - "spaced-comment": ["warn", "always"], - "strict": ["warn", "function"], - "template-curly-spacing": "off", - "unicode-bom": "warn", - "use-isnan": "warn", - "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", - "vars-on-top": "off", - "wrap-iife": "warn", - "wrap-regex": "warn", - "yield-star-spacing": "off", - "yoda": "warn" - }, - "parserOptions": { - "ecmaVersion": 2017 - } -} diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 0000000000..fed88d70d2 --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,188 @@ +env: + browser: true + es6: true + +# See https://github.com/OCA/odoo-community.org/issues/37#issuecomment-470686449 +parserOptions: + ecmaVersion: 2019 + +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/.flake8 b/.flake8 index 44ed868f7f..e397e8ed4e 100644 --- a/.flake8 +++ b/.flake8 @@ -1,5 +1,5 @@ [flake8] -max-line-length = 80 +max-line-length = 88 max-complexity = 16 # B = bugbear # B9 = bugbear opinionated (incl line length) @@ -8,3 +8,5 @@ select = C,E,F,W,B,B9 # E501: flake8 line length (covered by bugbear B950) # W503: line break before binary operator (black behaviour) ignore = E203,E501,W503 +per-file-ignores= + __init__.py:F401 diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml new file mode 100644 index 0000000000..7593c4fd8f --- /dev/null +++ b/.github/workflows/pre-commit.yml @@ -0,0 +1,46 @@ +name: pre-commit + +on: + pull_request: + branches: + - "13.0*" + push: + branches: + - "13.0" + - "13.0-ocabot-*" + +jobs: + pre-commit: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.8" + - name: Get python version + run: echo "PY=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV + - uses: actions/cache@v4 + with: + path: ~/.cache/pre-commit + key: pre-commit|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }} + - name: Install pre-commit + run: pip install pre-commit + - name: Run pre-commit + run: pre-commit run --all-files --show-diff-on-failure --color=always + env: + # Consider valid a PR that changes README fragments but doesn't + # change the README.rst file itself. It's not really a problem + # because the bot will update it anyway after merge. This way, we + # lower the barrier for functional contributors that want to fix the + # readme fragments, while still letting developers get README + # auto-generated (which also helps functionals when using runboat). + # DOCS https://pre-commit.com/#temporarily-disabling-hooks + SKIP: oca-gen-addon-readme + - name: Check that all files generated by pre-commit are in git + run: | + newfiles="$(git ls-files --others --exclude-from=.gitignore)" + if [ "$newfiles" != "" ] ; then + echo "Please check-in the following files:" + echo "$newfiles" + exit 1 + fi diff --git a/.github/workflows/pre-commit.yml.rej b/.github/workflows/pre-commit.yml.rej new file mode 100644 index 0000000000..8cc889c625 --- /dev/null +++ b/.github/workflows/pre-commit.yml.rej @@ -0,0 +1,11 @@ +diff a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml (rejected hunks) +@@ -17,2 +17,9 @@ jobs: + - uses: actions/setup-python@v2 ++ with: ++ # The pylint-odoo version we use here does not support python 3.10 ++ # https://github.com/OCA/oca-addons-repo-template/issues/80 ++ # We also need to pin to an older version of python for older odoo versions ++ # where we are not using black > 21. Older black versions won't work with ++ # Python 3.9.8+, and we can't bump black without reformatting. ++ python-version: "3.9.7" + - name: Get python version diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 0000000000..fa17fcd4e8 --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,69 @@ +name: Mark stale issues and pull requests + +on: + schedule: + - cron: "0 12 * * 0" + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - name: Stale PRs and issues policy + uses: actions/stale@v9 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + # General settings. + ascending: true + remove-stale-when-updated: true + # Pull Requests settings. + # 120+30 day stale policy for PRs + # * Except PRs marked as "no stale" + days-before-pr-stale: 120 + days-before-pr-close: 30 + exempt-pr-labels: "no stale" + stale-pr-label: "stale" + stale-pr-message: > + There hasn't been any activity on this pull request in the past 4 months, so + it has been marked as stale and it will be closed automatically if no + further activity occurs in the next 30 days. + + If you want this PR to never become stale, please ask a PSC member to apply + the "no stale" label. + # Issues settings. + # 180+30 day stale policy for open issues + # * Except Issues marked as "no stale" + days-before-issue-stale: 180 + days-before-issue-close: 30 + exempt-issue-labels: "no stale,needs more information" + stale-issue-label: "stale" + stale-issue-message: > + There hasn't been any activity on this issue in the past 6 months, so it has + been marked as stale and it will be closed automatically if no further + activity occurs in the next 30 days. + + If you want this issue to never become stale, please ask a PSC member to + apply the "no stale" label. + + # 15+30 day stale policy for issues pending more information + # * Issues that are pending more information + # * Except Issues marked as "no stale" + - name: Needs more information stale issues policy + uses: actions/stale@v9 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + ascending: true + only-labels: "needs more information" + exempt-issue-labels: "no stale" + days-before-stale: 15 + days-before-close: 30 + days-before-pr-stale: -1 + days-before-pr-close: -1 + remove-stale-when-updated: true + stale-issue-label: "stale" + stale-issue-message: > + This issue needs more information and there hasn't been any activity + recently, so it has been marked as stale and it will be closed automatically + if no further activity occurs in the next 30 days. + + If you think this is a mistake, please ask a PSC member to remove the "needs + more information" label. diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000000..fbf23cb101 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,71 @@ +name: tests + +on: + pull_request: + branches: + - "13.0*" + push: + branches: + - "13.0" + - "13.0-ocabot-*" + +jobs: + unreleased-deps: + runs-on: ubuntu-latest + name: Detect unreleased dependencies + steps: + - uses: actions/checkout@v4 + - run: | + for reqfile in requirements.txt test-requirements.txt ; do + if [ -f ${reqfile} ] ; then + result=0 + # reject non-comment lines that contain a / (i.e. URLs, relative paths) + grep "^[^#].*/" ${reqfile} || result=$? + if [ $result -eq 0 ] ; then + echo "Unreleased dependencies found in ${reqfile}." + exit 1 + fi + fi + done + test: + runs-on: ubuntu-20.04 + container: ${{ matrix.container }} + name: ${{ matrix.name }} + strategy: + fail-fast: false + matrix: + include: + - container: ghcr.io/oca/oca-ci/py3.6-odoo13.0:latest + name: test with Odoo + - container: ghcr.io/oca/oca-ci/py3.6-ocb13.0:latest + name: test with OCB + makepot: "true" + services: + postgres: + image: postgres:9.6 + env: + POSTGRES_USER: odoo + POSTGRES_PASSWORD: odoo + POSTGRES_DB: odoo + ports: + - 5432:5432 + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + - name: Install addons and dependencies + run: oca_install_addons + - name: Check licenses + run: manifestoo -d . check-licenses + - name: Check development status + run: manifestoo -d . check-dev-status --default-dev-status=Beta + - name: Initialize test db + run: oca_init_test_database + - name: Run tests + run: oca_run_tests + - uses: codecov/codecov-action@v4 + with: + token: ${{ secrets.CODECOV_TOKEN }} + - name: Update .pot files + run: oca_export_and_push_pot https://x-access-token:${{ secrets.GIT_PUSH_TOKEN }}@github.com/${{ github.repository }} + if: ${{ matrix.makepot == 'true' && github.event_name == 'push' && github.repository_owner == 'OCA' }} diff --git a/.gitignore b/.gitignore index 5e48466dc5..6ec07a054b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] +/.venv +/.pytest_cache +/.ruff_cache # C extensions *.so @@ -13,7 +16,6 @@ build/ develop-eggs/ dist/ eggs/ -lib/ lib64/ parts/ sdist/ @@ -23,6 +25,19 @@ var/ *.egg *.eggs +# Windows installers +*.msi + +# Debian packages +*.deb + +# Redhat packages +*.rpm + +# MacOS packages +*.dmg +*.pkg + # Installer logs pip-log.txt pip-delete-this-directory.txt @@ -41,6 +56,19 @@ coverage.xml # Pycharm .idea +# Eclipse +.settings + +# Visual Studio cache/options directory +.vs/ +.vscode + +# OSX Files +.DS_Store + +# Django stuff: +*.log + # Mr Developer .mr.developer.cfg .project @@ -56,5 +84,5 @@ docs/_build/ *~ *.swp -# OSX Files -*.DS_Store +# OCA rules +!static/lib/ diff --git a/.isort.cfg b/.isort.cfg index f14151bd06..0ec187efd1 100644 --- a/.isort.cfg +++ b/.isort.cfg @@ -9,4 +9,5 @@ line_length=88 known_odoo=odoo known_odoo_addons=odoo.addons sections=FUTURE,STDLIB,THIRDPARTY,ODOO,ODOO_ADDONS,FIRSTPARTY,LOCALFOLDER -known_third_party=dateutil,mock,psycopg2,requests,setuptools +default_section=THIRDPARTY +ensure_newline_before_comments = True diff --git a/.oca_hooks.cfg b/.oca_hooks.cfg new file mode 100644 index 0000000000..1f3e3e4267 --- /dev/null +++ b/.oca_hooks.cfg @@ -0,0 +1,2 @@ +[MESSAGES_CONTROL] +disable=xml-deprecated-data-node,xml-deprecated-tree-attribute diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 14bb88eab3..df297f7468 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,68 +1,143 @@ -exclude: "^setup/|/static/lib/|/static/src/lib/|^base_export_async/|^base_import_async/|^test_base_import_async/" +exclude: | + (?x) + # NOT INSTALLABLE ADDONS + ^base_export_async/| + # END NOT INSTALLABLE ADDONS + # 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/| + # Maybe reactivate this when all README files include prettier ignore tags? + ^README\.md$| + # Library files can have extraneous formatting (even minimized) + /static/(src/)?lib/| + # Repos using Sphinx to generate docs don't need prettying + ^docs/_templates/.*\.html$| + # Ignore build and dist directories in addons + /build/|/dist/| + # You don't usually want a bot to modify your legal texts + (LICENSE.*|COPYING.*) default_language_version: - python: python3 + python: python3.8 + node: "14.13.0" repos: -- repo: https://github.com/psf/black - rev: 19.3b0 - hooks: - - id: black -- repo: https://github.com/pre-commit/pre-commit-hooks - rev: v2.3.0 - hooks: - - id: trailing-whitespace - # exclude autogenerated files - exclude: /README\.rst$|\.pot?$ - - id: end-of-file-fixer - # exclude autogenerated files - exclude: /README\.rst$|\.pot?$ - - id: debug-statements - - id: flake8 - name: flake8 except __init__.py - exclude: /__init__\.py$ - additional_dependencies: ["flake8-bugbear==19.8.0"] - - id: flake8 - name: flake8 only __init__.py - args: ["--extend-ignore=F401"] # ignore unused imports in __init__.py - files: /__init__\.py$ - additional_dependencies: ["flake8-bugbear==19.8.0"] - - id: fix-encoding-pragma - args: ["--remove"] - - id: check-case-conflict - - id: check-docstring-first - - id: check-executables-have-shebangs - - id: check-merge-conflict - - id: check-symlinks - - id: check-xml - - id: mixed-line-ending - args: ["--fix=lf"] -- repo: https://github.com/pre-commit/mirrors-pylint - rev: v2.3.1 - hooks: - - id: pylint - name: pylint with optional checks - args: ["--rcfile=.pylintrc", "--exit-zero"] - verbose: true - additional_dependencies: ["pylint-odoo==3.0.3"] - - id: pylint - name: pylint with mandatory checks - args: ["--rcfile=.pylintrc-mandatory"] - additional_dependencies: ["pylint-odoo==3.0.3"] -- repo: https://github.com/asottile/pyupgrade - rev: v1.24.0 - hooks: - - id: pyupgrade -- repo: https://github.com/asottile/seed-isort-config - rev: v1.9.3 - hooks: - - id: seed-isort-config -- repo: https://github.com/pre-commit/mirrors-isort - rev: v4.3.21 - hooks: - - id: isort - name: isort except __init__.py - exclude: /__init__\.py$ -- repo: https://github.com/pre-commit/mirrors-eslint - rev: v6.5.1 - hooks: - - id: eslint - verbose: true + - repo: local + hooks: + # These files are most likely copier diff rejection junks; if found, + # review them manually, fix the problem (if needed) and remove them + - id: forbidden-files + name: forbidden files + entry: found forbidden files; remove them + language: fail + files: "\\.rej$" + - id: en-po-files + name: en.po files cannot exist + entry: found a en.po file + language: fail + files: '[a-zA-Z0-9_]*/i18n/en\.po$' + - repo: https://github.com/oca/maintainer-tools + rev: ab1d7f6 + hooks: + # update the NOT INSTALLABLE ADDONS section above + - id: oca-update-pre-commit-excluded-addons + - id: oca-fix-manifest-website + args: ["https://github.com/OCA/queue"] + - repo: https://github.com/myint/autoflake + rev: v1.4 + hooks: + - id: autoflake + args: + - --expand-star-imports + - --ignore-init-module-imports + - --in-place + - --remove-all-unused-imports + - --remove-duplicate-keys + - --remove-unused-variables + - repo: https://github.com/psf/black + rev: 19.10b0 + hooks: + - id: black + additional_dependencies: ["click<8.1.0"] + - repo: https://github.com/pre-commit/mirrors-prettier + rev: v1.19.1 + hooks: + - id: prettier + name: prettier (with plugin-xml) + entry: prettier --write --list-different + additional_dependencies: + - "prettier@1.19.1" + - "@prettier/plugin-xml@0.7.2" + files: \.(css|htm|html|js|json|jsx|less|md|scss|toml|ts|xml|yaml|yml)$ + - repo: https://github.com/pre-commit/mirrors-eslint + rev: v6.8.0 + hooks: + - id: eslint + verbose: true + args: + - --color + - --fix + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v2.4.0 + hooks: + - id: trailing-whitespace + # exclude autogenerated files + exclude: /README\.rst$|\.pot?$ + - id: end-of-file-fixer + # exclude autogenerated files + exclude: /README\.rst$|\.pot?$ + - id: debug-statements + - id: fix-encoding-pragma + args: ["--remove"] + - id: check-case-conflict + - id: check-docstring-first + - id: check-executables-have-shebangs + - id: check-merge-conflict + # exclude files where underlines are not distinguishable from merge conflicts + exclude: /README\.rst$|^docs/.*\.rst$ + - id: check-symlinks + - id: check-xml + - id: mixed-line-ending + args: ["--fix=lf"] + - repo: https://github.com/asottile/pyupgrade + rev: v1.26.2 + hooks: + - id: pyupgrade + args: ["--keep-percent-format"] + - repo: https://github.com/pre-commit/mirrors-isort + rev: v4.3.21 + hooks: + - id: isort + name: isort except __init__.py + exclude: /__init__\.py$ + - repo: https://github.com/acsone/setuptools-odoo + rev: 3.1.8 + hooks: + - id: setuptools-odoo-make-default + - id: setuptools-odoo-get-requirements + args: + - --output + - requirements.txt + - --header + - "# generated from manifests external_dependencies" + - repo: https://github.com/PyCQA/flake8 + rev: 3.7.9 + hooks: + - id: flake8 + name: flake8 + additional_dependencies: ["flake8-bugbear==19.8.0"] + - repo: https://github.com/pre-commit/mirrors-pylint + rev: v2.5.3 + hooks: + - id: pylint + name: pylint with optional checks + args: + - --rcfile=.pylintrc + - --exit-zero + verbose: true + additional_dependencies: &pylint_deps + - pylint-odoo==3.5.0 + - id: pylint + name: pylint with mandatory checks + args: + - --rcfile=.pylintrc-mandatory + additional_dependencies: *pylint_deps diff --git a/.prettierrc.yml b/.prettierrc.yml new file mode 100644 index 0000000000..5b6d4b361a --- /dev/null +++ b/.prettierrc.yml @@ -0,0 +1,8 @@ +# 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/.pylintrc b/.pylintrc index f9ddbaa3f3..20d850dfe2 100644 --- a/.pylintrc +++ b/.pylintrc @@ -1,3 +1,5 @@ + + [MASTER] load-plugins=pylint_odoo score=n @@ -28,6 +30,7 @@ enable=anomalous-backslash-in-string, class-camelcase, dangerous-default-value, dangerous-view-replace-wo-priority, + development-status-allowed, duplicate-id-csv, duplicate-key, duplicate-xml-fields, @@ -45,8 +48,6 @@ enable=anomalous-backslash-in-string, method-inverse, method-required-super, method-search, - missing-import-error, - missing-manifest-dependency, openerp-exception-warning, pointless-statement, pointless-string-statement, @@ -72,6 +73,7 @@ enable=anomalous-backslash-in-string, deprecated-module, file-not-used, invalid-commit, + missing-manifest-dependency, missing-newline-extrafiles, missing-readme, no-utf8-coding-comment, @@ -81,6 +83,7 @@ enable=anomalous-backslash-in-string, too-complex, unnecessary-utf8-coding-comment + [REPORTS] msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg} output-format=colorized diff --git a/.pylintrc-mandatory b/.pylintrc-mandatory index 583bd53fbd..1c8f3771f8 100644 --- a/.pylintrc-mandatory +++ b/.pylintrc-mandatory @@ -1,3 +1,4 @@ + [MASTER] load-plugins=pylint_odoo score=n @@ -13,11 +14,6 @@ valid_odoo_versions=13.0 [MESSAGES CONTROL] disable=all -# missing-manifest-dependency -# has been removed from the checks -# until https://github.com/OCA/pylint-odoo/pull/263 -# is released - enable=anomalous-backslash-in-string, api-one-deprecated, api-one-multi-together, @@ -26,6 +22,7 @@ enable=anomalous-backslash-in-string, class-camelcase, dangerous-default-value, dangerous-view-replace-wo-priority, + development-status-allowed, duplicate-id-csv, duplicate-key, duplicate-xml-fields, @@ -43,7 +40,6 @@ enable=anomalous-backslash-in-string, method-inverse, method-required-super, method-search, - missing-import-error, openerp-exception-warning, pointless-statement, pointless-string-statement, diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 7048b77b57..0000000000 --- a/.travis.yml +++ /dev/null @@ -1,48 +0,0 @@ -language: python -cache: - directories: - - $HOME/.cache/pip - - $HOME/.cache/pre-commit - -python: - - "3.6" - -addons: - postgresql: "9.6" - apt: - packages: - - expect-dev # provides unbuffer utility - -stages: - - linting - - test - -jobs: - include: - - stage: linting - name: "pre-commit" - before_install: - install: pip install pre-commit - script: pre-commit run --all --show-diff-on-failure - after_success: - - stage: test - env: - - TESTS="1" ODOO_REPO="odoo/odoo" MAKEPOT="1" - - stage: test - env: - - TESTS="1" ODOO_REPO="OCA/OCB" - -env: - global: - - VERSION="13.0" TESTS="0" LINT_CHECK="0" MAKEPOT="0" - -install: - - git clone --depth=1 https://github.com/OCA/maintainer-quality-tools.git ${HOME}/maintainer-quality-tools - - export PATH=${HOME}/maintainer-quality-tools/travis:${PATH} - - travis_install_nightly - -script: - - travis_run_tests - -after_success: - - travis_after_tests_success diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 20de9b302c..ba44a40790 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,7 @@ # OCA Guidelines -Please follow the official guide from the [OCA Guidelines page](https://odoo-community.org/page/contributing). +Please follow the official guide from the +[OCA Guidelines page](https://odoo-community.org/page/contributing). ## Project Specific Guidelines diff --git a/LICENSE b/LICENSE index 58777e31af..be3f7b28e5 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,7 @@ -GNU AFFERO GENERAL PUBLIC LICENSE + GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -633,8 +633,8 @@ the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -643,7 +643,7 @@ the "copyright" line and a pointer to where the full notice is found. GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . + along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. @@ -658,4 +658,4 @@ specific requirements. You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see -. +. diff --git a/README.md b/README.md index bde3f0a011..c43e4e8253 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,54 @@ -[![Build Status](https://travis-ci.org/OCA/queue.svg?branch=13.0)](https://travis-ci.org/OCA/queue) + +[![Runboat](https://img.shields.io/badge/runboat-Try%20me-875A7B.png)](https://runboat.odoo-community.org/builds?repo=OCA/queue&target_branch=13.0) +[![Pre-commit Status](https://github.com/OCA/queue/actions/workflows/pre-commit.yml/badge.svg?branch=13.0)](https://github.com/OCA/queue/actions/workflows/pre-commit.yml?query=branch%3A13.0) +[![Build Status](https://github.com/OCA/queue/actions/workflows/test.yml/badge.svg?branch=13.0)](https://github.com/OCA/queue/actions/workflows/test.yml?query=branch%3A13.0) [![codecov](https://codecov.io/gh/OCA/queue/branch/13.0/graph/badge.svg)](https://codecov.io/gh/OCA/queue) +[![Translation Status](https://translation.odoo-community.org/widgets/queue-13-0/-/svg-badge.svg)](https://translation.odoo-community.org/engage/queue-13-0/?utm_source=widget) + + + +# Odoo Queue Modules + +Advanced async job management for Odoo + + + + + +[//]: # (addons) + +Available addons +---------------- +addon | version | maintainers | summary +--- | --- | --- | --- +[base_import_async](base_import_async/) | 13.0.2.0.1 | | Import CSV files in the background +[queue_job](queue_job/) | 13.0.3.11.3 | guewen | Job Queue +[queue_job_cron](queue_job_cron/) | 13.0.2.1.1 | | Scheduled Actions as Queue Jobs +[queue_job_subscribe](queue_job_subscribe/) | 13.0.1.0.0 | | Control which users are subscribed to queue job notifications +[queue_job_web_notify](queue_job_web_notify/) | 13.0.1.0.0 | | This module allows to display a notification to the related user of a failed job. It uses the web_notify notification feature. +[test_base_import_async](test_base_import_async/) | 13.0.1.0.0 | | Test suite for base_import_async. Normally you don't need to install this. +[test_queue_job](test_queue_job/) | 13.0.2.5.0 | | Queue Job Tests + +Unported addons +--------------- +addon | version | maintainers | summary +--- | --- | --- | --- +[base_export_async](base_export_async/) | 12.0.1.0.0 (unported) | | Asynchronous export with job queue -Odoo Queue Modules -================== +[//]: # (end addons) -Asynchronous Job Queue. Delay Model methods in asynchronous jobs, executed in -the background as soon as possible or on a schedule. Support Channels to -segregates jobs in different queues with different capacities. Unlike -scheduled tasks, a job captures arguments for later processing. + +## Licenses +This repository is licensed under [AGPL-3.0](LICENSE). +However, each module can have a totally different license, as long as they adhere to Odoo Community Association (OCA) +policy. Consult each module's `__manifest__.py` file, which contains a `license` key +that explains its license. -Translation Status ------------------- -[![Transifex Status](https://www.transifex.com/projects/p/OCA-queue-13-0/chart/image_png)](https://www.transifex.com/projects/p/OCA-queue-13-0) +---- +OCA, or the [Odoo Community Association](http://odoo-community.org/), is a nonprofit +organization whose mission is to support the collaborative development of Odoo features +and promote its widespread use. diff --git a/base_export_async/data/config_parameter.xml b/base_export_async/data/config_parameter.xml index e3c1e5e35e..38ff75fd6e 100644 --- a/base_export_async/data/config_parameter.xml +++ b/base_export_async/data/config_parameter.xml @@ -1,4 +1,4 @@ - + attachment.ttl diff --git a/base_export_async/data/cron.xml b/base_export_async/data/cron.xml index ba42369ac3..7e12c92a02 100644 --- a/base_export_async/data/cron.xml +++ b/base_export_async/data/cron.xml @@ -1,8 +1,8 @@ - + Delete Generated Exports - + code model.cron_delete() 1 diff --git a/base_export_async/models/delay_export.py b/base_export_async/models/delay_export.py index 7881af001b..60479f3779 100644 --- a/base_export_async/models/delay_export.py +++ b/base_export_async/models/delay_export.py @@ -7,10 +7,12 @@ import operator from dateutil.relativedelta import relativedelta + from odoo import _, api, fields, models +from odoo.exceptions import UserError + from odoo.addons.queue_job.job import job from odoo.addons.web.controllers.main import CSVExport, ExcelExport -from odoo.exceptions import UserError _logger = logging.getLogger(__name__) diff --git a/base_export_async/security/ir_rule.xml b/base_export_async/security/ir_rule.xml index 7ed488ed37..d91b93b5e3 100644 --- a/base_export_async/security/ir_rule.xml +++ b/base_export_async/security/ir_rule.xml @@ -1,13 +1,13 @@ - + Only user can read delay.export - - - - - - + + + + + + [('user_id', '=', user.id)] diff --git a/base_export_async/static/src/js/data_export.js b/base_export_async/static/src/js/data_export.js index 06a7af02a0..bf228133de 100644 --- a/base_export_async/static/src/js/data_export.js +++ b/base_export_async/static/src/js/data_export.js @@ -1,11 +1,11 @@ -odoo.define('base_export_async.DataExport', function(require) { +odoo.define("base_export_async.DataExport", function(require) { "use strict"; - var core = require('web.core'); - var DataExport = require('web.DataExport'); - var framework = require('web.framework'); - var pyUtils = require('web.py_utils'); - var Dialog = require('web.Dialog'); + var core = require("web.core"); + var DataExport = require("web.DataExport"); + var framework = require("web.framework"); + var pyUtils = require("web.py_utils"); + var Dialog = require("web.Dialog"); var _t = core._t; DataExport.include({ @@ -16,7 +16,7 @@ odoo.define('base_export_async.DataExport', function(require) { */ start: function() { this._super.apply(this, arguments); - this.async = this.$('#async_export'); + this.async = this.$("#async_export"); }, export_data: function() { var self = this; @@ -24,73 +24,60 @@ odoo.define('base_export_async.DataExport', function(require) { /* Checks from the standard method */ - var exported_fields = this.$( - '.o_fields_list option').map( - function() { + var exported_fields = this.$(".o_fields_list option") + .map(function() { return { - name: (self.records[this.value] || - this).value, - label: this.textContent || - this.innerText + name: (self.records[this.value] || this).value, + label: this.textContent || this.innerText, }; - }).get(); + }) + .get(); if (_.isEmpty(exported_fields)) { - Dialog.alert(this, _t( - "Please select fields to export..." - )); + Dialog.alert(this, _t("Please select fields to export...")); return; } if (!this.isCompatibleMode) { exported_fields.unshift({ - name: 'id', - label: _t('External ID') + name: "id", + label: _t("External ID"), }); } - var export_format = this.$export_format_inputs - .filter(':checked').val(); + var export_format = this.$export_format_inputs.filter(":checked").val(); /* Call the delay export if Async is checked */ framework.blockUI(); this._rpc({ - model: 'delay.export', - method: 'delay_export', - args: [{ - data: JSON.stringify({ - format: export_format, - model: this - .record - .model, - fields: exported_fields, - ids: this - .ids_to_export, - domain: this - .domain, - context: pyUtils - .eval( - 'contexts', [ - this - .record - .getContext() - ] - ), - import_compat: - !! - this - .$import_compat_radios - .filter( - ':checked' - ).val(), - }) - }], + model: "delay.export", + method: "delay_export", + args: [ + { + data: JSON.stringify({ + format: export_format, + model: this.record.model, + fields: exported_fields, + ids: this.ids_to_export, + domain: this.domain, + context: pyUtils.eval("contexts", [ + this.record.getContext(), + ]), + import_compat: Boolean(this.$import_compat_radios + .filter(":checked") + .val()), + }), + }, + ], }).then(function(result) { framework.unblockUI(); - Dialog.alert(this, _t( - "You will receive the export file by email as soon as it is finished." - )); + Dialog.alert( + this, + _t( + "You will receive the export file by email as soon as it is finished." + ) + ); }); } else { /* diff --git a/base_export_async/static/src/xml/base.xml b/base_export_async/static/src/xml/base.xml index 24f53a000f..387189bc7b 100644 --- a/base_export_async/static/src/xml/base.xml +++ b/base_export_async/static/src/xml/base.xml @@ -1,12 +1,13 @@ - +
diff --git a/base_export_async/tests/test_base_export_async.py b/base_export_async/tests/test_base_export_async.py index fae4b6264d..0a81c3b693 100644 --- a/base_export_async/tests/test_base_export_async.py +++ b/base_export_async/tests/test_base_export_async.py @@ -3,8 +3,9 @@ import json -import odoo.tests.common as common from dateutil.relativedelta import relativedelta + +import odoo.tests.common as common from odoo import fields data_csv = { diff --git a/base_export_async/views/assets.xml b/base_export_async/views/assets.xml index f0a778851c..24f276ba7e 100644 --- a/base_export_async/views/assets.xml +++ b/base_export_async/views/assets.xml @@ -1,8 +1,15 @@ - + -