Base Tier Validation

base_tier_validation
REPOSITORY
REPOSITORYOCA/tier-validation
GIT
GIThttps://github.com/OCA/tier-validation.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/tier-validation/tree/19.0/base_tier_validation
VERSION
VERSION 1.0.3
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, Maksym Yankin, bosd
WEBSITE
WEBSITEhttps://github.com/OCA/tier-validation
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:40:46
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - 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`.

Code Analysis

Views touched (11)
XML IDNameModelTypeStatus
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
Models touched (6)

New fields (5)
  • comment Char
    required=True
  • res_id Integer
  • res_model Char
  • review_ids Many2many → tier.review
    comodel_name='tier.review'
  • validate_reject Char
Public methods (1)
  • add_comment(self)

New fields (1)
  • review_ids Many2many → tier.review
    comodel_name='tier.review' copy=False string='Reviews'
Public methods (1)
  • review_user_count(self)
    @api.model

New fields (23)
  • 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'
Public methods (1)
  • onchange_review_type(self)
    @api.onchange('review_type')

New fields (24)
  • 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
Public methods (0)

No public methods.

New fields (11)
  • 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
Public methods (8)
  • evaluate_tier(self, tier)
  • get_view(self, view_id=None, view_type='form', **options)
    @api.model
  • reject_tier(self)
  • request_validation(self)
  • restart_validation(self)
  • unlink(self)
  • validate_tier(self)
  • write(self, vals)

New fields (9)
  • 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'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/server-ux
GIT
GIThttps://github.com/OCA/server-ux.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-ux/tree/18.0/base_tier_validation
VERSION
VERSION 3.4.0
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow
COMMITTERS
COMMITTERSStefan 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
WEBSITEhttps://github.com/OCA/server-ux
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:16
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - 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`.

Code Analysis

Views touched (12)
XML IDNameModelTypeStatus
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
Models touched (7)

New fields (5)
  • comment Char
    required=True
  • res_id Integer
  • res_model Char
  • review_ids Many2many → tier.review
    comodel_name='tier.review'
  • validate_reject Char
Public methods (1)
  • add_comment(self)

New fields (1)
  • module_base_tier_validation_formula Boolean
    string='Tier Formula'
Public methods (0)

No public methods.

New fields (1)
  • review_ids Many2many → tier.review
    comodel_name='tier.review' copy=False string='Reviews'
Public methods (1)
  • review_user_count(self)
    @api.model

New fields (23)
  • 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'
Public methods (1)
  • onchange_review_type(self)
    @api.onchange('review_type')

New fields (24)
  • 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
Public methods (0)

No public methods.

New fields (13)
  • 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
Public methods (8)
  • evaluate_tier(self, tier)
  • get_view(self, view_id=None, view_type='form', **options)
    @api.model
  • reject_tier(self)
  • request_validation(self)
  • restart_validation(self)
  • unlink(self)
  • validate_tier(self)
  • write(self, vals)

New fields (9)
  • 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'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/server-ux
