| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/tier-validation |
| GIT | |
| GIT | https://github.com/OCA/tier-validation.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/tier-validation/tree/19.0/base_tier_validation |
| VERSION | |
| VERSION | 1.0.3 |
| CATEGORY | |
| CATEGORY | Tools |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), ForgeFlow |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), ForgeFlow |
| COMMITTERS | |
| COMMITTERS | Weblate, OCA-git-bot, oca-ci, Maksym Yankin, bosd |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/tier-validation |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 19:40:46 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - base_setup - web - bus - web_tour - html_editor |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | Validating some operations is a common need across different areas in a company and sometimes it also involves several people and stages in the process. With this module you will be able to define your custom validation workflows for any Odoo document. This module does not provide a functionality by itself but an abstract model to implement a validation process based on tiers on other models (e.g. purchase orders, sales orders, budgets, expenses...). **Note:** To be able to use this module in a new model you will need some development. See [purchase_tier_validation](https://github.com/OCA/purchase-workflow) as an example of implementation. Additionally, if your state field is a (stored) computed field, you need to set `_tier_validation_state_field_is_computed` to `True` in your model Python file, and you will want to add the dependent fields of the compute method in `_get_after_validation_exceptions` and `_get_under_validation_exceptions`. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
tier_definition_view_form |
tier.definition.form | tier.definition | form | New |
tier_definition_view_search |
tier.definition.search | tier.definition | search | New |
tier_definition_view_tree |
tier.definition.list | tier.definition | list | New |
tier_review_view_tree |
tier.review.list | tier.review | list | New |
tier_validation_buttons |
tier_validation_buttons | ir.ui.view | qweb | New |
tier_validation_exception_form |
tier.validation.exception.form | tier.validation.exception | form | New |
tier_validation_exception_search |
tier.validation.exception.search | tier.validation.exception | search | New |
tier_validation_exception_tree |
tier.validation.exception.list | tier.validation.exception | list | New |
tier_validation_label |
tier_validation_label | ir.ui.view | qweb | New |
tier_validation_reviews |
tier_validation_reviews | ir.ui.view | qweb | New |
view_comment_wizard |
Comment Wizard | comment.wizard | form | New |
comment
Char
required=True
res_id
Integer
res_model
Char
review_ids
Many2many → tier.review
comodel_name='tier.review'
validate_reject
Char
add_comment(self)
review_ids
Many2many → tier.review
comodel_name='tier.review'
copy=False
string='Reviews'
review_user_count(self)
active
Boolean
default=True
allow_write_for_reviewer
Boolean
default=False
string='Allow Write For Reviewers'
approve_sequence
Boolean
default=False
help='Approval order by the specified sequence number'
string='Approve by sequence'
approve_sequence_bypass
Boolean
help='Bypassed (auto validated), if previous tier was validated by same reviewer'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
definition_domain
Char
definition_type
Selection
default='domain'
selection=[('domain', 'Domain')]
string='Definition'
has_comment
Boolean
default=False
string='Comment'
model
Char
index=True
related='model_id.model'
store=True
model_id
Many2one → ir.model
comodel_name='ir.model'
domain=<expr>
string='Referenced Model'
name
Char
default=<expr>
required=True
string='Description'
translate=True
notify_on_accepted
Boolean
help='If set, reviewers will be notified by email when a review related to this definition is accepted.'
string='Notify Reviewers on Accepted'
notify_on_create
Boolean
help='If set, all possible reviewers will be notified by email when this definition is triggered.'
string='Notify Reviewers on Creation'
notify_on_pending
Boolean
help="If set, all possible reviewers will be notified by email when this status is reached.Usefull in an Approve by sequence scenario. An notification request to review is sent out when it's their turn to review."
string='Notify Reviewers on reaching Pending'
notify_on_rejected
Boolean
help='If set, reviewers will be notified by email when a review related to this definition is rejected.'
string='Notify Reviewers on Rejected'
notify_on_restarted
Boolean
help='If set, reviewers will be notified by email when a reviews related to this definition are restarted.'
string='Notify Reviewers on Restarted'
notify_reminder_delay
Integer
help='Number of days after which a message must be posted to remind about pending validation (0 = no reminder)'
string='Send reminder message on pending reviews'
review_type
Selection
default='individual'
selection=[('individual', 'Specific user'), ('group', 'Any user in a specific group'), ('field', 'Field in related record')]
string='Validated by'
reviewer_field_id
Many2one → ir.model.fields
comodel_name='ir.model.fields'
domain="[('id', 'in', valid_reviewer_field_ids)]"
string='Reviewer field'
reviewer_group_id
Many2one → res.groups
comodel_name='res.groups'
string='Reviewer group'
reviewer_id
Many2one → res.users
comodel_name='res.users'
string='Reviewer'
sequence
Integer
default=30
valid_reviewer_field_ids
One2many → ir.model.fields
comodel_name='ir.model.fields'
compute='_compute_domain_reviewer_field'
onchange_review_type(self)
approve_sequence
Boolean
related='definition_id.approve_sequence'
approve_sequence_bypass
Boolean
related='definition_id.approve_sequence_bypass'
can_review
Boolean
compute='_compute_can_review'
help='Can review will be marked if the review is pending and the\n approve sequence has been achieved'
store=True
comment
Char
string='Comments'
company_id
Many2one
related='definition_id.company_id'
store=True
definition_id
Many2one → tier.definition
comodel_name='tier.definition'
display_status
Char
compute='_compute_display_status'
done_by
Many2one → res.users
comodel_name='res.users'
has_comment
Boolean
related='definition_id.has_comment'
last_reminder_date
Datetime
readonly=True
model
Char
index=True
string='Related Document Model'
name
Char
related='definition_id.name'
requested_by
Many2one → res.users
comodel_name='res.users'
res_id
Many2oneReference
index=True
model_field='model'
string='Related Document ID'
review_type
Selection
related='definition_id.review_type'
reviewed_date
Datetime
string='Validation Date'
reviewed_formated_date
Char
compute='_compute_reviewed_formated_date'
string='Validation Formated Date'
reviewer_field_id
Many2one
related='definition_id.reviewer_field_id'
reviewer_group_id
Many2one
related='definition_id.reviewer_group_id'
reviewer_id
Many2one
related='definition_id.reviewer_id'
reviewer_ids
Many2many → res.users
comodel_name='res.users'
compute='_compute_reviewer_ids'
store=True
string='Reviewers'
sequence
Integer
string='Tier'
status
Selection
default='waiting'
args: [('waiting', 'Waiting'), ('pending', 'Pending'), ('rejected', 'Rejected'), ('approved', 'Approved'), ('cancel', 'Cancel')]
todo_by
Char
compute='_compute_todo_by'
store=True
No public methods.
can_review
Boolean
compute='_compute_can_review'
search='_search_can_review'
has_comment
Boolean
compute='_compute_has_comment'
help='If set, Allow the reviewer to leave a comment on the review.'
hide_reviews
Boolean
compute='_compute_hide_reviews'
need_validation
Boolean
compute='_compute_need_validation'
next_review
Char
compute='_compute_next_review'
rejected_message
Html
compute='_compute_rejected_message'
review_ids
One2many → tier.review
bypass_search_access=True
comodel_name='tier.review'
domain=<expr>
inverse_name='res_id'
string='Validations'
reviewer_ids
Many2many → res.users
comodel_name='res.users'
compute='_compute_reviewer_ids'
search='_search_reviewer_ids'
string='Reviewers'
to_validate_message
Html
compute='_compute_to_validate_message'
validated_message
Html
compute='_compute_validated_message'
validation_status
Selection
compute='_compute_validation_status'
default='no'
selection=[('no', 'Without validation'), ('waiting', 'Waiting'), ('pending', 'Pending'), ('rejected', 'Rejected'), ('validated', 'Validated')]
store=True
evaluate_tier(self, tier)
get_view(self, view_id=None, view_type='form', **options)
reject_tier(self)
request_validation(self)
restart_validation(self)
unlink(self)
validate_tier(self)
write(self, vals)
allowed_to_write_after_validation
Boolean
default=True
string='Write after Validation'
allowed_to_write_under_validation
Boolean
default=True
string='Write under Validation'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
field_ids
Many2many → ir.model.fields
comodel_name='ir.model.fields'
domain="[('id', 'in', valid_model_field_ids)]"
required=True
string='Fields'
group_ids
Many2many → res.groups
comodel_name='res.groups'
help='Allowed groups to use this Tier Validation Exception'
string='Groups'
model_id
Many2one → ir.model
comodel_name='ir.model'
domain=<expr>
ondelete='cascade'
required=True
string='Model'
model_name
Char
index=True
related='model_id.model'
store=True
string='Model Name'
name
Char
default='New Tier Validation Exception'
required=True
valid_model_field_ids
One2many → ir.model.fields
comodel_name='ir.model.fields'
compute='_compute_valid_model_field_ids'
No public methods.
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/server-ux |
| GIT | |
| GIT | https://github.com/OCA/server-ux.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/server-ux/tree/18.0/base_tier_validation |
| VERSION | |
| VERSION | 3.4.0 |
| CATEGORY | |
| CATEGORY | Tools |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), ForgeFlow |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), ForgeFlow |
| COMMITTERS | |
| COMMITTERS | Stefan Rijnhart, Pedro M. Baeza, Lois Rilo, Carlos Lopez, Víctor Martínez, Thierry Ducrest, Weblate, OCA-git-bot, Miika Nissi, Maxence Groine, oca-ci, Saran440, Kevin Khao, bosd, Duy (Đỗ Anh), nakrob samael, César León |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/server-ux |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 19:30:16 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - base_setup - web - bus - web_tour - html_editor |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | Validating some operations is a common need across different areas in a company and sometimes it also involves several people and stages in the process. With this module you will be able to define your custom validation workflows for any Odoo document. This module does not provide a functionality by itself but an abstract model to implement a validation process based on tiers on other models (e.g. purchase orders, sales orders, budgets, expenses...). **Note:** To be able to use this module in a new model you will need some development. See [purchase_tier_validation](https://github.com/OCA/purchase-workflow) as an example of implementation. Additionally, if your state field is a (stored) computed field, you need to set `_tier_validation_state_field_is_computed` to `True` in your model Python file, and you will want to add the dependent fields of the compute method in `_get_after_validation_exceptions` and `_get_under_validation_exceptions`. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
res_config_settings_view_form_budget |
res.config.settings.view.form.budget | res.config.settings | xpath | Inherits base_setup.res_config_settings_view_form |
tier_definition_view_form |
tier.definition.form | tier.definition | form | New |
tier_definition_view_search |
tier.definition.search | tier.definition | search | New |
tier_definition_view_tree |
tier.definition.list | tier.definition | list | New |
tier_review_view_tree |
tier.review.list | tier.review | list | New |
tier_validation_buttons |
tier_validation_buttons | ir.ui.view | qweb | New |
tier_validation_exception_form |
tier.validation.exception.form | tier.validation.exception | form | New |
tier_validation_exception_search |
tier.validation.exception.search | tier.validation.exception | search | New |
tier_validation_exception_tree |
tier.validation.exception.list | tier.validation.exception | list | New |
tier_validation_label |
tier_validation_label | ir.ui.view | qweb | New |
tier_validation_reviews |
tier_validation_reviews | ir.ui.view | qweb | New |
view_comment_wizard |
Comment Wizard | comment.wizard | form | New |
comment
Char
required=True
res_id
Integer
res_model
Char
review_ids
Many2many → tier.review
comodel_name='tier.review'
validate_reject
Char
add_comment(self)
module_base_tier_validation_formula
Boolean
string='Tier Formula'
No public methods.
review_ids
Many2many → tier.review
comodel_name='tier.review'
copy=False
string='Reviews'
review_user_count(self)
active
Boolean
default=True
allow_write_for_reviewer
Boolean
default=False
string='Allow Write For Reviewers'
approve_sequence
Boolean
default=False
help='Approval order by the specified sequence number'
string='Approve by sequence'
approve_sequence_bypass
Boolean
help='Bypassed (auto validated), if previous tier was validated by same reviewer'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
definition_domain
Char
definition_type
Selection
default='domain'
selection=[('domain', 'Domain')]
string='Definition'
has_comment
Boolean
default=False
string='Comment'
model
Char
index=True
related='model_id.model'
store=True
model_id
Many2one → ir.model
comodel_name='ir.model'
domain=<expr>
string='Referenced Model'
name
Char
default=<expr>
required=True
string='Description'
translate=True
notify_on_accepted
Boolean
help='If set, reviewers will be notified by email when a review related to this definition is accepted.'
string='Notify Reviewers on Accepted'
notify_on_create
Boolean
help='If set, all possible reviewers will be notified by email when this definition is triggered.'
string='Notify Reviewers on Creation'
notify_on_pending
Boolean
help="If set, all possible reviewers will be notified by email when this status is reached.Usefull in an Approve by sequence scenario. An notification request to review is sent out when it's their turn to review."
string='Notify Reviewers on reaching Pending'
notify_on_rejected
Boolean
help='If set, reviewers will be notified by email when a review related to this definition is rejected.'
string='Notify Reviewers on Rejected'
notify_on_restarted
Boolean
help='If set, reviewers will be notified by email when a reviews related to this definition are restarted.'
string='Notify Reviewers on Restarted'
notify_reminder_delay
Integer
help='Number of days after which a message must be posted to remind about pending validation (0 = no reminder)'
string='Send reminder message on pending reviews'
review_type
Selection
default='individual'
selection=[('individual', 'Specific user'), ('group', 'Any user in a specific group'), ('field', 'Field in related record')]
string='Validated by'
reviewer_field_id
Many2one → ir.model.fields
comodel_name='ir.model.fields'
domain="[('id', 'in', valid_reviewer_field_ids)]"
string='Reviewer field'
reviewer_group_id
Many2one → res.groups
comodel_name='res.groups'
string='Reviewer group'
reviewer_id
Many2one → res.users
comodel_name='res.users'
string='Reviewer'
sequence
Integer
default=30
valid_reviewer_field_ids
One2many → ir.model.fields
comodel_name='ir.model.fields'
compute='_compute_domain_reviewer_field'
onchange_review_type(self)
approve_sequence
Boolean
related='definition_id.approve_sequence'
approve_sequence_bypass
Boolean
related='definition_id.approve_sequence_bypass'
can_review
Boolean
compute='_compute_can_review'
help='Can review will be marked if the review is pending and the\n approve sequence has been achieved'
store=True
comment
Char
string='Comments'
company_id
Many2one
related='definition_id.company_id'
store=True
definition_id
Many2one → tier.definition
comodel_name='tier.definition'
display_status
Char
compute='_compute_display_status'
done_by
Many2one → res.users
comodel_name='res.users'
has_comment
Boolean
related='definition_id.has_comment'
last_reminder_date
Datetime
readonly=True
model
Char
index=True
string='Related Document Model'
name
Char
related='definition_id.name'
requested_by
Many2one → res.users
comodel_name='res.users'
res_id
Many2oneReference
index=True
model_field='model'
string='Related Document ID'
review_type
Selection
related='definition_id.review_type'
reviewed_date
Datetime
string='Validation Date'
reviewed_formated_date
Char
compute='_compute_reviewed_formated_date'
string='Validation Formated Date'
reviewer_field_id
Many2one
related='definition_id.reviewer_field_id'
reviewer_group_id
Many2one
related='definition_id.reviewer_group_id'
reviewer_id
Many2one
related='definition_id.reviewer_id'
reviewer_ids
Many2many → res.users
comodel_name='res.users'
compute='_compute_reviewer_ids'
store=True
string='Reviewers'
sequence
Integer
string='Tier'
status
Selection
default='waiting'
args: [('waiting', 'Waiting'), ('pending', 'Pending'), ('rejected', 'Rejected'), ('approved', 'Approved'), ('cancel', 'Cancel')]
todo_by
Char
compute='_compute_todo_by'
store=True
No public methods.
can_review
Boolean
compute='_compute_can_review'
search='_search_can_review'
has_comment
Boolean
compute='_compute_has_comment'
help='If set, Allow the reviewer to leave a comment on the review.'
hide_reviews
Boolean
compute='_compute_hide_reviews'
need_validation
Boolean
compute='_compute_need_validation'
next_review
Char
compute='_compute_next_review'
rejected
Boolean
compute='_compute_validated_rejected'
search='_search_rejected'
rejected_message
Html
compute='_compute_rejected_message'
review_ids
One2many → tier.review
auto_join=True
comodel_name='tier.review'
domain=<expr>
inverse_name='res_id'
string='Validations'
reviewer_ids
Many2many → res.users
comodel_name='res.users'
compute='_compute_reviewer_ids'
search='_search_reviewer_ids'
string='Reviewers'
to_validate_message
Html
compute='_compute_to_validate_message'
validated
Boolean
compute='_compute_validated_rejected'
search='_search_validated'
validated_message
Html
compute='_compute_validated_message'
validation_status
Selection
compute='_compute_validation_status'
default='no'
selection=[('no', 'Without validation'), ('waiting', 'Waiting'), ('pending', 'Pending'), ('rejected', 'Rejected'), ('validated', 'Validated')]
store=True
evaluate_tier(self, tier)
get_view(self, view_id=None, view_type='form', **options)
reject_tier(self)
request_validation(self)
restart_validation(self)
unlink(self)
validate_tier(self)
write(self, vals)
allowed_to_write_after_validation
Boolean
default=True
string='Write after Validation'
allowed_to_write_under_validation
Boolean
default=True
string='Write under Validation'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
field_ids
Many2many → ir.model.fields
comodel_name='ir.model.fields'
domain="[('id', 'in', valid_model_field_ids)]"
required=True
string='Fields'
group_ids
Many2many → res.groups
comodel_name='res.groups'
help='Allowed groups to use this Tier Validation Exception'
string='Groups'
model_id
Many2one → ir.model
comodel_name='ir.model'
domain=<expr>
ondelete='cascade'
required=True
string='Model'
model_name
Char
index=True
related='model_id.model'
store=True
string='Model Name'
name
Char
default='New Tier Validation Exception'
required=True
valid_model_field_ids
One2many → ir.model.fields
comodel_name='ir.model.fields'
compute='_compute_valid_model_field_ids'
No public methods.
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/server-ux |
| GIT | |
| GIT | https://github.com/OCA/server-ux.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/server-ux/tree/17.0/base_tier_validation |
| VERSION | |
| VERSION | 4.1.0 |
| CATEGORY | |
| CATEGORY | Tools |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), ForgeFlow |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), ForgeFlow |
| COMMITTERS | |
| COMMITTERS | Stefan Rijnhart, Lois Rilo, Carlos Lopez, Víctor Martínez, Thierry Ducrest, Ruchir Shukla, Weblate, OCA-git-bot, Raf Ven, Maxence Groine, oca-ci, Vincent Van Rossem, Eduardo De Miguel, Saran440, bosd, Alberto Martínez, AlexPForgeFlow, Henry Backman, sonhd91, djaen |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/server-ux |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 19:20:08 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - base_setup - web - bus - web_tour |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | Validating some operations is a common need across different areas in a company and sometimes it also involves several people and stages in the process. With this module you will be able to define your custom validation workflows for any Odoo document. This module does not provide a functionality by itself but an abstract model to implement a validation process based on tiers on other models (e.g. purchase orders, sales orders, budgets, expenses...). **Note:** To be able to use this module in a new model you will need some development. See [purchase_tier_validation](https://github.com/OCA/purchase-workflow) as an example of implementation. Additionally, if your state field is a (stored) computed field, you need to set `_tier_validation_state_field_is_computed` to `True` in your model Python file, and you will want to add the dependent fields of the compute method in `_get_after_validation_exceptions` and `_get_under_validation_exceptions`. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
res_config_settings_view_form_budget |
res.config.settings.view.form.budget | res.config.settings | xpath | Inherits base_setup.res_config_settings_view_form |
tier_definition_view_form |
tier.definition.form | tier.definition | form | New |
tier_definition_view_search |
tier.definition.search | tier.definition | search | New |
tier_definition_view_tree |
tier.definition.tree | tier.definition | tree | New |
tier_review_view_tree |
tier.review.tree | tier.review | tree | New |
tier_validation_buttons |
tier_validation_buttons | ir.ui.view | qweb | New |
tier_validation_exception_form |
tier.validation.exception.form | tier.validation.exception | form | New |
tier_validation_exception_search |
tier.validation.exception.search | tier.validation.exception | search | New |
tier_validation_exception_tree |
tier.validation.exception.tree | tier.validation.exception | tree | New |
tier_validation_label |
tier_validation_label | ir.ui.view | qweb | New |
tier_validation_reviews |
tier_validation_reviews | ir.ui.view | qweb | New |
view_comment_wizard |
Comment Wizard | comment.wizard | form | New |
No new fields.
Public methods (1)get_tier_review_action(self)
comment
Char
required=True
res_id
Integer
res_model
Char
review_ids
Many2many → tier.review
comodel_name='tier.review'
validate_reject
Char
add_comment(self)
module_base_tier_validation_formula
Boolean
string='Tier Formula'
No public methods.
review_ids
Many2many → tier.review
comodel_name='tier.review'
string='Reviews'
review_user_count(self)
active
Boolean
default=True
allow_write_for_reviewer
Boolean
default=False
string='Allow Write For Reviewers'
approve_sequence
Boolean
default=False
help='Approval order by the specified sequence number'
string='Approve by sequence'
approve_sequence_bypass
Boolean
help='Bypassed (auto validated), if previous tier was validated by same reviewer'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
definition_domain
Char
definition_type
Selection
default='domain'
selection=[('domain', 'Domain')]
string='Definition'
has_comment
Boolean
default=False
help='If set, Allow the reviewer to leave a comment on the review.'
string='Comment'
model
Char
index=True
related='model_id.model'
store=True
model_id
Many2one → ir.model
comodel_name='ir.model'
domain=<expr>
string='Referenced Model'
name
Char
default=<expr>
required=True
string='Description'
translate=True
notify_on_accepted
Boolean
help='If set, reviewers will be notified by email when a review related to this definition is accepted.'
string='Notify Reviewers on Accepted'
notify_on_create
Boolean
help='If set, all possible reviewers will be notified by email when this definition is triggered.'
string='Notify Reviewers on Creation'
notify_on_pending
Boolean
help="If set, all possible reviewers will be notified by email when this status is reached.Usefull in an Approve by sequence scenario. An notification request to review is sent out when it's their turn to review."
string='Notify Reviewers on reaching Pending'
notify_on_rejected
Boolean
help='If set, reviewers will be notified by email when a review related to this definition is rejected.'
string='Notify Reviewers on Rejected'
notify_on_restarted
Boolean
help='If set, reviewers will be notified by email when a reviews related to this definition are restarted.'
string='Notify Reviewers on Restarted'
notify_reminder_delay
Integer
help='Number of days after which a message must be posted to remind about pending validation (0 = no reminder)'
string='Send reminder message on pending reviews'
review_type
Selection
default='individual'
selection=[('individual', 'Specific user'), ('group', 'Any user in a specific group'), ('field', 'Field in related record')]
string='Validated by'
reviewer_field_id
Many2one → ir.model.fields
comodel_name='ir.model.fields'
domain="[('id', 'in', valid_reviewer_field_ids)]"
string='Reviewer field'
reviewer_group_id
Many2one → res.groups
comodel_name='res.groups'
string='Reviewer group'
reviewer_id
Many2one → res.users
comodel_name='res.users'
string='Reviewer'
sequence
Integer
default=30
valid_reviewer_field_ids
One2many → ir.model.fields
comodel_name='ir.model.fields'
compute='_compute_domain_reviewer_field'
onchange_review_type(self)
approve_sequence
Boolean
readonly=True
related='definition_id.approve_sequence'
approve_sequence_bypass
Boolean
readonly=True
related='definition_id.approve_sequence_bypass'
can_review
Boolean
compute='_compute_can_review'
help='Can review will be marked if the review is pending and the\n approve sequence has been achieved'
store=True
comment
Char
string='Comments'
company_id
Many2one
related='definition_id.company_id'
store=True
definition_id
Many2one → tier.definition
comodel_name='tier.definition'
display_status
Char
compute='_compute_display_status'
done_by
Many2one → res.users
comodel_name='res.users'
has_comment
Boolean
readonly=True
related='definition_id.has_comment'
last_reminder_date
Datetime
readonly=True
model
Char
index=True
string='Related Document Model'
name
Char
readonly=True
related='definition_id.name'
requested_by
Many2one → res.users
comodel_name='res.users'
res_id
Many2oneReference
index=True
model_field='model'
string='Related Document ID'
review_type
Selection
readonly=True
related='definition_id.review_type'
reviewed_date
Datetime
string='Validation Date'
reviewed_formated_date
Char
compute='_compute_reviewed_formated_date'
string='Validation Formated Date'
reviewer_field_id
Many2one
readonly=True
related='definition_id.reviewer_field_id'
reviewer_group_id
Many2one
readonly=True
related='definition_id.reviewer_group_id'
reviewer_id
Many2one
readonly=True
related='definition_id.reviewer_id'
reviewer_ids
Many2many → res.users
comodel_name='res.users'
compute='_compute_reviewer_ids'
store=True
string='Reviewers'
sequence
Integer
string='Tier'
status
Selection
default='waiting'
args: [('waiting', 'Waiting'), ('pending', 'Pending'), ('rejected', 'Rejected'), ('approved', 'Approved')]
todo_by
Char
compute='_compute_todo_by'
store=True
No public methods.
can_review
Boolean
compute='_compute_can_review'
search='_search_can_review'
has_comment
Boolean
compute='_compute_has_comment'
help='If set, Allow the reviewer to leave a comment on the review.'
hide_reviews
Boolean
compute='_compute_hide_reviews'
need_validation
Boolean
compute='_compute_need_validation'
next_review
Char
compute='_compute_next_review'
rejected
Boolean
compute='_compute_validated_rejected'
search='_search_rejected'
rejected_message
Html
compute='_compute_rejected_message'
review_ids
One2many → tier.review
auto_join=True
comodel_name='tier.review'
domain=<expr>
inverse_name='res_id'
string='Validations'
reviewer_ids
Many2many → res.users
comodel_name='res.users'
compute='_compute_reviewer_ids'
search='_search_reviewer_ids'
string='Reviewers'
to_validate_message
Html
compute='_compute_to_validate_message'
validated
Boolean
compute='_compute_validated_rejected'
search='_search_validated'
validated_message
Html
compute='_compute_validated_message'
validation_status
Selection
compute='_compute_validation_status'
default='no'
selection=[('no', 'Without validation'), ('waiting', 'Waiting'), ('pending', 'Pending'), ('rejected', 'Rejected'), ('validated', 'Validated')]
store=True
evaluate_tier(self, tier)
get_view(self, view_id=None, view_type='form', **options)
reject_tier(self)
request_validation(self)
restart_validation(self)
unlink(self)
validate_tier(self)
write(self, vals)
allowed_to_write_after_validation
Boolean
default=True
string='Write after Validation'
allowed_to_write_under_validation
Boolean
default=True
string='Write under Validation'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
field_ids
Many2many → ir.model.fields
comodel_name='ir.model.fields'
domain="[('id', 'in', valid_model_field_ids)]"
required=True
string='Fields'
group_ids
Many2many → res.groups
comodel_name='res.groups'
help='Allowed groups to use this Tier Validation Exception'
string='Groups'
model_id
Many2one → ir.model
comodel_name='ir.model'
domain=<expr>
ondelete='cascade'
required=True
string='Model'
model_name
Char
index=True
readonly=True
related='model_id.model'
store=True
string='Model Name'
name
Char
default='New Tier Validation Exception'
required=True
valid_model_field_ids
One2many → ir.model.fields
comodel_name='ir.model.fields'
compute='_compute_valid_model_field_ids'
No public methods.
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/server-ux |
| GIT | |
| GIT | https://github.com/OCA/server-ux.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/server-ux/tree/16.0/base_tier_validation |
| VERSION | |
| VERSION | 4.0.2 |
| CATEGORY | |
| CATEGORY | Tools |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), ForgeFlow |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), ForgeFlow |
| COMMITTERS | |
| COMMITTERS | Holger Brunn, GitHub, Florent de Labarre, Lois Rilo, Carlos Lopez, Francesco Apruzzese, manu, Víctor Martínez, Ignacio Cainelli, Thierry Ducrest, Ruchir Shukla, Weblate, OCA-git-bot, oca-ci, Christopher Ormaza, Eduardo De Miguel, Saran440, bosd, Kev-Roche, JasminSForgeFlow, Houzéfa Abbasbhay, CRogos, Jesús Alan Ramos Rordríguez |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/server-ux |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:53:53 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - base_setup - web - bus - web_tour |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
res_config_settings_view_form_budget |
res.config.settings.view.form.budget | res.config.settings | xpath | Inherits base_setup.res_config_settings_view_form |
tier_definition_view_form |
tier.definition.form | tier.definition | form | New |
tier_definition_view_search |
tier.definition.search | tier.definition | search | New |
tier_definition_view_tree |
tier.definition.tree | tier.definition | tree | New |
tier_review_view_tree |
tier.review.tree | tier.review | tree | New |
tier_validation_buttons |
tier_validation_buttons | ir.ui.view | qweb | New |
tier_validation_exception_form |
tier.validation.exception.form | tier.validation.exception | form | New |
tier_validation_exception_search |
tier.validation.exception.search | tier.validation.exception | search | New |
tier_validation_exception_tree |
tier.validation.exception.tree | tier.validation.exception | tree | New |
tier_validation_label |
tier_validation_label | ir.ui.view | qweb | New |
tier_validation_reviews |
tier_validation_reviews | ir.ui.view | qweb | New |
view_comment_wizard |
Comment Wizard | comment.wizard | form | New |
comment
Char
required=True
res_id
Integer
res_model
Char
review_ids
Many2many → tier.review
comodel_name='tier.review'
validate_reject
Char
add_comment(self)
module_base_tier_validation_formula
Boolean
string='Tier Formula'
module_base_tier_validation_forward
Boolean
No public methods.
review_ids
Many2many → tier.review
comodel_name='tier.review'
string='Reviews'
get_reviews(self, data)
review_user_count(self)
active
Boolean
default=True
approve_sequence
Boolean
default=False
help='Approval order by the specified sequence number'
string='Approve by sequence'
approve_sequence_bypass
Boolean
help='Bypassed (auto validated), if previous tier was validated by same reviewer'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
definition_domain
Char
definition_type
Selection
default='domain'
selection=[('domain', 'Domain')]
string='Definition'
has_comment
Boolean
default=False
string='Comment'
model
Char
index=True
related='model_id.model'
store=True
model_id
Many2one → ir.model
comodel_name='ir.model'
domain=<expr>
string='Referenced Model'
name
Char
default=<expr>
required=True
string='Description'
translate=True
notify_on_accepted
Boolean
help='If set, reviewers will be notified by email when a review related to this definition is accepted.'
string='Notify Reviewers on Accepted'
notify_on_create
Boolean
help='If set, all possible reviewers will be notified by email when this definition is triggered.'
string='Notify Reviewers on Creation'
notify_on_rejected
Boolean
help='If set, reviewers will be notified by email when a review related to this definition is rejected.'
string='Notify Reviewers on Rejected'
notify_on_restarted
Boolean
help='If set, reviewers will be notified by email when a reviews related to this definition are restarted.'
string='Notify Reviewers on Restarted'
notify_reminder_delay
Integer
help='Number of days after which a message must be posted to remind about pending validation (0 = no reminder)'
string='Send reminder message on pending reviews'
review_type
Selection
default='individual'
selection=[('individual', 'Specific user'), ('group', 'Any user in a specific group'), ('field', 'Field in related record')]
string='Validated by'
reviewer_field_id
Many2one → ir.model.fields
comodel_name='ir.model.fields'
domain="[('id', 'in', valid_reviewer_field_ids)]"
string='Reviewer field'
reviewer_group_id
Many2one → res.groups
comodel_name='res.groups'
string='Reviewer group'
reviewer_id
Many2one → res.users
comodel_name='res.users'
string='Reviewer'
sequence
Integer
default=30
valid_reviewer_field_ids
One2many → ir.model.fields
comodel_name='ir.model.fields'
compute='_compute_domain_reviewer_field'
onchange_review_type(self)
approve_sequence
Boolean
readonly=True
related='definition_id.approve_sequence'
approve_sequence_bypass
Boolean
readonly=True
related='definition_id.approve_sequence_bypass'
can_review
Boolean
compute='_compute_can_review'
help='Can review will be marked if the review is pending and the\n approve sequence has been achieved'
store=True
comment
Char
string='Comments'
company_id
Many2one
related='definition_id.company_id'
store=True
definition_id
Many2one → tier.definition
comodel_name='tier.definition'
display_status
Char
compute='_compute_display_status'
done_by
Many2one → res.users
comodel_name='res.users'
has_comment
Boolean
readonly=True
related='definition_id.has_comment'
last_reminder_date
Datetime
readonly=True
model
Char
index=True
string='Related Document Model'
name
Char
readonly=True
related='definition_id.name'
requested_by
Many2one → res.users
comodel_name='res.users'
res_id
Many2oneReference
index=True
model_field='model'
string='Related Document ID'
review_type
Selection
readonly=True
related='definition_id.review_type'
reviewed_date
Datetime
string='Validation Date'
reviewed_formated_date
Char
compute='_compute_reviewed_formated_date'
string='Validation Formated Date'
reviewer_field_id
Many2one
readonly=True
related='definition_id.reviewer_field_id'
reviewer_group_id
Many2one
readonly=True
related='definition_id.reviewer_group_id'
reviewer_id
Many2one
readonly=True
related='definition_id.reviewer_id'
reviewer_ids
Many2many → res.users
comodel_name='res.users'
compute='_compute_reviewer_ids'
store=True
string='Reviewers'
sequence
Integer
string='Tier'
status
Selection
default='pending'
selection=[('pending', 'Pending'), ('rejected', 'Rejected'), ('approved', 'Approved')]
todo_by
Char
compute='_compute_todo_by'
store=True
No public methods.
can_review
Boolean
compute='_compute_can_review'
search='_search_can_review'
has_comment
Boolean
compute='_compute_has_comment'
is_reevaluation_required
Boolean
compute='_compute_is_reevaluation_required'
need_validation
Boolean
compute='_compute_need_validation'
next_review
Char
compute='_compute_next_review'
rejected
Boolean
compute='_compute_validated_rejected'
search='_search_rejected'
rejected_message
Html
compute='_compute_rejected_message'
review_ids
One2many → tier.review
auto_join=True
comodel_name='tier.review'
domain=<expr>
inverse_name='res_id'
string='Validations'
reviewer_ids
Many2many → res.users
comodel_name='res.users'
compute='_compute_reviewer_ids'
search='_search_reviewer_ids'
string='Reviewers'
to_validate_message
Html
compute='_compute_to_validate_message'
validated
Boolean
compute='_compute_validated_rejected'
search='_search_validated'
validated_message
Html
compute='_compute_validated_message'
validation_status
Selection
compute='_compute_validation_status'
default='no'
selection=[('no', 'Without validation'), ('pending', 'Pending'), ('rejected', 'Rejected'), ('validated', 'Validated')]
store=True
evaluate_tier(self, tier)
get_view(self, view_id=None, view_type='form', **options)
reevaluate_reviews(self)
reject_tier(self)
request_validation(self)
restart_validation(self)
unlink(self)
validate_tier(self)
write(self, vals)
allowed_to_write_after_validation
Boolean
default=True
string='Write after Validation'
allowed_to_write_under_validation
Boolean
default=True
string='Write under Validation'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
field_ids
Many2many → ir.model.fields
comodel_name='ir.model.fields'
domain="[('id', 'in', valid_model_field_ids)]"
required=True
string='Fields'
group_ids
Many2many → res.groups
comodel_name='res.groups'
help='Allowed groups to use this Tier Validation Exception'
string='Groups'
model_id
Many2one → ir.model
comodel_name='ir.model'
domain=<expr>
ondelete='cascade'
required=True
string='Model'
model_name
Char
index=True
readonly=True
related='model_id.model'
store=True
string='Model Name'
name
Char
default='New Tier Validation Exception'
required=True
valid_model_field_ids
One2many → ir.model.fields
comodel_name='ir.model.fields'
compute='_compute_valid_model_field_ids'
No public methods.
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/server-ux |
| GIT | |
| GIT | https://github.com/OCA/server-ux.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/server-ux/tree/15.0/base_tier_validation |
| VERSION | |
| VERSION | 1.6.0 |
| CATEGORY | |
| CATEGORY | Tools |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), ForgeFlow |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), ForgeFlow |
| COMMITTERS | |
| COMMITTERS | Lois Rilo, Carlos Lopez, OCA Transbot, Víctor Martínez, Thierry Ducrest, Weblate, OCA-git-bot, oca-ci, Saran440, bosd, Jasmin Solanki, Kevin Luna, josep-tecnativa |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/server-ux |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:46:39 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - base_setup - web - bus - web_tour |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
res_config_settings_view_form_budget |
res.config.settings.view.form.budget | res.config.settings | xpath | Inherits base_setup.res_config_settings_view_form |
tier_definition_view_form |
tier.definition.form | tier.definition | form | New |
tier_definition_view_search |
tier.definition.search | tier.definition | search | New |
tier_definition_view_tree |
tier.definition.tree | tier.definition | tree | New |
tier_review_view_tree |
tier.review.tree | tier.review | tree | New |
tier_validation_buttons |
tier_validation_buttons | ir.ui.view | qweb | New |
tier_validation_label |
tier_validation_label | ir.ui.view | qweb | New |
tier_validation_reviews |
tier_validation_reviews | ir.ui.view | qweb | New |
view_comment_wizard |
Comment Wizard | comment.wizard | form | New |
comment
Char
required=True
res_id
Integer
res_model
Char
review_ids
Many2many → tier.review
comodel_name='tier.review'
validate_reject
Char
add_comment(self)
module_base_tier_validation_formula
Boolean
string='Tier Formula'
module_base_tier_validation_forward
Boolean
module_base_tier_validation_report
Boolean
module_base_tier_validation_server_action
Boolean
No public methods.
review_ids
Many2many → tier.review
comodel_name='tier.review'
string='Reviews'
get_reviews(self, data)
review_user_count(self)
active
Boolean
default=True
approve_sequence
Boolean
default=False
help='Approval order by the specified sequence number'
string='Approve by sequence'
approve_sequence_bypass
Boolean
help='Bypassed (auto validated), if previous tier was validated by same reviewer'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
definition_domain
Char
definition_type
Selection
default='domain'
selection=[('domain', 'Domain')]
string='Definition'
has_comment
Boolean
default=False
string='Comment'
model
Char
index=True
related='model_id.model'
store=True
model_id
Many2one → ir.model
comodel_name='ir.model'
domain=<expr>
string='Referenced Model'
name
Char
default=<expr>
required=True
string='Description'
translate=True
notify_on_create
Boolean
help='If set, all possible reviewers will be notified by email when this definition is triggered.'
string='Notify Reviewers on Creation'
notify_reminder_delay
Integer
help='Number of days after which a message must be posted to remind about pending validation (0 = no reminder)'
string='Send reminder message on pending reviews'
review_type
Selection
default='individual'
selection=[('individual', 'Specific user'), ('group', 'Any user in a specific group'), ('field', 'Field in related record')]
string='Validated by'
reviewer_field_id
Many2one → ir.model.fields
comodel_name='ir.model.fields'
domain="[('id', 'in', valid_reviewer_field_ids)]"
string='Reviewer field'
reviewer_group_id
Many2one → res.groups
comodel_name='res.groups'
string='Reviewer group'
reviewer_id
Many2one → res.users
comodel_name='res.users'
string='Reviewer'
sequence
Integer
default=30
valid_reviewer_field_ids
One2many → ir.model.fields
comodel_name='ir.model.fields'
compute='_compute_domain_reviewer_field'
onchange_review_type(self)
approve_sequence
Boolean
readonly=True
related='definition_id.approve_sequence'
approve_sequence_bypass
Boolean
readonly=True
related='definition_id.approve_sequence_bypass'
can_review
Boolean
compute='_compute_can_review'
help='Can review will be marked if the review is pending and the\n approve sequence has been achieved'
store=True
comment
Char
string='Comments'
company_id
Many2one
related='definition_id.company_id'
store=True
definition_id
Many2one → tier.definition
comodel_name='tier.definition'
done_by
Many2one → res.users
comodel_name='res.users'
has_comment
Boolean
readonly=True
related='definition_id.has_comment'
last_reminder_date
Datetime
readonly=True
model
Char
index=True
string='Related Document Model'
name
Char
readonly=True
related='definition_id.name'
requested_by
Many2one → res.users
comodel_name='res.users'
res_id
Integer
index=True
string='Related Document ID'
review_type
Selection
readonly=True
related='definition_id.review_type'
reviewed_date
Datetime
string='Validation Date'
reviewer_field_id
Many2one
readonly=True
related='definition_id.reviewer_field_id'
reviewer_group_id
Many2one
readonly=True
related='definition_id.reviewer_group_id'
reviewer_id
Many2one
readonly=True
related='definition_id.reviewer_id'
reviewer_ids
Many2many → res.users
comodel_name='res.users'
compute='_compute_reviewer_ids'
store=True
string='Reviewers'
sequence
Integer
string='Tier'
status
Selection
default='pending'
selection=[('pending', 'Pending'), ('rejected', 'Rejected'), ('approved', 'Approved')]
todo_by
Char
compute='_compute_todo_by'
store=True
No public methods.
can_review
Boolean
compute='_compute_can_review'
search='_search_can_review'
has_comment
Boolean
compute='_compute_has_comment'
need_validation
Boolean
compute='_compute_need_validation'
next_review
Char
compute='_compute_next_review'
rejected
Boolean
compute='_compute_validated_rejected'
search='_search_rejected'
rejected_message
Html
compute='_compute_validated_rejected'
review_ids
One2many → tier.review
auto_join=True
comodel_name='tier.review'
domain=<expr>
inverse_name='res_id'
string='Validations'
reviewer_ids
Many2many → res.users
comodel_name='res.users'
compute='_compute_reviewer_ids'
search='_search_reviewer_ids'
string='Reviewers'
to_validate_message
Html
compute='_compute_validated_rejected'
validated
Boolean
compute='_compute_validated_rejected'
search='_search_validated'
validated_message
Html
compute='_compute_validated_rejected'
validation_status
Selection
compute='_compute_validation_status'
default='no'
selection=[('no', 'Without validation'), ('pending', 'Pending'), ('rejected', 'Rejected'), ('validated', 'Validated')]
evaluate_tier(self, tier)
fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
reject_tier(self)
request_validation(self)
restart_validation(self)
unlink(self)
validate_tier(self)
write(self, vals)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/server-ux |
| GIT | |
| GIT | https://github.com/OCA/server-ux.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/server-ux/tree/14.0/base_tier_validation |
| VERSION | |
| VERSION | 4.1.1 |
| CATEGORY | |
| CATEGORY | Tools |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), ForgeFlow |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), ForgeFlow |
| COMMITTERS | |
| COMMITTERS | mreficent, Denis Roussel, Daniel Reis, Enric Tobella, Lois Rilo, Carlos Lopez, OCA Transbot, Víctor Martínez, Thierry Ducrest, Mathieu Benoit, oca-travis, Weblate, OCA-git-bot, Adrià Gil Sorribes, oca-ci, Kitti U, newtratip, Mateu Griful, Ilyas, oca-git-bot, Dũng (Trần Đình), Alessio Renda, Kev-Roche |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/server-ux |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:41:07 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - base_setup - web - bus - web_tour |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
assets_backend |
mail assets | ir.ui.view | qweb | Inherits web.assets_backend |
res_config_settings_view_form_budget |
res.config.settings.view.form.budget | res.config.settings | xpath | Inherits base_setup.res_config_settings_view_form |
tier_definition_view_form |
tier.definition.form | tier.definition | form | New |
tier_definition_view_search |
tier.definition.search | tier.definition | search | New |
tier_definition_view_tree |
tier.definition.tree | tier.definition | tree | New |
tier_review_view_tree |
tier.review.tree | tier.review | tree | New |
tier_validation_buttons |
tier_validation_buttons | ir.ui.view | qweb | New |
tier_validation_label |
tier_validation_label | ir.ui.view | qweb | New |
tier_validation_reviews |
tier_validation_reviews | ir.ui.view | qweb | New |
view_comment_wizard |
Comment Wizard | comment.wizard | form | New |
comment
Char
required=True
res_id
Integer
res_model
Char
review_ids
Many2many → tier.review
comodel_name='tier.review'
validate_reject
Char
add_comment(self)
module_base_tier_validation_formula
Boolean
string='Tier Formula'
module_base_tier_validation_forward
Boolean
module_base_tier_validation_report
Boolean
module_base_tier_validation_server_action
Boolean
No public methods.
review_ids
Many2many → tier.review
comodel_name='tier.review'
string='Reviews'
get_reviews(self, data)
review_user_count(self)
active
Boolean
default=True
allow_write_for_reviewer
Boolean
default=False
string='Allow Write For Reviewers'
approve_sequence
Boolean
default=False
help='Approval order by the specified sequence number'
string='Approve by sequence'
approve_sequence_bypass
Boolean
help='Bypassed (auto validated), if previous tier was validated by same reviewer'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
definition_domain
Char
definition_type
Selection
default='domain'
selection=[('domain', 'Domain')]
string='Definition'
has_comment
Boolean
default=False
string='Comment'
model
Char
index=True
related='model_id.model'
store=True
model_id
Many2one → ir.model
comodel_name='ir.model'
domain=<expr>
string='Referenced Model'
name
Char
default=<expr>
required=True
string='Description'
translate=True
notify_on_create
Boolean
help='If set, all possible reviewers will be notified by email when this definition is triggered.'
string='Notify Reviewers on Creation'
notify_reminder_delay
Integer
help='Number of days after which a message must be posted to remind about pending validation (0 = no reminder)'
string='Send reminder message on pending reviews'
review_type
Selection
default='individual'
selection=[('individual', 'Specific user'), ('group', 'Any user in a specific group'), ('field', 'Field in related record')]
string='Validated by'
reviewer_field_id
Many2one → ir.model.fields
comodel_name='ir.model.fields'
domain="[('id', 'in', valid_reviewer_field_ids)]"
string='Reviewer field'
reviewer_group_id
Many2one → res.groups
comodel_name='res.groups'
string='Reviewer group'
reviewer_id
Many2one → res.users
comodel_name='res.users'
string='Reviewer'
sequence
Integer
default=30
valid_reviewer_field_ids
One2many → ir.model.fields
comodel_name='ir.model.fields'
compute='_compute_domain_reviewer_field'
onchange_review_type(self)
approve_sequence
Boolean
readonly=True
related='definition_id.approve_sequence'
approve_sequence_bypass
Boolean
readonly=True
related='definition_id.approve_sequence_bypass'
can_review
Boolean
compute='_compute_can_review'
help='Can review will be marked if the review is pending and the\n approve sequence has been achieved'
store=True
comment
Char
string='Comments'
company_id
Many2one
related='definition_id.company_id'
store=True
definition_id
Many2one → tier.definition
comodel_name='tier.definition'
done_by
Many2one → res.users
comodel_name='res.users'
has_comment
Boolean
readonly=True
related='definition_id.has_comment'
last_reminder_date
Datetime
readonly=True
model
Char
index=True
string='Related Document Model'
name
Char
readonly=True
related='definition_id.name'
record_id
Reference
compute='_compute_record_id'
index=True
selection=<expr>
store=True
requested_by
Many2one → res.users
comodel_name='res.users'
res_id
Integer
index=True
string='Related Document ID'
review_type
Selection
readonly=True
related='definition_id.review_type'
reviewed_date
Datetime
string='Validation Date'
reviewer_field_id
Many2one
readonly=True
related='definition_id.reviewer_field_id'
reviewer_group_id
Many2one
readonly=True
related='definition_id.reviewer_group_id'
reviewer_id
Many2one
readonly=True
related='definition_id.reviewer_id'
reviewer_ids
Many2many → res.users
comodel_name='res.users'
compute='_compute_reviewer_ids'
store=True
string='Reviewers'
sequence
Integer
string='Tier'
status
Selection
default='pending'
selection=[('pending', 'Pending'), ('rejected', 'Rejected'), ('approved', 'Approved')]
todo_by
Char
compute='_compute_todo_by'
store=True
No public methods.
can_review
Boolean
compute='_compute_can_review'
search='_search_can_review'
has_comment
Boolean
compute='_compute_has_comment'
need_validation
Boolean
compute='_compute_need_validation'
next_review
Char
compute='_compute_next_review'
rejected
Boolean
compute='_compute_validated_rejected'
search='_search_rejected'
rejected_message
Html
compute='_compute_validated_rejected'
review_ids
One2many → tier.review
auto_join=True
comodel_name='tier.review'
domain=<expr>
inverse_name='res_id'
string='Validations'
reviewer_ids
Many2many → res.users
comodel_name='res.users'
compute='_compute_reviewer_ids'
search='_search_reviewer_ids'
string='Reviewers'
tier_validation_before_write
Boolean
compute='_compute_tier_validation_before_write'
to_validate_message
Html
compute='_compute_validated_rejected'
validated
Boolean
compute='_compute_validated_rejected'
search='_search_validated'
validated_message
Html
compute='_compute_validated_rejected'
validation_status
Selection
compute='_compute_validation_status'
default='no'
selection=[('no', 'Without validation'), ('pending', 'Pending'), ('rejected', 'Rejected'), ('validated', 'Validated')]
evaluate_tier(self, tier)
fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
reject_tier(self)
request_validation(self)
restart_validation(self)
unlink(self)
validate_tier(self)
write(self, vals)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/server-ux |
| GIT | |
| GIT | https://github.com/OCA/server-ux.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/server-ux/tree/13.0/base_tier_validation |
| VERSION | |
| VERSION | 1.9.2 |
| CATEGORY | |
| CATEGORY | Tools |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), ForgeFlow |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), ForgeFlow |
| COMMITTERS | |
| COMMITTERS | Pedro M. Baeza, mreficent, Enric Tobella, Lois Rilo, Carlos Lopez, Cas Vissers, Jordi Ballester, OCA Transbot, sergio-teruel, Sergio Teruel, oca-travis, Weblate, OCA-git-bot, Adrià Gil Sorribes, oca-ci, Kitti U, Jaime Arroyo, CarlosRoca13, Alba Riera, jim.hoefnagels, = |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/server-ux |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:34:17 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - base_setup - web - bus - web_tour |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
assets_backend |
mail assets | ir.ui.view | qweb | Inherits web.assets_backend |
tier_definition_view_form |
tier.definition.form | tier.definition | form | New |
tier_definition_view_search |
tier.definition.search | tier.definition | search | New |
tier_definition_view_tree |
tier.definition.tree | tier.definition | tree | New |
tier_review_view_tree |
tier.review.tree | tier.review | tree | New |
tier_validation_buttons |
tier_validation_buttons | ir.ui.view | qweb | New |
tier_validation_label |
tier_validation_label | ir.ui.view | qweb | New |
tier_validation_reviews |
tier_validation_reviews | ir.ui.view | qweb | New |
view_comment_wizard |
Comment Wizard | comment.wizard | form | New |
comment
Char
required=True
res_id
Integer
res_model
Char
review_ids
Many2many → tier.review
comodel_name='tier.review'
validate_reject
Char
add_comment(self)
review_ids
Many2many → tier.review
comodel_name='tier.review'
string='Reviews'
get_reviews(self, data)
review_user_count(self)
active
Boolean
default=True
approve_sequence
Boolean
default=False
help='Approval order by the specified sequence number'
string='Approve by sequence'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
definition_domain
Char
definition_type
Selection
default='domain'
selection=[('domain', 'Domain')]
string='Definition'
has_comment
Boolean
default=False
string='Comment'
model
Char
index=True
related='model_id.model'
store=True
model_id
Many2one → ir.model
comodel_name='ir.model'
domain=<expr>
string='Referenced Model'
name
Char
default=<expr>
required=True
string='Description'
translate=True
notify_on_create
Boolean
help='If set, all possible reviewers will be notified by email when this definition is triggered.'
string='Notify Reviewers on Creation'
review_type
Selection
default='individual'
selection=[('individual', 'Specific user'), ('group', 'Any user in a specific group'), ('field', 'Field in related record')]
string='Validated by'
reviewer_field_id
Many2one → ir.model.fields
comodel_name='ir.model.fields'
domain="[('id', 'in', valid_reviewer_field_ids)]"
string='Reviewer field'
reviewer_group_id
Many2one → res.groups
comodel_name='res.groups'
string='Reviewer group'
reviewer_id
Many2one → res.users
comodel_name='res.users'
string='Reviewer'
sequence
Integer
default=30
valid_reviewer_field_ids
One2many → ir.model.fields
comodel_name='ir.model.fields'
compute='_compute_domain_reviewer_field'
onchange_review_type(self)
approve_sequence
Boolean
readonly=True
related='definition_id.approve_sequence'
can_review
Boolean
compute='_compute_can_review'
help='Can review will be marked if the review is pending and the\n approve sequence has been achieved'
store=True
comment
Char
string='Comments'
company_id
Many2one
related='definition_id.company_id'
store=True
definition_id
Many2one → tier.definition
comodel_name='tier.definition'
done_by
Many2one → res.users
comodel_name='res.users'
has_comment
Boolean
readonly=True
related='definition_id.has_comment'
model
Char
index=True
string='Related Document Model'
name
Char
readonly=True
related='definition_id.name'
requested_by
Many2one → res.users
comodel_name='res.users'
res_id
Integer
index=True
string='Related Document ID'
review_type
Selection
readonly=True
related='definition_id.review_type'
reviewed_date
Datetime
string='Validation Date'
reviewer_field_id
Many2one
readonly=True
related='definition_id.reviewer_field_id'
reviewer_group_id
Many2one
readonly=True
related='definition_id.reviewer_group_id'
reviewer_id
Many2one
readonly=True
related='definition_id.reviewer_id'
reviewer_ids
Many2many → res.users
comodel_name='res.users'
compute='_compute_reviewer_ids'
store=True
string='Reviewers'
sequence
Integer
string='Tier'
status
Selection
default='pending'
selection=[('pending', 'Pending'), ('rejected', 'Rejected'), ('approved', 'Approved')]
todo_by
Char
compute='_compute_todo_by'
store=True
No public methods.
can_review
Boolean
compute='_compute_can_review'
search='_search_can_review'
has_comment
Boolean
compute='_compute_has_comment'
need_validation
Boolean
compute='_compute_need_validation'
next_review
Char
compute='_compute_next_review'
rejected
Boolean
compute='_compute_validated_rejected'
search='_search_rejected'
rejected_message
Html
compute='_compute_validated_rejected'
review_ids
One2many → tier.review
auto_join=True
comodel_name='tier.review'
domain=<expr>
inverse_name='res_id'
string='Validations'
reviewer_ids
Many2many → res.users
comodel_name='res.users'
compute='_compute_reviewer_ids'
search='_search_reviewer_ids'
string='Reviewers'
to_validate_message
Html
compute='_compute_validated_rejected'
validated
Boolean
compute='_compute_validated_rejected'
search='_search_validated'
validated_message
Html
compute='_compute_validated_rejected'
evaluate_tier(self, tier)
fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
reject_tier(self)
request_validation(self)
restart_validation(self)
unlink(self)
validate_tier(self)
write(self, vals)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/server-ux |
| GIT | |
| GIT | https://github.com/OCA/server-ux.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/server-ux/tree/12.0/base_tier_validation |
| VERSION | |
| VERSION | 3.9.3 |
| CATEGORY | |
| CATEGORY | Tools |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Eficent |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Eficent |
| COMMITTERS | |
| COMMITTERS | GitHub, Andrea, Enric Tobella, Lois Rilo, Naglis Jonaitis, Yoshi Tashiro, OCA Transbot, oca-travis, Weblate, OCA-git-bot, Adrià Gil Sorribes, oca-ci, Kitti U, Jaime Arroyo, Héctor Villarreal Ortega, Saran440, Marcel Savegnago, Mateu Griful, Stéphane Valaeys, ps-tubtim |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/server-ux |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:29:22 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - base_setup - web - bus - web_tour |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
assets_backend |
mail assets | ir.ui.view | qweb | Inherits web.assets_backend |
tier_definition_view_form |
tier.definition.form | tier.definition | form | New |
tier_definition_view_search |
tier.definition.search | tier.definition | search | New |
tier_definition_view_tree |
tier.definition.tree | tier.definition | tree | New |
tier_review_view_tree |
tier.review.tree | tier.review | tree | New |
view_comment_wizard |
Comment Wizard | comment.wizard | form | New |
comment
Char
required=True
res_id
Integer
res_model
Char
review_ids
Many2many → tier.review
comodel_name='tier.review'
validate_reject
Char
add_comment(self)
review_ids
Many2many → tier.review
comodel_name='tier.review'
string='Reviews'
get_reviews(self, data)
review_user_count(self)
active
Boolean
default=True
approve_sequence
Boolean
default=False
help='Approval order by the specified sequence number'
string='Approve by sequence'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
definition_domain
Char
definition_type
Selection
default='domain'
selection=[('domain', 'Domain')]
string='Definition'
has_comment
Boolean
default=False
string='Comment'
model
Char
index=True
related='model_id.model'
store=True
model_id
Many2one → ir.model
comodel_name='ir.model'
string='Referenced Model'
name
Char
default=<expr>
required=True
string='Description'
translate=True
notify_on_create
Boolean
help='If set, all possible reviewers will be notified by email when this definition is triggered.'
string='Notify Reviewers on Creation'
review_type
Selection
default='individual'
selection=[('individual', 'Specific user'), ('group', 'Any user in a specific group'), ('field', 'Field in related record')]
string='Validated by'
reviewer_field_id
Many2one → ir.model.fields
comodel_name='ir.model.fields'
domain="[('id', 'in', valid_reviewer_field_ids)]"
string='Reviewer field'
reviewer_group_id
Many2one → res.groups
comodel_name='res.groups'
string='Reviewer group'
reviewer_id
Many2one → res.users
comodel_name='res.users'
string='Reviewer'
sequence
Integer
default=30
valid_reviewer_field_ids
One2many → ir.model.fields
comodel_name='ir.model.fields'
compute='_compute_domain_reviewer_field'
onchange_model_id(self)
onchange_review_type(self)
approve_sequence
Boolean
readonly=True
related='definition_id.approve_sequence'
can_review
Boolean
compute='_compute_can_review'
help='Can review will be marked if the review is pending and the\n approve sequence has been achieved'
store=True
comment
Char
string='Comments'
definition_id
Many2one → tier.definition
comodel_name='tier.definition'
done_by
Many2one → res.users
comodel_name='res.users'
has_comment
Boolean
readonly=True
related='definition_id.has_comment'
model
Char
index=True
string='Related Document Model'
name
Char
readonly=True
related='definition_id.name'
requested_by
Many2one → res.users
comodel_name='res.users'
res_id
Integer
index=True
string='Related Document ID'
review_type
Selection
readonly=True
related='definition_id.review_type'
reviewed_date
Datetime
string='Validation Date'
reviewer_field_id
Many2one
readonly=True
related='definition_id.reviewer_field_id'
reviewer_group_id
Many2one
readonly=True
related='definition_id.reviewer_group_id'
reviewer_id
Many2one
readonly=True
related='definition_id.reviewer_id'
reviewer_ids
Many2many → res.users
comodel_name='res.users'
compute='_compute_reviewer_ids'
store=True
string='Reviewers'
sequence
Integer
string='Tier'
status
Selection
default='pending'
selection=[('pending', 'Pending'), ('rejected', 'Rejected'), ('approved', 'Approved')]
todo_by
Char
compute='_compute_todo_by'
compute_sudo=True
store=True
No public methods.
can_review
Boolean
compute='_compute_can_review'
search='_search_can_review'
has_comment
Boolean
compute='_compute_has_comment'
need_validation
Boolean
compute='_compute_need_validation'
rejected
Boolean
compute='_compute_validated_rejected'
search='_search_rejected'
review_ids
One2many → tier.review
auto_join=True
comodel_name='tier.review'
domain=<expr>
inverse_name='res_id'
string='Validations'
reviewer_ids
Many2many → res.users
comodel_name='res.users'
compute='_compute_reviewer_ids'
search='_search_reviewer_ids'
string='Reviewers'
validated
Boolean
compute='_compute_validated_rejected'
search='_search_validated'
evaluate_tier(self, tier)
reject_tier(self)
request_validation(self)
restart_validation(self)
unlink(self)
validate_tier(self)
write(self, vals)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/server-ux |
| GIT | |
| GIT | https://github.com/OCA/server-ux.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/server-ux/tree/11.0/base_tier_validation |
| VERSION | |
| VERSION | 3.1.1 |
| CATEGORY | |
| CATEGORY | Tools |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Eficent |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Eficent |
| COMMITTERS | |
| COMMITTERS | GitHub, Enric Tobella, Lois Rilo, Jordi Ballester Alomar, OCA Transbot, oca-travis, OCA-git-bot, Adrià Gil Sorribes, hveficent |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/server-ux |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:24:00 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - web - base - bus |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
assets_backend |
mail assets | ir.ui.view | qweb | Inherits web.assets_backend |
tier_definition_view_form |
tier.definition.form | tier.definition | form | New |
tier_definition_view_search |
tier.definition.search | tier.definition | search | New |
tier_definition_view_tree |
tier.definition.tree | tier.definition | tree | New |
tier_review_view_tree |
tier.review.tree | tier.review | tree | New |
review_ids
Many2many → tier.review
comodel_name='tier.review'
string='Reviews'
get_reviews(self, data)
review_user_count(self)
active
Boolean
default=True
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
definition_domain
Char
definition_type
Selection
default='domain'
selection=[('domain', 'Domain')]
string='Definition'
model
Char
index=True
related='model_id.model'
store=True
model_id
Many2one → ir.model
comodel_name='ir.model'
string='Referenced Model'
name
Char
default=_get_default_name
required=True
string='Description'
translate=True
notify_on_create
Boolean
help='If set, all possible reviewers will be notified by email when this definition is triggered.'
string='Notify Reviewers on Creation'
review_type
Selection
default='individual'
selection=[('individual', 'Specific user'), ('group', 'Any user in a specific group.')]
string='Validated by'
reviewer_group_id
Many2one → res.groups
comodel_name='res.groups'
string='Reviewer group'
reviewer_id
Many2one → res.users
comodel_name='res.users'
string='Reviewer'
sequence
Integer
default=30
onchange_model_id(self)
onchange_review_type(self)
definition_id
Many2one → tier.definition
comodel_name='tier.definition'
done_by
Many2one → res.users
comodel_name='res.users'
model
Char
index=True
string='Related Document Model'
name
Char
readonly=True
related='definition_id.name'
requested_by
Many2one → res.users
comodel_name='res.users'
res_id
Integer
index=True
string='Related Document ID'
review_type
Selection
readonly=True
related='definition_id.review_type'
reviewed_date
Datetime
string='Validation Date'
reviewer_group_id
Many2one
readonly=True
related='definition_id.reviewer_group_id'
reviewer_id
Many2one
readonly=True
related='definition_id.reviewer_id'
reviewer_ids
Many2many → res.users
comodel_name='res.users'
compute='_compute_reviewer_ids'
store=True
string='Reviewers'
sequence
Integer
string='Tier'
status
Selection
default='pending'
selection=[('pending', 'Pending'), ('rejected', 'Rejected'), ('approved', 'Approved')]
No public methods.
can_review
Boolean
compute='_compute_can_review'
need_validation
Boolean
compute='_compute_need_validation'
rejected
Boolean
compute='_compute_validated_rejected'
review_ids
One2many → tier.review
auto_join=True
comodel_name='tier.review'
domain=<expr>
inverse_name='res_id'
string='Validations'
review_ids_dropdown
One2many
help='Field needed to display the dropdown menu correctly'
related='review_ids'
reviewer_ids
Many2many → res.users
comodel_name='res.users'
compute='_compute_reviewer_ids'
search='_search_reviewer_ids'
string='Reviewers'
validated
Boolean
compute='_compute_validated_rejected'
search='_search_validated'
evaluate_tier(self, tier)
reject_tier(self)
request_validation(self)
restart_validation(self)
validate_tier(self)
write(self, vals)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/server-tools |
| GIT | |
| GIT | https://github.com/OCA/server-tools.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/server-tools/tree/10.0/base_tier_validation |
| VERSION | |
| VERSION | 1.0.1 |
| CATEGORY | |
| CATEGORY | Tools |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Eficent |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Eficent |
| COMMITTERS | |
| COMMITTERS | GitHub, mreficent, Lois Rilo, OCA Transbot, oca-travis, OCA-git-bot |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/server-tools |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:19:59 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
tier_definition_view_form |
tier.definition.form | tier.definition | form | New |
tier_definition_view_tree |
tier.definition.tree | tier.definition | tree | New |
tier_review_view_tree |
tier.review.tree | tier.review | tree | New |
active
Boolean
default=True
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
model
Char
index=True
related='model_id.model'
store=True
model_id
Many2one → ir.model
comodel_name='ir.model'
string='Referenced Model'
python_code
Text
default='# Available locals:\n# - rec: current record'
help='Write Python code that defines when this tier confirmation will be needed. The result of executing the expresion must be a boolean.'
string='Tier Definition Expression'
review_type
Selection
default='individual'
selection=[('individual', 'Specific user'), ('group', 'Any user in a specific group.')]
string='Validated by'
reviewer_group_id
Many2one → res.groups
comodel_name='res.groups'
string='Reviewer group'
reviewer_id
Many2one → res.users
comodel_name='res.users'
string='Reviewer'
sequence
Integer
default=30
onchange_model_id(self)
definition_id
Many2one → tier.definition
comodel_name='tier.definition'
model
Char
index=True
string='Related Document Model'
res_id
Integer
index=True
string='Related Document ID'
review_type
Selection
readonly=True
related='definition_id.review_type'
reviewer_group_id
Many2one
readonly=True
related='definition_id.reviewer_group_id'
reviewer_id
Many2one
readonly=True
related='definition_id.reviewer_id'
reviewer_ids
Many2many → res.users
comodel_name='res.users'
compute='_compute_reviewer_ids'
store=True
string='Reviewers'
sequence
Integer
string='Tier'
status
Selection
default='pending'
selection=[('pending', 'Pending'), ('rejected', 'Rejected'), ('approved', 'Approved')]
No public methods.
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/server-tools |
| GIT | |
| GIT | https://github.com/OCA/server-tools.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/server-tools/tree/9.0/base_tier_validation |
| VERSION | |
| VERSION | 1.0.2 |
| CATEGORY | |
| CATEGORY | Tools |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo Community Association (OCA), Eficent |
| MAINTAINERS | |
| MAINTAINERS | Odoo Community Association (OCA), Eficent |
| COMMITTERS | |
| COMMITTERS | mreficent, Lois Rilo, oca-travis, OCA-git-bot |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/server-tools |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:15:22 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
tier_definition_view_form |
tier.definition.form | tier.definition | form | New |
tier_definition_view_tree |
tier.definition.tree | tier.definition | tree | New |
tier_review_view_tree |
tier.review.tree | tier.review | tree | New |
active
Boolean
default=True
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
model
Char
index=True
related='model_id.model'
store=True
model_id
Many2one → ir.model
comodel_name='ir.model'
string='Referenced Model'
python_code
Text
default='# Available locals:\n# - rec: current record'
help='Write Python code that defines when this tier confirmation will be needed. The result of executing the expresion must be a boolean.'
string='Tier Definition Expression'
review_type
Selection
default='individual'
selection=[('individual', 'Specific user'), ('group', 'Any user in a specific group.')]
string='Validated by'
reviewer_group_id
Many2one → res.groups
comodel_name='res.groups'
string='Reviewer group'
reviewer_id
Many2one → res.users
comodel_name='res.users'
string='Reviewer'
sequence
Integer
default=30
onchange_model_id(self)
definition_id
Many2one → tier.definition
comodel_name='tier.definition'
model
Char
index=True
string='Related Document Model'
res_id
Integer
index=True
string='Related Document ID'
review_type
Selection
readonly=True
related='definition_id.review_type'
reviewer_group_id
Many2one
readonly=True
related='definition_id.reviewer_group_id'
reviewer_id
Many2one
readonly=True
related='definition_id.reviewer_id'
reviewer_ids
Many2many → res.users
comodel_name='res.users'
compute='_compute_reviewer_ids'
store=True
string='Reviewers'
sequence
Integer
string='Tier'
status
Selection
default='pending'
selection=[('pending', 'Pending'), ('rejected', 'Rejected'), ('approved', 'Approved')]
No public methods.