Repository: it-projects-llc/misc-addons
Branch: 14.0
Commit: a605936278fc
Files: 44
Total size: 109.5 KB
Directory structure:
gitextract_cvrop6my/
├── .copier-answers.yml
├── .editorconfig
├── .eslintrc.yml
├── .flake8
├── .github/
│ ├── FUNDING.yml
│ └── workflows/
│ ├── pre-commit.yml
│ └── test.yml
├── .gitignore
├── .isort.cfg
├── .oca_hooks.cfg
├── .pre-commit-config.yaml
├── .prettierrc.yml
├── .pylintrc
├── .pylintrc-mandatory
├── LICENSE
├── README.md
├── project_task_subtask/
│ ├── README.rst
│ ├── __init__.py
│ ├── __manifest__.py
│ ├── data/
│ │ └── subscription_template.xml
│ ├── demo/
│ │ └── project_task_subtask_demo.xml
│ ├── i18n/
│ │ ├── es_CR.po
│ │ ├── fr.po
│ │ ├── project_task_subtask.pot
│ │ ├── ru.po
│ │ └── sl.po
│ ├── models/
│ │ ├── __init__.py
│ │ └── project_task_subtask.py
│ ├── readme/
│ │ ├── CONTRIBUTORS.md
│ │ ├── DESCRIPTION.md
│ │ └── USAGE.md
│ ├── security/
│ │ └── ir.model.access.csv
│ ├── static/
│ │ ├── description/
│ │ │ └── index.html
│ │ └── src/
│ │ ├── css/
│ │ │ └── kanban_styles.css
│ │ ├── js/
│ │ │ ├── one2many_renderer.js
│ │ │ └── tours/
│ │ │ └── tour.js
│ │ └── xml/
│ │ └── templates.xml
│ ├── tests/
│ │ ├── __init__.py
│ │ └── test_subtask_sort_button.py
│ └── views/
│ ├── assets.xml
│ └── project_task_subtask.xml
└── setup/
├── .setuptools-odoo-make-default-ignore
├── README
└── project_task_subtask/
└── setup.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .copier-answers.yml
================================================
# Do NOT update manually; changes here will be overwritten by Copier
_commit: 089da8d
_src_path: https://github.com/it-projects-llc/oca-addons-repo-template
ci: GitHub
convert_readme_fragments_to_markdown: false
generate_requirements_txt: true
github_check_license: true
github_ci_extra_env: {}
github_enable_codecov: true
github_enable_makepot: false
github_enable_stale_action: false
github_enforce_dev_status_compatibility: false
include_wkhtmltopdf: false
odoo_test_flavor: Both
odoo_version: 14.0
org_name: IT-Projects LLC
org_slug: it-projects-llc
rebel_module_groups: []
repo_description: ''
repo_name: ''
repo_slug: misc-addons
repo_website: https://github.com/it-projects-llc/misc-addons
use_pyproject_toml: false
use_ruff: false
================================================
FILE: .editorconfig
================================================
# 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
================================================
FILE: .eslintrc.yml
================================================
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: warn
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
================================================
FILE: .flake8
================================================
[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
================================================
FILE: .github/FUNDING.yml
================================================
custom: "https://www.paypal.me/ITProPayment"
================================================
FILE: .github/workflows/pre-commit.yml
================================================
name: pre-commit
on:
pull_request:
branches:
- "14.0*"
push:
branches:
- "14.0"
- "14.0-ocabot-*"
jobs:
pre-commit:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v2
with:
python-version: "3.11"
- name: Get python version
run: echo "PY=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV
- uses: actions/cache@v1
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
================================================
FILE: .github/workflows/test.yml
================================================
name: tests
on:
pull_request:
branches:
- "14.0*"
push:
branches:
- "14.0"
- "14.0-ocabot-*"
jobs:
unreleased-deps:
runs-on: ubuntu-latest
name: Detect unreleased dependencies
steps:
- uses: actions/checkout@v3
- run: |
for reqfile in requirements.txt test-requirements.txt ; do
if [ -f ${reqfile} ] ; then
result=0
# reject non-comment lines that contain a / (i.e. URLs, relative paths)
grep "^[^#].*/" ${reqfile} || result=$?
if [ $result -eq 0 ] ; then
echo "Unreleased dependencies found in ${reqfile}."
exit 1
fi
fi
done
test:
runs-on: ubuntu-22.04
container: ${{ matrix.container }}
name: ${{ matrix.name }}
strategy:
fail-fast: false
matrix:
include:
- container: ghcr.io/oca/oca-ci/py3.6-odoo14.0:latest
name: test with Odoo
- container: ghcr.io/oca/oca-ci/py3.6-ocb14.0:latest
name: test with OCB
makepot: "false"
services:
postgres:
image: postgres:9.6
env:
POSTGRES_USER: odoo
POSTGRES_PASSWORD: odoo
POSTGRES_DB: odoo
ports:
- 5432:5432
steps:
- uses: actions/checkout@v3
with:
persist-credentials: false
- name: Install addons and dependencies
run: oca_install_addons
- name: Check licenses
run: manifestoo -d . check-licenses
- name: Check development status
run: manifestoo -d . check-dev-status --default-dev-status=Beta
continue-on-error: true
- name: Initialize test db
run: oca_init_test_database
- name: Run tests
run: oca_run_tests
- uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
- name: Update .pot files
run: oca_export_and_push_pot https://x-access-token:${{ secrets.GIT_PUSH_TOKEN }}@github.com/${{ github.repository }}
if: ${{ matrix.makepot == 'true' && github.event_name == 'push' && github.repository_owner == 'it-projects-llc' }}
================================================
FILE: .gitignore
================================================
# 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
# Windows installers
*.msi
# Debian packages
*.deb
# Redhat packages
*.rpm
# MacOS packages
*.dmg
*.pkg
# 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/
================================================
FILE: .isort.cfg
================================================
[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
================================================
FILE: .oca_hooks.cfg
================================================
[MESSAGES_CONTROL]
disable=xml-deprecated-data-node,xml-deprecated-tree-attribute
================================================
FILE: .pre-commit-config.yaml
================================================
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/|
# 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: "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$"
- 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: d5fab7ee87fceee858a3d01048c78a548974d935
hooks:
# update the NOT INSTALLABLE ADDONS section above
- id: oca-update-pre-commit-excluded-addons
- id: oca-fix-manifest-website
args: ["https://github.com/it-projects-llc/misc-addons"]
- id: oca-gen-addon-readme
args:
- --addons-dir=.
- --branch=14.0
- --org-name=it-projects-llc
- --repo-name=misc-addons
- --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/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: 22.3.0
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.12.0
hooks:
- id: isort
name: isort except __init__.py
args:
- --settings=.
exclude: /__init__\.py$
- repo: https://github.com/acsone/setuptools-odoo
rev: 3.1.8
hooks:
- id: setuptools-odoo-make-default
- id: setuptools-odoo-get-requirements
args:
- --output
- requirements.txt
- --header
- "# generated from manifests external_dependencies"
- repo: https://github.com/PyCQA/flake8
rev: 3.8.3
hooks:
- id: flake8
name: flake8
additional_dependencies: ["flake8-bugbear==20.1.4"]
- repo: https://github.com/OCA/pylint-odoo
rev: 7.0.2
hooks:
- id: pylint_odoo
name: pylint with optional checks
args:
- --rcfile=.pylintrc
- --exit-zero
verbose: true
- id: pylint_odoo
args:
- --rcfile=.pylintrc-mandatory
================================================
FILE: .prettierrc.yml
================================================
# 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"
================================================
FILE: .pylintrc
================================================
[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=IT-Projects LLC
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,
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
================================================
FILE: .pylintrc-mandatory
================================================
[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=IT-Projects LLC
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
================================================
FILE: LICENSE
================================================
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
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.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.
================================================
FILE: README.md
================================================
<!-- /!\ Non OCA Context : Set here the badge of your runbot / runboat instance. -->
[](https://github.com/it-projects-llc/misc-addons/actions/workflows/pre-commit.yml?query=branch%3A14.0)
[](https://github.com/it-projects-llc/misc-addons/actions/workflows/test.yml?query=branch%3A14.0)
[](https://codecov.io/gh/it-projects-llc/misc-addons)
<!-- /!\ Non OCA Context : Set here the badge of your translation instance. -->
<!-- /!\ do not modify above this line -->
#
<!-- /!\ do not modify below this line -->
<!-- prettier-ignore-start -->
[//]: # (addons)
This part will be replaced when running the oca-gen-addons-table script from OCA/maintainer-tools.
[//]: # (end addons)
<!-- prettier-ignore-end -->
## Licenses
This repository is licensed under [LGPL-3.0](LICENSE).
However, each module can have a totally different license, as long as they adhere to IT-Projects LLC
policy. Consult each module's `__manifest__.py` file, which contains a `license` key
that explains its license.
----
<!-- /!\ Non OCA Context : Set here the full description of your organization. -->
================================================
FILE: project_task_subtask/README.rst
================================================
======================
Project Task Checklist
======================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:3a3f0575b71186dece7826cf32d1bfc8cbfa7c3076d64352bcca8a09c4fd41a9
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png
:target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html
:alt: License: LGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-it--projects--llc%2Fmisc--addons-lightgray.png?logo=github
:target: https://github.com/it-projects-llc/misc-addons/tree/14.0/project_task_subtask
:alt: it-projects-llc/misc-addons
|badge1| |badge2| |badge3|
Use subtasks to control your tasks. Be ensure that all your
tasks/subtasks are performed and not missed.
Features:
- Added new "Checklist" tab on task's form
- When new subtask is created\\changed, message is sent to user that
assigned to this subtask
- Only users related to subtask can change subtask parameters
- All subtasks have a certain color, informing about their state
- Each subtask has buttons to switch state:
- DONE
- TODO
- CANCELLED
- Added new "Checklist" menu
- default filter: "My", "TODO"
- optional group by: "Project", "Task", "User", "State"
**Table of contents**
.. contents::
:local:
Usage
=====
- Create User1 and User2 in the ``Settings >> Users`` menu
- Login as User1
- Go to ``Project >> Project >> All Tasks`` and open the
``Checklist`` tab
- Create new subtask (Assigned to - User2)
- Login as User2
- See message in Inbox like "TODO: subtask_name"
- Change state of subtask to Cancelled/Done
- You can see a message in Inbox "Cancelled: subtask_name" or "Done:
subtask_name" accordingly.
- You can see your TODOs on tasks in kanban view in the
``Project >> Project >> Tasks`` menu
- The ``Project >> Project >> Checklist`` menu displays ALL subtasks in
state TODO assigned to you and subtasks where you are Reviewer
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/it-projects-llc/misc-addons/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/it-projects-llc/misc-addons/issues/new?body=module:%20project_task_subtask%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
-------
* IT-Projects LLC
Contributors
------------
- Ivan Yelizariev (https://github.com/yelizariev)
- Rafael Manaev (https://github.com/manawi)
- Ilmir Karamov (https://github.com/ilmir-k)
- Ildar Nasyrov (https://github.com/iledarn)
- Nicolas Jeudy (https://github.com/njeudy)
- Alexandr Kolushov (https://github.com/KolushovAlexandr)
- Almas Giniatullin (https://github.com/almas50)
- Denis Mudarisov (https://github.com/trojikman)
- Vildan Safin (https://github.com/Enigma228322)
- Eugene Molotov (https://github.com/em230418)
- Victor Bykov (https://github.com/BykovVik)
Maintainers
-----------
This module is part of the `it-projects-llc/misc-addons <https://github.com/it-projects-llc/misc-addons/tree/14.0/project_task_subtask>`_ project on GitHub.
You are welcome to contribute.
================================================
FILE: project_task_subtask/__init__.py
================================================
# License MIT (https://opensource.org/licenses/MIT).
from . import models
================================================
FILE: project_task_subtask/__manifest__.py
================================================
{
"name": """Project Task Checklist""",
"summary": """Use checklist to be ensure that all your tasks are performed and to make easy control over them""", # noqa: B950
"category": """Project Management""",
"images": ["images/checklist_main.png"],
"version": "14.0.1.1.2",
"author": "IT-Projects LLC",
"support": "it@it-projects.info",
"website": "https://github.com/it-projects-llc/misc-addons",
"license": "LGPL-3",
"depends": ["project"],
"data": [
"security/ir.model.access.csv",
"views/project_task_subtask.xml",
"views/assets.xml",
"data/subscription_template.xml",
],
"qweb": ["static/src/xml/templates.xml"],
"demo": ["demo/project_task_subtask_demo.xml"],
}
================================================
FILE: project_task_subtask/data/subscription_template.xml
================================================
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="subtasks_subtype" model="mail.message.subtype">
<field name="name">All checklist updates</field>
<field name="res_model">project.task</field>
<field name="description">
Subscribe to checklist updates of other users. By default you are notified
on checklist items to and from you only.
</field>
<field name="default" eval="False" />
</record>
<record id="all_subtask_subtype" model="mail.message.subtype">
<field name="name">All checklist updates</field>
<field name="description">
Subscribe to checklist updates of other users. By default you are notified
on checklist items to and from you only.
</field>
<field name="sequence">10</field>
<field name="res_model">project.project</field>
<field name="parent_id" eval="ref('subtasks_subtype')" />
<field name="relation_field">project_id</field>
<field name="default" eval="True" />
</record>
</odoo>
================================================
FILE: project_task_subtask/demo/project_task_subtask_demo.xml
================================================
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record id="project_task_subtask_1" model="project.task.subtask">
<field name="name">test subtask</field>
<field name="user_id" eval="ref('base.user_demo')" />
<field name="task_id" eval="ref('project.project_task_1')" />
</record>
</odoo>
================================================
FILE: project_task_subtask/i18n/es_CR.po
================================================
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * project_task_subtask
#
# Translators:
# Randall <randall_castro@me.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-04-30 21:57+0000\n"
"PO-Revision-Date: 2018-04-30 21:57+0000\n"
"Last-Translator: Randall <randall_castro@me.com>, 2018\n"
"Language-Team: Spanish (Costa Rica) (https://www.transifex.com/it-projects-llc/teams/76080/es_CR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: es_CR\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: project_task_subtask
#: model:mail.message.subtype,name:project_task_subtask.all_subtask_subtype
#: model:mail.message.subtype,name:project_task_subtask.subtasks_subtype
msgid "All checklist updates"
msgstr "Todas las actualizaciones de la lista de verificación"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_user_id
msgid "Assigned to"
msgstr "Asignado a"
#. module: project_task_subtask
#: selection:project.task.subtask,state:0
msgid "Cancelled"
msgstr "Cancelado"
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Change state to CANCELLED"
msgstr "Cambiar estado a CANCELADO"
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Change state to DONE"
msgstr "Cambiar estado a TERMINADO"
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Change state to TODO"
msgstr "Cambiar estado a POR HACER"
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Change state to WAITING"
msgstr "Cambiar estado a ESPERANDO"
#. module: project_task_subtask
#: model:ir.actions.act_window,name:project_task_subtask.action_view_subtask
#: model:ir.ui.menu,name:project_task_subtask.menu_action_view_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Checklist"
msgstr "Lista de Verificación"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_create_uid
msgid "Created by"
msgstr "Creado por"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_create_date
msgid "Created on"
msgstr "Creado en"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_deadline
msgid "Deadline"
msgstr "Tiempo Entrega"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_default_user
msgid "Default User"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_name
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "Description"
msgstr "Descripción"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_display_name
msgid "Display Name"
msgstr "Mostrar Nombre"
#. module: project_task_subtask
#: selection:project.task.subtask,state:0
msgid "Done"
msgstr "Terminado"
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "Filter"
msgstr "Filtro"
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "Group By"
msgstr "Agrupar por"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_hide_button
msgid "Hide Button"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_id
msgid "ID"
msgstr "ID"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_kanban_subtasks
msgid "Kanban Subtasks"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask___last_update
msgid "Last Modified on"
msgstr "Última Modificación el"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_write_uid
msgid "Last Updated by"
msgstr "Última Modificación por"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_write_date
msgid "Last Updated on"
msgstr "Última Actualización en"
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "My"
msgstr "Mi"
#. module: project_task_subtask
#: code:addons/project_task_subtask/models/project_task_subtask.py:60
#: code:addons/project_task_subtask/models/project_task_subtask.py:64
#, python-format
msgid "Only users related to that subtask can change state."
msgstr ""
"Sólo los usuarios relacionados a la sub tarea pueden cambiarla de estado"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_project_id_2779
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "Project"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_recolor
msgid "Recolor"
msgstr "Cambiar Color"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_reviewer_id
msgid "Reviewer"
msgstr "Revisado Por"
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "State"
msgstr "Estado"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_state
msgid "Status"
msgstr "Estatus"
#. module: project_task_subtask
#: model:mail.message.subtype,description:project_task_subtask.all_subtask_subtype
#: model:mail.message.subtype,description:project_task_subtask.subtasks_subtype
msgid ""
"Subscribe to checklist updates of other users. By default you are notified "
"on checklist items to and from you only."
msgstr ""
"Suscríbete a las actualizaciones de la lista de verificación de otros "
"usuarios. De forma predeterminada, se le notifica solo en los elementos de "
"la lista de verificación."
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_ids
msgid "Subtask"
msgstr "Sub tarea"
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_id
msgid "Subtask Message"
msgstr "Mensaje Sub tarea"
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
#: selection:project.task.subtask,state:0
msgid "TODO"
msgstr "Por Hacer"
#. module: project_task_subtask
#: model:ir.model,name:project_task_subtask.model_project_task
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_task_id
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "Task"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_task_state
msgid "Task state"
msgstr "Estado tarea"
#. module: project_task_subtask
#: model:project.task.subtask,task_state:project_task_subtask.project_task_subtask_1
msgid "To Do"
msgstr "Por Hacer"
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "User"
msgstr "Usuario"
#. module: project_task_subtask
#: selection:project.task.subtask,state:0
msgid "Waiting"
msgstr "Esperando"
#. module: project_task_subtask
#: model:ir.model,name:project_task_subtask.model_project_task_subtask
msgid "project.task.subtask"
msgstr "project.task.subtask"
================================================
FILE: project_task_subtask/i18n/fr.po
================================================
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * project_task_subtask
#
# Translators:
# Translation Bot <i18n-bot@it-projects.info>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-04-20 23:52+0000\n"
"PO-Revision-Date: 2018-04-20 23:52+0000\n"
"Last-Translator: Translation Bot <i18n-bot@it-projects.info>, 2018\n"
"Language-Team: French (https://www.transifex.com/it-projects-llc/teams/76080/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#. module: project_task_subtask
#: model:mail.message.subtype,name:project_task_subtask.all_subtask_subtype
#: model:mail.message.subtype,name:project_task_subtask.subtasks_subtype
msgid "All checklist updates"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_user_id
msgid "Assigned to"
msgstr ""
#. module: project_task_subtask
#: selection:project.task.subtask,state:0
msgid "Cancelled"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Change state to CANCELLED"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Change state to DONE"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Change state to TODO"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Change state to WAITING"
msgstr ""
#. module: project_task_subtask
#: model:ir.actions.act_window,name:project_task_subtask.action_view_subtask
#: model:ir.ui.menu,name:project_task_subtask.menu_action_view_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Checklist"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_create_uid
msgid "Created by"
msgstr "Créé par"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_create_date
msgid "Created on"
msgstr "Créé le"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_deadline
msgid "Deadline"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_default_user
msgid "Default user"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_name
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "Description"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_display_name
msgid "Display Name"
msgstr "Nom affiché"
#. module: project_task_subtask
#: selection:project.task.subtask,state:0
msgid "Done"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "Filter"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "Group By"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_hide_button
msgid "Hide button"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_id
msgid "ID"
msgstr "ID"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_kanban_subtasks
msgid "Kanban subtasks"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask___last_update
msgid "Last Modified on"
msgstr "Dernière Modification le"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_write_uid
msgid "Last Updated by"
msgstr "Dernière mise à jour par"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_write_date
msgid "Last Updated on"
msgstr "Dernière mise à jour le"
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "My"
msgstr ""
#. module: project_task_subtask
#: code:addons/project_task_subtask/models/project_task_subtask.py:61
#: code:addons/project_task_subtask/models/project_task_subtask.py:65
#, python-format
msgid "Only users related to that subtask can change state."
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_project_id
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "Project"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_recolor
msgid "Recolor"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_reviewer_id
msgid "Reviewer"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "State"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_state
msgid "Status"
msgstr ""
#. module: project_task_subtask
#: model:mail.message.subtype,description:project_task_subtask.all_subtask_subtype
#: model:mail.message.subtype,description:project_task_subtask.subtasks_subtype
msgid ""
"Subscribe to checklist updates of other users. By default you are notified "
"on checklist items to and from you only."
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_ids
msgid "Subtask"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_id
msgid "Subtask Message"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
#: selection:project.task.subtask,state:0
msgid "TODO"
msgstr ""
#. module: project_task_subtask
#: model:ir.model,name:project_task_subtask.model_project_task
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_task_id
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "Task"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Task Work"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_task_state
msgid "Task state"
msgstr ""
#. module: project_task_subtask
#: model:project.task.subtask,task_state:project_task_subtask.project_task_subtask_1
msgid "To Do"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "User"
msgstr ""
#. module: project_task_subtask
#: selection:project.task.subtask,state:0
msgid "Waiting"
msgstr ""
#. module: project_task_subtask
#: model:ir.model,name:project_task_subtask.model_project_task_subtask
msgid "project.task.subtask"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.subtask_list_view
msgid "subtask_list_form"
msgstr ""
================================================
FILE: project_task_subtask/i18n/project_task_subtask.pot
================================================
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * project_task_subtask
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: project_task_subtask
#: model:mail.message.subtype,name:project_task_subtask.all_subtask_subtype
#: model:mail.message.subtype,name:project_task_subtask.subtasks_subtype
msgid "All checklist updates"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_user_id
msgid "Assigned to"
msgstr ""
#. module: project_task_subtask
#: selection:project.task.subtask,state:0
msgid "Cancelled"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Change state to CANCELLED"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Change state to DONE"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Change state to TODO"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Change state to Waiting"
msgstr ""
#. module: project_task_subtask
#: model:ir.actions.act_window,name:project_task_subtask.action_view_subtask
#: model:ir.ui.menu,name:project_task_subtask.menu_action_view_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Checklist"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_completion
msgid "Completion"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_completion_xml
msgid "Completion Xml"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_create_uid
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_reviewer_id
msgid "Created by"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_create_date
msgid "Created on"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_deadline
msgid "Deadline"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_default_user
msgid "Default User"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_name
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "Description"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_display_name
msgid "Display Name"
msgstr ""
#. module: project_task_subtask
#: selection:project.task.subtask,state:0
msgid "Done"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "Filter"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "Group By"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_hide_button
msgid "Hide Button"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_id
msgid "ID"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_kanban_subtasks
msgid "Kanban Subtasks"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask___last_update
msgid "Last Modified on"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_write_uid
msgid "Last Updated by"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_write_date
msgid "Last Updated on"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "My"
msgstr ""
#. module: project_task_subtask
#: code:addons/project_task_subtask/models/project_task_subtask.py:67
#: code:addons/project_task_subtask/models/project_task_subtask.py:71
#, python-format
msgid "Only users related to that subtask can change state."
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_project_id_4692
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "Project"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_recolor
msgid "Recolor"
msgstr ""
#. module: project_task_subtask
#. openerp-web
#: code:addons/project_task_subtask/static/src/xml/templates.xml:6
#, python-format
msgid "Sort"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "State"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_state
msgid "Status"
msgstr ""
#. module: project_task_subtask
#: model:mail.message.subtype,description:project_task_subtask.all_subtask_subtype
#: model:mail.message.subtype,description:project_task_subtask.subtasks_subtype
msgid "Subscribe to checklist updates of other users. By default you are notified on checklist items to and from you only."
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_ids
msgid "Subtask"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_id
msgid "Subtask Message"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
#: selection:project.task.subtask,state:0
msgid "TODO"
msgstr ""
#. module: project_task_subtask
#: model:ir.model,name:project_task_subtask.model_project_task
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_task_id
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "Task"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_task_state
msgid "Task state"
msgstr ""
#. module: project_task_subtask
#: model:project.task.subtask,task_state:project_task_subtask.project_task_subtask_1
msgid "To Do"
msgstr ""
#. module: project_task_subtask
#. openerp-web
#: code:addons/project_task_subtask/static/src/xml/templates.xml:7
#, python-format
msgid "Unsort"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "User"
msgstr ""
#. module: project_task_subtask
#: selection:project.task.subtask,state:0
msgid "Waiting"
msgstr ""
#. module: project_task_subtask
#: model:ir.model,name:project_task_subtask.model_project_task_subtask
msgid "project.task.subtask"
msgstr ""
================================================
FILE: project_task_subtask/i18n/ru.po
================================================
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * project_task_subtask
#
# Translators:
# Dinar <gabbasov@it-projects.info>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-22 11:27+0000\n"
"PO-Revision-Date: 2017-11-22 11:27+0000\n"
"Last-Translator: Dinar <gabbasov@it-projects.info>, 2017\n"
"Language-Team: Russian (https://www.transifex.com/it-projects-llc/teams/76080/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: ru\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
#. module: project_task_subtask
#: model:mail.message.subtype,name:project_task_subtask.all_subtask_subtype
#: model:mail.message.subtype,name:project_task_subtask.subtasks_subtype
msgid "All checklist updates"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_user_id
msgid "Assigned to"
msgstr ""
#. module: project_task_subtask
#: selection:project.task.subtask,state:0
msgid "Cancelled"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Change state to CANCELLED"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Change state to DONE"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Change state to TODO"
msgstr ""
#. module: project_task_subtask
#: model:ir.actions.act_window,name:project_task_subtask.action_view_subtask
#: model:ir.ui.menu,name:project_task_subtask.menu_action_view_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Checklist"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_create_uid
msgid "Created by"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_create_date
msgid "Created on"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_default_user
msgid "Default user"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_name
msgid "Description"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_display_name
msgid "Display Name"
msgstr "Отображаемое имя"
#. module: project_task_subtask
#: selection:project.task.subtask,state:0
msgid "Done"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "Filter"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "Group By"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_hide_button
msgid "Hide button"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_id
msgid "ID"
msgstr "ID"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_kanban_subtasks
msgid "Kanban subtasks"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask___last_update
msgid "Last Modified on"
msgstr "Последний раз редактировалось"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_write_uid
msgid "Last Updated by"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_write_date
msgid "Last Updated on"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "My"
msgstr ""
#. module: project_task_subtask
#: code:addons/project_task_subtask/models/project_task_subtask.py:60
#: code:addons/project_task_subtask/models/project_task_subtask.py:64
#, python-format
msgid "Only users related to that subtask can change state."
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_project_id
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "Project"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_recolor
msgid "Recolor"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_reviewer_id
msgid "Reviewer"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "State"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_state
msgid "Status"
msgstr ""
#. module: project_task_subtask
#: model:mail.message.subtype,description:project_task_subtask.all_subtask_subtype
#: model:mail.message.subtype,description:project_task_subtask.subtasks_subtype
msgid ""
"Subscribe to checklist updates of other users. By default you are notified "
"on checklist items to and from you only."
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_ids
msgid "Subtask"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_id
msgid "Subtask Message"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
#: selection:project.task.subtask,state:0
msgid "TODO"
msgstr ""
#. module: project_task_subtask
#: model:ir.model,name:project_task_subtask.model_project_task
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_task_id
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "Task"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Task Work"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_task_state
msgid "Task state"
msgstr ""
#. module: project_task_subtask
#: model:project.task.subtask,task_state:project_task_subtask.project_task_subtask_1
msgid "To Do"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "User"
msgstr ""
#. module: project_task_subtask
#: selection:project.task.subtask,state:0
msgid "Waiting"
msgstr ""
#. module: project_task_subtask
#: model:ir.model,name:project_task_subtask.model_project_task_subtask
msgid "project.task.subtask"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.subtask_list_view
msgid "subtask_list_form"
msgstr ""
================================================
FILE: project_task_subtask/i18n/sl.po
================================================
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * project_task_subtask
#
# Translators:
# Translation Bot <i18n-bot@it-projects.info>, 2017
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-07-24 07:50+0000\n"
"PO-Revision-Date: 2017-07-24 07:50+0000\n"
"Last-Translator: Translation Bot <i18n-bot@it-projects.info>, 2017\n"
"Language-Team: Slovenian (https://www.transifex.com/it-projects-llc/teams/76080/sl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: sl\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
#. module: project_task_subtask
#: model:mail.message.subtype,name:project_task_subtask.all_subtask_subtype
#: model:mail.message.subtype,name:project_task_subtask.subtasks_subtype
msgid "All checklist updates"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_user_id
msgid "Assigned to"
msgstr ""
#. module: project_task_subtask
#: selection:project.task.subtask,state:0
msgid "Cancelled"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Change state to CANCELLED"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Change state to DONE"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Change state to TODO"
msgstr ""
#. module: project_task_subtask
#: model:ir.actions.act_window,name:project_task_subtask.action_view_subtask
#: model:ir.ui.menu,name:project_task_subtask.menu_action_view_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Checklist"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_create_uid
msgid "Created by"
msgstr "Ustvaril"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_create_date
msgid "Created on"
msgstr "Ustvarjeno"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_default_user
msgid "Default user"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_name
msgid "Description"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_display_name
msgid "Display Name"
msgstr ""
#. module: project_task_subtask
#: selection:project.task.subtask,state:0
msgid "Done"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "Filter"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "Group By"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_hide_button
msgid "Hide button"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_id
msgid "ID"
msgstr "ID"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_kanban_subtasks
msgid "Kanban subtasks"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask___last_update
msgid "Last Modified on"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_write_uid
msgid "Last Updated by"
msgstr "Zadnjič posodobil"
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_write_date
msgid "Last Updated on"
msgstr "Zadnjič posodobljeno"
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "My"
msgstr ""
#. module: project_task_subtask
#: code:addons/project_task_subtask/models/project_task_subtask.py:62
#, python-format
msgid "Only reviewer can change description."
msgstr ""
#. module: project_task_subtask
#: code:addons/project_task_subtask/models/project_task_subtask.py:58
#, python-format
msgid "Only users related to that subtask can change state."
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_project_id
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "Project"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_recolor
msgid "Recolor"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_reviewer_id
msgid "Reviewer"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "State"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_state
msgid "Status"
msgstr ""
#. module: project_task_subtask
#: model:mail.message.subtype,description:project_task_subtask.all_subtask_subtype
#: model:mail.message.subtype,description:project_task_subtask.subtasks_subtype
msgid ""
"Subscribe to checklist updates of other users. By default you are notified "
"on checklist items to and from you only."
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_ids
msgid "Subtask"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_id
msgid "Subtask Message"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
#: selection:project.task.subtask,state:0
msgid "TODO"
msgstr ""
#. module: project_task_subtask
#: model:ir.model,name:project_task_subtask.model_project_task
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_task_id
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "Task"
msgstr "Opravilo"
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.view_task_form2
msgid "Task Work"
msgstr ""
#. module: project_task_subtask
#: model:ir.model.fields,field_description:project_task_subtask.field_project_task_subtask_task_state
msgid "Task state"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.project_task_subtask_view_search
msgid "User"
msgstr ""
#. module: project_task_subtask
#: model:ir.model,name:project_task_subtask.model_project_task_subtask
msgid "project.task.subtask"
msgstr ""
#. module: project_task_subtask
#: model:ir.ui.view,arch_db:project_task_subtask.subtask_list_view
msgid "subtask_list_form"
msgstr ""
================================================
FILE: project_task_subtask/models/__init__.py
================================================
from . import project_task_subtask
================================================
FILE: project_task_subtask/models/project_task_subtask.py
================================================
from odoo import api, fields, models
from odoo.exceptions import Warning as UserError
from odoo.tools import html_escape as escape
from odoo.tools.translate import _
SUBTASK_STATES = {
"done": "Done",
"todo": "TODO",
"waiting": "Waiting",
"cancelled": "Cancelled",
}
class ProjectTaskSubtask(models.Model):
_name = "project.task.subtask"
_description = "Subtask"
_inherit = ["mail.activity.mixin"]
state = fields.Selection(
[(k, v) for k, v in list(SUBTASK_STATES.items())],
"Status",
required=True,
copy=False,
default="todo",
)
name = fields.Char(required=True, string="Description")
reviewer_id = fields.Many2one(
"res.users", "Reviewer", readonly=True, default=lambda self: self.env.user
)
project_id = fields.Many2one(
"project.project", related="task_id.project_id", store=True
)
user_id = fields.Many2one("res.users", "Assigned to", required=True)
task_id = fields.Many2one(
"project.task", "Task", ondelete="cascade", required=True, index="1"
)
task_state = fields.Char(
string="Task state", related="task_id.stage_id.name", readonly=True
)
hide_button = fields.Boolean(compute="_compute_hide_button")
recolor = fields.Boolean(compute="_compute_recolor")
deadline = fields.Datetime(string="Deadline")
def _compute_recolor(self):
for record in self:
if self.env.user == record.user_id and record.state == "todo":
record.recolor = True
else:
record.recolor = False
def _compute_hide_button(self):
for record in self:
if self.env.user not in [record.reviewer_id, record.user_id]:
record.hide_button = True
else:
record.hide_button = False
def _compute_reviewer_id(self):
for record in self:
record.reviewer_id = record.create_uid
@api.model
def _needaction_domain_get(self):
if self._needaction:
return [("state", "=", "todo"), ("user_id", "=", self.env.uid)]
return []
def write(self, vals):
old_names = dict(list(zip(self.mapped("id"), self.mapped("name"))))
result = super(ProjectTaskSubtask, self).write(vals)
for r in self:
if vals.get("state"):
r.task_id.send_subtask_email(
r.name, r.state, r.reviewer_id.id, r.user_id.id
)
if self.env.user != r.reviewer_id and self.env.user != r.user_id:
raise UserError(
_("Only users related to that subtask can change state.")
)
if vals.get("name"):
r.task_id.send_subtask_email(
r.name,
r.state,
r.reviewer_id.id,
r.user_id.id,
old_name=old_names[r.id],
)
if self.env.user != r.reviewer_id and self.env.user != r.user_id:
raise UserError(
_("Only users related to that subtask can change state.")
)
if vals.get("user_id"):
r.task_id.send_subtask_email(
r.name, r.state, r.reviewer_id.id, r.user_id.id
)
return result
@api.model
def create(self, vals):
result = super(ProjectTaskSubtask, self).create(vals)
vals = self._add_missing_default_values(vals)
task = self.env["project.task"].browse(vals.get("task_id"))
task.send_subtask_email(
vals["name"], vals["state"], vals["reviewer_id"], vals["user_id"]
)
return result
def change_state_done(self):
for record in self:
record.state = "done"
def change_state_todo(self):
for record in self:
record.state = "todo"
def change_state_cancelled(self):
for record in self:
record.state = "cancelled"
def change_state_waiting(self):
for record in self:
record.state = "waiting"
class Task(models.Model):
_inherit = "project.task"
subtask_ids = fields.One2many("project.task.subtask", "task_id", "Subtask")
kanban_subtasks = fields.Text(compute="_compute_kanban_subtasks")
default_user = fields.Many2one("res.users", compute="_compute_default_user")
completion = fields.Integer("Completion", compute="_compute_completion")
completion_xml = fields.Text(compute="_compute_completion_xml")
def _compute_default_user(self):
for record in self:
if self.env.user != record.user_id and self.env.user != record.create_uid:
record.default_user = record.user_id
else:
if self.env.user != record.user_id:
record.default_user = record.user_id
elif self.env.user != record.create_uid:
record.default_user = record.create_uid
elif (
self.env.user == record.create_uid
and self.env.user == record.user_id
):
record.default_user = self.env.user
def _compute_kanban_subtasks(self):
for record in self:
result_string_td = ""
result_string_wt = ""
if record.subtask_ids:
task_todo_ids = record.subtask_ids.filtered(
lambda x: x.state == "todo" and x.user_id.id == record.env.user.id
)
task_waiting_ids = record.subtask_ids.filtered(
lambda x: x.state == "waiting"
and x.user_id.id == record.env.user.id
)
if task_todo_ids:
tmp_string_td = escape(": {}".format(len(task_todo_ids)))
result_string_td += "<li><b>TODO{}</b></li>".format(tmp_string_td)
if task_waiting_ids:
tmp_string_wt = escape(": {}".format(len(task_waiting_ids)))
result_string_wt += "<li><b>Waiting{}</b></li>".format(
tmp_string_wt
)
record.kanban_subtasks = (
'<div class="kanban_subtasks"><ul>'
+ result_string_td
+ result_string_wt
+ "</ul></div>"
)
def _compute_completion(self):
for record in self:
record.completion = record.task_completion()
def _compute_completion_xml(self):
for record in self:
active_subtasks = record.subtask_ids and record.subtask_ids.filtered(
lambda x: x.user_id.id == record.env.user.id and x.state != "cancelled"
)
if not active_subtasks:
record.completion_xml = """
<div class="task_progress">
</div>
"""
continue
completion = record.task_completion()
color = "bg-success-full"
if completion < 50:
color = "bg-danger-full"
record.completion_xml = """
<div class="task_progress">
<div class="progress_info">
Your Checklist:
</div>
<div class ="o_kanban_counter_progress progress task_progress_bar">
<div data-filter="done"
class ="progress-bar {1} o_bar_has_records task_progress_bar_done"
data-original-title="1 done"
style="width: {0}%;">
</div>
<div data-filter="blocked"
class ="progress-bar bg-danger-full"
data-original-title="0 blocked">
</div>
</div>
<div class="task_completion"> {0}% </div>
</div>
""".format(
int(completion), color
)
def task_completion(self):
user_task_ids = self.subtask_ids.filtered(
lambda x: x.user_id.id == self.env.user.id and x.state != "cancelled"
)
if not user_task_ids:
return 100
user_done_task_ids = user_task_ids.filtered(lambda x: x.state == "done")
return (len(user_done_task_ids) / len(user_task_ids)) * 100
def send_subtask_email(
self,
subtask_name,
subtask_state,
subtask_reviewer_id,
subtask_user_id,
old_name=None,
):
for r in self:
body = ""
reviewer = self.env["res.users"].browse(subtask_reviewer_id)
user = self.env["res.users"].browse(subtask_user_id)
state = SUBTASK_STATES[subtask_state]
if subtask_state == "done":
state = '<span style="color:#080">' + state + "</span>"
if subtask_state == "todo":
state = '<span style="color:#A00">' + state + "</span>"
if subtask_state == "cancelled":
state = '<span style="color:#777">' + state + "</span>"
if subtask_state == "waiting":
state = '<span style="color:#b818ce">' + state + "</span>"
partner_ids = []
subtype = "project_task_subtask.subtasks_subtype"
if user == self.env.user and reviewer == self.env.user:
body = "<p>" + "<strong>" + state + "</strong>: " + escape(subtask_name)
subtype = False
elif self.env.user == reviewer:
body = (
"<p>"
+ escape(user.name)
+ ", <br><strong>"
+ state
+ "</strong>: "
+ escape(subtask_name)
)
partner_ids = [user.partner_id.id]
elif self.env.user == user:
body = (
"<p>"
+ escape(reviewer.name)
+ ', <em style="color:#999">I updated checklist item assigned to me:</em> <br><strong>' # noqa: B950
+ state
+ "</strong>: "
+ escape(subtask_name)
)
partner_ids = [reviewer.partner_id.id]
else:
body = (
"<p>"
+ escape(user.name)
+ ", "
+ escape(reviewer.name)
+ ', <em style="color:#999">I updated checklist item, now its assigned to '
+ escape(user.name)
+ ": </em> <br><strong>"
+ state
+ "</strong>: "
+ escape(subtask_name)
)
partner_ids = [user.partner_id.id, reviewer.partner_id.id]
if old_name:
body = (
body
+ '<br><em style="color:#999">Updated from</em><br><strong>'
+ state
+ "</strong>: "
+ escape(old_name)
+ "</p>"
)
else:
body = body + "</p>"
r.message_post(
message_type="comment",
subtime_xmlid=subtype,
body=body,
partner_ids=partner_ids,
)
def copy(self, default=None):
task = super(Task, self).copy(default)
for subtask in self.subtask_ids:
subtask.copy({"task_id": task.id, "state": subtask.state})
return task
================================================
FILE: project_task_subtask/readme/CONTRIBUTORS.md
================================================
- Ivan Yelizariev (https://github.com/yelizariev)
- Rafael Manaev (https://github.com/manawi)
- Ilmir Karamov (https://github.com/ilmir-k)
- Ildar Nasyrov (https://github.com/iledarn)
- Nicolas Jeudy (https://github.com/njeudy)
- Alexandr Kolushov (https://github.com/KolushovAlexandr)
- Almas Giniatullin (https://github.com/almas50)
- Denis Mudarisov (https://github.com/trojikman)
- Vildan Safin (https://github.com/Enigma228322)
- Eugene Molotov (https://github.com/em230418)
- Victor Bykov (https://github.com/BykovVik)
================================================
FILE: project_task_subtask/readme/DESCRIPTION.md
================================================
Use subtasks to control your tasks. Be ensure that all your tasks/subtasks are performed and not missed.
Features:
* Added new "Checklist" tab on task's form
* When new subtask is created\changed, message is sent to user that assigned to this subtask
* Only users related to subtask can change subtask parameters
* All subtasks have a certain color, informing about their state
* Each subtask has buttons to switch state:
* DONE
* TODO
* CANCELLED
* Added new "Checklist" menu
* default filter: "My", "TODO"
* optional group by: "Project", "Task", "User", "State"
================================================
FILE: project_task_subtask/readme/USAGE.md
================================================
* Create User1 and User2 in the ``Settings >> Users`` menu
* Login as User1
* Go to ``Project >> Project >> All Tasks`` and open the ``Checklist`` tab
* Create new subtask (Assigned to - User2)
* Login as User2
* See message in Inbox like "TODO: subtask_name"
* Change state of subtask to Cancelled/Done
* You can see a message in Inbox "Cancelled: subtask_name" or "Done: subtask_name" accordingly.
* You can see your TODOs on tasks in kanban view in the ``Project >> Project >> Tasks`` menu
* The ``Project >> Project >> Checklist`` menu displays ALL subtasks in state TODO assigned to you and subtasks where you are Reviewer
================================================
FILE: project_task_subtask/security/ir.model.access.csv
================================================
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_task_subtask,project.task.subtask,model_project_task_subtask,project.group_project_user,1,1,1,0
================================================
FILE: project_task_subtask/static/description/index.html
================================================
<section class="oe_container">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<h2 class="oe_slogan" style="color:#875A7B;">Project Task Checklist</h2>
<h3 class="oe_slogan">Use checklist to be ensure that all your tasks are performed and to make easy control over them</h3>
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<p class="oe_mt32">
<div class="alert alert-info" style="padding:8px;font-weight: 300; font-size: 20px;">
<i class="fa fa-hand-o-right"></i><b> Key features: </b>
<ul class="list-unstyled">
<li>
<i class="fa fa-check-square-o text-primary"></i>
create checklist for any tasks
</li>
<li>
<i class="fa fa-check-square-o text-primary"></i>
track all subtasks that should be done and keep them under control
</li>
<li>
<i class="fa fa-check-square-o text-primary"></i>
checklist items will be colored depending on their state
</li>
<li>
<i class="fa fa-check-square-o text-primary"></i>
only users related to subtask can change subtask parameters
</li>
<li>
<i class="fa fa-check-square-o text-primary"></i>
see instant email notifications in task mail thread and your Inbox
</li>
</ul>
</div>
</p>
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<h3 class="oe_slogan">How It Works</h3>
<div class="oe_span12" >
<p class="oe_mt32">
Go to <em>Project → Tasks</em> menu and create/open a task. Here you can see new "Checklist" tab.
Add items (hereinafter "subtasks") into your checklist. <br/>
Specify <em>"Description"</em> and select <em>"Assigned to"</em>, <em>"Reviewer"</em>.
</p>
</div>
<div class="oe_row_img oe_centered">
<img class="oe_demo oe_picture oe_screenshot" src="checklist.png"/>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<p class="oe_mt32">
<ul>
<li>if a subtask has state "TODO", it's colored in red for user assigned to subtask</li>
<li>if a subtask has state "DONE", it's colored in green</li>
<li>if a subtask has state "CANCELLED", it's colored in grey</li>
</ul>
</p>
<p>
If you mistakenly switch state to "DONE" or "CANCELLED", you will be able to revert state to TODO by clicking on <img src="checklist_icon.png">
</p>
</div>
<div class="oe_row_img oe_centered">
<img class="oe_demo oe_picture oe_screenshot" src="checklist_color.png"/>
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<div class="oe_span12 text-center">
<p class="oe_mt32">
All checklist changes and updates are tracked on task mail thread and you will receive instant email notifications to your Inbox
</p>
</div>
<div class="oe_row_img oe_centered">
<img class="oe_demo oe_picture oe_screenshot" src="checklist_mail.png"/>
</div>
</div>
</section>
<section class="oe_container oe_dark">
<div class="oe_row oe_spaced">
<div class="oe_span12 text-center">
<p class="oe_mt32">
You can see your TODOs on tasks in kanban view
</p>
</div>
<div class="oe_row_img oe_centered">
<img class="oe_demo oe_picture oe_screenshot" src="checklist_kanban.png"/>
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<div class="oe_span12 text-center">
<p class="oe_mt32">
Track all your TODOs in one place and keep them under control. Go to the <em>Project → Checklist</em> menu to see them.
</p>
</div>
<div class="oe_row_img oe_centered">
<img class="oe_demo oe_picture oe_screenshot" src="checklist_menu.png"/>
</div>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="color:#875A7B;">Free Support</h2>
<h3 class="oe_slogan">You will get free support and assistance in case of any issues</h3>
</div>
</section>
<section class="oe_container">
<div class="oe_row oe_spaced">
<div class="oe_span12">
<h2>Need our service?</h2>
<p class="oe_mt32">Contact us by <a href="mailto:apps@it-projects.info">email</a> or fill out <a href="https://www.it-projects.info/page/website.contactus " target="_blank">request form</a></p>
<ul>
<li><a href="mailto:apps@it-projects.info">apps@it-projects.info <i class="fa fa-envelope-o"></i></a></li>
<li><a href="https://www.it-projects.info/page/website.contactus " target="_blank">https://www.it-projects.info/page/website.contactus <i class="fa fa-list-alt"></i></a></li>
<li><a href="https://m.me/itprojectsllc" target="_blank">https://m.me/itprojectsllc <i class="fa fa-facebook-square"></i></a></li>
<li>skype@it-projects.info <i class="fa fa-skype"></i></li>
</ul>
</div>
</div>
</section>
================================================
FILE: project_task_subtask/static/src/css/kanban_styles.css
================================================
.task_progress {
width: 40%;
display: inline-block;
font-size: 10px;
}
.task_progress {
width: 40%;
display: inline-block;
font-size: 10px;
}
.task_progress .task_progress_bar {
width: 85%;
display: inline-block;
margin-bottom: 0px;
height: 10px;
}
.task_progress .task_progress_bar_done {
max-width: 100%;
min-width: 3%;
}
.task_progress .task_completion {
width: 10%;
display: inline-block;
height: 13px;
}
.kanban_subtasks {
width: 55%;
display: inline-block;
font-size: 10px;
}
.kanban_subtasks ul {
-webkit-padding-start: 30px;
}
================================================
FILE: project_task_subtask/static/src/js/one2many_renderer.js
================================================
odoo.define("project_task_subtask.one2many_renderer", function (require) {
"use strict";
var FieldOne2Many = require("web.relational_fields").FieldOne2Many;
var BasicModel = require("web.BasicModel");
var core = require("web.core");
var QWeb = core.qweb;
FieldOne2Many.include({
check_task_tree_mode: function () {
if (
this.view &&
this.view.arch.tag === "tree" &&
this.record &&
this.record.model === "project.task" &&
this.name === "subtask_ids"
) {
return true;
}
return false;
},
sort_data: function () {
var user_id = this.record.context.uid;
var new_rows = _.filter(this.value.data, function (d) {
return !d.res_id;
});
var data = _.difference(this.value.data, new_rows);
_.each(data, function (d) {
d.u_name = d.data.user_id.data.display_name;
});
var name_index = _.sortBy(
_.uniq(
_.map(data, function (d) {
return d.data.user_id.data.display_name;
})
)
);
data = _.sortBy(data, "u_name");
_.each(data, function (d) {
d.deadline = d.data.deadline;
if (d.data.user_id.data.id === user_id) {
d.index = 0;
} else {
d.index =
(_.indexOf(name_index, d.data.user_id.data.display_name) + 1) *
1000000;
}
});
data = _.sortBy(data, "deadline");
_.each(data, function (d) {
d.index += _.indexOf(data, d);
if (!d.deadline) {
d.index += 90000;
}
if (d.data.state === "todo") {
// Continue
} else if (d.data.state === "waiting") {
d.index += 100000;
} else if (d.data.state === "done") {
d.index += 400000;
} else {
// Makes cancelled subtasks stay last in line
d.index += (name_index.length + 2) * 1000000;
if (d.data.user_id.data.id !== user_id) {
d.index +=
(_.indexOf(name_index, d.data.user_id.data.display_name) +
1) *
1000000;
}
}
});
data = _.sortBy(data, "index");
_.each(new_rows, function (r) {
data.push(r);
});
this.default_sorting = this.value.data;
this.value.data = data;
},
_render: function () {
if (this.check_task_tree_mode() && this.getParent().list_is_sorted) {
this.sort_data();
}
return this._super(arguments);
},
reset: function (record, ev, fieldChanged) {
var self = this;
return this._super.apply(this, arguments).then(function (res) {
if (self.check_task_tree_mode() && self.getParent().list_is_sorted) {
self._render();
}
});
},
_renderButtons: function () {
var self = this;
if (this.check_task_tree_mode()) {
this.$buttons = $(
QWeb.render("SubtaskSortButtons", {
check_button: this.getParent().list_is_sorted,
})
);
this.$buttons.on(
"click",
".o_pager_sort",
this._update_custom_sort_buttons.bind(this)
);
this.$buttons.on(
"click",
".o_pager_unsort",
this._update_custom_unsort_buttons.bind(this)
);
}
return this._super(arguments);
},
_update_custom_sort_buttons: function () {
this.getParent().list_is_sorted = true;
this.default_sorting = this.value.data;
this._render();
},
_update_custom_unsort_buttons: function () {
this.getParent().list_is_sorted = false;
this.value.data = this.default_sorting;
this._render();
},
});
BasicModel.include({
_sortList: function (list) {
// Taken from odoo
if (!list.static) {
// Only sort x2many lists
return;
}
var self = this;
// -----
if (list.model === "project.task.subtask" && list.orderedResIDs) {
var rows = [];
var new_rows = [];
_.each(list.data, function (d) {
var r = self.localData[d];
if (Number(r.res_id) === r.res_id) {
rows.push(r);
} else {
new_rows.push(r);
}
});
rows = this.sort_data(rows, list.context.uid, this);
_.each(new_rows, function (r) {
rows.push(r);
});
list.orderedResIDs = _.pluck(rows, "res_id");
return this._setDataInRange(list);
}
return this._super(list);
},
sort_data: function (data, user_id, parent) {
user_id = user_id || 1;
_.each(data, function (d) {
d.u_name = parent.localData[d.data.user_id].data.display_name;
});
var name_index = _.sortBy(
_.uniq(
_.map(data, function (d) {
return parent.localData[d.data.user_id].data.display_name;
})
)
);
data = _.sortBy(data, "u_name");
_.each(data, function (d) {
d.deadline = d.data.deadline;
if (parent.localData[d.data.user_id].data.id === user_id) {
d.index = 0;
} else {
d.index =
(_.indexOf(
name_index,
parent.localData[d.data.user_id].data.display_name
) +
1) *
1000000;
}
});
data = _.sortBy(data, "deadline");
_.each(data, function (d) {
d.index += _.indexOf(data, d);
if (!d.deadline) {
d.index += 90000;
}
if (d.data.state === "todo") {
// Continue
} else if (d.data.state === "waiting") {
d.index += 100000;
} else if (d.data.state === "done") {
d.index += 400000;
} else {
d.index += 700000;
}
});
return _.sortBy(data, "index");
},
});
});
================================================
FILE: project_task_subtask/static/src/js/tours/tour.js
================================================
odoo.define("project_task_subtask.tour", function (require) {
"use strict";
var core = require("web.core");
var tour = require("web_tour.tour");
var _t = core._t;
var steps = [
tour.stepUtils.showAppsMenuItem(),
{
trigger: '.o_app[data-menu-xmlid="project.menu_main_pm"]',
content: _t(
"Want a better way to <b>manage your projects</b>? <i>It starts here.</i>"
),
position: "right",
edition: "community",
},
{
trigger: '.o_app[data-menu-xmlid="project.menu_main_pm"]',
content: _t(
"Want a better way to <b>manage your projects</b>? <i>It starts here.</i>"
),
position: "bottom",
edition: "enterprise",
},
{
trigger: ".o_project_kanban_main",
content: "open project",
timeout: 10000,
},
{
trigger: ".o_loading",
content: "waiting for loading to finish",
timeout: 5000,
},
{
trigger: ".o_content",
content: "just click",
timeout: 1000,
},
{
trigger: ".oe_kanban_content",
content: "open task",
timeout: 20000,
},
{
trigger: ".o_pager_sort",
content: "sort",
timeout: 10000,
},
{
trigger: ".o_pager_unsort",
content: "unsort",
timeout: 10000,
},
];
tour.register("task_subtask", {url: "/web"}, steps);
});
================================================
FILE: project_task_subtask/static/src/xml/templates.xml
================================================
<?xml version="1.0" encoding="utf-8" ?>
<template xml:space="preserve">
<t t-name="SubtaskSortButtons">
<div>
<button
aria-label="Sort"
class="btn btn-sm btn-primary o_pager_sort"
type="button"
t-if="!check_button"
>
Sort
</button>
<button
aria-label="Unsort"
class="btn btn-sm btn-default o_pager_unsort"
type="button"
t-if="check_button"
>
Unsort
</button>
</div>
</t>
</template>
================================================
FILE: project_task_subtask/tests/__init__.py
================================================
# License MIT (https://opensource.org/licenses/MIT).
from . import test_subtask_sort_button
================================================
FILE: project_task_subtask/tests/test_subtask_sort_button.py
================================================
import odoo.tests
class TestUi(odoo.tests.HttpCase):
def test_01_subtask_sort_button(self):
self.env["ir.module.module"].search(
[("name", "=", "project_task_subtask")], limit=1
).state = "installed"
self.start_tour("/web", "task_subtask", login="admin")
================================================
FILE: project_task_subtask/views/assets.xml
================================================
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<template
id="assets_backend"
name="Project timelog assets"
inherit_id="web.assets_backend"
>
<xpath expr="." position="inside">
<link
rel="stylesheet"
type="text/css"
href="/project_task_subtask/static/src/css/kanban_styles.css"
/>
<script
type="text/javascript"
src="/project_task_subtask/static/src/js/one2many_renderer.js"
/>
</xpath>
</template>
<template
id="assets_backend_web"
name="project_task_subtask_backend_assets"
inherit_id="web.assets_backend"
>
<xpath expr="." position="inside">
<script
type="text/javascript"
src="/project_task_subtask/static/src/js/tours/tour.js"
/>
</xpath>
</template>
</odoo>
================================================
FILE: project_task_subtask/views/project_task_subtask.xml
================================================
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="view_task_form2" model="ir.ui.view">
<field name="name">project.task.form</field>
<field name="model">project.task</field>
<field name="inherit_id" ref="project.view_task_form2" />
<field name="arch" type="xml">
<xpath expr="//page[1]" position="before">
<page string="Checklist">
<field name="default_user" invisible='True' />
<field
name="subtask_ids"
context="{'default_user_id': default_user}"
>
<tree
editable="bottom"
decoration-danger="recolor == True"
decoration-muted="state == 'cancelled'"
decoration-success="state == 'done'"
decoration-info="state == 'waiting'"
>
<field name="name" />
<field name="recolor" invisible='True' />
<field name="user_id" />
<field name="state" />
<field name="hide_button" invisible='True' />
<button
name="change_state_done"
title="Change state to DONE"
type="object"
icon="fa-check"
attrs="{'invisible': ['|', ('state', 'in',['done', 'cancelled']), ('hide_button', '=', True)]}"
/>
<button
name="change_state_todo"
title="Change state to TODO"
type="object"
icon="fa-caret-square-o-right"
attrs="{'invisible': [ '|',('state', '=', 'todo'), ('hide_button', '=', True)]}"
/>
<button
name="change_state_waiting"
type="object"
title="Change state to Waiting"
icon="fa-pause"
attrs="{'invisible': [ '|',('state', '=', 'waiting'), ('hide_button', '=', True)]}"
/>
<button
name="change_state_cancelled"
type="object"
title="Change state to CANCELLED"
icon="fa-ban"
attrs="{'invisible': [ '|',('state', '=', 'cancelled'), ('hide_button', '=', True)]}"
/>
<field name="reviewer_id" />
<field name="deadline" />
</tree>
</field>
</page>
</xpath>
</field>
</record>
<record id="view_task_kanban_subtasks" model="ir.ui.view">
<field name="name">project.task.kanban.subtasks</field>
<field name="model">project.task</field>
<field name="inherit_id" ref="project.view_task_kanban" />
<field name="arch" type="xml">
<xpath expr="//field[@name ='tag_ids']" position="after">
<field name="completion" invisible="1" />
<field name="subtask_ids" invisible="1" />
<field name="kanban_subtasks" invisible="1" />
<field name="completion_xml" invisible="1" />
</xpath>
<xpath expr="//div[hasclass('o_kanban_record_bottom')]" position="before">
<div>
<t t-raw="record.completion_xml.raw_value" />
<t t-raw="record.kanban_subtasks.raw_value" />
</div>
</xpath>
</field>
</record>
<record model="ir.ui.view" id="view_id">
<field name="name">project.task.subtask</field>
<field name="model">project.task.subtask</field>
<field name="arch" type="xml">
<form string="Subtask Message">
<sheet>
<group>
<field name="name" />
<field name="user_id" />
<field name="state" />
<field name="task_id" />
</group>
</sheet>
</form>
</field>
</record>
<record id="project_task_subtask_view_search" model="ir.ui.view">
<field name="name">project.task.subtask.filter</field>
<field name="model">project.task.subtask</field>
<field name="arch" type="xml">
<search string="Filter">
<field name="name" string="Description" />
<filter string="My" domain="[('user_id','=',uid)]" name="my_subtask" />
<separator />
<filter
string="TODO"
domain="[('state','=','todo')]"
name="done_subtask"
/>
<group expand="0" string="Group By">
<filter
string="Project"
name="project"
context="{'group_by':'project_id'}"
/>
<filter
string="Task"
name="task"
context="{'group_by':'task_id'}"
/>
<filter
string="User"
name="user"
context="{'group_by':'user_id'}"
/>
</group>
</search>
</field>
</record>
<record model="ir.ui.view" id="subtask_list_view">
<field name="name">subtask.list.form</field>
<field name="model">project.task.subtask</field>
<field name="arch" type="xml">
<tree>
<field name="name" />
<field name="user_id" />
<field name="reviewer_id" />
<field name="task_id" />
<field name="task_state" />
</tree>
</field>
</record>
<record id="action_view_subtask" model="ir.actions.act_window">
<field name="name">Checklist</field>
<field name="res_model">project.task.subtask</field>
<field name="view_mode">tree,form</field>
<field name="context">
{
'search_default_my_subtask': 1,
'search_default_done_subtask': 1,
}
</field>
</record>
<menuitem
name="Checklist"
parent="project.menu_project_management"
id="menu_action_view_subtask"
action="action_view_subtask"
/>
</odoo>
================================================
FILE: setup/.setuptools-odoo-make-default-ignore
================================================
# addons listed in this file are ignored by
# setuptools-odoo-make-default (one addon per line)
================================================
FILE: setup/README
================================================
To learn more about this directory, please visit
https://pypi.python.org/pypi/setuptools-odoo
================================================
FILE: setup/project_task_subtask/setup.py
================================================
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)
gitextract_cvrop6my/
├── .copier-answers.yml
├── .editorconfig
├── .eslintrc.yml
├── .flake8
├── .github/
│ ├── FUNDING.yml
│ └── workflows/
│ ├── pre-commit.yml
│ └── test.yml
├── .gitignore
├── .isort.cfg
├── .oca_hooks.cfg
├── .pre-commit-config.yaml
├── .prettierrc.yml
├── .pylintrc
├── .pylintrc-mandatory
├── LICENSE
├── README.md
├── project_task_subtask/
│ ├── README.rst
│ ├── __init__.py
│ ├── __manifest__.py
│ ├── data/
│ │ └── subscription_template.xml
│ ├── demo/
│ │ └── project_task_subtask_demo.xml
│ ├── i18n/
│ │ ├── es_CR.po
│ │ ├── fr.po
│ │ ├── project_task_subtask.pot
│ │ ├── ru.po
│ │ └── sl.po
│ ├── models/
│ │ ├── __init__.py
│ │ └── project_task_subtask.py
│ ├── readme/
│ │ ├── CONTRIBUTORS.md
│ │ ├── DESCRIPTION.md
│ │ └── USAGE.md
│ ├── security/
│ │ └── ir.model.access.csv
│ ├── static/
│ │ ├── description/
│ │ │ └── index.html
│ │ └── src/
│ │ ├── css/
│ │ │ └── kanban_styles.css
│ │ ├── js/
│ │ │ ├── one2many_renderer.js
│ │ │ └── tours/
│ │ │ └── tour.js
│ │ └── xml/
│ │ └── templates.xml
│ ├── tests/
│ │ ├── __init__.py
│ │ └── test_subtask_sort_button.py
│ └── views/
│ ├── assets.xml
│ └── project_task_subtask.xml
└── setup/
├── .setuptools-odoo-make-default-ignore
├── README
└── project_task_subtask/
└── setup.py
SYMBOL INDEX (21 symbols across 2 files)
FILE: project_task_subtask/models/project_task_subtask.py
class ProjectTaskSubtask (line 14) | class ProjectTaskSubtask(models.Model):
method _compute_recolor (line 43) | def _compute_recolor(self):
method _compute_hide_button (line 50) | def _compute_hide_button(self):
method _compute_reviewer_id (line 57) | def _compute_reviewer_id(self):
method _needaction_domain_get (line 62) | def _needaction_domain_get(self):
method write (line 67) | def write(self, vals):
method create (line 98) | def create(self, vals):
method change_state_done (line 107) | def change_state_done(self):
method change_state_todo (line 111) | def change_state_todo(self):
method change_state_cancelled (line 115) | def change_state_cancelled(self):
method change_state_waiting (line 119) | def change_state_waiting(self):
class Task (line 124) | class Task(models.Model):
method _compute_default_user (line 132) | def _compute_default_user(self):
method _compute_kanban_subtasks (line 147) | def _compute_kanban_subtasks(self):
method _compute_completion (line 174) | def _compute_completion(self):
method _compute_completion_xml (line 178) | def _compute_completion_xml(self):
method task_completion (line 216) | def task_completion(self):
method send_subtask_email (line 225) | def send_subtask_email(
method copy (line 303) | def copy(self, default=None):
FILE: project_task_subtask/tests/test_subtask_sort_button.py
class TestUi (line 4) | class TestUi(odoo.tests.HttpCase):
method test_01_subtask_sort_button (line 5) | def test_01_subtask_sort_button(self):
Condensed preview — 44 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (121K chars).
[
{
"path": ".copier-answers.yml",
"chars": 740,
"preview": "# Do NOT update manually; changes here will be overwritten by Copier\n_commit: 089da8d\n_src_path: https://github.com/it-p"
},
{
"path": ".editorconfig",
"chars": 558,
"preview": "# Configuration for known file extensions\n[*.{css,js,json,less,md,py,rst,sass,scss,xml,yaml,yml}]\ncharset = utf-8\nend_of"
},
{
"path": ".eslintrc.yml",
"chars": 4417,
"preview": "env:\n browser: true\n es6: true\n\n# See https://github.com/OCA/odoo-community.org/issues/37#issuecomment-470686449\nparse"
},
{
"path": ".flake8",
"chars": 356,
"preview": "[flake8]\nmax-line-length = 88\nmax-complexity = 16\n# B = bugbear\n# B9 = bugbear opinionated (incl line length)\nselect = C"
},
{
"path": ".github/FUNDING.yml",
"chars": 45,
"preview": "custom: \"https://www.paypal.me/ITProPayment\"\n"
},
{
"path": ".github/workflows/pre-commit.yml",
"chars": 1653,
"preview": "name: pre-commit\n\non:\n pull_request:\n branches:\n - \"14.0*\"\n push:\n branches:\n - \"14.0\"\n - \"14.0-o"
},
{
"path": ".github/workflows/test.yml",
"chars": 2248,
"preview": "name: tests\n\non:\n pull_request:\n branches:\n - \"14.0*\"\n push:\n branches:\n - \"14.0\"\n - \"14.0-ocabot"
},
{
"path": ".gitignore",
"chars": 848,
"preview": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n/.venv\n/.pytest_cache\n/.ruff_cache\n\n# C extensions\n*.so\n\n"
},
{
"path": ".isort.cfg",
"chars": 357,
"preview": "[settings]\n; see https://github.com/psf/black\nmulti_line_output=3\ninclude_trailing_comma=True\nforce_grid_wrap=0\ncombine_"
},
{
"path": ".oca_hooks.cfg",
"chars": 82,
"preview": "[MESSAGES_CONTROL]\ndisable=xml-deprecated-data-node,xml-deprecated-tree-attribute\n"
},
{
"path": ".pre-commit-config.yaml",
"chars": 4986,
"preview": "exclude: |\n (?x)\n # NOT INSTALLABLE ADDONS\n # END NOT INSTALLABLE ADDONS\n # Files and folders generated by bots, to "
},
{
"path": ".prettierrc.yml",
"chars": 240,
"preview": "# Defaults for all prettier-supported languages.\n# Prettier will complete this with settings from .editorconfig file.\nbr"
},
{
"path": ".pylintrc",
"chars": 2508,
"preview": "\n\n[MASTER]\nload-plugins=pylint_odoo\nscore=n\n\n[ODOOLINT]\nreadme_template_url=\"https://github.com/OCA/maintainer-tools/blo"
},
{
"path": ".pylintrc-mandatory",
"chars": 1645,
"preview": "\n[MASTER]\nload-plugins=pylint_odoo\nscore=n\n\n[ODOOLINT]\nreadme_template_url=\"https://github.com/OCA/maintainer-tools/blob"
},
{
"path": "LICENSE",
"chars": 7652,
"preview": " GNU LESSER GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007"
},
{
"path": "README.md",
"chars": 1413,
"preview": "\n<!-- /!\\ Non OCA Context : Set here the badge of your runbot / runboat instance. -->\n[.\n\nfrom . import models\n"
},
{
"path": "project_task_subtask/__manifest__.py",
"chars": 754,
"preview": "{\n \"name\": \"\"\"Project Task Checklist\"\"\",\n \"summary\": \"\"\"Use checklist to be ensure that all your tasks are perform"
},
{
"path": "project_task_subtask/data/subscription_template.xml",
"chars": 1076,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<odoo>\n <record id=\"subtasks_subtype\" model=\"mail.message.subtype\">\n <"
},
{
"path": "project_task_subtask/demo/project_task_subtask_demo.xml",
"chars": 332,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<odoo noupdate=\"1\">\n <record id=\"project_task_subtask_1\" model=\"project.task."
},
{
"path": "project_task_subtask/i18n/es_CR.po",
"chars": 8203,
"preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * project_task_subtask\n# "
},
{
"path": "project_task_subtask/i18n/fr.po",
"chars": 7825,
"preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * project_task_subtask\n# "
},
{
"path": "project_task_subtask/i18n/project_task_subtask.pot",
"chars": 7722,
"preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n#\t* project_task_subtask\n#\n"
},
{
"path": "project_task_subtask/i18n/ru.po",
"chars": 7511,
"preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * project_task_subtask\n# "
},
{
"path": "project_task_subtask/i18n/sl.po",
"chars": 7328,
"preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * project_task_subtask\n# "
},
{
"path": "project_task_subtask/models/__init__.py",
"chars": 35,
"preview": "from . import project_task_subtask\n"
},
{
"path": "project_task_subtask/models/project_task_subtask.py",
"chars": 11728,
"preview": "from odoo import api, fields, models\nfrom odoo.exceptions import Warning as UserError\nfrom odoo.tools import html_escape"
},
{
"path": "project_task_subtask/readme/CONTRIBUTORS.md",
"chars": 525,
"preview": "- Ivan Yelizariev (https://github.com/yelizariev)\n- Rafael Manaev (https://github.com/manawi)\n- Ilmir Karamov (https://g"
},
{
"path": "project_task_subtask/readme/DESCRIPTION.md",
"chars": 574,
"preview": "Use subtasks to control your tasks. Be ensure that all your tasks/subtasks are performed and not missed.\n\nFeatures:\n\n* A"
},
{
"path": "project_task_subtask/readme/USAGE.md",
"chars": 642,
"preview": "* Create User1 and User2 in the ``Settings >> Users`` menu\n* Login as User1\n\n * Go to ``Project >> Project >> All Tasks"
},
{
"path": "project_task_subtask/security/ir.model.access.csv",
"chars": 180,
"preview": "id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink\naccess_task_subtask,project.task.subtask,mo"
},
{
"path": "project_task_subtask/static/description/index.html",
"chars": 5112,
"preview": "<section class=\"oe_container\">\n <div class=\"oe_row oe_spaced\">\n <div class=\"oe_span12\">\n <h2 class="
},
{
"path": "project_task_subtask/static/src/css/kanban_styles.css",
"chars": 613,
"preview": ".task_progress {\n width: 40%;\n display: inline-block;\n font-size: 10px;\n}\n\n.task_progress {\n width: 40%;\n "
},
{
"path": "project_task_subtask/static/src/js/one2many_renderer.js",
"chars": 7389,
"preview": "odoo.define(\"project_task_subtask.one2many_renderer\", function (require) {\n \"use strict\";\n var FieldOne2Many = req"
},
{
"path": "project_task_subtask/static/src/js/tours/tour.js",
"chars": 1640,
"preview": "odoo.define(\"project_task_subtask.tour\", function (require) {\n \"use strict\";\n\n var core = require(\"web.core\");\n "
},
{
"path": "project_task_subtask/static/src/xml/templates.xml",
"chars": 639,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<template xml:space=\"preserve\">\n <t t-name=\"SubtaskSortButtons\">\n <div"
},
{
"path": "project_task_subtask/tests/__init__.py",
"chars": 93,
"preview": "# License MIT (https://opensource.org/licenses/MIT).\n\nfrom . import test_subtask_sort_button\n"
},
{
"path": "project_task_subtask/tests/test_subtask_sort_button.py",
"chars": 297,
"preview": "import odoo.tests\n\n\nclass TestUi(odoo.tests.HttpCase):\n def test_01_subtask_sort_button(self):\n self.env[\"ir.m"
},
{
"path": "project_task_subtask/views/assets.xml",
"chars": 951,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<odoo>\n <template\n id=\"assets_backend\"\n name=\"Project timelog a"
},
{
"path": "project_task_subtask/views/project_task_subtask.xml",
"chars": 7027,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<odoo>\n <record id=\"view_task_form2\" model=\"ir.ui.view\">\n <field name="
},
{
"path": "setup/.setuptools-odoo-make-default-ignore",
"chars": 96,
"preview": "# addons listed in this file are ignored by\n# setuptools-odoo-make-default (one addon per line)\n"
},
{
"path": "setup/README",
"chars": 94,
"preview": "To learn more about this directory, please visit\nhttps://pypi.python.org/pypi/setuptools-odoo\n"
},
{
"path": "setup/project_task_subtask/setup.py",
"chars": 100,
"preview": "import setuptools\n\nsetuptools.setup(\n setup_requires=['setuptools-odoo'],\n odoo_addon=True,\n)\n"
}
]
About this extraction
This page contains the full source code of the it-projects-llc/misc-addons GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 44 files (109.5 KB), approximately 29.2k tokens, and a symbol index with 21 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.