GIT
GIThttps://github.com/OCA/server-ux.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-ux/tree/17.0/base_tier_validation
VERSION
VERSION 4.1.0
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow
COMMITTERS
COMMITTERSStefan 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
WEBSITEhttps://github.com/OCA/server-ux
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:08
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - 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`.

Code Analysis

Views touched (12)
XML IDNameModelTypeStatus
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
Models touched (8)

New fields (0)

No new fields.

Public methods (1)
  • get_tier_review_action(self)
    @api.model
    To be overridden for custom per-model action customization e.g. in `account.move` model class: @api.model def get_tier_review_action(self) action = self.env["ir.actions.actions"]._for_xml_id( "account.action_move_journal_line" ) return action

New fields (5)
  • comment Char
    required=True
  • res_id Integer
  • res_model Char
  • review_ids Many2many → tier.review
    comodel_name='tier.review'
  • validate_reject Char
Public methods (1)
  • add_comment(self)

New fields (1)
  • module_base_tier_validation_formula Boolean
    string='Tier Formula'
Public methods (0)

No public methods.

New fields (1)
  • review_ids Many2many → tier.review
    comodel_name='tier.review' string='Reviews'
Public methods (1)
  • review_user_count(self)
    @api.model

New fields (23)
  • 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'
Public methods (1)
  • onchange_review_type(self)
    @api.onchange('review_type')

New fields (24)
  • 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
Public methods (0)

No public methods.

New fields (13)
  • 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
Public methods (8)
  • evaluate_tier(self, tier)
  • get_view(self, view_id=None, view_type='form', **options)
    @api.model
  • reject_tier(self)
  • request_validation(self)
  • restart_validation(self)
  • unlink(self)
  • validate_tier(self)
  • write(self, vals)

New fields (9)
  • 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'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/server-ux
GIT
GIThttps://github.com/OCA/server-ux.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-ux/tree/16.0/base_tier_validation
VERSION
VERSION 4.0.2
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow
COMMITTERS
COMMITTERSHolger 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
WEBSITEhttps://github.com/OCA/server-ux
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:53
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (12)
XML IDNameModelTypeStatus
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
Models touched (7)

New fields (5)
  • comment Char
    required=True
  • res_id Integer
  • res_model Char
  • review_ids Many2many → tier.review
    comodel_name='tier.review'
  • validate_reject Char
Public methods (1)
  • add_comment(self)

New fields (2)
  • module_base_tier_validation_formula Boolean
    string='Tier Formula'
  • module_base_tier_validation_forward Boolean
    args: 'Tier Forward & Backward'
Public methods (0)

No public methods.

New fields (1)
  • review_ids Many2many → tier.review
    comodel_name='tier.review' string='Reviews'
Public methods (2)
  • get_reviews(self, data)
    @api.model
  • review_user_count(self)
    @api.model

New fields (21)
  • 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'
Public methods (1)
  • onchange_review_type(self)
    @api.onchange('review_type')

New fields (24)
  • 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
Public methods (0)

No public methods.

New fields (13)
  • 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
Public methods (9)
  • evaluate_tier(self, tier)
  • get_view(self, view_id=None, view_type='form', **options)
    @api.model
  • reevaluate_reviews(self)
  • reject_tier(self)
  • request_validation(self)
  • restart_validation(self)
  • unlink(self)
  • validate_tier(self)
  • write(self, vals)

New fields (9)
  • 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'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/server-ux
GIT
GIThttps://github.com/OCA/server-ux.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-ux/tree/15.0/base_tier_validation
VERSION
VERSION 1.6.0
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow
COMMITTERS
COMMITTERSLois 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
WEBSITEhttps://github.com/OCA/server-ux
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:39
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (9)
XML IDNameModelTypeStatus
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
Models touched (6)

New fields (5)
  • comment Char
    required=True
  • res_id Integer
  • res_model Char
  • review_ids Many2many → tier.review
    comodel_name='tier.review'
  • validate_reject Char
Public methods (1)
  • add_comment(self)

New fields (4)
  • module_base_tier_validation_formula Boolean
    string='Tier Formula'
  • module_base_tier_validation_forward Boolean
    args: 'Tier Forward & Backward'
  • module_base_tier_validation_report Boolean
    args: 'Tier Reports'
  • module_base_tier_validation_server_action Boolean
    args: 'Tier Server Action'
Public methods (0)

No public methods.

New fields (1)
  • review_ids Many2many → tier.review
    comodel_name='tier.review' string='Reviews'
Public methods (2)
  • get_reviews(self, data)
    @api.model
  • review_user_count(self)
    @api.model

New fields (18)
  • 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'
Public methods (1)
  • onchange_review_type(self)
    @api.onchange('review_type')

New fields (22)
  • 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
Public methods (0)

No public methods.

New fields (12)
  • 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')]
Public methods (8)
  • evaluate_tier(self, tier)
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • reject_tier(self)
  • request_validation(self)
  • restart_validation(self)
  • unlink(self)
  • validate_tier(self)
  • write(self, vals)
REPOSITORY
REPOSITORYOCA/server-ux
GIT
GIThttps://github.com/OCA/server-ux.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-ux/tree/14.0/base_tier_validation
VERSION
VERSION 4.1.1
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow
COMMITTERS
COMMITTERSmreficent, 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
WEBSITEhttps://github.com/OCA/server-ux
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:07
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (10)
XML IDNameModelTypeStatus
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
Models touched (6)

New fields (5)
  • comment Char
    required=True
  • res_id Integer
  • res_model Char
  • review_ids Many2many → tier.review
    comodel_name='tier.review'
  • validate_reject Char
Public methods (1)
  • add_comment(self)

New fields (4)
  • module_base_tier_validation_formula Boolean
    string='Tier Formula'
  • module_base_tier_validation_forward Boolean
    args: 'Tier Forward & Backward'
  • module_base_tier_validation_report Boolean
    args: 'Tier Reports'
  • module_base_tier_validation_server_action Boolean
    args: 'Tier Server Action'
Public methods (0)

No public methods.

New fields (1)
  • review_ids Many2many → tier.review
    comodel_name='tier.review' string='Reviews'
Public methods (2)
  • get_reviews(self, data)
    @api.model
  • review_user_count(self)
    @api.model

New fields (19)
  • 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'
Public methods (1)
  • onchange_review_type(self)
    @api.onchange('review_type')

New fields (23)
  • 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
Public methods (0)

No public methods.

New fields (13)
  • 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')]
Public methods (8)
  • evaluate_tier(self, tier)
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • reject_tier(self)
  • request_validation(self)
  • restart_validation(self)
  • unlink(self)
  • validate_tier(self)
  • write(self, vals)
REPOSITORY
REPOSITORYOCA/server-ux
GIT
GIThttps://github.com/OCA/server-ux.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-ux/tree/13.0/base_tier_validation
VERSION
VERSION 1.9.2
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), ForgeFlow
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), ForgeFlow
COMMITTERS
COMMITTERSPedro 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
WEBSITEhttps://github.com/OCA/server-ux
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:17
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (9)
XML IDNameModelTypeStatus
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
Models touched (5)

New fields (5)
  • comment Char
    required=True
  • res_id Integer
  • res_model Char
  • review_ids Many2many → tier.review
    comodel_name='tier.review'
  • validate_reject Char
Public methods (1)
  • add_comment(self)

New fields (1)
  • review_ids Many2many → tier.review
    comodel_name='tier.review' string='Reviews'
Public methods (2)
  • get_reviews(self, data)
    @api.model
  • review_user_count(self)
    @api.model

New fields (16)
  • 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'
Public methods (1)
  • onchange_review_type(self)
    @api.onchange('review_type')

New fields (20)
  • 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
Public methods (0)

No public methods.

New fields (11)
  • 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'
Public methods (8)
  • evaluate_tier(self, tier)
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • reject_tier(self)
  • request_validation(self)
  • restart_validation(self)
  • unlink(self)
  • validate_tier(self)
  • write(self, vals)
REPOSITORY
REPOSITORYOCA/server-ux
GIT
GIThttps://github.com/OCA/server-ux.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-ux/tree/12.0/base_tier_validation
VERSION
VERSION 3.9.3
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Eficent
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Eficent
COMMITTERS
COMMITTERSGitHub, 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
WEBSITEhttps://github.com/OCA/server-ux
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:22
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - mail
    - base
    - base_setup
    - web
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
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
Models touched (5)

New fields (5)
  • comment Char
    required=True
  • res_id Integer
  • res_model Char
  • review_ids Many2many → tier.review
    comodel_name='tier.review'
  • validate_reject Char
Public methods (1)
  • add_comment(self)
    @api.multi

New fields (1)
  • review_ids Many2many → tier.review
    comodel_name='tier.review' string='Reviews'
Public methods (2)
  • get_reviews(self, data)
    @api.model
  • review_user_count(self)
    @api.model

New fields (16)
  • 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'
Public methods (2)
  • onchange_model_id(self)
    @api.onchange('model_id')
  • onchange_review_type(self)
    @api.onchange('review_type')

New fields (19)
  • 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
Public methods (0)

No public methods.

New fields (7)
  • 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'
Public methods (7)
  • evaluate_tier(self, tier)
    @api.multi
  • reject_tier(self)
    @api.multi
  • request_validation(self)
    @api.multi
  • restart_validation(self)
    @api.multi
  • unlink(self)
  • validate_tier(self)
    @api.multi
  • write(self, vals)
    @api.multi
REPOSITORY
REPOSITORYOCA/server-ux
GIT
GIThttps://github.com/OCA/server-ux.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-ux/tree/11.0/base_tier_validation
VERSION
VERSION 3.1.1
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Eficent
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Eficent
COMMITTERS
COMMITTERSGitHub, Enric Tobella, Lois Rilo, Jordi Ballester Alomar, OCA Transbot, oca-travis, OCA-git-bot, Adrià Gil Sorribes, hveficent
WEBSITE
WEBSITEhttps://github.com/OCA/server-ux
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-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

Code Analysis

Views touched (5)
XML IDNameModelTypeStatus
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
Models touched (4)

New fields (1)
  • review_ids Many2many → tier.review
    comodel_name='tier.review' string='Reviews'
Public methods (2)
  • get_reviews(self, data)
    @api.model
  • review_user_count(self)
    @api.model

New fields (12)
  • 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
Public methods (2)
  • onchange_model_id(self)
    @api.onchange('model_id')
  • onchange_review_type(self)
    @api.onchange('review_type')

New fields (13)
  • 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')]
Public methods (0)

No public methods.

New fields (7)
  • 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'
Public methods (6)
  • evaluate_tier(self, tier)
    @api.multi
  • reject_tier(self)
    @api.multi
  • request_validation(self)
    @api.multi
  • restart_validation(self)
    @api.multi
  • validate_tier(self)
    @api.multi
  • write(self, vals)
    @api.multi
REPOSITORY
REPOSITORYOCA/server-tools
GIT
GIThttps://github.com/OCA/server-tools.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-tools/tree/10.0/base_tier_validation
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Eficent
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Eficent
COMMITTERS
COMMITTERSGitHub, mreficent, Lois Rilo, OCA Transbot, oca-travis, OCA-git-bot
WEBSITE
WEBSITEhttps://github.com/OCA/server-tools
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-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

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
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
Models touched (2)

New fields (9)
  • 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
Public methods (1)
  • onchange_model_id(self)
    @api.onchange('model_id')

New fields (9)
  • 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')]
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/server-tools
GIT
GIThttps://github.com/OCA/server-tools.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-tools/tree/9.0/base_tier_validation
VERSION
VERSION 1.0.2
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Eficent
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Eficent
COMMITTERS
COMMITTERSmreficent, Lois Rilo, oca-travis, OCA-git-bot
WEBSITE
WEBSITEhttps://github.com/OCA/server-tools
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-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

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
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
Models touched (2)

New fields (9)
  • 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
Public methods (1)
  • onchange_model_id(self)
    @api.onchange('model_id')

New fields (9)
  • 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')]
Public methods (0)

No public methods.