From a723f1ae0492bc12a1895b7f68cfe88b90f70d32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20-=20Le=20Filament?= <remi@le-filament.com> Date: Thu, 8 Aug 2024 16:07:18 +0200 Subject: [PATCH] [MIG] version 16.0 --- .editorconfig | 20 +++ .eslintrc.yml | 188 ++++++++++++++++++++++++ .gitignore | 76 ++++++++++ .pre-commit-config.yaml | 117 +++++++++++++++ .prettierrc.yml | 8 + .pylintrc | 123 ++++++++++++++++ .pylintrc-mandatory | 98 ++++++++++++ .ruff.toml | 30 ++++ LICENSE | 12 +- README.md | 25 ++++ README.rst | 38 ----- __init__.py | 5 +- __manifest__.py | 47 +++--- controllers/__init__.py | 4 +- controllers/main.py | 27 +--- models/__init__.py | 5 +- models/nichoirs_stat_year.py | 34 ++--- models/product_public_category.py | 23 +-- models/sale_order.py | 36 +++-- templates/assets.xml | 10 -- templates/home_stat_templates.xml | 37 ++++- views/nichoirs_stat_year_views.xml | 134 +++++++++-------- views/product_public_category_views.xml | 31 ++-- 23 files changed, 892 insertions(+), 236 deletions(-) create mode 100644 .editorconfig create mode 100644 .eslintrc.yml create mode 100644 .gitignore create mode 100644 .pre-commit-config.yaml create mode 100644 .prettierrc.yml create mode 100644 .pylintrc create mode 100644 .pylintrc-mandatory create mode 100644 .ruff.toml mode change 100755 => 100644 LICENSE create mode 100644 README.md delete mode 100755 README.rst delete mode 100644 templates/assets.xml diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..bfd7ac5 --- /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.yml b/.eslintrc.yml new file mode 100644 index 0000000..fed88d7 --- /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/.gitignore b/.gitignore new file mode 100644 index 0000000..d99361a --- /dev/null +++ b/.gitignore @@ -0,0 +1,76 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +/.venv +/.pytest_cache +/.ruff_cache + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +bin/ +build/ +develop-eggs/ +dist/ +eggs/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg +*.eggs +.copier-answers.yml + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.cache +nosetests.xml +coverage.xml + +# Translations +*.mo + +# Pycharm +.idea + +# Eclipse +.settings + +# Visual Studio cache/options directory +.vs/ +.vscode + +# OSX Files +.DS_Store + +# Django stuff: +*.log + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject + +# Rope +.ropeproject + +# Sphinx documentation +docs/_build/ + +# Backup files +*~ +*.swp + +# OCA rules +!static/lib/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..3efb4d9 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,117 @@ +exclude: | + (?x) + # NOT INSTALLABLE ADDONS + # 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$| + # 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: + python: python3 + node: "16.17.0" +repos: + - 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: f71041f22b8cd68cf7c77b73a14ca8d8cd190a60 + 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"] + - id: oca-gen-addon-readme + args: + - --addons-dir=. + - --branch=16.0 + - --org-name=lefilament + - --repo-name=template_module + - --if-source-changed + - --keep-source-digest + - repo: https://github.com/OCA/odoo-pre-commit-hooks + rev: v0.0.25 + hooks: + - id: oca-checks-odoo-module + - id: oca-checks-po + - repo: https://github.com/pre-commit/mirrors-prettier + rev: v2.7.1 + hooks: + - id: prettier + name: prettier (with plugin-xml) + additional_dependencies: + - "prettier@2.7.1" + - "@prettier/plugin-xml@2.2.0" + args: + - --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.24.0 + hooks: + - id: eslint + verbose: true + args: + - --color + - --fix + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.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: 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/astral-sh/ruff-pre-commit + rev: v0.1.3 + hooks: + - id: ruff + args: [--fix, --exit-non-zero-on-fix] + - id: ruff-format + - repo: https://github.com/OCA/pylint-odoo + rev: v8.0.19 + hooks: + - id: pylint_odoo + name: pylint with optional checks + args: + - --rcfile=.pylintrc + - --exit-zero + verbose: true + - id: pylint_odoo + args: + - --rcfile=.pylintrc-mandatory diff --git a/.prettierrc.yml b/.prettierrc.yml new file mode 100644 index 0000000..5b6d4b3 --- /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 new file mode 100644 index 0000000..71c476d --- /dev/null +++ b/.pylintrc @@ -0,0 +1,123 @@ + + +[MASTER] +load-plugins=pylint_odoo +score=n + +[ODOOLINT] +readme_template_url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst" +manifest_required_authors=Le Filament +manifest_required_keys=license +manifest_deprecated_keys=description,active +license_allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3 +valid_odoo_versions=16.0 + +[MESSAGES CONTROL] +disable=all + +# This .pylintrc contains optional AND mandatory checks and is meant to be +# loaded in an IDE to have it check everything, in the hope this will make +# optional checks more visible to contributors who otherwise never look at a +# green travis to see optional checks that failed. +# .pylintrc-mandatory containing only mandatory checks is used the pre-commit +# config as a blocking check. + +enable=anomalous-backslash-in-string, + api-one-deprecated, + api-one-multi-together, + assignment-from-none, + attribute-deprecated, + class-camelcase, + dangerous-default-value, + dangerous-view-replace-wo-priority, + development-status-allowed, + duplicate-id-csv, + duplicate-key, + duplicate-xml-fields, + duplicate-xml-record-id, + eval-referenced, + eval-used, + incoherent-interpreter-exec-perm, + license-allowed, + manifest-author-string, + manifest-deprecated-key, + manifest-required-author, + manifest-required-key, + manifest-version-format, + method-compute, + method-inverse, + method-required-super, + method-search, + openerp-exception-warning, + pointless-statement, + pointless-string-statement, + print-used, + redundant-keyword-arg, + redundant-modulename-xml, + reimported, + relative-import, + return-in-init, + rst-syntax-error, + sql-injection, + too-few-format-args, + translation-field, + translation-required, + unreachable, + use-vim-comment, + wrong-tabs-instead-of-spaces, + xml-syntax-error, + attribute-string-redundant, + character-not-valid-in-resource-link, + consider-merging-classes-inherited, + context-overridden, + create-user-wo-reset-password, + dangerous-filter-wo-user, + dangerous-qweb-replace-wo-priority, + deprecated-data-xml-node, + deprecated-openerp-xml-node, + duplicate-po-message-definition, + except-pass, + file-not-used, + invalid-commit, + manifest-maintainers-list, + missing-newline-extrafiles, + missing-readme, + missing-return, + odoo-addons-relative-import, + old-api7-method-defined, + po-msgstr-variables, + po-syntax-error, + renamed-field-parameter, + resource-not-exist, + str-format-used, + test-folder-imported, + translation-contains-variable, + translation-positional-used, + unnecessary-utf8-coding-comment, + website-manifest-key-not-valid-uri, + xml-attribute-translatable, + xml-deprecated-qweb-directive, + xml-deprecated-tree-attribute, + external-request-timeout, + # messages that do not cause the lint step to fail + consider-merging-classes-inherited, + create-user-wo-reset-password, + dangerous-filter-wo-user, + deprecated-module, + file-not-used, + invalid-commit, + missing-manifest-dependency, + missing-newline-extrafiles, + missing-readme, + no-utf8-coding-comment, + odoo-addons-relative-import, + old-api7-method-defined, + redefined-builtin, + too-complex, + unnecessary-utf8-coding-comment + + +[REPORTS] +msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg} +output-format=colorized +reports=no diff --git a/.pylintrc-mandatory b/.pylintrc-mandatory new file mode 100644 index 0000000..9906493 --- /dev/null +++ b/.pylintrc-mandatory @@ -0,0 +1,98 @@ + +[MASTER] +load-plugins=pylint_odoo +score=n + +[ODOOLINT] +readme-template-url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst" +manifest-required-authors=Le Filament +manifest-required-keys=license +manifest-deprecated-keys=description,active +license-allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3 +valid-odoo-versions=16.0 + +[MESSAGES CONTROL] +disable=all + +enable=anomalous-backslash-in-string, + api-one-deprecated, + api-one-multi-together, + assignment-from-none, + attribute-deprecated, + class-camelcase, + dangerous-default-value, + dangerous-view-replace-wo-priority, + development-status-allowed, + duplicate-id-csv, + duplicate-key, + duplicate-xml-fields, + duplicate-xml-record-id, + eval-referenced, + eval-used, + incoherent-interpreter-exec-perm, + license-allowed, + manifest-author-string, + manifest-deprecated-key, + manifest-required-author, + manifest-required-key, + manifest-version-format, + method-compute, + method-inverse, + method-required-super, + method-search, + openerp-exception-warning, + pointless-statement, + pointless-string-statement, + print-used, + redundant-keyword-arg, + redundant-modulename-xml, + reimported, + relative-import, + return-in-init, + rst-syntax-error, + sql-injection, + too-few-format-args, + translation-field, + translation-required, + unreachable, + use-vim-comment, + wrong-tabs-instead-of-spaces, + xml-syntax-error, + attribute-string-redundant, + character-not-valid-in-resource-link, + consider-merging-classes-inherited, + context-overridden, + create-user-wo-reset-password, + dangerous-filter-wo-user, + dangerous-qweb-replace-wo-priority, + deprecated-data-xml-node, + deprecated-openerp-xml-node, + duplicate-po-message-definition, + except-pass, + file-not-used, + invalid-commit, + manifest-maintainers-list, + missing-newline-extrafiles, + missing-readme, + missing-return, + odoo-addons-relative-import, + old-api7-method-defined, + po-msgstr-variables, + po-syntax-error, + renamed-field-parameter, + resource-not-exist, + str-format-used, + test-folder-imported, + translation-contains-variable, + translation-positional-used, + unnecessary-utf8-coding-comment, + website-manifest-key-not-valid-uri, + xml-attribute-translatable, + xml-deprecated-qweb-directive, + xml-deprecated-tree-attribute, + external-request-timeout + +[REPORTS] +msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg} +output-format=colorized +reports=no diff --git a/.ruff.toml b/.ruff.toml new file mode 100644 index 0000000..0240c75 --- /dev/null +++ b/.ruff.toml @@ -0,0 +1,30 @@ + +target-version = "py310" +fix = true + +[lint] +extend-select = [ + "B", + "C90", + "E501", # line too long (default 88) + "I", # isort + "UP", # pyupgrade +] +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/LICENSE b/LICENSE old mode 100755 new mode 100644 index 3ffc567..be3f7b2 --- 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. <http://fsf.org/> + Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> 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) <year> <name of author> 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 <http://www.gnu.org/licenses/>. + along with this program. If not, see <https://www.gnu.org/licenses/>. 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 -<http://www.gnu.org/licenses/>. \ No newline at end of file +<https://www.gnu.org/licenses/>. diff --git a/README.md b/README.md new file mode 100644 index 0000000..f82ea2a --- /dev/null +++ b/README.md @@ -0,0 +1,25 @@ +# Symbiosphère - Impacts Website +## Description +Ce module permet l'ajout d'un bloc sur la Page d'accueil, afin de pouvoir visualiser l'impact de Symbiosphère sur la biodiversité. + +## Exemple + + +## Credits + +Le développement de ce module a été financé par / The development of this module has been financially supported by: + - Symbiosphère (https://symbiosphere.fr) + +## Contributors + + * Juliana Poudou <juliana@le-filament.com> + +## Maintainer + + +[](https://le-filament.com) +This module is maintained by Le Filament + +## Licenses + +This repository is licensed under [AGPL-3.0](LICENSE). diff --git a/README.rst b/README.rst deleted file mode 100755 index 4104713..0000000 --- a/README.rst +++ /dev/null @@ -1,38 +0,0 @@ -.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg - :target: http://www.gnu.org/licenses/agpl - :alt: License: AGPL-3 - - -=============================== -Symbiosphère - Impacts Website -=============================== - -Description -=========== - -Ce module permet l'ajout d'un bloc sur la Page d'accueil, afin de pouvoir visualiser -l'impact de Symbiosphère sur la biodiversité. - -Exemple -======= - - - -Credits -======= - -Contributors ------------- - -* Juliana Poudou <juliana@le-filament.com> - - -Maintainer ----------- - -.. image:: https://le-filament.com/images/logo-lefilament.png - :alt: Le Filament - :target: https://le-filament.com - -This module is maintained by Le Filament - diff --git a/__init__.py b/__init__.py index 4082a0a..f7209b1 100644 --- a/__init__.py +++ b/__init__.py @@ -1,5 +1,2 @@ -# Copyright 2021 Le Filament (<http://www.le-filament.com>) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - from . import models -from . import controllers \ No newline at end of file +from . import controllers diff --git a/__manifest__.py b/__manifest__.py index ba6cf34..f34fad1 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -1,23 +1,24 @@ -# Copyright 2021 Le Filament (<http://www.le-filament.com>) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - -{ - 'name': 'Symbiosphère - Impacts Website', - 'version': '12.0.1.0', - 'summary': '', - "author": "Le Filament", - "license": "AGPL-3", - 'category': 'Nichoirs', - 'depends': [ - 'website_sale', - ], - 'website': 'http://www.le-filament.com', - 'data': [ - 'security/ir.model.access.csv', - 'templates/assets.xml', - 'views/nichoirs_stat_year_views.xml', - 'views/product_public_category_views.xml', - 'templates/home_stat_templates.xml' - ], - 'qweb': [], -} +{ + "name": "Symbiosphère - Impacts Website", + "author": "Le Filament", + "website": "https://le-filament.com", + "version": "16.0.1.0.0", + "license": "AGPL-3", + "category": "Nichoirs", + "depends": [ + "website_sale", + ], + "data": [ + "security/ir.model.access.csv", + "views/nichoirs_stat_year_views.xml", + "views/product_public_category_views.xml", + "templates/home_stat_templates.xml", + ], + "assets": { + "web.assets_frontend": [ + "symbiosphere_impact_website/static/src/css/styles.css" + ], + }, + "installable": True, + "auto_install": False, +} diff --git a/controllers/__init__.py b/controllers/__init__.py index 6920e20..12a7e52 100644 --- a/controllers/__init__.py +++ b/controllers/__init__.py @@ -1,3 +1 @@ -# -*- coding: utf-8 -*- - -from . import main \ No newline at end of file +from . import main diff --git a/controllers/main.py b/controllers/main.py index a938e1f..0271826 100644 --- a/controllers/main.py +++ b/controllers/main.py @@ -1,28 +1,17 @@ -# © 2021 Le Filament (<http://www.le-filament.com>) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - +# Copyright 2021- Le Filament (https://le-filament.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) from odoo import http from odoo.http import request + from odoo.addons.website.controllers.main import Website class Website(Website): + @http.route("/", type="http", auth="public", website=True) + def index(self, **kw): + super().index(**kw) - ############################################### - ## HOME - ############################################### - @http.route('/', type='http', auth="public", website=True) - def index(self, **kw): - res = super(Website, self).index(**kw) - - cat_ids = request.env['product.public.category'].search([]) - # list_qty = request.env['nichoirs.stat.year'].read_group( - # [], ['categ_id', 'nichoirs_proprata_qty'], - # ['categ_id'], lazy=False - # ) + cat_ids = request.env["product.public.category"].search([]) - return request.render('website.homepage', { - # 'list_qty': list_qty, - 'cat_ids': cat_ids - }) + return request.render("website.homepage", {"cat_ids": cat_ids}) diff --git a/models/__init__.py b/models/__init__.py index a76f0f1..34d66a6 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,6 +1,3 @@ -# Copyright 2021 Le Filament (<http://www.le-filament.com>) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - from . import nichoirs_stat_year from . import sale_order -from . import product_public_category \ No newline at end of file +from . import product_public_category diff --git a/models/nichoirs_stat_year.py b/models/nichoirs_stat_year.py index 54bb4bc..bef90cb 100644 --- a/models/nichoirs_stat_year.py +++ b/models/nichoirs_stat_year.py @@ -1,31 +1,31 @@ -# Copyright 2021 Le Filament (<http://www.le-filament.com>) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# Copyright 2021- Le Filament (https://le-filament.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) -from odoo import fields, models, api -from datetime import datetime, date +from odoo import api, fields, models class NichoirsStatYear(models.Model): - _name = 'nichoirs.stat.year' - _description = 'Statistiques de ventes nichoirs' + _name = "nichoirs.stat.year" + _description = "Statistiques de ventes nichoirs" # ------------------------------------------------------ # Fields declaration # ------------------------------------------------------ - categ_id = fields.Many2one( - 'product.public.category', 'Catégorie', - required=True) - year = fields.Integer('Année') + categ_id = fields.Many2one("product.public.category", "Catégorie", required=True) + year = fields.Integer("Année") product_qty = fields.Integer("Nombre d'articles vendus") coeff_year = fields.Integer( "Coefficient calculé en fonction de l'année", - compute='_compute_coeff_year', - store=True, default=1 + compute="_compute_coeff_year", + store=True, + default=1, ) nichoirs_proprata_qty = fields.Integer( "Nombre de nichoirs", - compute='_compute_nichoirs_proprata_qty', - store=True, default=0) + compute="_compute_nichoirs_proprata_qty", + store=True, + default=0, + ) # ------------------------------------------------------ # SQL Constraints @@ -38,13 +38,13 @@ class NichoirsStatYear(models.Model): # ------------------------------------------------------ # Computed fields / Search Fields # ------------------------------------------------------ - @api.depends('year') + @api.depends("year") def _compute_coeff_year(self): for res in self: if res.year: - res.coeff_year = ( date.today().year - res.year ) + 1 + res.coeff_year = (fields.Date.today().year - res.year) + 1 - @api.depends('product_qty', 'coeff_year') + @api.depends("product_qty", "coeff_year") def _compute_nichoirs_proprata_qty(self): for res in self: if res.product_qty: diff --git a/models/product_public_category.py b/models/product_public_category.py index fac65d8..052c478 100644 --- a/models/product_public_category.py +++ b/models/product_public_category.py @@ -1,11 +1,11 @@ -# Copyright 2021 Le Filament (<http://www.le-filament.com>) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# Copyright 2021- Le Filament (https://le-filament.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) -from odoo import fields, models, api +from odoo import fields, models class ProductPublicCategory(models.Model): - _inherit = 'product.public.category' + _inherit = "product.public.category" # ------------------------------------------------------ # Fields declaration @@ -39,13 +39,14 @@ class ProductPublicCategory(models.Model): # ------------------------------------------------------ def update_qty(self): for cat in self: - nb_nichoirs = self.env['nichoirs.stat.year'].read_group( - [('categ_id', '=', cat.id)], ['categ_id', 'nichoirs_proprata_qty'], - ['categ_id'], lazy=False) - cat.nb_nichoirs = nb_nichoirs[0]['nichoirs_proprata_qty'] * cat.capacite - # self.write({ - # 'nb_nichoirs': nichoirs - # }) + nb_nichoirs = self.env["nichoirs.stat.year"].read_group( + [("categ_id", "=", cat.id)], + ["categ_id", "nichoirs_proprata_qty"], + ["categ_id"], + lazy=False, + ) + cat.nb_nichoirs = nb_nichoirs[0]["nichoirs_proprata_qty"] * cat.capacite + # ------------------------------------------------------ # Business methods # ------------------------------------------------------ diff --git a/models/sale_order.py b/models/sale_order.py index df38ee3..dc36605 100644 --- a/models/sale_order.py +++ b/models/sale_order.py @@ -1,12 +1,13 @@ -# Copyright 2021 Le Filament (<http://www.le-filament.com>) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# Copyright 2021- Le Filament (https://le-filament.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) -from odoo import fields, models, api -from datetime import datetime, date +from datetime import date + +from odoo import models class SaleOrder(models.Model): - _inherit = 'sale.order' + _inherit = "sale.order" # ------------------------------------------------------ # Fields declaration @@ -36,24 +37,29 @@ class SaleOrder(models.Model): # Actions # ------------------------------------------------------ def action_confirm(self): - res = super(SaleOrder, self).action_confirm() + res = super().action_confirm() for order in self: for line in order.order_line: cat_ids = line.product_id.public_categ_ids if cat_ids: - rec = self.env['nichoirs.stat.year'].search([ - ('categ_id', '=', cat_ids[0].id), - ('year', '=', date.today().year) - ]) + rec = self.env["nichoirs.stat.year"].search( + [ + ("categ_id", "=", cat_ids[0].id), + ("year", "=", date.today().year), + ] + ) if rec: rec.product_qty += line.product_uom_qty else: - self.env['nichoirs.stat.year'].create({ - 'categ_id': cat_ids[0].id, - 'year': date.today().year, - 'product_qty': line.product_uom_qty - }) + self.env["nichoirs.stat.year"].create( + { + "categ_id": cat_ids[0].id, + "year": date.today().year, + "product_qty": line.product_uom_qty, + } + ) return res + # ------------------------------------------------------ # Business methods # ------------------------------------------------------ diff --git a/templates/assets.xml b/templates/assets.xml deleted file mode 100644 index e224c41..0000000 --- a/templates/assets.xml +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<odoo> - - <template id="assets_frontend" inherit_id="website.assets_frontend" > - <xpath expr="." position="inside"> - <link rel="stylesheet" href="/symbiosphere_impact_website/static/src/css/styles.css" /> - </xpath> - </template> - -</odoo> \ No newline at end of file diff --git a/templates/home_stat_templates.xml b/templates/home_stat_templates.xml index 9bae134..1338152 100644 --- a/templates/home_stat_templates.xml +++ b/templates/home_stat_templates.xml @@ -1,22 +1,43 @@ <odoo> +<!-- Copyright 2021- Le Filament (https://le-filament.com) + License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> - <template id="homepage_stat" inherit_id="website.homepage" name="Stats Bloc" customize_show="True" active="True"> + <template + id="homepage_stat" + inherit_id="website.homepage" + name="Stats Bloc" + customize_show="True" + active="True" + > <data inherit_id="website.homepage"> <xpath expr="//div[@id='wrap']" position="after"> - <input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/> + <input + type="hidden" + name="csrf_token" + t-att-value="request.csrf_token()" + /> <div class="container mt32 mb64 stat-bloc"> - <h2>Depuis sa création, Symbiosphère a permis d'offrir de quoi s'abriter pour :</h2> + <h2 + >Depuis sa création, Symbiosphère a permis d'offrir de quoi s'abriter pour :</h2> <div class="row mt-32"> <t t-foreach="cat_ids" t-as="cat"> <div class="col-md-3 col-xs-12 text-center"> - <t t-if="cat.image_1920"><img t-attf-src="data:image/*;base64,{{cat.image_1920}}" class="img-responsive p-4" /></t> - <h3><t t-esc="cat.nb_nichoirs"/> <t t-esc="cat.name_website"/> *</h3> + <t t-if="cat.image_1920"><img + t-attf-src="data:image/*;base64,{{cat.image_1920}}" + class="img-responsive p-4" + /></t> + <h3><t t-esc="cat.nb_nichoirs" /> <t + t-esc="cat.name_website" + /> *</h3> </div> </t> </div> - <p>* les calculs sont les suivant : nb nichoirs (avec coef sur année de vente) x capacité<br/> - nb nichoirs = nombre d’aménagement vendus ou installés<br/> - année = nombre d’année (ex : 1 nichoir installé il y a 2 ans = 2 nichoirs)<br/> + <p + >* les calculs sont les suivant : nb nichoirs (avec coef sur année de vente) x capacité<br + /> + nb nichoirs = nombre d’aménagement vendus ou installés<br /> + année = nombre d’année (ex : 1 nichoir installé il y a 2 ans = 2 nichoirs)<br + /> capacité = nombre d’animaux pouvant occuper l’aménagement</p> </div> </xpath> diff --git a/views/nichoirs_stat_year_views.xml b/views/nichoirs_stat_year_views.xml index 5cf5d78..94acb7e 100644 --- a/views/nichoirs_stat_year_views.xml +++ b/views/nichoirs_stat_year_views.xml @@ -1,71 +1,81 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8" ?> +<!-- Copyright 2021- Le Filament (https://le-filament.com) + License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> <odoo> - <data> - - <record id="nichoirs_stat_year_form_view" model="ir.ui.view"> - <field name="name">symb.nichoirs_stat_year.form</field> - <field name="model">nichoirs.stat.year</field> - <field name="arch" type="xml"> - <form string="Enregistrement"> - <sheet> + <record id="nichoirs_stat_year_form_view" model="ir.ui.view"> + <field name="name">symb.nichoirs_stat_year.form</field> + <field name="model">nichoirs.stat.year</field> + <field name="arch" type="xml"> + <form string="Enregistrement"> + <sheet> + <group> <group> - <group> - <field name="categ_id" /> - <field name="year" /> - <field name="product_qty" /> - <field name="coeff_year" /> - <field name="nichoirs_proprata_qty" /> - </group> + <field name="categ_id" /> + <field name="year" /> + <field name="product_qty" /> + <field name="coeff_year" /> + <field name="nichoirs_proprata_qty" /> </group> - </sheet> - </form> - </field> - </record> + </group> + </sheet> + </form> + </field> + </record> - <record id="nichoirs_stat_year_tree_view" model="ir.ui.view"> - <field name="name">symb.nichoirs_stat_year.tree</field> - <field name="model">nichoirs.stat.year</field> - <field name="arch" type="xml"> - <tree string="Statistiques"> - <field name="year"/> - <field name="categ_id"/> - <field name="product_qty"/> - <field name="coeff_year"/> - <field name="nichoirs_proprata_qty"/> - </tree> - </field> - </record> + <record id="nichoirs_stat_year_tree_view" model="ir.ui.view"> + <field name="name">symb.nichoirs_stat_year.tree</field> + <field name="model">nichoirs.stat.year</field> + <field name="arch" type="xml"> + <tree string="Statistiques"> + <field name="year" /> + <field name="categ_id" /> + <field name="product_qty" /> + <field name="coeff_year" /> + <field name="nichoirs_proprata_qty" /> + </tree> + </field> + </record> - <record id="nichoirs_stat_year_search_view" model="ir.ui.view"> - <field name="name">symb.nichoirs_stat_year.search</field> - <field name="model">nichoirs.stat.year</field> - <field name="arch" type="xml"> - <search string="Statistiques"> - <group expand="1" string="Group By"> - <filter string="Année" name="year" domain="[]" context="{'group_by':'year'}"/> - <filter string="Catégorie" name="categ_id" domain="[]" context="{'group_by':'categ_id'}"/> - </group> - </search> - </field> - </record> + <record id="nichoirs_stat_year_search_view" model="ir.ui.view"> + <field name="name">symb.nichoirs_stat_year.search</field> + <field name="model">nichoirs.stat.year</field> + <field name="arch" type="xml"> + <search string="Statistiques"> + <group expand="1" string="Group By"> + <filter + string="Année" + name="year" + domain="[]" + context="{'group_by':'year'}" + /> + <filter + string="Catégorie" + name="categ_id" + domain="[]" + context="{'group_by':'categ_id'}" + /> + </group> + </search> + </field> + </record> - <record id="nichoirs_stat_year_act_window" model="ir.actions.act_window"> - <field name="name">Statistiques</field> - <field name="type">ir.actions.act_window</field> - <field name="res_model">nichoirs.stat.year</field> - <field name="view_mode">tree,form</field> - <field name="help" type="html"> - <p class="oe_view_nocontent_create"> - Ajouter un nouvel enregistrement - </p> - </field> - </record> + <record id="nichoirs_stat_year_act_window" model="ir.actions.act_window"> + <field name="name">Statistiques</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">nichoirs.stat.year</field> + <field name="view_mode">tree,form</field> + <field name="help" type="html"> + <p class="oe_view_nocontent_create"> + Ajouter un nouvel enregistrement + </p> + </field> + </record> - <menuitem - name="Statistiques" - id="nichoirs_stat_year_menu" - parent="symbiosphere_nichoirs.menu_symbiosphere" - action="nichoirs_stat_year_act_window"/> + <menuitem + name="Statistiques" + id="nichoirs_stat_year_menu" + parent="symbiosphere_nichoirs.menu_symbiosphere" + action="nichoirs_stat_year_act_window" + /> - </data> </odoo> diff --git a/views/product_public_category_views.xml b/views/product_public_category_views.xml index 36c1084..df79c63 100644 --- a/views/product_public_category_views.xml +++ b/views/product_public_category_views.xml @@ -1,19 +1,18 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8" ?> +<!-- Copyright 2021- Le Filament (https://le-filament.com) + License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> <odoo> - <data> - - <record id="product_public_category_form_view" model="ir.ui.view"> - <field name="name">product.public.category.form.inherit</field> - <field name="model">product.public.category</field> - <field name="inherit_id" ref="website_sale.product_public_category_form_view"/> - <field name="arch" type="xml"> - <field name="sequence" position="after"> - <field name="capacite"/> - <field name="nb_nichoirs"/> - <field name="name_website"/> - </field> + <record id="product_public_category_form_view" model="ir.ui.view"> + <field name="name">product.public.category.form.inherit</field> + <field name="model">product.public.category</field> + <field name="inherit_id" ref="website_sale.product_public_category_form_view" /> + <field name="arch" type="xml"> + <field name="sequence" position="after"> + <field name="capacite" /> + <field name="nb_nichoirs" /> + <field name="name_website" /> </field> - </record> + </field> + </record> - </data> -</odoo> \ No newline at end of file +</odoo> -- GitLab