From 76db335030386e3ff3ab08f5264104a945e91fe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phan=20Sainl=C3=A9ger?= Date: Wed, 25 Jun 2025 15:09:39 +0200 Subject: [PATCH 1/5] WIP - [ADD] global: add pre-commit process --- .editorconfig | 20 ++++ .eslintrc.yml | 188 +++++++++++++++++++++++++++++++ .github/workflows/pre-commit.yml | 42 +++++++ .pre-commit-config.yaml | 146 ++++++++++++++++++++++++ .prettierrc.yml | 8 ++ .pylintrc | 123 ++++++++++++++++++++ .pylintrc-mandatory | 98 ++++++++++++++++ .ruff.toml | 31 +++++ 8 files changed, 656 insertions(+) create mode 100644 .editorconfig create mode 100644 .eslintrc.yml create mode 100644 .github/workflows/pre-commit.yml 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 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/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml new file mode 100644 index 0000000..37d6128 --- /dev/null +++ b/.github/workflows/pre-commit.yml @@ -0,0 +1,42 @@ +name: pre-commit + +on: + pull_request: + branches: + - "16.0*" + +jobs: + pre-commit: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.11" + - 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/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..9fd6c41 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,146 @@ +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/|^eslint.config.cjs|^prettier.config.cjs| + # Maybe reactivate this when all README files include prettier ignore tags? + ^README\.md$| + # Library files can have extraneous formatting (even minimized) + /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/| + # Ignore test files in addons + /tests/samples/.*| + # 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: f9b919b9868143135a9c9cb03021089cabba8223 + hooks: + # update the NOT INSTALLABLE ADDONS section above + - id: oca-update-pre-commit-excluded-addons + - id: oca-fix-manifest-website + args: ["https://github.com/elabore-coop/helpdesk-tools"] + - id: oca-gen-addon-readme + args: + - --addons-dir=. + - --branch=16.0 + - --org-name=OCA + - --repo-name=helpdesk-tools + - --if-source-changed + - --keep-source-digest + - repo: https://github.com/OCA/odoo-pre-commit-hooks + rev: v0.1.4 + hooks: + - id: oca-checks-odoo-module + - id: oca-checks-po + args: + - --disable=po-pretty-format + - repo: local + hooks: + - id: prettier + name: prettier (with plugin-xml) + entry: prettier + args: + - --write + - --list-different + - --ignore-unknown + types: [text] + files: \.(css|htm|html|js|json|jsx|less|md|scss|toml|ts|xml|yaml|yml)$ + language: node + additional_dependencies: + - "prettier@2.7.1" + - "@prettier/plugin-xml@2.2.0" + - repo: local + hooks: + - id: eslint + name: eslint + entry: eslint + args: + - --color + - --fix + verbose: true + types: [javascript] + language: node + additional_dependencies: + - "eslint@8.24.0" + - "eslint-plugin-jsdoc@" + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.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/PyCQA/docformatter + rev: v1.7.7 + hooks: + - id: docformatter + args: [ + "--in-place", # modify the files + "--recursive", # run on all the files + "--wrap-summaries", + "88", # max length of 1st line + "--wrap-descriptions", + "88", # max length of other lines + "--pre-summary-newline", # new line before a long summary + "--make-summary-multi-line", # force summary on multilines + ] + additional_dependencies: ["tomli"] # if Python <3.11 + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.12.0 + hooks: + - id: ruff + args: [--fix, --exit-non-zero-on-fix] + - id: ruff-format + - repo: https://github.com/OCA/pylint-odoo + rev: v9.1.3 + 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..652a781 --- /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=Elabore +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..14ca356 --- /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=Elabore +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..5e63128 --- /dev/null +++ b/.ruff.toml @@ -0,0 +1,31 @@ + +target-version = "py310" +fix = true + +[lint] +extend-select = [ + "B", + "C90", + "E501", # line too long (default 88) + "I", # isort + "UP", # pyupgrade +] +extend-safe-fixes = ["UP008"] +exclude = ["setup/*"] + +[format] +exclude = ["setup/*"] + +[lint.per-file-ignores] +"__init__.py" = ["F401", "I001"] # ignore unused and unsorted imports in __init__.py +"__manifest__.py" = ["B018"] # useless expression + +[lint.isort] +section-order = ["future", "standard-library", "third-party", "odoo", "odoo-addons", "first-party", "local-folder"] + +[lint.isort.sections] +"odoo" = ["odoo"] +"odoo-addons" = ["odoo.addons"] + +[lint.mccabe] +max-complexity = 16 -- 2.49.1 From 2afa90260fadc31e428a451de30153126c352b3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phan=20Sainl=C3=A9ger?= Date: Wed, 25 Jun 2025 15:57:21 +0200 Subject: [PATCH 2/5] [CLN] global: apply ruff --- helpdesk_convert_ticket_to_task/README.md | 22 +++--- .../__manifest__.py | 9 ++- .../models/helpdesk_ticket.py | 77 +++++++++---------- .../README.md | 16 ++-- .../__manifest__.py | 2 +- .../controllers/__init__.py | 1 - .../controllers/main.py | 13 +++- .../views/helpdesk_ticket_templates.xml | 35 +++++---- .../README.md | 12 ++- .../controllers/__init__.py | 1 - .../controllers/main.py | 3 +- .../views/helpdesk_ticket_templates.xml | 54 ++++++++----- helpdesk_portal_timesheet/__init__.py | 1 - helpdesk_portal_timesheet/__manifest__.py | 5 +- helpdesk_request_type/__init__.py | 1 - helpdesk_request_type/__manifest__.py | 2 +- helpdesk_request_type/controllers/__init__.py | 2 +- helpdesk_request_type/controllers/main.py | 7 +- helpdesk_request_type/models/__init__.py | 2 +- .../models/helpdesk_request_type.py | 6 +- .../models/helpdesk_ticket.py | 2 +- .../views/helpdesk_request_type.xml | 9 ++- .../views/helpdesk_ticket.xml | 4 +- .../views/helpdesk_ticket_templates.xml | 20 +++-- .../__manifest__.py | 4 +- helpdesk_transfer_timesheet_to_task/README.md | 16 ++-- .../__manifest__.py | 2 +- .../models/helpdesk_ticket.py | 10 ++- .../tests/test_helpdesk_ticket.py | 3 +- .../models/helpdesk_ticket.py | 3 +- .../models/res_users.py | 7 +- .../views/res_users_views.xml | 2 +- 32 files changed, 194 insertions(+), 159 deletions(-) diff --git a/helpdesk_convert_ticket_to_task/README.md b/helpdesk_convert_ticket_to_task/README.md index dde6ce8..c91efb7 100644 --- a/helpdesk_convert_ticket_to_task/README.md +++ b/helpdesk_convert_ticket_to_task/README.md @@ -1,9 +1,7 @@ -=============================== -helpdesk_convert_ticket_to_task -=============================== +# helpdesk_convert_ticket_to_task -This module aims to convert a ticket into a task. -For this, it adds a button in the ticket view "Convert to task". +This module changes the behavior of the buttons "create" and "create and edit" of the +field `task` in a ticket form. It automatically fills up many fields (check the function button_convert_to_task for details) @@ -14,16 +12,16 @@ Use Odoo normal module installation procedure to install # Known issues / Roadmap -A current limitation is that one task can be linked to many tickets. -Thus, the above task fields are filled up at the creation of the task from a ticket form -but are not updated when the linked tickets are updated. +A current limitation is that one task can be linked to many tickets. Thus, the above +task fields are filled up at the creation of the task from a ticket form but are not +updated when the linked tickets are updated. # Bug Tracker -Bugs are tracked on `our issues website `\_. In case of -trouble, please check there if your issue has already been -reported. If you spotted it first, help us smashing it by providing a -detailed and welcomed feedback. +Bugs are tracked on +`our issues website `\_. In case +of trouble, please check there if your issue has already been reported. If you spotted +it first, help us smashing it by providing a detailed and welcomed feedback. # Credits diff --git a/helpdesk_convert_ticket_to_task/__manifest__.py b/helpdesk_convert_ticket_to_task/__manifest__.py index d0ce9f7..1ef75a7 100644 --- a/helpdesk_convert_ticket_to_task/__manifest__.py +++ b/helpdesk_convert_ticket_to_task/__manifest__.py @@ -13,10 +13,13 @@ "base", "helpdesk_mgmt", "helpdesk_mgmt_project", - "helpdesk_request_type", # to create the helpdesk.request.type model and have the field request_type_id in the helpdesk.ticket model - "project_request_data", # to have the fields service_id and request_type_id in the project.task model + # to create the helpdesk.request.type model and have the field request_type_id + # in the helpdesk.ticket model + "helpdesk_request_type", + # to have the fields service_id and request_type_id in the project.task model + "project_request_data", "project_task_add_very_high", # to have priority values 2 and 3 on tasks - "helpdesk_transfer_timesheet_to_task" # to copy timesheets from ticket to task + "helpdesk_transfer_timesheet_to_task", # to copy timesheets from ticket to task ], "data": [ "views/helpdesk_convert_ticket_to_task.xml", diff --git a/helpdesk_convert_ticket_to_task/models/helpdesk_ticket.py b/helpdesk_convert_ticket_to_task/models/helpdesk_ticket.py index a76cb79..44647e3 100644 --- a/helpdesk_convert_ticket_to_task/models/helpdesk_ticket.py +++ b/helpdesk_convert_ticket_to_task/models/helpdesk_ticket.py @@ -1,5 +1,6 @@ from odoo import _, models, api + class HelpdeskTicket(models.Model): _inherit = "helpdesk.ticket" @@ -7,42 +8,41 @@ class HelpdeskTicket(models.Model): user_ids = [self.user_id.id] task_service_id, request_type_id = self._match_task_service_and_request_type( ticket_category_id=self.category_id.id, - ticket_request_type_id=self.request_type_id.id + ticket_request_type_id=self.request_type_id.id, ) - task = self.env["project.task"].create({ - "name": self.name, - "description": self.description, - "project_id": self.project_id.id, - "user_ids": user_ids, - "partner_id": self.partner_id.id, - "service_id": task_service_id, - "request_type_id": request_type_id, - "priority": self.priority - }) + task = self.env["project.task"].create( + { + "name": self.name, + "description": self.description, + "project_id": self.project_id.id, + "user_ids": user_ids, + "partner_id": self.partner_id.id, + "service_id": task_service_id, + "request_type_id": request_type_id, + "priority": self.priority, + } + ) # copy chatter for msg in reversed(self.message_ids): - msg.copy({ - 'model': 'project.task', - 'res_id': task.id - }) + msg.copy({"model": "project.task", "res_id": task.id}) # copy attachments inserted in the messages for attach in msg.attachment_ids: - attach.copy({ - 'res_model': 'project.task', - 'res_id': task.id, - 'res_name': task.name - }) + attach.copy( + { + "res_model": "project.task", + "res_id": task.id, + "res_name": task.name, + } + ) # copy attachments not added in a message for attachment in self.attachment_ids: - attachment.copy({ - 'res_model': 'project.task', - 'res_id': task.id, - 'res_name': task.name - }) + attachment.copy( + {"res_model": "project.task", "res_id": task.id, "res_name": task.name} + ) # copy subscribers task.message_subscribe(partner_ids=self.message_partner_ids.ids) @@ -52,7 +52,7 @@ class HelpdeskTicket(models.Model): ticket_url = f"{base_url}/web#id={self.id}&model=helpdesk.ticket&view_type=form" task_message = _( "This task has been converted from a ticket. You can find the original ticket on this link.", - ticket_url=ticket_url + ticket_url=ticket_url, ) task.message_post(body=task_message) @@ -60,15 +60,12 @@ class HelpdeskTicket(models.Model): task_url = f"{base_url}/web#id={task.id}&model=project.task&view_type=form" ticket_message = _( "This ticket has been converted into a task. You can find it on this link.", - task_url=task_url + task_url=task_url, ) self.message_post(body=ticket_message) # archive the ticket - self.write({ - "active": False, - "task_id": task.id - }) + self.write({"active": False, "task_id": task.id}) # transfer timesheets from ticket to task self._onchange_task_id() @@ -81,23 +78,23 @@ class HelpdeskTicket(models.Model): } def _match_task_service_and_request_type( - self, - ticket_category_id: int, - ticket_request_type_id: int + self, ticket_category_id: int, ticket_request_type_id: int ) -> tuple[int, int]: """ This function permits to match the task service_id and request_type from the ticket category and request type """ helpdesk_ticket_category = self.env["helpdesk.ticket.category"].search( - [("id", "=", ticket_category_id)], - limit=1 + [("id", "=", ticket_category_id)], limit=1 + ) + task_service = self.env["task.service"].search( + [("name", "=", helpdesk_ticket_category.name)] ) - task_service = self.env["task.service"].search([("name", "=", helpdesk_ticket_category.name)]) helpdesk_ticket_request_type = self.env["helpdesk.request.type"].search( - [("id", "=", ticket_request_type_id)], - limit=1 + [("id", "=", ticket_request_type_id)], limit=1 + ) + task_request_type = self.env["request.type"].search( + [("name", "=", helpdesk_ticket_request_type.name)] ) - task_request_type = self.env["request.type"].search([("name", "=", helpdesk_ticket_request_type.name)]) return task_service.id, task_request_type.id diff --git a/helpdesk_portal_ticket_enriched_description_form/README.md b/helpdesk_portal_ticket_enriched_description_form/README.md index 7f83a42..630103f 100644 --- a/helpdesk_portal_ticket_enriched_description_form/README.md +++ b/helpdesk_portal_ticket_enriched_description_form/README.md @@ -3,8 +3,8 @@ helpdesk_portal_ticket_enriched_description_form ================================================ Add fieds in ticket creation portal form to enrich description content. -Installation -============ + +# Installation Use Odoo normal module installation procedure to install `helpdesk_portal_ticket_enriched_description_form`. @@ -12,13 +12,13 @@ Use Odoo normal module installation procedure to install # Known issues / Roadmap None yet. -Bug Tracker -=========== -Bugs are tracked on `our issues website `\_. In case of -trouble, please check there if your issue has already been -reported. If you spotted it first, help us smashing it by providing a -detailed and welcomed feedback. +# Bug Tracker + +Bugs are tracked on +`our issues website `\_. In case +of trouble, please check there if your issue has already been reported. If you spotted +it first, help us smashing it by providing a detailed and welcomed feedback. # Credits diff --git a/helpdesk_portal_ticket_enriched_description_form/__manifest__.py b/helpdesk_portal_ticket_enriched_description_form/__manifest__.py index 45484e4..af2b5dd 100644 --- a/helpdesk_portal_ticket_enriched_description_form/__manifest__.py +++ b/helpdesk_portal_ticket_enriched_description_form/__manifest__.py @@ -9,7 +9,7 @@ "maintainer": "Stéphan Sainléger", "license": "AGPL-3", "category": "Tools", - "summary": "Add fieds in ticket creation portal form to enrich description content.", + "summary": "Add fieds in ticket creation portal form to enrich description data.", # any module necessary for this one to work correctly "depends": [ "base", diff --git a/helpdesk_portal_ticket_enriched_description_form/controllers/__init__.py b/helpdesk_portal_ticket_enriched_description_form/controllers/__init__.py index 8b6d05e..12a7e52 100644 --- a/helpdesk_portal_ticket_enriched_description_form/controllers/__init__.py +++ b/helpdesk_portal_ticket_enriched_description_form/controllers/__init__.py @@ -1,2 +1 @@ - from . import main diff --git a/helpdesk_portal_ticket_enriched_description_form/controllers/main.py b/helpdesk_portal_ticket_enriched_description_form/controllers/main.py index 4c734ec..340f1f6 100644 --- a/helpdesk_portal_ticket_enriched_description_form/controllers/main.py +++ b/helpdesk_portal_ticket_enriched_description_form/controllers/main.py @@ -1,4 +1,3 @@ -import odoo.http as http from odoo import _ from odoo.addons.helpdesk_mgmt.controllers.main import HelpdeskTicketController @@ -9,15 +8,21 @@ class HelpdeskTicketControllerDescription(HelpdeskTicketController): description = "" if kw.get("small_description", False): description = ( - description + "%s
" % _(u"DESCRIPTION:") + kw["small_description"] + description + + "%s
" % _("DESCRIPTION:") + + kw["small_description"] ) del kw["small_description"] if kw.get("access", False): - description = description + "

%s
" % _(u"ACCESS:") + kw["access"] + description = ( + description + "

%s
" % _("ACCESS:") + kw["access"] + ) del kw["access"] if kw.get("bug_report", False): description = ( - description + "

%s
" % _(u"BUG REPORT:") + kw["bug_report"] + description + + "

%s
" % _("BUG REPORT:") + + kw["bug_report"] ) del kw["bug_report"] res.update({"description": description}) diff --git a/helpdesk_portal_ticket_enriched_description_form/views/helpdesk_ticket_templates.xml b/helpdesk_portal_ticket_enriched_description_form/views/helpdesk_ticket_templates.xml index b7d3745..8bdbdf3 100644 --- a/helpdesk_portal_ticket_enriched_description_form/views/helpdesk_ticket_templates.xml +++ b/helpdesk_portal_ticket_enriched_description_form/views/helpdesk_ticket_templates.xml @@ -1,7 +1,11 @@ - + -