diff --git a/.eslintrc.yml b/.eslintrc.yml index 9429bc688aab4993eae460767368f65089afa323..fed88d70d23ecb3297ea28854b320c4d62ee3c26 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -22,6 +22,7 @@ globals: 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 diff --git a/.gitignore b/.gitignore index 818770fb1bdc0a144e924c9a5940f0b035df8a0d..d99361a24aa02c2d19d8165c3a057b84bc575166 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ __pycache__/ *.py[cod] /.venv /.pytest_cache +/.ruff_cache # C extensions *.so @@ -15,7 +16,6 @@ build/ develop-eggs/ dist/ eggs/ -lib/ lib64/ parts/ sdist/ @@ -24,6 +24,7 @@ var/ .installed.cfg *.egg *.eggs +.copier-answers.yml # Installer logs pip-log.txt diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 732d0c4a644eb444d6b4385643ff32fab19fab52..740d10c003557349d6b59ab07ee2da7c6c9d270d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -6,10 +6,16 @@ exclude: | ^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$| + # Don't bother non-technical authors with formatting issues in docs + readme/.*\.(rst|md)$| + # 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: @@ -25,30 +31,34 @@ repos: 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: 7d8a9f9ad73db0976fb03cbee43d953bc29b89e9 + rev: 9a170331575a265c092ee6b24b845ec508e8ef75 hooks: # update the NOT INSTALLABLE ADDONS section above - id: oca-update-pre-commit-excluded-addons - id: oca-fix-manifest-website args: ["https://le-filament.com"] - - repo: https://github.com/myint/autoflake - rev: v1.4 - hooks: - - id: autoflake + - id: oca-gen-addon-readme 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: 22.3.0 + - --addons-dir=. + - --branch=14.0 + - --org-name=lefilament + - --repo-name=template_module + - --if-source-changed + - --keep-source-digest + - --convert-fragments-to-markdown + - repo: https://github.com/OCA/odoo-pre-commit-hooks + rev: v0.0.25 hooks: - - id: black + - id: oca-checks-odoo-module + - id: oca-checks-po - repo: https://github.com/pre-commit/mirrors-prettier - rev: v2.6.2 + rev: v2.1.2 hooks: - id: prettier name: prettier (with plugin-xml) @@ -59,7 +69,7 @@ repos: - --plugin=@prettier/plugin-xml 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.15.0 + rev: v7.8.1 hooks: - id: eslint verbose: true @@ -67,7 +77,7 @@ repos: - --color - --fix - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.2.0 + rev: v3.2.0 hooks: - id: trailing-whitespace # exclude autogenerated files @@ -89,37 +99,25 @@ repos: - id: mixed-line-ending args: ["--fix=lf"] - repo: https://github.com/asottile/pyupgrade - rev: v2.32.1 + rev: v2.7.2 hooks: - id: pyupgrade args: ["--keep-percent-format"] - - repo: https://github.com/PyCQA/isort - rev: 5.10.1 - hooks: - - id: isort - name: isort except __init__.py - args: - - --settings=. - exclude: /__init__\.py$ - - repo: https://gitlab.com/PyCQA/flake8 - rev: 3.9.2 + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.1.3 hooks: - - id: flake8 - name: flake8 - additional_dependencies: ["flake8-bugbear==20.1.4"] - - repo: https://github.com/PyCQA/pylint - rev: v2.11.1 + - id: ruff + args: [--fix, --exit-non-zero-on-fix] + - id: ruff-format + - repo: https://github.com/OCA/pylint-odoo + rev: 7.0.2 hooks: - - id: pylint + - id: pylint_odoo name: pylint with optional checks args: - --rcfile=.pylintrc - --exit-zero verbose: true - additional_dependencies: &pylint_deps - - pylint-odoo==5.0.5 - - id: pylint - name: pylint with mandatory checks + - id: pylint_odoo args: - --rcfile=.pylintrc-mandatory - additional_dependencies: *pylint_deps diff --git a/.pylintrc b/.pylintrc index dc6270e15be0c08da00e768a570f27c785d8630e..941ea6ba8dc268fa854836ba0651f657a7f98a7b 100644 --- a/.pylintrc +++ b/.pylintrc @@ -1,3 +1,5 @@ + + [MASTER] load-plugins=pylint_odoo score=n @@ -73,6 +75,7 @@ enable=anomalous-backslash-in-string, invalid-commit, missing-manifest-dependency, missing-newline-extrafiles, + missing-readme, no-utf8-coding-comment, odoo-addons-relative-import, old-api7-method-defined, diff --git a/.pylintrc-mandatory b/.pylintrc-mandatory index 43ea23947166ff8080219007cfae43ec54a28f8e..4336f52d81465175d3cea21e54fe6b6089078d36 100644 --- a/.pylintrc-mandatory +++ b/.pylintrc-mandatory @@ -1,3 +1,4 @@ + [MASTER] load-plugins=pylint_odoo score=n diff --git a/.ruff.toml b/.ruff.toml new file mode 100644 index 0000000000000000000000000000000000000000..d75c6d979221f4e8efe98381989a52ca4703e863 --- /dev/null +++ b/.ruff.toml @@ -0,0 +1,28 @@ + +fix = true + +[lint] +extend-select = [ + "B", + "C90", + "E501", # line too long (default 88) + "I", # isort +] +exclude = ["setup/*"] + +[format] +exclude = ["setup/*"] + +[per-file-ignores] +"__init__.py" = ["F401", "I001"] # ignore unused and unsorted imports in __init__.py +"__manifest__.py" = ["B018"] # useless expression + +[isort] +section-order = ["future", "standard-library", "third-party", "odoo", "odoo-addons", "first-party", "local-folder"] + +[isort.sections] +"odoo" = ["odoo"] +"odoo-addons" = ["odoo.addons"] + +[mccabe] +max-complexity = 16 diff --git a/models/product_template.py b/models/product_template.py index 42e8761ba6be4a8947ccb77594c759c2892941f1..fa2e3cf1f76ff67740384a168ecd511aecfd129a 100644 --- a/models/product_template.py +++ b/models/product_template.py @@ -1,16 +1,7 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -import itertools -import logging -from collections import defaultdict - -from odoo import api, fields, models, tools, _, SUPERUSER_ID -from odoo.exceptions import ValidationError, RedirectWarning, UserError -from odoo.osv import expression - -_logger = logging.getLogger(__name__) +# Copyright 2024- Le Filament (https://le-filament.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) +from odoo import fields, models class ProductTemplate(models.Model): _inherit = "product.template" @@ -18,10 +9,8 @@ class ProductTemplate(models.Model): # ------------------------------------------------------ # Fields declaration # ------------------------------------------------------ - nb_accesories = fields.Float(f"Nombre d'accessoires") - accessory_label = fields.Char( - related="categ_id.accessory_label", readonly=True - ) + nb_accesories = fields.Float("Nombre d'accessoires") + accessory_label = fields.Char(related="categ_id.accessory_label", readonly=True) # ------------------------------------------------------ # SQL Constraints @@ -50,4 +39,3 @@ class ProductTemplate(models.Model): # ------------------------------------------------------ # Business methods # ------------------------------------------------------ - diff --git a/views/product_template_views.xml b/views/product_template_views.xml index f5247f547362c81fb9ef8396c9162d07c4f26d11..f04b42934f9e4617efba97267535cbe8a12d6579 100644 --- a/views/product_template_views.xml +++ b/views/product_template_views.xml @@ -16,12 +16,31 @@ <record id="product_template_only_form_view_ap" model="ir.ui.view"> <field name="name">product.template.product.form.inherit</field> <field name="model">product.template</field> - <field name="inherit_id" ref="product.product_template_form_view"/> + <field name="inherit_id" ref="product.product_template_form_view" /> <field name="arch" type="xml"> - <field name="categ_id" position="after"> - <field name="accessory_label" string="Accessoire de catégorie associé"/> - <field name="nb_accesories"/> - </field> + <xpath expr="//group[field[@name='description']]" position="before"> + <table + class="o_group" + style="width=50%;" + attrs="{'invisible': [('accessory_label', '=', False)]}" + > + <tbody class="o_inner_group"> + <tr> + <td class="o_td_label"> + <field + name="accessory_label" + nolabel="1" + class="o_form_label" + help="Nombre d'accessoires à compter par article" + /> + </td> + <td style="width=100%,"> + <field name="nb_accesories" nolabel="1" /> + </td> + </tr> + </tbody> + </table> + </xpath> </field> </record>