diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000000000000000000000000000000000..bfd7ac53df9f103f6dc8853738c63fd364445fde --- /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 0000000000000000000000000000000000000000..d4cc423ccda9db9691205c9da83307af97b2670f --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,187 @@ +env: + browser: true + es6: true + +# See https://github.com/OCA/odoo-community.org/issues/37#issuecomment-470686449 +parserOptions: + ecmaVersion: 2017 + +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 + +# 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 new file mode 100644 index 0000000000000000000000000000000000000000..e397e8ed4e3e7f7fe7785dd391bb80aa6d85575e --- /dev/null +++ b/.flake8 @@ -0,0 +1,12 @@ +[flake8] +max-line-length = 88 +max-complexity = 16 +# B = bugbear +# B9 = bugbear opinionated (incl line length) +select = C,E,F,W,B,B9 +# E203: whitespace before ':' (black behaviour) +# 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/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..818770fb1bdc0a144e924c9a5940f0b035df8a0d --- /dev/null +++ b/.gitignore @@ -0,0 +1,75 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +/.venv +/.pytest_cache + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +bin/ +build/ +develop-eggs/ +dist/ +eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg +*.eggs + +# 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/.isort.cfg b/.isort.cfg new file mode 100644 index 0000000000000000000000000000000000000000..0ec187efd1bf802844749f508cda0c8f138970f9 --- /dev/null +++ b/.isort.cfg @@ -0,0 +1,13 @@ +[settings] +; see https://github.com/psf/black +multi_line_output=3 +include_trailing_comma=True +force_grid_wrap=0 +combine_as_imports=True +use_parentheses=True +line_length=88 +known_odoo=odoo +known_odoo_addons=odoo.addons +sections=FUTURE,STDLIB,THIRDPARTY,ODOO,ODOO_ADDONS,FIRSTPARTY,LOCALFOLDER +default_section=THIRDPARTY +ensure_newline_before_comments = True diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1c6434bfc2274c73d98dbf62b6de9baccdc353ce --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,127 @@ +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$| + # You don't usually want a bot to modify your legal texts + (LICENSE.*|COPYING.*) +default_language_version: + python: python3 + node: "14.13.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$" + - 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://le-filament.com"] + - 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: 20.8b1 + hooks: + - id: black + - repo: https://github.com/pre-commit/mirrors-prettier + rev: v2.1.2 + hooks: + - id: prettier + name: prettier (with plugin-xml) + additional_dependencies: + - "prettier@2.1.2" + - "@prettier/plugin-xml@0.12.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: v7.8.1 + hooks: + - id: eslint + verbose: true + args: + - --color + - --fix + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v3.2.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: v2.7.2 + hooks: + - id: pyupgrade + args: ["--keep-percent-format"] + - repo: https://github.com/PyCQA/isort + rev: 5.5.1 + hooks: + - id: isort + name: isort except __init__.py + args: + - --settings=. + exclude: /__init__\.py$ + - repo: https://gitlab.com/PyCQA/flake8 + rev: 3.8.3 + hooks: + - id: flake8 + name: flake8 + additional_dependencies: ["flake8-bugbear==20.1.4"] + - repo: https://github.com/PyCQA/pylint + rev: pylint-2.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 0000000000000000000000000000000000000000..5b6d4b361ace92f3877993bf2848fac190d8fab6 --- /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 0000000000000000000000000000000000000000..dc6270e15be0c08da00e768a570f27c785d8630e --- /dev/null +++ b/.pylintrc @@ -0,0 +1,87 @@ +[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=14.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, + # 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, + 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 0000000000000000000000000000000000000000..43ea23947166ff8080219007cfae43ec54a28f8e --- /dev/null +++ b/.pylintrc-mandatory @@ -0,0 +1,64 @@ +[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=14.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 + +[REPORTS] +msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg} +output-format=colorized +reports=no diff --git a/README.rst b/README.rst old mode 100755 new mode 100644 diff --git a/__init__.py b/__init__.py old mode 100755 new mode 100644 diff --git a/__manifest__.py b/__manifest__.py old mode 100755 new mode 100644 index 554ca462191050429349cb057a7e6bd29cc15594..ffbff46df4a7f013becde066523ed98f3db85e62 --- a/__manifest__.py +++ b/__manifest__.py @@ -1,7 +1,7 @@ { "name": "CG SCOP - Adhésion Alfodoo", "summary": "CG SCOP - Adhésion Alfodoo", - "version": "12.0.1.2", + "version": "14.0.1.0.0", "author": "Le Filament", "license": "AGPL-3", "application": False, @@ -19,4 +19,7 @@ "views/res_partner.xml", "views/scop_adhesion_file.xml", ], + "external_dependencies": { + "python": ["cmislib"], + }, } diff --git a/datas/mail_data.xml b/datas/mail_data.xml index d8db113fcc4e34a1e786e1daa02b8b852e34152d..fabe66c53bd2812cedea0cc302e3fed49ce3966c 100644 --- a/datas/mail_data.xml +++ b/datas/mail_data.xml @@ -1,11 +1,11 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8" ?> <odoo> <data noupdate="1"> <!-- Template and notification section --> <record id="email_template_adhesion" model="mail.template"> <field name="name">CG Scop - Mail adhésion CG</field> - <field name="model_id" ref="model_res_partner"/> + <field name="model_id" ref="model_res_partner" /> <field name="email_from">administratif.cg@scop.coop</field> <field name="partner_to">${object.get_recipients_adhesion()}</field> <field name="reply_to">administratif.cg@scop.coop</field> @@ -15,22 +15,24 @@ <p style="margin: 0px; padding: 0px; font-size: 13px;"> <p>Chère Coopératrice, Cher Coopérateur,</p> - <p>Merci pour votre adhésion ! Vous trouverez sur votre espace personnel votre courrier et facture d'adhésion.</p> + <p + >Merci pour votre adhésion ! Vous trouverez sur votre espace personnel votre courrier et facture d'adhésion.</p> - <p>Si vous rencontrez des problèmes d'accès ou si vous ne savez pas comment vous connectez, n'hésitez pas à vous rapprocher de votre délégué qui pourra vous aider.</p> + <p + >Si vous rencontrez des problèmes d'accès ou si vous ne savez pas comment vous connectez, n'hésitez pas à vous rapprocher de votre délégué qui pourra vous aider.</p> - <p>Nous vous prions d'agréer, Chère Coopératrice, Cher Coopérateur, nos sentiments les meilleurs.</p> + <p + >Nous vous prions d'agréer, Chère Coopératrice, Cher Coopérateur, nos sentiments les meilleurs.</p> <p>Pour la CG Scop,</p> - <p>Christophe GENTREAU</p> + <p>Amélie RAFAEL</p> <p>Directeur Administratif et Exploitation</p> </p> </div> </field> <field name="lang">${object.lang}</field> - <field name="user_signature" eval="False"/> - <field name="auto_delete" eval="False"/> + <field name="auto_delete" eval="False" /> </record> </data> diff --git a/datas/mail_message_subtype.xml b/datas/mail_message_subtype.xml index ade10d6a4e0279bc2c33971815c6bbc513c0a855..ca14b52407a412954fa90532013fe74a66649ebd 100644 --- a/datas/mail_message_subtype.xml +++ b/datas/mail_message_subtype.xml @@ -1,12 +1,14 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8" ?> <odoo> <data noupdate="1"> <record id="mail_message_subtype_adhesion" model="mail.message.subtype"> <field name="name">Mail validation adhésion</field> - <field name="model">res.partner</field> - <field name="description">Mail envoyé à la coop pour valider l'adhésion au mouvement</field> - <field name="interal">True</field> + <field name="res_model">res.partner</field> + <field + name="description" + >Mail envoyé à la coop pour valider l'adhésion au mouvement</field> + <field name="internal">True</field> <field name="hidden">True</field> </record> diff --git a/models/__init__.py b/models/__init__.py old mode 100755 new mode 100644 diff --git a/models/res_partner.py b/models/res_partner.py index f320f92e3ebb964d334083dc63f5111c4ececbba..cee068fa787955330ed52364e69b8aa510814a0f 100644 --- a/models/res_partner.py +++ b/models/res_partner.py @@ -2,13 +2,14 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from pytz import timezone -from odoo import models, api, fields + +from odoo import fields, models class ScopAlfrescoAdhesionPartner(models.Model): - _inherit = 'res.partner' + _inherit = "res.partner" - log_missing_docs = fields.Text('Documents manquants') + log_missing_docs = fields.Text("Documents manquants") # ------------------------------------------------------ # Actions @@ -27,42 +28,42 @@ class ScopAlfrescoAdhesionPartner(models.Model): if not recipient_list and self.email: recipient_list.append(self.id) recipient_ids = self.browse(recipient_list) - res = ','.join(map(lambda x: str(x), recipient_ids.ids)) + res = ",".join(map(lambda x: str(x), recipient_ids.ids)) return res - @api.multi def send_mail_adhesion(self): """ Send mail adhésion to coop :return: """ self.ensure_one() - template_id = self.env.ref( - 'cgscop_adhesion_alfodoo.email_template_adhesion') - ir_model_data = self.env['ir.model.data'] + template_id = self.env.ref("cgscop_adhesion_alfodoo.email_template_adhesion") + ir_model_data = self.env["ir.model.data"] try: compose_form_id = ir_model_data.get_object_reference( - 'mail', 'email_compose_message_wizard_form')[1] + "mail", "email_compose_message_wizard_form" + )[1] except ValueError: compose_form_id = False ctx = { - 'default_model': 'res.partner', - 'default_res_id': self.id, - 'default_use_template': True, - 'default_template_id': template_id.id, - 'default_subtype_id': self.env.ref( - 'cgscop_adhesion_alfodoo.mail_message_subtype_adhesion').id, - 'default_composition_mode': 'comment', + "default_model": "res.partner", + "default_res_id": self.id, + "default_use_template": True, + "default_template_id": template_id.id, + "default_subtype_id": self.env.ref( + "cgscop_adhesion_alfodoo.mail_message_subtype_adhesion" + ).id, + "default_composition_mode": "comment", } return { - 'type': 'ir.actions.act_window', - 'view_type': 'form', - 'view_mode': 'form', - 'res_model': 'mail.compose.message', - 'views': [(compose_form_id, 'form')], - 'view_id': compose_form_id, - 'target': 'new', - 'context': ctx, + "type": "ir.actions.act_window", + "view_type": "form", + "view_mode": "form", + "res_model": "mail.compose.message", + "views": [(compose_form_id, "form")], + "view_id": compose_form_id, + "target": "new", + "context": ctx, } def check_docs_adhesion(self): @@ -74,27 +75,32 @@ class ScopAlfrescoAdhesionPartner(models.Model): if doc.name not in missing_docs: html += "checked" html += "/> " + doc.name + "<br/>" - local_tz = timezone('Europe/Paris') - utc_tz = timezone('UTC') - html += "<hr/>Vérifié le " + '<strong>' + utc_tz.localize( - fields.Datetime.now()).astimezone(local_tz).strftime( - "%d/%m/%Y à %-H:%M") + \ - '</strong>' + local_tz = timezone("Europe/Paris") + utc_tz = timezone("UTC") + html += ( + "<hr/>Vérifié le " + + "<strong>" + + utc_tz.localize(fields.Datetime.now()) + .astimezone(local_tz) + .strftime("%d/%m/%Y à %-H:%M") + + "</strong>" + ) self.log_missing_docs = html # ------------------------------------------------------ # Business method # ------------------------------------------------------ def get_compulsory_docs(self): - return self.env['scop.adhesion.file'].search([ - ('coop_type_id', '=', self.cooperative_form_id.id), - ('is_compulsory', '=', True) - ]) + return self.env["scop.adhesion.file"].search( + [ + ("coop_type_id", "=", self.cooperative_form_id.id), + ("is_compulsory", "=", True), + ] + ) # ------------------------------------------------------ # Override parent # ------------------------------------------------------ - @api.multi def scop_valid_cg_button(self): """ Inherit button to send mail @@ -102,7 +108,6 @@ class ScopAlfrescoAdhesionPartner(models.Model): super(ScopAlfrescoAdhesionPartner, self).scop_valid_cg_button() return self.send_mail_adhesion() - @api.multi def scop_valid_cg(self): """ Inherit function to push files on Alfresco : @@ -116,45 +121,51 @@ class ScopAlfrescoAdhesionPartner(models.Model): folder_coop = self.partner_cmis_folder # Create & store Facture d'adhésion - invoice_file = self.env.ref('account.account_invoices'). \ - render_qweb_pdf(self.invoice_adhesion_id.id)[0] - invoice_name = 'Facture d\'Adhésion' + invoice_file = self.env.ref("account.account_invoices").render_qweb_pdf( + self.invoice_adhesion_id.id + )[0] + invoice_name = "Facture d'Adhésion" self.push_alfresco_file( file=invoice_file, name=invoice_name + ".pdf", folder=folder_coop, metadata={ - 'cm:title': invoice_name, - 'cmis:objectTypeId': 'D:crm:document', - 'cmis:secondaryObjectTypeIds': [ - 'P:crm:organisme', 'P:cm:titled'], - 'crm:type': 'FAD', - 'crm:contexte': 'STD', - 'crm:annee': str(fields.Datetime.now().year) - }) + "cm:title": invoice_name, + "cmis:objectTypeId": "D:crm:document", + "cmis:secondaryObjectTypeIds": [ + "P:crm:organisme", + "P:cm:titled", + ], + "crm:type": "FAD", + "crm:contexte": "STD", + "crm:annee": str(fields.Datetime.now().year), + }, + ) # Create & store Courrier adhésion report_adhesion = self.env.ref( - 'cgscop_adhesion.cgscop_adhesion_report'). \ - render_qweb_pdf(self.id)[0] - courrier_name = 'Courrier d\'Adhésion' + "cgscop_adhesion.cgscop_adhesion_report" + ).render_qweb_pdf(self.id)[0] + courrier_name = "Courrier d'Adhésion" self.push_alfresco_file( file=report_adhesion, name=courrier_name + ".pdf", folder=folder_coop, metadata={ - 'cm:title': courrier_name, - 'cmis:objectTypeId': 'D:crm:document', - 'cmis:secondaryObjectTypeIds': [ - 'P:crm:organisme', 'P:cm:titled'], - 'crm:type': 'CAD', - 'crm:contexte': 'STD', - 'crm:annee': str(fields.Datetime.now().year) - }) + "cm:title": courrier_name, + "cmis:objectTypeId": "D:crm:document", + "cmis:secondaryObjectTypeIds": [ + "P:crm:organisme", + "P:cm:titled", + ], + "crm:type": "CAD", + "crm:contexte": "STD", + "crm:annee": str(fields.Datetime.now().year), + }, + ) return res - @api.multi def check_compulsory_docs(self): """ Override function to check docs with cmis query @@ -162,13 +173,16 @@ class ScopAlfrescoAdhesionPartner(models.Model): """ errors = list() compulsory_docs = self.get_compulsory_docs() - loaded_docs = self.env['scop.adhesion.file'].\ - compulsory_doc_cmis_query(self) - - compulsory_docs_list = compulsory_docs.mapped(lambda d: {'name': d.name, 'metadata': d.type_doc}) - loaded_docs_list = list(map(lambda d: d.properties.get('crm:type'), loaded_docs)) + loaded_docs = self.env["scop.adhesion.file"].compulsory_doc_cmis_query(self) + + compulsory_docs_list = compulsory_docs.mapped( + lambda d: {"name": d.name, "metadata": d.type_doc} + ) + loaded_docs_list = list( + map(lambda d: d.properties.get("crm:type"), loaded_docs) + ) for mandatory_doc in compulsory_docs_list: - if mandatory_doc.get('metadata') not in loaded_docs_list: - errors.append(mandatory_doc.get('name')) + if mandatory_doc.get("metadata") not in loaded_docs_list: + errors.append(mandatory_doc.get("name")) return errors diff --git a/models/scop_adhesion_file.py b/models/scop_adhesion_file.py index 6e81a1f04627e21d0f2d950ce1d50f9d1a8af7d0..3005cbe3dfc625fe9f06dc52ed4a1600b7b796ea 100644 --- a/models/scop_adhesion_file.py +++ b/models/scop_adhesion_file.py @@ -1,31 +1,38 @@ # © 2021 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from odoo import fields, models, exceptions +from odoo import _, exceptions, fields, models class ScopAdhesionFiles(models.Model): - _inherit = 'scop.adhesion.file' - _description = 'Documents pour adhésion des coops' + _inherit = "scop.adhesion.file" + _description = "Documents pour adhésion des coops" - type_doc = fields.Char('Méta : Type') + type_doc = fields.Char("Méta : Type") # ------------------------------------------------------ # Business method # ------------------------------------------------------ def compulsory_doc_cmis_query(self, partner): - backend = self.env['cmis.backend'].search([]) + backend = self.env["cmis.backend"].search([]) backend.ensure_one() cmis_client = backend.get_cmis_client() - query = (""" + query = ( + """ SELECT * FROM crm:document as d JOIN crm:organisme as o ON d.cmis:objectId = o.cmis:objectId - WHERE o.crm:id = '%s'""" % partner.id) + WHERE o.crm:id = '%s'""" + % partner.id + ) try: doc = cmis_client.getDefaultRepository().query(query) result = doc.getResults() return result except Exception as e: - raise exceptions.Warning( - "Impossible de vérifier les documents d'adhésion" - " dans Alfresco : %s" % e) + raise exceptions.UserError( + _( + "Impossible de vérifier les documents d'adhésion" + " dans Alfresco : %s" + ) + % e + ) diff --git a/report/report_invoice_adhesion.xml b/report/report_invoice_adhesion.xml index dc8cfe81c67a7d507914dc58625e74949fe8aa20..7965d6a5074714a7b0dd7eb01e351a0ba7f8c3c3 100644 --- a/report/report_invoice_adhesion.xml +++ b/report/report_invoice_adhesion.xml @@ -1,15 +1,18 @@ -<?xml version="1.0" encoding="utf-8"?> +<?xml version="1.0" encoding="utf-8" ?> <odoo> <data> <!-- Template invoice --> - <template id="scop_report_invoice_adhesion" inherit_id="account.report_invoice_document"> + <template + id="scop_report_invoice_adhesion" + inherit_id="account.report_invoice_document" + > <xpath expr="//t[@t-set='o']" position="after"> <t t-if="o.journal_id == o.company_id.journal_adhesion_id"> - <t t-set="is_adh" t-value="True"/> + <t t-set="is_adh" t-value="True" /> </t> <t t-else=""> - <t t-set="is_adh" t-value="False"/> + <t t-set="is_adh" t-value="False" /> </t> </xpath> <xpath expr="//div[hasclass('page')]/h2" position="attributes"> @@ -17,10 +20,16 @@ </xpath> <xpath expr="//div[hasclass('page')]/h2" position="after"> <h2 t-if="is_adh"> - <span t-if="o.type == 'out_invoice' and o.state in ('open', 'in_payment', 'paid')">Droits d'adhésion</span> - <span t-if="o.type == 'out_invoice' and o.state == 'draft'">Brouillon adhésion</span> - <span t-if="o.type == 'out_invoice' and o.state == 'cancel'">Annulation adhésion</span> - <span t-field="o.number"/> + <span + t-if="o.type == 'out_invoice' and o.state in ('open', 'in_payment', 'paid')" + >Droits d'adhésion</span> + <span + t-if="o.type == 'out_invoice' and o.state == 'draft'" + >Brouillon adhésion</span> + <span + t-if="o.type == 'out_invoice' and o.state == 'cancel'" + >Annulation adhésion</span> + <span t-field="o.number" /> </h2> </xpath> diff --git a/static/description/icon.png b/static/description/icon.png old mode 100755 new mode 100644 index 82ef47760a441cf229b5009f0a18ccf3842fbfa5..499652a2c9c0307f875bafc145b6fbafa133da72 Binary files a/static/description/icon.png and b/static/description/icon.png differ diff --git a/views/res_partner.xml b/views/res_partner.xml index 0f82f5878650597a2ae24a3f7ab058fcd506211a..2fc93ccfc63790f28a5221ac0851b2441d0ee412 100644 --- a/views/res_partner.xml +++ b/views/res_partner.xml @@ -1,21 +1,40 @@ -<?xml version="1.0"?> +<?xml version="1.0" ?> <!-- Copyright 2019 Le Filament License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> - <odoo> <data> - <!-- FORM --> - <record id="res_partner_scop_adhesion_alfodoo_view_form_inherit" model="ir.ui.view"> + <!-- FORM --> + <record + id="res_partner_scop_adhesion_alfodoo_view_form_inherit" + model="ir.ui.view" + > <field name="name">res.partner.scop.adhesion.view.form.inherit</field> <field name="model">res.partner</field> - <field name="inherit_id" ref="cgscop_partner_alfodoo.res_partner_alfresco_view_form_inherit"/> + <field + name="inherit_id" + ref="cgscop_partner_alfodoo.res_partner_alfresco_view_form_inherit" + /> <field name="arch" type="xml"> <xpath expr="//field[@name='partner_cmis_folder']" position="before"> - <button string="Vérifier la liste des docs" type="object" name="check_docs_adhesion" class="btn-info mb-10" - attrs="{'invisible': [('project_status', '!=', '4_adhesion')]}"/> - <div class="alert alert-info mt16" role="alert" attrs="{'invisible':['|', '|', ('write_date', '=', False), ('log_missing_docs', '=', False), ('project_status', '!=', '4_adhesion')]}"> - <field class="o_field_header" name="log_missing_docs" readonly="1" widget="html"/> + <button + string="Vérifier la liste des docs" + type="object" + name="check_docs_adhesion" + class="btn-info mb-10" + attrs="{'invisible': [('project_status', '!=', '4_adhesion')]}" + /> + <div + class="alert alert-info mt16" + role="alert" + attrs="{'invisible':['|', '|', ('write_date', '=', False), ('log_missing_docs', '=', False), ('project_status', '!=', '4_adhesion')]}" + > + <field + class="o_field_header" + name="log_missing_docs" + readonly="1" + widget="html" + /> </div> </xpath> </field> diff --git a/views/scop_adhesion_file.xml b/views/scop_adhesion_file.xml old mode 100755 new mode 100644 index 258558a27f1f4f2d7438f6f6c15448f0ff1636fd..033e3ae121654c93aec1a47be645eb2dc7f0878a --- a/views/scop_adhesion_file.xml +++ b/views/scop_adhesion_file.xml @@ -1,20 +1,19 @@ -<?xml version="1.0"?> +<?xml version="1.0" ?> <!-- Copyright 2021 Le Filament License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> - <odoo> <data> <record model="ir.ui.view" id="scop_adhesion_file_inherit_tree"> <field name="name">scop.adhesion.file.inherit.tree</field> <field name="model">scop.adhesion.file</field> - <field name="inherit_id" ref="cgscop_adhesion.scop_adhesion_file_tree"/> + <field name="inherit_id" ref="cgscop_adhesion.scop_adhesion_file_tree" /> <field name="arch" type="xml"> <xpath expr="//tree" position="inside"> - <field name="type_doc"/> + <field name="type_doc" /> </xpath> </field> </record> </data> -</odoo> \ No newline at end of file +</odoo>