| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/19.0/gamification |
| VERSION | |
| VERSION | 1.0 |
| CATEGORY | |
| CATEGORY | Human Resources |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Odoo S.A. |
| MAINTAINERS | |
| MAINTAINERS | Odoo S.A. |
| COMMITTERS | |
| COMMITTERS | Raphael Collet, Odoo Translation Bot, Thibault Delavallée, Xavier Morel, Yannick Tivisse, Julien Castiaux, Sébastien Theys, Achraf (abz), Tiffany Chang (tic), Gorash, alsh-odoo, Victor Piryns (pivi), Dylan Kiss (dyki), omra-odoo, Serge Bayet (seba), Martin Trigaux (mat), mano-odoo, aamo-odoo, sben-odoo, Anton Romanova (roan), Krzysztof Magusiak (krma), defl, Giorgio Tocco (gito), Jérôme Belpaire, saurabh, chpa-odoo, panj-odoo |
| WEBSITE | |
| WEBSITE | |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 01:51:43 |
| 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 | Gamification process ==================== The Gamification module provides ways to evaluate and motivate the users of Odoo. The users can be evaluated using goals and numerical objectives to reach. **Goals** are assigned through **challenges** to evaluate and compare members of a team with each others and through time. For non-numerical achievements, **badges** can be granted to users. From a simple "thank you" to an exceptional achievement, a badge is an easy way to exprimate gratitude to a user for their good work. Both goals and badges are flexibles and can be adapted to a large range of modules and actions. When installed, this module creates easy goals to help new users to discover Odoo and configure their user profile. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
badge_form_view |
Badge Form | gamification.badge | form | New |
badge_kanban_view |
Badge Kanban View | gamification.badge | kanban | New |
badge_list_view |
Badge List | gamification.badge | list | New |
badge_user_kanban_view |
Badge User Kanban View | gamification.badge.user | kanban | New |
challenge_form_view |
Challenge Form | gamification.challenge | form | New |
challenge_line_list_view |
Challenge line list | gamification.challenge.line | list | New |
challenge_list_view |
Challenges List | gamification.challenge | list | New |
challenge_search_view |
Challenge Search | gamification.challenge | search | New |
gamification_badge_view_search |
gamification.badge.view.search | gamification.badge | search | New |
gamification_karma_rank_view_form |
gamification.karma.rank.view.form | gamification.karma.rank | form | New |
gamification_karma_ranks_view_search |
gamification.karma.ranks.view.search | gamification.karma.rank | search | New |
gamification_karma_ranks_view_tree |
gamification.karma.ranks.view.list | gamification.karma.rank | list | New |
gamification_karma_tracking_view_form |
gamification.karma.tracking.view.form | gamification.karma.tracking | form | New |
gamification_karma_tracking_view_search |
gamification.karma.tracking.view.search | gamification.karma.tracking | search | New |
gamification_karma_tracking_view_tree |
gamification.karma.tracking.view.list | gamification.karma.tracking | list | New |
goal_definition_form_view |
Goal Definitions Form | gamification.goal.definition | form | New |
goal_definition_list_view |
Goal Definitions List | gamification.goal.definition | list | New |
goal_definition_search_view |
Goal Definition Search | gamification.goal.definition | search | New |
goal_form_view |
Goal Form | gamification.goal | form | New |
goal_kanban_view |
Goal Kanban View | gamification.goal | kanban | New |
goal_list_view |
Goal List | gamification.goal | list | New |
goal_search_view |
Goal Search | gamification.goal | search | New |
res_users_view_form |
res.users.view.form.inherit.gamification | res.users | xpath | Inherits base.view_users_form |
view_badge_wizard_grant |
Grant Badge User Form | gamification.badge.user.wizard | form | New |
view_challenge_kanban |
Challenge Kanban | gamification.challenge | kanban | New |
view_goal_wizard_update_current |
Update the current value of the Goal | gamification.goal.wizard | form | New |
active
Boolean
default=True
args: 'Active'
challenge_ids
One2many → gamification.challenge
string='Reward of Challenges'
args: 'gamification.challenge', 'reward_id'
description
Html
sanitize_attributes=False
translate=True
args: 'Description'
goal_definition_ids
Many2many → gamification.goal.definition
help='The users that have succeeded these goals will receive automatically the badge.'
string='Rewarded by'
args: 'gamification.goal.definition', 'badge_unlocked_definition_rel'
granted_count
Integer
compute='_get_owners_info'
help='The number of time this badge has been received.'
args: 'Total'
granted_users_count
Integer
compute='_get_owners_info'
help='The number of time this badge has been received by unique users.'
args: 'Number of users'
level
Selection
default='bronze'
string='Forum Badge Level'
args: [('bronze', 'Bronze'), ('silver', 'Silver'), ('gold', 'Gold')]
name
Char
required=True
translate=True
args: 'Badge'
owner_ids
One2many → gamification.badge.user
help='The list of instances of this badge granted to users'
string='Owners'
args: 'gamification.badge.user', 'badge_id'
remaining_sending
Integer
compute='_remaining_sending_calc'
help='If a maximum is set'
args: 'Remaining Sending Allowed'
rule_auth
Selection
default='everyone'
help='Who can grant this badge'
required=True
string='Allowance to Grant'
args: [('everyone', 'Everyone'), ('users', 'A selected list of users'), ('having', 'People having some badges'), ('nobody', 'No one, assigned through challenges')]
rule_auth_badge_ids
Many2many → gamification.badge
help='Only the people having these badges can give this badge'
string='Required Badges'
args: 'gamification.badge', 'gamification_badge_rule_badge_rel', 'badge1_id', 'badge2_id'
rule_auth_user_ids
Many2many → res.users
help='Only these people can give this badge'
string='Authorized Users'
args: 'res.users', 'rel_badge_auth_users'
rule_max
Boolean
help='Check to set a monthly limit per person of sending this badge'
args: 'Monthly Limited Sending'
rule_max_number
Integer
help='The maximum number of time this badge can be sent per month per person.'
args: 'Limitation Number'
stat_my
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has received this badge.'
args: 'My Total'
stat_my_monthly_sending
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has sent this badge this month.'
args: 'My Monthly Sending Total'
stat_my_this_month
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has received this badge this month.'
args: 'My Monthly Total'
stat_this_month
Integer
compute='_get_badge_user_stats'
help='The number of time this badge has been received this month.'
args: 'Monthly total'
unique_owner_ids
Many2many → res.users
compute='_get_owners_info'
help='The list of unique users having received this badge.'
string='Unique Owners'
args: 'res.users'
check_granting(self)
badge_id
Many2one → gamification.badge
index=True
ondelete='cascade'
required=True
string='Badge'
args: 'gamification.badge'
badge_name
Char
readonly=False
related='badge_id.name'
string='Badge Name'
challenge_id
Many2one → gamification.challenge
string='Challenge'
args: 'gamification.challenge'
comment
Text
level
Selection
readonly=True
related='badge_id.level'
store=True
string='Badge Level'
sender_id
Many2one → res.users
string='Sender'
args: 'res.users'
user_id
Many2one → res.users
index=True
ondelete='cascade'
required=True
string='User'
args: 'res.users'
user_partner_id
Many2one → res.partner
related='user_id.partner_id'
args: 'res.partner'
create(self, vals_list)
badge_id
Many2one → gamification.badge
required=True
string='Badge'
args: 'gamification.badge'
comment
Text
user_id
Many2one → res.users
required=True
string='User'
args: 'res.users'
action_grant_badge(self)
challenge_category
Selection
default='hr'
help='Define the visibility of the challenge through menus'
required=True
string='Appears in'
args: [('hr', 'Human Resources / Engagement'), ('other', 'Settings / Gamification Tools')]
description
Text
translate=True
args: 'Description'
end_date
Date
help='The day a new challenge will be automatically closed. If no periodicity is set, will use this date as the goal end date.'
args: 'End Date'
invited_user_ids
Many2many → res.users
string='Suggest to users'
args: 'res.users', 'gamification_invited_user_ids_rel'
last_report_date
Date
default=fields.Date.today
args: 'Last Report Date'
line_ids
One2many → gamification.challenge.line
copy=True
help='List of goals that will be set'
required=True
string='Lines'
args: 'gamification.challenge.line', 'challenge_id'
manager_id
Many2one → res.users
default=<expr>
string='Responsible'
args: 'res.users'
name
Char
required=True
translate=True
args: 'Challenge Name'
next_report_date
Date
compute='_get_next_report_date'
store=True
args: 'Next Report Date'
period
Selection
default='once'
help='Period of automatic goal assignment. If none is selected, should be launched manually.'
required=True
string='Periodicity'
args: [('once', 'Non recurring'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('yearly', 'Yearly')]
remind_update_delay
Integer
help='Never reminded if no value or zero is specified.'
args: 'Non-updated manual goals will be reminded after'
report_message_frequency
Selection
default='never'
required=True
string='Report Frequency'
args: [('never', 'Never'), ('onchange', 'On change'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('yearly', 'Yearly')]
report_message_group_id
Many2one → discuss.channel
help='Group that will receive a copy of the report in addition to the user'
string='Send a copy to'
args: 'discuss.channel'
report_template_id
Many2one → mail.template
default=<expr>
required=True
string='Report Template'
args: 'mail.template'
reward_failure
Boolean
reward_first_id
Many2one → gamification.badge
string='For 1st user'
args: 'gamification.badge'
reward_id
Many2one → gamification.badge
index='btree_not_null'
string='For Every Succeeding User'
args: 'gamification.badge'
reward_realtime
Boolean
default=True
help='With this option enabled, a user can receive a badge only once. The top 3 badges are still rewarded only at the end of the challenge.'
args: 'Reward as soon as every goal is reached'
reward_second_id
Many2one → gamification.badge
string='For 2nd user'
args: 'gamification.badge'
reward_third_id
Many2one → gamification.badge
string='For 3rd user'
args: 'gamification.badge'
start_date
Date
help='The day a new challenge will be automatically started. If no periodicity is set, will use this date as the goal start date.'
args: 'Start Date'
state
Selection
copy=False
default='draft'
required=True
string='State'
tracking=True
args: [('draft', 'Draft'), ('inprogress', 'In Progress'), ('done', 'Done')]
user_count
Integer
compute='_compute_user_count'
args: '# Users'
user_domain
Char
user_ids
Many2many → res.users
string='Participants'
args: 'res.users', 'gamification_challenge_users_rel'
visibility_mode
Selection
default='personal'
required=True
string='Display Mode'
args: [('personal', 'Individual Goals'), ('ranking', 'Leader Board (Group Ranking)')]
accept_challenge(self)
action_check(self)
action_report_progress(self)
action_start(self)
action_view_users(self)
create(self, vals_list)
default_get(self, fields)
discard_challenge(self)
report_progress(self, users=(), subset_goals=False)
write(self, vals)
challenge_id
Many2one → gamification.challenge
index=True
ondelete='cascade'
required=True
string='Challenge'
args: 'gamification.challenge'
condition
Selection
readonly=True
related='definition_id.condition'
string='Condition'
definition_full_suffix
Char
readonly=True
related='definition_id.full_suffix'
args: 'Suffix'
definition_id
Many2one → gamification.goal.definition
ondelete='cascade'
required=True
string='Goal Definition'
args: 'gamification.goal.definition'
definition_monetary
Boolean
readonly=True
related='definition_id.monetary'
args: 'Monetary'
definition_suffix
Char
readonly=True
related='definition_id.suffix'
args: 'Unit'
name
Char
readonly=False
related='definition_id.name'
args: 'Name'
sequence
Integer
default=1
args: 'Sequence'
target_goal
Float
required=True
args: 'Target Value to Reach'
No public methods.
challenge_id
Many2one
help='Challenge that generated the goal, assign challenge to users to generate goals with a value in this field.'
index=True
readonly=True
related='line_id.challenge_id'
store=True
closed
Boolean
color
Integer
compute='_compute_color'
args: 'Color Index'
completeness
Float
compute='_get_completion'
args: 'Completeness'
computation_mode
Selection
readonly=False
related='definition_id.computation_mode'
current
Float
default=0
required=True
args: 'Current Value'
definition_condition
Selection
readonly=True
related='definition_id.condition'
string='Definition Condition'
definition_description
Text
readonly=True
related='definition_id.description'
args: 'Definition Description'
definition_display
Selection
readonly=True
related='definition_id.display_mode'
string='Display Mode'
definition_id
Many2one → gamification.goal.definition
ondelete='cascade'
required=True
string='Goal Definition'
args: 'gamification.goal.definition'
definition_suffix
Char
readonly=True
related='definition_id.full_suffix'
args: 'Suffix'
end_date
Date
last_update
Date
help='In case of manual goal, reminders are sent if the goal as not been updated for a while (defined in challenge). Ignored in case of non-manual goal or goal not linked to a challenge.'
args: 'Last Update'
line_id
Many2one → gamification.challenge.line
ondelete='cascade'
string='Challenge Line'
args: 'gamification.challenge.line'
remind_update_delay
Integer
help='The number of days after which the user assigned to a manual goal will be reminded. Never reminded if no value is specified.'
args: 'Remind delay'
start_date
Date
default=fields.Date.today
args: 'Start Date'
state
Selection
default='draft'
required=True
string='State'
args: [('draft', 'Draft'), ('inprogress', 'In progress'), ('reached', 'Reached'), ('failed', 'Failed'), ('canceled', 'Cancelled')]
target_goal
Float
required=True
args: 'To Reach'
to_update
Boolean
user_id
Many2one → res.users
bypass_search_access=True
index=True
ondelete='cascade'
required=True
string='User'
args: 'res.users'
user_partner_id
Many2one → res.partner
related='user_id.partner_id'
args: 'res.partner'
action_cancel(self)
action_fail(self)
action_reach(self)
action_start(self)
create(self, vals_list)
get_action(self)
update_goal(self)
write(self, vals)
action_id
Many2one → ir.actions.act_window
help='The action that will be called to update the goal value.'
string='Action'
args: 'ir.actions.act_window'
batch_distinctive_field
Many2one → ir.model.fields
help='In batch mode, this indicates which field distinguishes one user from the other, e.g. user_id, partner_id...'
string='Distinctive field for batch user'
args: 'ir.model.fields'
batch_mode
Boolean
help='Evaluate the expression in batch instead of once for each user'
args: 'Batch Mode'
batch_user_expression
Char
help="The value to compare with the distinctive field. The expression can contain reference to 'user' which is a browse record of the current user, e.g. user.id, user.partner_id.id..."
args: 'Evaluated expression for batch mode'
computation_mode
Selection
default='manually'
help="Define how the goals will be computed. The result of the operation will be stored in the field 'Current'."
required=True
string='Computation Mode'
args: [('manually', 'Recorded manually'), ('count', 'Automatic: number of records'), ('sum', 'Automatic: sum on a field'), ('python', 'Automatic: execute a specific Python code')]
compute_code
Text
help="Python code to be executed for each user. 'result' should contains the new current value. Evaluated user can be access through object.user_id."
args: 'Python Code'
condition
Selection
default='higher'
help='A goal is considered as completed when the current value is compared to the value to reach'
required=True
string='Goal Performance'
args: [('higher', 'The higher the better'), ('lower', 'The lower the better')]
description
Text
display_mode
Selection
default='progress'
required=True
string='Displayed as'
args: [('progress', 'Progressive (using numerical values)'), ('boolean', 'Exclusive (done or not-done)')]
domain
Char
default='[]'
help="Domain for filtering records. General rule, not user depending, e.g. [('state', '=', 'done')]. The expression can contain reference to 'user' which is a browse record of the current user if not in batch mode."
required=True
args: 'Filter Domain'
field_date_id
Many2one → ir.model.fields
domain=<expr>
help='The date to use for the time period evaluated'
string='Date Field'
args: 'ir.model.fields'
field_id
Many2one → ir.model.fields
domain=<expr>
string='Field to Sum'
args: 'ir.model.fields'
full_suffix
Char
compute='_compute_full_suffix'
help='The currency and suffix field'
args: 'Full Suffix'
model_id
Many2one → ir.model
ondelete='cascade'
string='Model'
args: 'ir.model'
model_inherited_ids
Many2many → ir.model
related='model_id.inherited_model_ids'
args: 'ir.model'
monetary
Boolean
default=False
help='The target and current value are defined in the company currency.'
args: 'Monetary Value'
name
Char
required=True
translate=True
args: 'Goal Definition'
res_id_field
Char
help='The field name on the user profile (res.users) containing the value for res_id for action.'
args: 'ID Field of user'
suffix
Char
help='The unit of the target and current values'
translate=True
args: 'Suffix'
create(self, vals_list)
write(self, vals)
current
Float
goal_id
Many2one → gamification.goal
required=True
string='Goal'
args: 'gamification.goal'
action_update_current(self)
description
Html
sanitize_attributes=False
string='Description'
translate=html_translate
description_motivational
Html
help='Motivational phrase to reach this rank on your profile page'
sanitize_attributes=False
sanitize_overridable=True
string='Motivational'
translate=html_translate
karma_min
Integer
default=1
required=True
string='Required Karma'
name
Text
required=True
string='Rank Name'
translate=True
rank_users_count
Integer
compute='_compute_rank_users_count'
args: '# Users'
user_ids
One2many → res.users
string='Users'
args: 'res.users', 'rank_id'
create(self, vals_list)
write(self, vals)
consolidated
Boolean
gain
Integer
compute='_compute_gain'
readonly=False
args: 'Gain'
new_value
Integer
required=True
args: 'New Karma Value'
old_value
Integer
readonly=True
args: 'Old Karma Value'
origin_ref
Reference
default=<expr>
selection=<expr>
string='Source'
origin_ref_model_name
Selection
compute='_compute_origin_ref_model_name'
selection=<expr>
store=True
string='Source Type'
reason
Text
default=<expr>
string='Description'
tracking_date
Datetime
default=fields.Datetime.now
index=True
readonly=True
user_id
Many2one → res.users
index=True
ondelete='cascade'
required=True
args: 'res.users', 'User'
create(self, vals_list)
badge_ids
One2many → gamification.badge.user
copy=False
string='Badges'
args: 'gamification.badge.user', 'user_id'
bronze_badge
Integer
compute='_get_user_badge_level'
args: 'Bronze badges count'
gold_badge
Integer
compute='_get_user_badge_level'
args: 'Gold badges count'
karma
Integer
compute='_compute_karma'
readonly=False
store=True
args: 'Karma'
karma_tracking_ids
One2many → gamification.karma.tracking
groups='base.group_system'
string='Karma Changes'
args: 'gamification.karma.tracking', 'user_id'
next_rank_id
Many2one → gamification.karma.rank
rank_id
Many2one → gamification.karma.rank
index='btree_not_null'
args: 'gamification.karma.rank', 'Rank'
silver_badge
Integer
compute='_get_user_badge_level'
args: 'Silver badges count'
action_karma_report(self)
create(self, vals_list)
get_gamification_redirection_data(self)
write(self, vals)
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/18.0/gamification |
| VERSION | |
| VERSION | 1.0 |
| CATEGORY | |
| CATEGORY | Human Resources |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Raphael Collet, Odoo Translation Bot, Martin Trigaux, Xavier Morel, Aaron Bohy, qsm-odoo, Odoo Online, Aurélien Warnon, Brice bib Bartoletti, Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, Vincent Larcin, alsh-odoo, Gaetan Vanden Bergh (gavb), Louis Wicket (wil), Pierre-Yves Dufays, Dylan Kiss (dyki), Vivek Pathak, omra-odoo, Maryam Kia, Serge Bayet (seba), Louis (wil), mano-odoo, aamo-odoo, sben-odoo, kusi-odoo, Krzysztof Magusiak (krma), Jérôme Belpaire |
| WEBSITE | |
| WEBSITE | |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 01:25:56 |
| 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 | Gamification process ==================== The Gamification module provides ways to evaluate and motivate the users of Odoo. The users can be evaluated using goals and numerical objectives to reach. **Goals** are assigned through **challenges** to evaluate and compare members of a team with each others and through time. For non-numerical achievements, **badges** can be granted to users. From a simple "thank you" to an exceptional achievement, a badge is an easy way to exprimate gratitude to a user for their good work. Both goals and badges are flexibles and can be adapted to a large range of modules and actions. When installed, this module creates easy goals to help new users to discover Odoo and configure their user profile. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
badge_form_view |
Badge Form | gamification.badge | form | New |
badge_kanban_view |
Badge Kanban View | gamification.badge | kanban | New |
badge_list_view |
Badge List | gamification.badge | list | New |
badge_user_kanban_view |
Badge User Kanban View | gamification.badge.user | kanban | New |
challenge_form_view |
Challenge Form | gamification.challenge | form | New |
challenge_line_list_view |
Challenge line list | gamification.challenge.line | list | New |
challenge_list_view |
Challenges List | gamification.challenge | list | New |
challenge_search_view |
Challenge Search | gamification.challenge | search | New |
gamification_badge_view_search |
gamification.badge.view.search | gamification.badge | search | New |
gamification_karma_rank_view_form |
gamification.karma.rank.view.form | gamification.karma.rank | form | New |
gamification_karma_ranks_view_search |
gamification.karma.ranks.view.search | gamification.karma.rank | search | New |
gamification_karma_ranks_view_tree |
gamification.karma.ranks.view.list | gamification.karma.rank | list | New |
gamification_karma_tracking_view_form |
gamification.karma.tracking.view.form | gamification.karma.tracking | form | New |
gamification_karma_tracking_view_search |
gamification.karma.tracking.view.search | gamification.karma.tracking | search | New |
gamification_karma_tracking_view_tree |
gamification.karma.tracking.view.list | gamification.karma.tracking | list | New |
goal_definition_form_view |
Goal Definitions Form | gamification.goal.definition | form | New |
goal_definition_list_view |
Goal Definitions List | gamification.goal.definition | list | New |
goal_definition_search_view |
Goal Definition Search | gamification.goal.definition | search | New |
goal_form_view |
Goal Form | gamification.goal | form | New |
goal_kanban_view |
Goal Kanban View | gamification.goal | kanban | New |
goal_list_view |
Goal List | gamification.goal | list | New |
goal_search_view |
Goal Search | gamification.goal | search | New |
res_users_view_form |
res.users.view.form.inherit.gamification | res.users | xpath | Inherits base.view_users_form |
view_badge_wizard_grant |
Grant Badge User Form | gamification.badge.user.wizard | form | New |
view_challenge_kanban |
Challenge Kanban | gamification.challenge | kanban | New |
view_goal_wizard_update_current |
Update the current value of the Goal | gamification.goal.wizard | form | New |
active
Boolean
default=True
args: 'Active'
challenge_ids
One2many → gamification.challenge
string='Reward of Challenges'
args: 'gamification.challenge', 'reward_id'
description
Html
sanitize_attributes=False
translate=True
args: 'Description'
goal_definition_ids
Many2many → gamification.goal.definition
help='The users that have succeeded these goals will receive automatically the badge.'
string='Rewarded by'
args: 'gamification.goal.definition', 'badge_unlocked_definition_rel'
granted_count
Integer
compute='_get_owners_info'
help='The number of time this badge has been received.'
args: 'Total'
granted_users_count
Integer
compute='_get_owners_info'
help='The number of time this badge has been received by unique users.'
args: 'Number of users'
level
Selection
default='bronze'
string='Forum Badge Level'
args: [('bronze', 'Bronze'), ('silver', 'Silver'), ('gold', 'Gold')]
name
Char
required=True
translate=True
args: 'Badge'
owner_ids
One2many → gamification.badge.user
help='The list of instances of this badge granted to users'
string='Owners'
args: 'gamification.badge.user', 'badge_id'
remaining_sending
Integer
compute='_remaining_sending_calc'
help='If a maximum is set'
args: 'Remaining Sending Allowed'
rule_auth
Selection
default='everyone'
help='Who can grant this badge'
required=True
string='Allowance to Grant'
args: [('everyone', 'Everyone'), ('users', 'A selected list of users'), ('having', 'People having some badges'), ('nobody', 'No one, assigned through challenges')]
rule_auth_badge_ids
Many2many → gamification.badge
help='Only the people having these badges can give this badge'
string='Required Badges'
args: 'gamification.badge', 'gamification_badge_rule_badge_rel', 'badge1_id', 'badge2_id'
rule_auth_user_ids
Many2many → res.users
help='Only these people can give this badge'
string='Authorized Users'
args: 'res.users', 'rel_badge_auth_users'
rule_max
Boolean
help='Check to set a monthly limit per person of sending this badge'
args: 'Monthly Limited Sending'
rule_max_number
Integer
help='The maximum number of time this badge can be sent per month per person.'
args: 'Limitation Number'
stat_my
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has received this badge.'
args: 'My Total'
stat_my_monthly_sending
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has sent this badge this month.'
args: 'My Monthly Sending Total'
stat_my_this_month
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has received this badge this month.'
args: 'My Monthly Total'
stat_this_month
Integer
compute='_get_badge_user_stats'
help='The number of time this badge has been received this month.'
args: 'Monthly total'
unique_owner_ids
Many2many → res.users
compute='_get_owners_info'
help='The list of unique users having received this badge.'
string='Unique Owners'
args: 'res.users'
check_granting(self)
badge_id
Many2one → gamification.badge
index=True
ondelete='cascade'
required=True
string='Badge'
args: 'gamification.badge'
badge_name
Char
readonly=False
related='badge_id.name'
string='Badge Name'
challenge_id
Many2one → gamification.challenge
string='Challenge'
args: 'gamification.challenge'
comment
Text
level
Selection
readonly=True
related='badge_id.level'
store=True
string='Badge Level'
sender_id
Many2one → res.users
string='Sender'
args: 'res.users'
user_id
Many2one → res.users
index=True
ondelete='cascade'
required=True
string='User'
args: 'res.users'
create(self, vals_list)
badge_id
Many2one → gamification.badge
required=True
string='Badge'
args: 'gamification.badge'
comment
Text
user_id
Many2one → res.users
required=True
string='User'
args: 'res.users'
action_grant_badge(self)
challenge_category
Selection
default='hr'
help='Define the visibility of the challenge through menus'
required=True
string='Appears in'
args: [('hr', 'Human Resources / Engagement'), ('other', 'Settings / Gamification Tools')]
description
Text
translate=True
args: 'Description'
end_date
Date
help='The day a new challenge will be automatically closed. If no periodicity is set, will use this date as the goal end date.'
args: 'End Date'
invited_user_ids
Many2many → res.users
string='Suggest to users'
args: 'res.users', 'gamification_invited_user_ids_rel'
last_report_date
Date
default=fields.Date.today
args: 'Last Report Date'
line_ids
One2many → gamification.challenge.line
copy=True
help='List of goals that will be set'
required=True
string='Lines'
args: 'gamification.challenge.line', 'challenge_id'
manager_id
Many2one → res.users
default=<expr>
string='Responsible'
args: 'res.users'
name
Char
required=True
translate=True
args: 'Challenge Name'
next_report_date
Date
compute='_get_next_report_date'
store=True
args: 'Next Report Date'
period
Selection
default='once'
help='Period of automatic goal assignment. If none is selected, should be launched manually.'
required=True
string='Periodicity'
args: [('once', 'Non recurring'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('yearly', 'Yearly')]
remind_update_delay
Integer
help='Never reminded if no value or zero is specified.'
args: 'Non-updated manual goals will be reminded after'
report_message_frequency
Selection
default='never'
required=True
string='Report Frequency'
args: [('never', 'Never'), ('onchange', 'On change'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('yearly', 'Yearly')]
report_message_group_id
Many2one → discuss.channel
help='Group that will receive a copy of the report in addition to the user'
string='Send a copy to'
args: 'discuss.channel'
report_template_id
Many2one → mail.template
default=<expr>
required=True
string='Report Template'
args: 'mail.template'
reward_failure
Boolean
reward_first_id
Many2one → gamification.badge
string='For 1st user'
args: 'gamification.badge'
reward_id
Many2one → gamification.badge
string='For Every Succeeding User'
args: 'gamification.badge'
reward_realtime
Boolean
default=True
help='With this option enabled, a user can receive a badge only once. The top 3 badges are still rewarded only at the end of the challenge.'
args: 'Reward as soon as every goal is reached'
reward_second_id
Many2one → gamification.badge
string='For 2nd user'
args: 'gamification.badge'
reward_third_id
Many2one → gamification.badge
string='For 3rd user'
args: 'gamification.badge'
start_date
Date
help='The day a new challenge will be automatically started. If no periodicity is set, will use this date as the goal start date.'
args: 'Start Date'
state
Selection
copy=False
default='draft'
required=True
string='State'
tracking=True
args: [('draft', 'Draft'), ('inprogress', 'In Progress'), ('done', 'Done')]
user_count
Integer
compute='_compute_user_count'
args: '# Users'
user_domain
Char
user_ids
Many2many → res.users
string='Participants'
args: 'res.users', 'gamification_challenge_users_rel'
visibility_mode
Selection
default='personal'
required=True
string='Display Mode'
args: [('personal', 'Individual Goals'), ('ranking', 'Leader Board (Group Ranking)')]
accept_challenge(self)
action_check(self)
action_report_progress(self)
action_start(self)
action_view_users(self)
create(self, vals_list)
default_get(self, fields_list)
discard_challenge(self)
report_progress(self, users=(), subset_goals=False)
write(self, vals)
challenge_id
Many2one → gamification.challenge
ondelete='cascade'
required=True
string='Challenge'
args: 'gamification.challenge'
condition
Selection
readonly=True
related='definition_id.condition'
string='Condition'
definition_full_suffix
Char
readonly=True
related='definition_id.full_suffix'
args: 'Suffix'
definition_id
Many2one → gamification.goal.definition
ondelete='cascade'
required=True
string='Goal Definition'
args: 'gamification.goal.definition'
definition_monetary
Boolean
readonly=True
related='definition_id.monetary'
args: 'Monetary'
definition_suffix
Char
readonly=True
related='definition_id.suffix'
args: 'Unit'
name
Char
readonly=False
related='definition_id.name'
args: 'Name'
sequence
Integer
default=1
args: 'Sequence'
target_goal
Float
required=True
args: 'Target Value to Reach'
No public methods.
challenge_id
Many2one
help='Challenge that generated the goal, assign challenge to users to generate goals with a value in this field.'
index=True
readonly=True
related='line_id.challenge_id'
store=True
closed
Boolean
color
Integer
compute='_compute_color'
args: 'Color Index'
completeness
Float
compute='_get_completion'
args: 'Completeness'
computation_mode
Selection
readonly=False
related='definition_id.computation_mode'
current
Float
default=0
required=True
args: 'Current Value'
definition_condition
Selection
readonly=True
related='definition_id.condition'
string='Definition Condition'
definition_description
Text
readonly=True
related='definition_id.description'
args: 'Definition Description'
definition_display
Selection
readonly=True
related='definition_id.display_mode'
string='Display Mode'
definition_id
Many2one → gamification.goal.definition
ondelete='cascade'
required=True
string='Goal Definition'
args: 'gamification.goal.definition'
definition_suffix
Char
readonly=True
related='definition_id.full_suffix'
args: 'Suffix'
end_date
Date
last_update
Date
help='In case of manual goal, reminders are sent if the goal as not been updated for a while (defined in challenge). Ignored in case of non-manual goal or goal not linked to a challenge.'
args: 'Last Update'
line_id
Many2one → gamification.challenge.line
ondelete='cascade'
string='Challenge Line'
args: 'gamification.challenge.line'
remind_update_delay
Integer
help='The number of days after which the user assigned to a manual goal will be reminded. Never reminded if no value is specified.'
args: 'Remind delay'
start_date
Date
default=fields.Date.today
args: 'Start Date'
state
Selection
default='draft'
required=True
string='State'
args: [('draft', 'Draft'), ('inprogress', 'In progress'), ('reached', 'Reached'), ('failed', 'Failed'), ('canceled', 'Cancelled')]
target_goal
Float
required=True
args: 'To Reach'
to_update
Boolean
user_id
Many2one → res.users
auto_join=True
ondelete='cascade'
required=True
string='User'
args: 'res.users'
action_cancel(self)
action_fail(self)
action_reach(self)
action_start(self)
create(self, vals_list)
get_action(self)
update_goal(self)
write(self, vals)
action_id
Many2one → ir.actions.act_window
help='The action that will be called to update the goal value.'
string='Action'
args: 'ir.actions.act_window'
batch_distinctive_field
Many2one → ir.model.fields
help='In batch mode, this indicates which field distinguishes one user from the other, e.g. user_id, partner_id...'
string='Distinctive field for batch user'
args: 'ir.model.fields'
batch_mode
Boolean
help='Evaluate the expression in batch instead of once for each user'
args: 'Batch Mode'
batch_user_expression
Char
help="The value to compare with the distinctive field. The expression can contain reference to 'user' which is a browse record of the current user, e.g. user.id, user.partner_id.id..."
args: 'Evaluated expression for batch mode'
computation_mode
Selection
default='manually'
help="Define how the goals will be computed. The result of the operation will be stored in the field 'Current'."
required=True
string='Computation Mode'
args: [('manually', 'Recorded manually'), ('count', 'Automatic: number of records'), ('sum', 'Automatic: sum on a field'), ('python', 'Automatic: execute a specific Python code')]
compute_code
Text
help="Python code to be executed for each user. 'result' should contains the new current value. Evaluated user can be access through object.user_id."
args: 'Python Code'
condition
Selection
default='higher'
help='A goal is considered as completed when the current value is compared to the value to reach'
required=True
string='Goal Performance'
args: [('higher', 'The higher the better'), ('lower', 'The lower the better')]
description
Text
display_mode
Selection
default='progress'
required=True
string='Displayed as'
args: [('progress', 'Progressive (using numerical values)'), ('boolean', 'Exclusive (done or not-done)')]
domain
Char
default='[]'
help="Domain for filtering records. General rule, not user depending, e.g. [('state', '=', 'done')]. The expression can contain reference to 'user' which is a browse record of the current user if not in batch mode."
required=True
args: 'Filter Domain'
field_date_id
Many2one → ir.model.fields
domain=<expr>
help='The date to use for the time period evaluated'
string='Date Field'
args: 'ir.model.fields'
field_id
Many2one → ir.model.fields
domain=<expr>
string='Field to Sum'
args: 'ir.model.fields'
full_suffix
Char
compute='_compute_full_suffix'
help='The currency and suffix field'
args: 'Full Suffix'
model_id
Many2one → ir.model
ondelete='cascade'
string='Model'
args: 'ir.model'
model_inherited_ids
Many2many → ir.model
related='model_id.inherited_model_ids'
args: 'ir.model'
monetary
Boolean
default=False
help='The target and current value are defined in the company currency.'
args: 'Monetary Value'
name
Char
required=True
translate=True
args: 'Goal Definition'
res_id_field
Char
help='The field name on the user profile (res.users) containing the value for res_id for action.'
args: 'ID Field of user'
suffix
Char
help='The unit of the target and current values'
translate=True
args: 'Suffix'
create(self, vals_list)
write(self, vals)
current
Float
goal_id
Many2one → gamification.goal
required=True
string='Goal'
args: 'gamification.goal'
action_update_current(self)
description
Html
sanitize_attributes=False
string='Description'
translate=html_translate
description_motivational
Html
help='Motivational phrase to reach this rank on your profile page'
sanitize_attributes=False
sanitize_overridable=True
string='Motivational'
translate=html_translate
karma_min
Integer
default=1
required=True
string='Required Karma'
name
Text
required=True
string='Rank Name'
translate=True
rank_users_count
Integer
compute='_compute_rank_users_count'
args: '# Users'
user_ids
One2many → res.users
string='Users'
args: 'res.users', 'rank_id'
create(self, values_list)
write(self, vals)
consolidated
Boolean
gain
Integer
compute='_compute_gain'
readonly=False
args: 'Gain'
new_value
Integer
required=True
args: 'New Karma Value'
old_value
Integer
readonly=True
args: 'Old Karma Value'
origin_ref
Reference
default=<expr>
selection=<expr>
string='Source'
origin_ref_model_name
Selection
compute='_compute_origin_ref_model_name'
selection=<expr>
store=True
string='Source Type'
reason
Text
default=<expr>
string='Description'
tracking_date
Datetime
default=fields.Datetime.now
index=True
readonly=True
user_id
Many2one → res.users
index=True
ondelete='cascade'
required=True
args: 'res.users', 'User'
create(self, values_list)
badge_ids
One2many → gamification.badge.user
copy=False
string='Badges'
args: 'gamification.badge.user', 'user_id'
bronze_badge
Integer
compute='_get_user_badge_level'
args: 'Bronze badges count'
gold_badge
Integer
compute='_get_user_badge_level'
args: 'Gold badges count'
karma
Integer
compute='_compute_karma'
readonly=False
store=True
args: 'Karma'
karma_tracking_ids
One2many → gamification.karma.tracking
groups='base.group_system'
string='Karma Changes'
args: 'gamification.karma.tracking', 'user_id'
next_rank_id
Many2one → gamification.karma.rank
rank_id
Many2one → gamification.karma.rank
silver_badge
Integer
compute='_get_user_badge_level'
args: 'Silver badges count'
action_karma_report(self)
create(self, values_list)
get_gamification_redirection_data(self)
write(self, values)
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/17.0/gamification |
| VERSION | |
| VERSION | 1.0 |
| CATEGORY | |
| CATEGORY | Human Resources |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Raphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Xavier Morel, Aaron Bohy, qsm-odoo, Odoo Online, Aurélien Warnon, Xavier-Do, Victor Feyens, Sébastien Theys, std-odoo, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Pierre Paridans, Benoit Socias, Florian Charlier, Renaud Thiry, niyasraphy, alsh-odoo, Gaetan Vanden Bergh (gavb), Louis Wicket (wil), Pierre-Yves Dufays, Saurabh Choraria, Dylan Kiss (dyki), Bruno Boi, Brieuc-brd, Jordan D. (Joda), Serge Bayet (seba), Julien Carion (juca), Louis (wil), aamo-odoo, Elisabeth Dickinson, Julien, Jérôme Belpaire |
| WEBSITE | |
| WEBSITE | |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 01:02: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 | Gamification process ==================== The Gamification module provides ways to evaluate and motivate the users of Odoo. The users can be evaluated using goals and numerical objectives to reach. **Goals** are assigned through **challenges** to evaluate and compare members of a team with each others and through time. For non-numerical achievements, **badges** can be granted to users. From a simple "thank you" to an exceptional achievement, a badge is an easy way to exprimate gratitude to a user for their good work. Both goals and badges are flexibles and can be adapted to a large range of modules and actions. When installed, this module creates easy goals to help new users to discover Odoo and configure their user profile. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
badge_form_view |
Badge Form | gamification.badge | form | New |
badge_kanban_view |
Badge Kanban View | gamification.badge | kanban | New |
badge_list_view |
Badge List | gamification.badge | tree | New |
badge_user_kanban_view |
Badge User Kanban View | gamification.badge.user | kanban | New |
challenge_form_view |
Challenge Form | gamification.challenge | form | New |
challenge_line_list_view |
Challenge line list | gamification.challenge.line | tree | New |
challenge_list_view |
Challenges List | gamification.challenge | tree | New |
challenge_search_view |
Challenge Search | gamification.challenge | search | New |
gamification_badge_view_search |
gamification.badge.view.search | gamification.badge | search | New |
gamification_karma_rank_view_form |
gamification.karma.rank.view.form | gamification.karma.rank | form | New |
gamification_karma_ranks_view_search |
gamification.karma.ranks.view.search | gamification.karma.rank | search | New |
gamification_karma_ranks_view_tree |
gamification.karma.ranks.view.tree | gamification.karma.rank | tree | New |
gamification_karma_tracking_view_form |
gamification.karma.tracking.view.form | gamification.karma.tracking | form | New |
gamification_karma_tracking_view_search |
gamification.karma.tracking.view.search | gamification.karma.tracking | search | New |
gamification_karma_tracking_view_tree |
gamification.karma.tracking.view.tree | gamification.karma.tracking | tree | New |
goal_definition_form_view |
Goal Definitions Form | gamification.goal.definition | form | New |
goal_definition_list_view |
Goal Definitions List | gamification.goal.definition | tree | New |
goal_definition_search_view |
Goal Definition Search | gamification.goal.definition | search | New |
goal_form_view |
Goal Form | gamification.goal | form | New |
goal_kanban_view |
Goal Kanban View | gamification.goal | kanban | New |
goal_list_view |
Goal List | gamification.goal | tree | New |
goal_search_view |
Goal Search | gamification.goal | search | New |
res_users_view_form |
res.users.view.form.inherit.gamification | res.users | xpath | Inherits base.view_users_form |
view_badge_wizard_grant |
Grant Badge User Form | gamification.badge.user.wizard | form | New |
view_challenge_kanban |
Challenge Kanban | gamification.challenge | kanban | New |
view_goal_wizard_update_current |
Update the current value of the Goal | gamification.goal.wizard | form | New |
active
Boolean
default=True
args: 'Active'
challenge_ids
One2many → gamification.challenge
string='Reward of Challenges'
args: 'gamification.challenge', 'reward_id'
description
Html
sanitize_attributes=False
translate=True
args: 'Description'
goal_definition_ids
Many2many → gamification.goal.definition
help='The users that have succeeded these goals will receive automatically the badge.'
string='Rewarded by'
args: 'gamification.goal.definition', 'badge_unlocked_definition_rel'
granted_count
Integer
compute='_get_owners_info'
help='The number of time this badge has been received.'
args: 'Total'
granted_users_count
Integer
compute='_get_owners_info'
help='The number of time this badge has been received by unique users.'
args: 'Number of users'
level
Selection
default='bronze'
string='Forum Badge Level'
args: [('bronze', 'Bronze'), ('silver', 'Silver'), ('gold', 'Gold')]
name
Char
required=True
translate=True
args: 'Badge'
owner_ids
One2many → gamification.badge.user
help='The list of instances of this badge granted to users'
string='Owners'
args: 'gamification.badge.user', 'badge_id'
remaining_sending
Integer
compute='_remaining_sending_calc'
help='If a maximum is set'
args: 'Remaining Sending Allowed'
rule_auth
Selection
default='everyone'
help='Who can grant this badge'
required=True
string='Allowance to Grant'
args: [('everyone', 'Everyone'), ('users', 'A selected list of users'), ('having', 'People having some badges'), ('nobody', 'No one, assigned through challenges')]
rule_auth_badge_ids
Many2many → gamification.badge
help='Only the people having these badges can give this badge'
string='Required Badges'
args: 'gamification.badge', 'gamification_badge_rule_badge_rel', 'badge1_id', 'badge2_id'
rule_auth_user_ids
Many2many → res.users
help='Only these people can give this badge'
string='Authorized Users'
args: 'res.users', 'rel_badge_auth_users'
rule_max
Boolean
help='Check to set a monthly limit per person of sending this badge'
args: 'Monthly Limited Sending'
rule_max_number
Integer
help='The maximum number of time this badge can be sent per month per person.'
args: 'Limitation Number'
stat_my
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has received this badge.'
args: 'My Total'
stat_my_monthly_sending
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has sent this badge this month.'
args: 'My Monthly Sending Total'
stat_my_this_month
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has received this badge this month.'
args: 'My Monthly Total'
stat_this_month
Integer
compute='_get_badge_user_stats'
help='The number of time this badge has been received this month.'
args: 'Monthly total'
unique_owner_ids
Many2many → res.users
compute='_get_owners_info'
help='The list of unique users having received this badge.'
string='Unique Owners'
args: 'res.users'
check_granting(self)
badge_id
Many2one → gamification.badge
index=True
ondelete='cascade'
required=True
string='Badge'
args: 'gamification.badge'
badge_name
Char
readonly=False
related='badge_id.name'
string='Badge Name'
challenge_id
Many2one → gamification.challenge
string='Challenge'
args: 'gamification.challenge'
comment
Text
level
Selection
readonly=True
related='badge_id.level'
store=True
string='Badge Level'
sender_id
Many2one → res.users
string='Sender'
args: 'res.users'
user_id
Many2one → res.users
index=True
ondelete='cascade'
required=True
string='User'
args: 'res.users'
create(self, vals_list)
badge_id
Many2one → gamification.badge
required=True
string='Badge'
args: 'gamification.badge'
comment
Text
user_id
Many2one → res.users
required=True
string='User'
args: 'res.users'
action_grant_badge(self)
challenge_category
Selection
default='hr'
help='Define the visibility of the challenge through menus'
required=True
string='Appears in'
args: [('hr', 'Human Resources / Engagement'), ('other', 'Settings / Gamification Tools')]
description
Text
translate=True
args: 'Description'
end_date
Date
help='The day a new challenge will be automatically closed. If no periodicity is set, will use this date as the goal end date.'
args: 'End Date'
invited_user_ids
Many2many → res.users
string='Suggest to users'
args: 'res.users', 'gamification_invited_user_ids_rel'
last_report_date
Date
default=fields.Date.today
args: 'Last Report Date'
line_ids
One2many → gamification.challenge.line
copy=True
help='List of goals that will be set'
required=True
string='Lines'
args: 'gamification.challenge.line', 'challenge_id'
manager_id
Many2one → res.users
default=<expr>
string='Responsible'
args: 'res.users'
name
Char
required=True
translate=True
args: 'Challenge Name'
next_report_date
Date
compute='_get_next_report_date'
store=True
args: 'Next Report Date'
period
Selection
default='once'
help='Period of automatic goal assignment. If none is selected, should be launched manually.'
required=True
string='Periodicity'
args: [('once', 'Non recurring'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('yearly', 'Yearly')]
remind_update_delay
Integer
help='Never reminded if no value or zero is specified.'
args: 'Non-updated manual goals will be reminded after'
report_message_frequency
Selection
default='never'
required=True
string='Report Frequency'
args: [('never', 'Never'), ('onchange', 'On change'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('yearly', 'Yearly')]
report_message_group_id
Many2one → discuss.channel
help='Group that will receive a copy of the report in addition to the user'
string='Send a copy to'
args: 'discuss.channel'
report_template_id
Many2one → mail.template
default=<expr>
required=True
string='Report Template'
args: 'mail.template'
reward_failure
Boolean
reward_first_id
Many2one → gamification.badge
string='For 1st user'
args: 'gamification.badge'
reward_id
Many2one → gamification.badge
string='For Every Succeeding User'
args: 'gamification.badge'
reward_realtime
Boolean
default=True
help='With this option enabled, a user can receive a badge only once. The top 3 badges are still rewarded only at the end of the challenge.'
args: 'Reward as soon as every goal is reached'
reward_second_id
Many2one → gamification.badge
string='For 2nd user'
args: 'gamification.badge'
reward_third_id
Many2one → gamification.badge
string='For 3rd user'
args: 'gamification.badge'
start_date
Date
help='The day a new challenge will be automatically started. If no periodicity is set, will use this date as the goal start date.'
args: 'Start Date'
state
Selection
copy=False
default='draft'
required=True
string='State'
tracking=True
args: [('draft', 'Draft'), ('inprogress', 'In Progress'), ('done', 'Done')]
user_count
Integer
compute='_compute_user_count'
args: '# Users'
user_domain
Char
user_ids
Many2many → res.users
string='Participants'
args: 'res.users', 'gamification_challenge_users_rel'
visibility_mode
Selection
default='personal'
required=True
string='Display Mode'
args: [('personal', 'Individual Goals'), ('ranking', 'Leader Board (Group Ranking)')]
accept_challenge(self)
action_check(self)
action_report_progress(self)
action_start(self)
action_view_users(self)
create(self, vals_list)
default_get(self, fields_list)
discard_challenge(self)
report_progress(self, users=(), subset_goals=False)
write(self, vals)
challenge_id
Many2one → gamification.challenge
ondelete='cascade'
required=True
string='Challenge'
args: 'gamification.challenge'
condition
Selection
readonly=True
related='definition_id.condition'
string='Condition'
definition_full_suffix
Char
readonly=True
related='definition_id.full_suffix'
args: 'Suffix'
definition_id
Many2one → gamification.goal.definition
ondelete='cascade'
required=True
string='Goal Definition'
args: 'gamification.goal.definition'
definition_monetary
Boolean
readonly=True
related='definition_id.monetary'
args: 'Monetary'
definition_suffix
Char
readonly=True
related='definition_id.suffix'
args: 'Unit'
name
Char
readonly=False
related='definition_id.name'
args: 'Name'
sequence
Integer
default=1
args: 'Sequence'
target_goal
Float
required=True
args: 'Target Value to Reach'
No public methods.
challenge_id
Many2one
help='Challenge that generated the goal, assign challenge to users to generate goals with a value in this field.'
index=True
readonly=True
related='line_id.challenge_id'
store=True
closed
Boolean
completeness
Float
compute='_get_completion'
args: 'Completeness'
computation_mode
Selection
readonly=False
related='definition_id.computation_mode'
current
Float
default=0
required=True
args: 'Current Value'
definition_condition
Selection
readonly=True
related='definition_id.condition'
string='Definition Condition'
definition_description
Text
readonly=True
related='definition_id.description'
args: 'Definition Description'
definition_display
Selection
readonly=True
related='definition_id.display_mode'
string='Display Mode'
definition_id
Many2one → gamification.goal.definition
ondelete='cascade'
required=True
string='Goal Definition'
args: 'gamification.goal.definition'
definition_suffix
Char
readonly=True
related='definition_id.full_suffix'
args: 'Suffix'
end_date
Date
last_update
Date
help='In case of manual goal, reminders are sent if the goal as not been updated for a while (defined in challenge). Ignored in case of non-manual goal or goal not linked to a challenge.'
args: 'Last Update'
line_id
Many2one → gamification.challenge.line
ondelete='cascade'
string='Challenge Line'
args: 'gamification.challenge.line'
remind_update_delay
Integer
help='The number of days after which the user assigned to a manual goal will be reminded. Never reminded if no value is specified.'
args: 'Remind delay'
start_date
Date
default=fields.Date.today
args: 'Start Date'
state
Selection
default='draft'
required=True
string='State'
args: [('draft', 'Draft'), ('inprogress', 'In progress'), ('reached', 'Reached'), ('failed', 'Failed'), ('canceled', 'Canceled')]
target_goal
Float
required=True
args: 'To Reach'
to_update
Boolean
user_id
Many2one → res.users
auto_join=True
ondelete='cascade'
required=True
string='User'
args: 'res.users'
action_cancel(self)
action_fail(self)
action_reach(self)
action_start(self)
create(self, vals_list)
get_action(self)
update_goal(self)
write(self, vals)
action_id
Many2one → ir.actions.act_window
help='The action that will be called to update the goal value.'
string='Action'
args: 'ir.actions.act_window'
batch_distinctive_field
Many2one → ir.model.fields
help='In batch mode, this indicates which field distinguishes one user from the other, e.g. user_id, partner_id...'
string='Distinctive field for batch user'
args: 'ir.model.fields'
batch_mode
Boolean
help='Evaluate the expression in batch instead of once for each user'
args: 'Batch Mode'
batch_user_expression
Char
help="The value to compare with the distinctive field. The expression can contain reference to 'user' which is a browse record of the current user, e.g. user.id, user.partner_id.id..."
args: 'Evaluated expression for batch mode'
computation_mode
Selection
default='manually'
help="Define how the goals will be computed. The result of the operation will be stored in the field 'Current'."
required=True
string='Computation Mode'
args: [('manually', 'Recorded manually'), ('count', 'Automatic: number of records'), ('sum', 'Automatic: sum on a field'), ('python', 'Automatic: execute a specific Python code')]
compute_code
Text
help="Python code to be executed for each user. 'result' should contains the new current value. Evaluated user can be access through object.user_id."
args: 'Python Code'
condition
Selection
default='higher'
help='A goal is considered as completed when the current value is compared to the value to reach'
required=True
string='Goal Performance'
args: [('higher', 'The higher the better'), ('lower', 'The lower the better')]
description
Text
display_mode
Selection
default='progress'
required=True
string='Displayed as'
args: [('progress', 'Progressive (using numerical values)'), ('boolean', 'Exclusive (done or not-done)')]
domain
Char
default='[]'
help="Domain for filtering records. General rule, not user depending, e.g. [('state', '=', 'done')]. The expression can contain reference to 'user' which is a browse record of the current user if not in batch mode."
required=True
args: 'Filter Domain'
field_date_id
Many2one → ir.model.fields
domain=<expr>
help='The date to use for the time period evaluated'
string='Date Field'
args: 'ir.model.fields'
field_id
Many2one → ir.model.fields
domain=<expr>
string='Field to Sum'
args: 'ir.model.fields'
full_suffix
Char
compute='_compute_full_suffix'
help='The currency and suffix field'
args: 'Full Suffix'
model_id
Many2one → ir.model
ondelete='cascade'
string='Model'
args: 'ir.model'
model_inherited_ids
Many2many → ir.model
related='model_id.inherited_model_ids'
args: 'ir.model'
monetary
Boolean
default=False
help='The target and current value are defined in the company currency.'
args: 'Monetary Value'
name
Char
required=True
translate=True
args: 'Goal Definition'
res_id_field
Char
help='The field name on the user profile (res.users) containing the value for res_id for action.'
args: 'ID Field of user'
suffix
Char
help='The unit of the target and current values'
translate=True
args: 'Suffix'
create(self, vals_list)
write(self, vals)
current
Float
goal_id
Many2one → gamification.goal
required=True
string='Goal'
args: 'gamification.goal'
action_update_current(self)
description
Html
sanitize_attributes=False
string='Description'
translate=html_translate
description_motivational
Html
help='Motivational phrase to reach this rank on your profile page'
sanitize_attributes=False
sanitize_overridable=True
string='Motivational'
translate=html_translate
karma_min
Integer
default=1
required=True
string='Required Karma'
name
Text
required=True
string='Rank Name'
translate=True
rank_users_count
Integer
compute='_compute_rank_users_count'
args: '# Users'
user_ids
One2many → res.users
string='Users'
args: 'res.users', 'rank_id'
create(self, values_list)
write(self, vals)
consolidated
Boolean
gain
Integer
compute='_compute_gain'
readonly=False
args: 'Gain'
new_value
Integer
required=True
args: 'New Karma Value'
old_value
Integer
readonly=True
args: 'Old Karma Value'
origin_ref
Reference
default=<expr>
selection=<expr>
string='Source'
origin_ref_model_name
Selection
compute='_compute_origin_ref_model_name'
selection=<expr>
store=True
string='Source Type'
reason
Text
default=<expr>
string='Description'
tracking_date
Datetime
default=fields.Datetime.now
index=True
readonly=True
user_id
Many2one → res.users
index=True
ondelete='cascade'
required=True
args: 'res.users', 'User'
create(self, values_list)
badge_ids
One2many → gamification.badge.user
copy=False
string='Badges'
args: 'gamification.badge.user', 'user_id'
bronze_badge
Integer
compute='_get_user_badge_level'
args: 'Bronze badges count'
gold_badge
Integer
compute='_get_user_badge_level'
args: 'Gold badges count'
karma
Integer
compute='_compute_karma'
readonly=False
store=True
args: 'Karma'
karma_tracking_ids
One2many → gamification.karma.tracking
groups='base.group_system'
string='Karma Changes'
args: 'gamification.karma.tracking', 'user_id'
next_rank_id
Many2one → gamification.karma.rank
rank_id
Many2one → gamification.karma.rank
silver_badge
Integer
compute='_get_user_badge_level'
args: 'Silver badges count'
action_karma_report(self)
create(self, values_list)
get_gamification_redirection_data(self)
write(self, values)
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/16.0/gamification |
| VERSION | |
| VERSION | 1.0 |
| CATEGORY | |
| CATEGORY | Human Resources |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Raphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Géry Debongnie, Aaron Bohy, GitHub, Aurélien Warnon, Xavier-Do, Romeo Fragomeli, Victor Feyens, Tiffany Chang (tic), Mathieu Duckerts-Antoine, Benoit Socias, Florian Charlier, Fabio Barbero, niyasraphy, alsh-odoo, Louis Wicket (wil), Saurabh Choraria, Bruno Boi, Brieuc-brd, Jordan D. (Joda), Serge Bayet (seba), Karan Bosamia |
| WEBSITE | |
| WEBSITE | |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:40:49 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - base_setup - web - bus - web_tour - web_kanban_gauge |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | Gamification process ==================== The Gamification module provides ways to evaluate and motivate the users of Odoo. The users can be evaluated using goals and numerical objectives to reach. **Goals** are assigned through **challenges** to evaluate and compare members of a team with each others and through time. For non-numerical achievements, **badges** can be granted to users. From a simple "thank you" to an exceptional achievement, a badge is an easy way to exprimate gratitude to a user for their good work. Both goals and badges are flexibles and can be adapted to a large range of modules and actions. When installed, this module creates easy goals to help new users to discover Odoo and configure their user profile. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
badge_form_view |
Badge Form | gamification.badge | form | New |
badge_kanban_view |
Badge Kanban View | gamification.badge | kanban | New |
badge_list_view |
Badge List | gamification.badge | tree | New |
badge_user_kanban_view |
Badge User Kanban View | gamification.badge.user | kanban | New |
challenge_form_view |
Challenge Form | gamification.challenge | form | New |
challenge_line_list_view |
Challenge line list | gamification.challenge.line | tree | New |
challenge_list_view |
Challenges List | gamification.challenge | tree | New |
challenge_search_view |
Challenge Search | gamification.challenge | search | New |
gamification_badge_view_search |
gamification.badge.view.search | gamification.badge | search | New |
gamification_karma_rank_view_form |
gamification.karma.rank.view.form | gamification.karma.rank | form | New |
gamification_karma_ranks_view_search |
gamification.karma.ranks.view.search | gamification.karma.rank | search | New |
gamification_karma_ranks_view_tree |
gamification.karma.ranks.view.tree | gamification.karma.rank | tree | New |
gamification_karma_tracking_view_form |
gamification.karma.tracking.view.form | gamification.karma.tracking | form | New |
gamification_karma_tracking_view_search |
gamification.karma.tracking.view.search | gamification.karma.tracking | search | New |
gamification_karma_tracking_view_tree |
gamification.karma.tracking.view.tree | gamification.karma.tracking | tree | New |
goal_definition_form_view |
Goal Definitions Form | gamification.goal.definition | form | New |
goal_definition_list_view |
Goal Definitions List | gamification.goal.definition | tree | New |
goal_definition_search_view |
Goal Definition Search | gamification.goal.definition | search | New |
goal_form_view |
Goal Form | gamification.goal | form | New |
goal_kanban_view |
Goal Kanban View | gamification.goal | kanban | New |
goal_list_view |
Goal List | gamification.goal | tree | New |
goal_search_view |
Goal Search | gamification.goal | search | New |
res_users_view_form |
res.users.view.form.inherit.gamification | res.users | group | Inherits base.view_users_form |
view_badge_wizard_grant |
Grant Badge User Form | gamification.badge.user.wizard | form | New |
view_challenge_kanban |
Challenge Kanban | gamification.challenge | kanban | New |
view_goal_wizard_update_current |
Update the current value of the Goal | gamification.goal.wizard | form | New |
active
Boolean
default=True
args: 'Active'
challenge_ids
One2many → gamification.challenge
string='Reward of Challenges'
args: 'gamification.challenge', 'reward_id'
description
Html
sanitize_attributes=False
translate=True
args: 'Description'
goal_definition_ids
Many2many → gamification.goal.definition
help='The users that have succeeded these goals will receive automatically the badge.'
string='Rewarded by'
args: 'gamification.goal.definition', 'badge_unlocked_definition_rel'
granted_count
Integer
compute='_get_owners_info'
help='The number of time this badge has been received.'
args: 'Total'
granted_users_count
Integer
compute='_get_owners_info'
help='The number of time this badge has been received by unique users.'
args: 'Number of users'
level
Selection
default='bronze'
string='Forum Badge Level'
args: [('bronze', 'Bronze'), ('silver', 'Silver'), ('gold', 'Gold')]
name
Char
required=True
translate=True
args: 'Badge'
owner_ids
One2many → gamification.badge.user
help='The list of instances of this badge granted to users'
string='Owners'
args: 'gamification.badge.user', 'badge_id'
remaining_sending
Integer
compute='_remaining_sending_calc'
help='If a maximum is set'
args: 'Remaining Sending Allowed'
rule_auth
Selection
default='everyone'
help='Who can grant this badge'
required=True
string='Allowance to Grant'
args: [('everyone', 'Everyone'), ('users', 'A selected list of users'), ('having', 'People having some badges'), ('nobody', 'No one, assigned through challenges')]
rule_auth_badge_ids
Many2many → gamification.badge
help='Only the people having these badges can give this badge'
string='Required Badges'
args: 'gamification.badge', 'gamification_badge_rule_badge_rel', 'badge1_id', 'badge2_id'
rule_auth_user_ids
Many2many → res.users
help='Only these people can give this badge'
string='Authorized Users'
args: 'res.users', 'rel_badge_auth_users'
rule_max
Boolean
help='Check to set a monthly limit per person of sending this badge'
args: 'Monthly Limited Sending'
rule_max_number
Integer
help='The maximum number of time this badge can be sent per month per person.'
args: 'Limitation Number'
stat_my
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has received this badge.'
args: 'My Total'
stat_my_monthly_sending
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has sent this badge this month.'
args: 'My Monthly Sending Total'
stat_my_this_month
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has received this badge this month.'
args: 'My Monthly Total'
stat_this_month
Integer
compute='_get_badge_user_stats'
help='The number of time this badge has been received this month.'
args: 'Monthly total'
unique_owner_ids
Many2many → res.users
compute='_get_owners_info'
help='The list of unique users having received this badge.'
string='Unique Owners'
args: 'res.users'
check_granting(self)
badge_id
Many2one → gamification.badge
index=True
ondelete='cascade'
required=True
string='Badge'
args: 'gamification.badge'
badge_name
Char
readonly=False
related='badge_id.name'
string='Badge Name'
challenge_id
Many2one → gamification.challenge
string='Challenge'
args: 'gamification.challenge'
comment
Text
level
Selection
readonly=True
related='badge_id.level'
store=True
string='Badge Level'
sender_id
Many2one → res.users
string='Sender'
args: 'res.users'
user_id
Many2one → res.users
index=True
ondelete='cascade'
required=True
string='User'
args: 'res.users'
create(self, vals_list)
badge_id
Many2one → gamification.badge
required=True
string='Badge'
args: 'gamification.badge'
comment
Text
user_id
Many2one → res.users
required=True
string='User'
args: 'res.users'
action_grant_badge(self)
challenge_category
Selection
default='hr'
help='Define the visibility of the challenge through menus'
required=True
string='Appears in'
args: [('hr', 'Human Resources / Engagement'), ('other', 'Settings / Gamification Tools')]
description
Text
translate=True
args: 'Description'
end_date
Date
help='The day a new challenge will be automatically closed. If no periodicity is set, will use this date as the goal end date.'
args: 'End Date'
invited_user_ids
Many2many → res.users
string='Suggest to users'
args: 'res.users', 'gamification_invited_user_ids_rel'
last_report_date
Date
default=fields.Date.today
args: 'Last Report Date'
line_ids
One2many → gamification.challenge.line
copy=True
help='List of goals that will be set'
required=True
string='Lines'
args: 'gamification.challenge.line', 'challenge_id'
manager_id
Many2one → res.users
default=<expr>
string='Responsible'
args: 'res.users'
name
Char
required=True
translate=True
args: 'Challenge Name'
next_report_date
Date
compute='_get_next_report_date'
store=True
args: 'Next Report Date'
period
Selection
default='once'
help='Period of automatic goal assignment. If none is selected, should be launched manually.'
required=True
string='Periodicity'
args: [('once', 'Non recurring'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('yearly', 'Yearly')]
remind_update_delay
Integer
help='Never reminded if no value or zero is specified.'
args: 'Non-updated manual goals will be reminded after'
report_message_frequency
Selection
default='never'
required=True
string='Report Frequency'
args: [('never', 'Never'), ('onchange', 'On change'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('yearly', 'Yearly')]
report_message_group_id
Many2one → mail.channel
help='Group that will receive a copy of the report in addition to the user'
string='Send a copy to'
args: 'mail.channel'
report_template_id
Many2one → mail.template
default=<expr>
required=True
string='Report Template'
args: 'mail.template'
reward_failure
Boolean
reward_first_id
Many2one → gamification.badge
string='For 1st user'
args: 'gamification.badge'
reward_id
Many2one → gamification.badge
string='For Every Succeeding User'
args: 'gamification.badge'
reward_realtime
Boolean
default=True
help='With this option enabled, a user can receive a badge only once. The top 3 badges are still rewarded only at the end of the challenge.'
args: 'Reward as soon as every goal is reached'
reward_second_id
Many2one → gamification.badge
string='For 2nd user'
args: 'gamification.badge'
reward_third_id
Many2one → gamification.badge
string='For 3rd user'
args: 'gamification.badge'
start_date
Date
help='The day a new challenge will be automatically started. If no periodicity is set, will use this date as the goal start date.'
args: 'Start Date'
state
Selection
copy=False
default='draft'
required=True
string='State'
tracking=True
args: [('draft', 'Draft'), ('inprogress', 'In Progress'), ('done', 'Done')]
user_count
Integer
compute='_compute_user_count'
args: '# Users'
user_domain
Char
user_ids
Many2many → res.users
string='Participants'
args: 'res.users', 'gamification_challenge_users_rel'
visibility_mode
Selection
default='personal'
required=True
string='Display Mode'
args: [('personal', 'Individual Goals'), ('ranking', 'Leader Board (Group Ranking)')]
accept_challenge(self)
action_check(self)
action_report_progress(self)
action_start(self)
action_view_users(self)
create(self, vals_list)
default_get(self, fields_list)
discard_challenge(self)
report_progress(self, users=(), subset_goals=False)
write(self, vals)
challenge_id
Many2one → gamification.challenge
ondelete='cascade'
required=True
string='Challenge'
args: 'gamification.challenge'
condition
Selection
readonly=True
related='definition_id.condition'
string='Condition'
definition_full_suffix
Char
readonly=True
related='definition_id.full_suffix'
args: 'Suffix'
definition_id
Many2one → gamification.goal.definition
ondelete='cascade'
required=True
string='Goal Definition'
args: 'gamification.goal.definition'
definition_monetary
Boolean
readonly=True
related='definition_id.monetary'
args: 'Monetary'
definition_suffix
Char
readonly=True
related='definition_id.suffix'
args: 'Unit'
name
Char
readonly=False
related='definition_id.name'
args: 'Name'
sequence
Integer
default=1
args: 'Sequence'
target_goal
Float
required=True
args: 'Target Value to Reach'
No public methods.
challenge_id
Many2one
help='Challenge that generated the goal, assign challenge to users to generate goals with a value in this field.'
index=True
readonly=True
related='line_id.challenge_id'
store=True
closed
Boolean
completeness
Float
compute='_get_completion'
args: 'Completeness'
computation_mode
Selection
readonly=False
related='definition_id.computation_mode'
current
Float
default=0
required=True
args: 'Current Value'
definition_condition
Selection
readonly=True
related='definition_id.condition'
string='Definition Condition'
definition_description
Text
readonly=True
related='definition_id.description'
args: 'Definition Description'
definition_display
Selection
readonly=True
related='definition_id.display_mode'
string='Display Mode'
definition_id
Many2one → gamification.goal.definition
ondelete='cascade'
required=True
string='Goal Definition'
args: 'gamification.goal.definition'
definition_suffix
Char
readonly=True
related='definition_id.full_suffix'
args: 'Suffix'
end_date
Date
last_update
Date
help='In case of manual goal, reminders are sent if the goal as not been updated for a while (defined in challenge). Ignored in case of non-manual goal or goal not linked to a challenge.'
args: 'Last Update'
line_id
Many2one → gamification.challenge.line
ondelete='cascade'
string='Challenge Line'
args: 'gamification.challenge.line'
remind_update_delay
Integer
help='The number of days after which the user assigned to a manual goal will be reminded. Never reminded if no value is specified.'
args: 'Remind delay'
start_date
Date
default=fields.Date.today
args: 'Start Date'
state
Selection
default='draft'
required=True
string='State'
args: [('draft', 'Draft'), ('inprogress', 'In progress'), ('reached', 'Reached'), ('failed', 'Failed'), ('canceled', 'Canceled')]
target_goal
Float
required=True
args: 'To Reach'
to_update
Boolean
user_id
Many2one → res.users
auto_join=True
ondelete='cascade'
required=True
string='User'
args: 'res.users'
action_cancel(self)
action_fail(self)
action_reach(self)
action_start(self)
create(self, vals_list)
get_action(self)
update_goal(self)
write(self, vals)
action_id
Many2one → ir.actions.act_window
help='The action that will be called to update the goal value.'
string='Action'
args: 'ir.actions.act_window'
batch_distinctive_field
Many2one → ir.model.fields
help='In batch mode, this indicates which field distinguishes one user from the other, e.g. user_id, partner_id...'
string='Distinctive field for batch user'
args: 'ir.model.fields'
batch_mode
Boolean
help='Evaluate the expression in batch instead of once for each user'
args: 'Batch Mode'
batch_user_expression
Char
help="The value to compare with the distinctive field. The expression can contain reference to 'user' which is a browse record of the current user, e.g. user.id, user.partner_id.id..."
args: 'Evaluated expression for batch mode'
computation_mode
Selection
default='manually'
help="Define how the goals will be computed. The result of the operation will be stored in the field 'Current'."
required=True
string='Computation Mode'
args: [('manually', 'Recorded manually'), ('count', 'Automatic: number of records'), ('sum', 'Automatic: sum on a field'), ('python', 'Automatic: execute a specific Python code')]
compute_code
Text
help="Python code to be executed for each user. 'result' should contains the new current value. Evaluated user can be access through object.user_id."
args: 'Python Code'
condition
Selection
default='higher'
help='A goal is considered as completed when the current value is compared to the value to reach'
required=True
string='Goal Performance'
args: [('higher', 'The higher the better'), ('lower', 'The lower the better')]
description
Text
display_mode
Selection
default='progress'
required=True
string='Displayed as'
args: [('progress', 'Progressive (using numerical values)'), ('boolean', 'Exclusive (done or not-done)')]
domain
Char
default='[]'
help="Domain for filtering records. General rule, not user depending, e.g. [('state', '=', 'done')]. The expression can contain reference to 'user' which is a browse record of the current user if not in batch mode."
required=True
args: 'Filter Domain'
field_date_id
Many2one → ir.model.fields
domain=<expr>
help='The date to use for the time period evaluated'
string='Date Field'
args: 'ir.model.fields'
field_id
Many2one → ir.model.fields
domain=<expr>
string='Field to Sum'
args: 'ir.model.fields'
full_suffix
Char
compute='_compute_full_suffix'
help='The currency and suffix field'
args: 'Full Suffix'
model_id
Many2one → ir.model
ondelete='cascade'
string='Model'
args: 'ir.model'
model_inherited_ids
Many2many → ir.model
related='model_id.inherited_model_ids'
args: 'ir.model'
monetary
Boolean
default=False
help='The target and current value are defined in the company currency.'
args: 'Monetary Value'
name
Char
required=True
translate=True
args: 'Goal Definition'
res_id_field
Char
help='The field name on the user profile (res.users) containing the value for res_id for action.'
args: 'ID Field of user'
suffix
Char
help='The unit of the target and current values'
translate=True
args: 'Suffix'
create(self, vals_list)
write(self, vals)
current
Float
goal_id
Many2one → gamification.goal
required=True
string='Goal'
args: 'gamification.goal'
action_update_current(self)
description
Html
sanitize_attributes=False
string='Description'
translate=html_translate
description_motivational
Html
help='Motivational phrase to reach this rank on your profile page'
sanitize_attributes=False
sanitize_overridable=True
string='Motivational'
translate=html_translate
karma_min
Integer
default=1
required=True
string='Required Karma'
name
Text
required=True
string='Rank Name'
translate=True
rank_users_count
Integer
compute='_compute_rank_users_count'
args: '# Users'
user_ids
One2many → res.users
string='Users'
args: 'res.users', 'rank_id'
create(self, values_list)
write(self, vals)
consolidated
Boolean
new_value
Integer
readonly=True
required=True
args: 'New Karma Value'
old_value
Integer
readonly=True
required=True
args: 'Old Karma Value'
tracking_date
Date
default=fields.Date.context_today
user_id
Many2one → res.users
index=True
ondelete='cascade'
readonly=True
required=True
args: 'res.users', 'User'
No public methods.
badge_ids
One2many → gamification.badge.user
copy=False
string='Badges'
args: 'gamification.badge.user', 'user_id'
bronze_badge
Integer
compute='_get_user_badge_level'
args: 'Bronze badges count'
gold_badge
Integer
compute='_get_user_badge_level'
args: 'Gold badges count'
karma
Integer
copy=False
default=0
args: 'Karma'
karma_tracking_ids
One2many → gamification.karma.tracking
groups='base.group_system'
string='Karma Changes'
args: 'gamification.karma.tracking', 'user_id'
next_rank_id
Many2one → gamification.karma.rank
rank_id
Many2one → gamification.karma.rank
silver_badge
Integer
compute='_get_user_badge_level'
args: 'Silver badges count'
add_karma(self, karma)
create(self, values_list)
get_gamification_redirection_data(self)
write(self, vals)
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/15.0/gamification |
| VERSION | |
| VERSION | 1.0 |
| CATEGORY | |
| CATEGORY | Human Resources |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Raphael Collet, Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Christophe Simonis, Xavier Morel, Jeremy Kersten, GitHub, Barad Mahendra, Nicolas Seinlet, Xavier-Do, Victor Feyens, Julien Mougenot, Tiffany Chang (tic), Kevin Baptiste, Benjamin Vray, Benoit Socias, Florian Charlier, Nicolas Bayet, Michael Mattiello (mcm), Fabio Barbero, niyasraphy, Leonardo Pavan Rocha, Jordan D. (Joda), Karan Bosamia |
| WEBSITE | |
| WEBSITE | |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:25:28 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - base_setup - web - bus - web_tour - web_kanban_gauge |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | Gamification process ==================== The Gamification module provides ways to evaluate and motivate the users of Odoo. The users can be evaluated using goals and numerical objectives to reach. **Goals** are assigned through **challenges** to evaluate and compare members of a team with each others and through time. For non-numerical achievements, **badges** can be granted to users. From a simple "thank you" to an exceptional achievement, a badge is an easy way to exprimate gratitude to a user for their good work. Both goals and badges are flexibles and can be adapted to a large range of modules and actions. When installed, this module creates easy goals to help new users to discover Odoo and configure their user profile. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
badge_form_view |
Badge Form | gamification.badge | form | New |
badge_kanban_view |
Badge Kanban View | gamification.badge | kanban | New |
badge_list_view |
Badge List | gamification.badge | tree | New |
badge_user_kanban_view |
Badge User Kanban View | gamification.badge.user | kanban | New |
challenge_form_view |
Challenge Form | gamification.challenge | form | New |
challenge_line_list_view |
Challenge line list | gamification.challenge.line | tree | New |
challenge_list_view |
Challenges List | gamification.challenge | tree | New |
challenge_search_view |
Challenge Search | gamification.challenge | search | New |
gamification_badge_view_search |
gamification.badge.view.search | gamification.badge | search | New |
gamification_karma_rank_view_form |
gamification.karma.rank.view.form | gamification.karma.rank | form | New |
gamification_karma_ranks_view_search |
gamification.karma.ranks.view.search | gamification.karma.rank | search | New |
gamification_karma_ranks_view_tree |
gamification.karma.ranks.view.tree | gamification.karma.rank | tree | New |
gamification_karma_tracking_view_form |
gamification.karma.tracking.view.form | gamification.karma.tracking | form | New |
gamification_karma_tracking_view_search |
gamification.karma.tracking.view.search | gamification.karma.tracking | search | New |
gamification_karma_tracking_view_tree |
gamification.karma.tracking.view.tree | gamification.karma.tracking | tree | New |
goal_definition_form_view |
Goal Definitions Form | gamification.goal.definition | form | New |
goal_definition_list_view |
Goal Definitions List | gamification.goal.definition | tree | New |
goal_definition_search_view |
Goal Definition Search | gamification.goal.definition | search | New |
goal_form_view |
Goal Form | gamification.goal | form | New |
goal_kanban_view |
Goal Kanban View | gamification.goal | kanban | New |
goal_list_view |
Goal List | gamification.goal | tree | New |
goal_search_view |
Goal Search | gamification.goal | search | New |
res_users_view_form |
res.users.view.form.inherit.gamification | res.users | group | Inherits base.view_users_form |
view_badge_wizard_grant |
Grant Badge User Form | gamification.badge.user.wizard | form | New |
view_challenge_kanban |
Challenge Kanban | gamification.challenge | kanban | New |
view_goal_wizard_update_current |
Update the current value of the Goal | gamification.goal.wizard | form | New |
active
Boolean
default=True
args: 'Active'
challenge_ids
One2many → gamification.challenge
string='Reward of Challenges'
args: 'gamification.challenge', 'reward_id'
description
Html
sanitize_attributes=False
translate=True
args: 'Description'
goal_definition_ids
Many2many → gamification.goal.definition
help='The users that have succeeded theses goals will receive automatically the badge.'
string='Rewarded by'
args: 'gamification.goal.definition', 'badge_unlocked_definition_rel'
granted_count
Integer
compute='_get_owners_info'
help='The number of time this badge has been received.'
args: 'Total'
granted_users_count
Integer
compute='_get_owners_info'
help='The number of time this badge has been received by unique users.'
args: 'Number of users'
level
Selection
default='bronze'
string='Forum Badge Level'
args: [('bronze', 'Bronze'), ('silver', 'Silver'), ('gold', 'Gold')]
name
Char
required=True
translate=True
args: 'Badge'
owner_ids
One2many → gamification.badge.user
help='The list of instances of this badge granted to users'
string='Owners'
args: 'gamification.badge.user', 'badge_id'
remaining_sending
Integer
compute='_remaining_sending_calc'
help='If a maximum is set'
args: 'Remaining Sending Allowed'
rule_auth
Selection
default='everyone'
help='Who can grant this badge'
required=True
string='Allowance to Grant'
args: [('everyone', 'Everyone'), ('users', 'A selected list of users'), ('having', 'People having some badges'), ('nobody', 'No one, assigned through challenges')]
rule_auth_badge_ids
Many2many → gamification.badge
help='Only the people having these badges can give this badge'
string='Required Badges'
args: 'gamification.badge', 'gamification_badge_rule_badge_rel', 'badge1_id', 'badge2_id'
rule_auth_user_ids
Many2many → res.users
help='Only these people can give this badge'
string='Authorized Users'
args: 'res.users', 'rel_badge_auth_users'
rule_max
Boolean
help='Check to set a monthly limit per person of sending this badge'
args: 'Monthly Limited Sending'
rule_max_number
Integer
help='The maximum number of time this badge can be sent per month per person.'
args: 'Limitation Number'
stat_my
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has received this badge.'
args: 'My Total'
stat_my_monthly_sending
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has sent this badge this month.'
args: 'My Monthly Sending Total'
stat_my_this_month
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has received this badge this month.'
args: 'My Monthly Total'
stat_this_month
Integer
compute='_get_badge_user_stats'
help='The number of time this badge has been received this month.'
args: 'Monthly total'
unique_owner_ids
Many2many → res.users
compute='_get_owners_info'
help='The list of unique users having received this badge.'
string='Unique Owners'
args: 'res.users'
check_granting(self)
badge_id
Many2one → gamification.badge
index=True
ondelete='cascade'
required=True
string='Badge'
args: 'gamification.badge'
badge_name
Char
readonly=False
related='badge_id.name'
string='Badge Name'
challenge_id
Many2one → gamification.challenge
help='If this badge was rewarded through a challenge'
string='Challenge originating'
args: 'gamification.challenge'
comment
Text
level
Selection
readonly=True
related='badge_id.level'
store=True
string='Badge Level'
sender_id
Many2one → res.users
help='The user who has send the badge'
string='Sender'
args: 'res.users'
user_id
Many2one → res.users
index=True
ondelete='cascade'
required=True
string='User'
args: 'res.users'
create(self, vals_list)
badge_id
Many2one → gamification.badge
required=True
string='Badge'
args: 'gamification.badge'
comment
Text
user_id
Many2one → res.users
required=True
string='User'
args: 'res.users'
action_grant_badge(self)
challenge_category
Selection
default='hr'
help='Define the visibility of the challenge through menus'
required=True
string='Appears in'
args: [('hr', 'Human Resources / Engagement'), ('other', 'Settings / Gamification Tools')]
description
Text
translate=True
args: 'Description'
end_date
Date
help='The day a new challenge will be automatically closed. If no periodicity is set, will use this date as the goal end date.'
args: 'End Date'
invited_user_ids
Many2many → res.users
string='Suggest to users'
args: 'res.users', 'gamification_invited_user_ids_rel'
last_report_date
Date
default=fields.Date.today
args: 'Last Report Date'
line_ids
One2many → gamification.challenge.line
copy=True
help='List of goals that will be set'
required=True
string='Lines'
args: 'gamification.challenge.line', 'challenge_id'
manager_id
Many2one → res.users
default=<expr>
help='The user responsible for the challenge.'
string='Responsible'
args: 'res.users'
name
Char
required=True
translate=True
args: 'Challenge Name'
next_report_date
Date
compute='_get_next_report_date'
store=True
args: 'Next Report Date'
period
Selection
default='once'
help='Period of automatic goal assigment. If none is selected, should be launched manually.'
required=True
string='Periodicity'
args: [('once', 'Non recurring'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('yearly', 'Yearly')]
remind_update_delay
Integer
help='Never reminded if no value or zero is specified.'
args: 'Non-updated manual goals will be reminded after'
report_message_frequency
Selection
default='never'
required=True
string='Report Frequency'
args: [('never', 'Never'), ('onchange', 'On change'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('yearly', 'Yearly')]
report_message_group_id
Many2one → mail.channel
help='Group that will receive a copy of the report in addition to the user'
string='Send a copy to'
args: 'mail.channel'
report_template_id
Many2one → mail.template
default=<expr>
required=True
string='Report Template'
args: 'mail.template'
reward_failure
Boolean
reward_first_id
Many2one → gamification.badge
string='For 1st user'
args: 'gamification.badge'
reward_id
Many2one → gamification.badge
string='For Every Succeeding User'
args: 'gamification.badge'
reward_realtime
Boolean
default=True
help='With this option enabled, a user can receive a badge only once. The top 3 badges are still rewarded only at the end of the challenge.'
args: 'Reward as soon as every goal is reached'
reward_second_id
Many2one → gamification.badge
string='For 2nd user'
args: 'gamification.badge'
reward_third_id
Many2one → gamification.badge
string='For 3rd user'
args: 'gamification.badge'
start_date
Date
help='The day a new challenge will be automatically started. If no periodicity is set, will use this date as the goal start date.'
args: 'Start Date'
state
Selection
copy=False
default='draft'
required=True
string='State'
tracking=True
args: [('draft', 'Draft'), ('inprogress', 'In Progress'), ('done', 'Done')]
user_domain
Char
help='Alternative to a list of users'
args: 'User domain'
user_ids
Many2many → res.users
help='List of users participating to the challenge'
string='Users'
args: 'res.users', 'gamification_challenge_users_rel'
visibility_mode
Selection
default='personal'
required=True
string='Display Mode'
args: [('personal', 'Individual Goals'), ('ranking', 'Leader Board (Group Ranking)')]
accept_challenge(self)
action_check(self)
action_report_progress(self)
action_start(self)
create(self, vals_list)
discard_challenge(self)
report_progress(self, users=(), subset_goals=False)
write(self, vals)
challenge_id
Many2one → gamification.challenge
ondelete='cascade'
required=True
string='Challenge'
args: 'gamification.challenge'
condition
Selection
readonly=True
related='definition_id.condition'
string='Condition'
definition_full_suffix
Char
readonly=True
related='definition_id.full_suffix'
args: 'Suffix'
definition_id
Many2one → gamification.goal.definition
ondelete='cascade'
required=True
string='Goal Definition'
args: 'gamification.goal.definition'
definition_monetary
Boolean
readonly=True
related='definition_id.monetary'
args: 'Monetary'
definition_suffix
Char
readonly=True
related='definition_id.suffix'
args: 'Unit'
name
Char
readonly=False
related='definition_id.name'
args: 'Name'
sequence
Integer
default=1
help='Sequence number for ordering'
args: 'Sequence'
target_goal
Float
required=True
args: 'Target Value to Reach'
No public methods.
challenge_id
Many2one
help='Challenge that generated the goal, assign challenge to users to generate goals with a value in this field.'
index=True
readonly=True
related='line_id.challenge_id'
store=True
closed
Boolean
help='These goals will not be recomputed.'
args: 'Closed goal'
completeness
Float
compute='_get_completion'
args: 'Completeness'
computation_mode
Selection
readonly=False
related='definition_id.computation_mode'
current
Float
default=0
required=True
args: 'Current Value'
definition_condition
Selection
readonly=True
related='definition_id.condition'
string='Definition Condition'
definition_description
Text
readonly=True
related='definition_id.description'
args: 'Definition Description'
definition_display
Selection
readonly=True
related='definition_id.display_mode'
string='Display Mode'
definition_id
Many2one → gamification.goal.definition
ondelete='cascade'
required=True
string='Goal Definition'
args: 'gamification.goal.definition'
definition_suffix
Char
readonly=True
related='definition_id.full_suffix'
args: 'Suffix'
end_date
Date
last_update
Date
help='In case of manual goal, reminders are sent if the goal as not been updated for a while (defined in challenge). Ignored in case of non-manual goal or goal not linked to a challenge.'
args: 'Last Update'
line_id
Many2one → gamification.challenge.line
ondelete='cascade'
string='Challenge Line'
args: 'gamification.challenge.line'
remind_update_delay
Integer
help='The number of days after which the user assigned to a manual goal will be reminded. Never reminded if no value is specified.'
args: 'Remind delay'
start_date
Date
default=fields.Date.today
args: 'Start Date'
state
Selection
default='draft'
required=True
string='State'
args: [('draft', 'Draft'), ('inprogress', 'In progress'), ('reached', 'Reached'), ('failed', 'Failed'), ('canceled', 'Canceled')]
target_goal
Float
required=True
args: 'To Reach'
to_update
Boolean
user_id
Many2one → res.users
auto_join=True
ondelete='cascade'
required=True
string='User'
args: 'res.users'
action_cancel(self)
action_fail(self)
action_reach(self)
action_start(self)
create(self, vals_list)
get_action(self)
update_goal(self)
write(self, vals)
action_id
Many2one → ir.actions.act_window
help='The action that will be called to update the goal value.'
string='Action'
args: 'ir.actions.act_window'
batch_distinctive_field
Many2one → ir.model.fields
help='In batch mode, this indicates which field distinguishes one user from the other, e.g. user_id, partner_id...'
string='Distinctive field for batch user'
args: 'ir.model.fields'
batch_mode
Boolean
help='Evaluate the expression in batch instead of once for each user'
args: 'Batch Mode'
batch_user_expression
Char
help="The value to compare with the distinctive field. The expression can contain reference to 'user' which is a browse record of the current user, e.g. user.id, user.partner_id.id..."
args: 'Evaluated expression for batch mode'
computation_mode
Selection
default='manually'
help="Define how the goals will be computed. The result of the operation will be stored in the field 'Current'."
required=True
string='Computation Mode'
args: [('manually', 'Recorded manually'), ('count', 'Automatic: number of records'), ('sum', 'Automatic: sum on a field'), ('python', 'Automatic: execute a specific Python code')]
compute_code
Text
help="Python code to be executed for each user. 'result' should contains the new current value. Evaluated user can be access through object.user_id."
args: 'Python Code'
condition
Selection
default='higher'
help='A goal is considered as completed when the current value is compared to the value to reach'
required=True
string='Goal Performance'
args: [('higher', 'The higher the better'), ('lower', 'The lower the better')]
description
Text
display_mode
Selection
default='progress'
required=True
string='Displayed as'
args: [('progress', 'Progressive (using numerical values)'), ('boolean', 'Exclusive (done or not-done)')]
domain
Char
default='[]'
help="Domain for filtering records. General rule, not user depending, e.g. [('state', '=', 'done')]. The expression can contain reference to 'user' which is a browse record of the current user if not in batch mode."
required=True
args: 'Filter Domain'
field_date_id
Many2one → ir.model.fields
domain=<expr>
help='The date to use for the time period evaluated'
string='Date Field'
args: 'ir.model.fields'
field_id
Many2one → ir.model.fields
domain=<expr>
help='The field containing the value to evaluate'
string='Field to Sum'
args: 'ir.model.fields'
full_suffix
Char
compute='_compute_full_suffix'
help='The currency and suffix field'
args: 'Full Suffix'
model_id
Many2one → ir.model
help='The model object for the field to evaluate'
string='Model'
args: 'ir.model'
model_inherited_ids
Many2many → ir.model
related='model_id.inherited_model_ids'
args: 'ir.model'
monetary
Boolean
default=False
help='The target and current value are defined in the company currency.'
args: 'Monetary Value'
name
Char
required=True
translate=True
args: 'Goal Definition'
res_id_field
Char
help='The field name on the user profile (res.users) containing the value for res_id for action.'
args: 'ID Field of user'
suffix
Char
help='The unit of the target and current values'
translate=True
args: 'Suffix'
create(self, vals_list)
write(self, vals)
current
Float
goal_id
Many2one → gamification.goal
required=True
string='Goal'
args: 'gamification.goal'
action_update_current(self)
description
Html
sanitize_attributes=False
string='Description'
translate=html_translate
description_motivational
Html
help='Motivational phrase to reach this rank'
sanitize_attributes=False
string='Motivational'
translate=html_translate
karma_min
Integer
default=1
help='Minimum karma needed to reach this rank'
required=True
string='Required Karma'
name
Text
required=True
string='Rank Name'
translate=True
rank_users_count
Integer
compute='_compute_rank_users_count'
args: '# Users'
user_ids
One2many → res.users
help='Users having this rank'
string='Users'
args: 'res.users', 'rank_id'
create(self, values_list)
write(self, vals)
consolidated
Boolean
new_value
Integer
readonly=True
required=True
args: 'New Karma Value'
old_value
Integer
readonly=True
required=True
args: 'Old Karma Value'
tracking_date
Date
default=fields.Date.context_today
user_id
Many2one → res.users
index=True
ondelete='cascade'
readonly=True
required=True
args: 'res.users', 'User'
No public methods.
badge_ids
One2many → gamification.badge.user
copy=False
string='Badges'
args: 'gamification.badge.user', 'user_id'
bronze_badge
Integer
compute='_get_user_badge_level'
args: 'Bronze badges count'
gold_badge
Integer
compute='_get_user_badge_level'
args: 'Gold badges count'
karma
Integer
copy=False
default=0
args: 'Karma'
karma_tracking_ids
One2many → gamification.karma.tracking
groups='base.group_system'
string='Karma Changes'
args: 'gamification.karma.tracking', 'user_id'
next_rank_id
Many2one → gamification.karma.rank
index=False
args: 'gamification.karma.rank', 'Next Rank'
rank_id
Many2one → gamification.karma.rank
index=False
args: 'gamification.karma.rank', 'Rank'
silver_badge
Integer
compute='_get_user_badge_level'
args: 'Silver badges count'
add_karma(self, karma)
create(self, values_list)
get_gamification_redirection_data(self)
write(self, vals)
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/14.0/gamification |
| VERSION | |
| VERSION | 1.0 |
| CATEGORY | |
| CATEGORY | Human Resources |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Christophe Simonis, Xavier Morel, Nicolas Martinelli, Jeremy Kersten, GitHub, Yannick Tivisse, Nicolas Seinlet, Aurélien Warnon, Xavier-Do, Victor Feyens, Sébastien Theys, fw-bot, David Beguin, Kevin Baptiste, Benjamin Vray, Florian Charlier, Patrick Hoste, Fabio Barbero, niyasraphy |
| WEBSITE | |
| WEBSITE | |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:14:29 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - base_setup - web - bus - web_tour - web_kanban_gauge |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | Gamification process ==================== The Gamification module provides ways to evaluate and motivate the users of Odoo. The users can be evaluated using goals and numerical objectives to reach. **Goals** are assigned through **challenges** to evaluate and compare members of a team with each others and through time. For non-numerical achievements, **badges** can be granted to users. From a simple "thank you" to an exceptional achievement, a badge is an easy way to exprimate gratitude to a user for their good work. Both goals and badges are flexibles and can be adapted to a large range of modules and actions. When installed, this module creates easy goals to help new users to discover Odoo and configure their user profile. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
assets_backend |
gamification assets | ir.ui.view | qweb | Inherits web.assets_backend |
badge_form_view |
Badge Form | gamification.badge | form | New |
badge_kanban_view |
Badge Kanban View | gamification.badge | kanban | New |
badge_list_view |
Badge List | gamification.badge | tree | New |
badge_user_kanban_view |
Badge User Kanban View | gamification.badge.user | kanban | New |
challenge_form_view |
Challenge Form | gamification.challenge | form | New |
challenge_line_list_view |
Challenge line list | gamification.challenge.line | tree | New |
challenge_list_view |
Challenges List | gamification.challenge | tree | New |
challenge_search_view |
Challenge Search | gamification.challenge | search | New |
gamification_badge_view_search |
gamification.badge.view.search | gamification.badge | search | New |
gamification_karma_rank_view_form |
gamification.karma.rank.view.form | gamification.karma.rank | form | New |
gamification_karma_ranks_view_search |
gamification.karma.ranks.view.search | gamification.karma.rank | search | New |
gamification_karma_ranks_view_tree |
gamification.karma.ranks.view.tree | gamification.karma.rank | tree | New |
gamification_karma_tracking_view_form |
gamification.karma.tracking.view.form | gamification.karma.tracking | form | New |
gamification_karma_tracking_view_search |
gamification.karma.tracking.view.search | gamification.karma.tracking | search | New |
gamification_karma_tracking_view_tree |
gamification.karma.tracking.view.tree | gamification.karma.tracking | tree | New |
goal_definition_form_view |
Goal Definitions Form | gamification.goal.definition | form | New |
goal_definition_list_view |
Goal Definitions List | gamification.goal.definition | tree | New |
goal_definition_search_view |
Goal Definition Search | gamification.goal.definition | search | New |
goal_form_view |
Goal Form | gamification.goal | form | New |
goal_kanban_view |
Goal Kanban View | gamification.goal | kanban | New |
goal_list_view |
Goal List | gamification.goal | tree | New |
goal_search_view |
Goal Search | gamification.goal | search | New |
res_users_view_form |
res.users.view.form.inherit.gamification | res.users | group | Inherits base.view_users_form |
view_badge_wizard_grant |
Grant Badge User Form | gamification.badge.user.wizard | form | New |
view_challenge_kanban |
Challenge Kanban | gamification.challenge | kanban | New |
view_goal_wizard_update_current |
Update the current value of the Goal | gamification.goal.wizard | form | New |
active
Boolean
default=True
args: 'Active'
challenge_ids
One2many → gamification.challenge
string='Reward of Challenges'
args: 'gamification.challenge', 'reward_id'
description
Text
translate=True
args: 'Description'
goal_definition_ids
Many2many → gamification.goal.definition
help='The users that have succeeded theses goals will receive automatically the badge.'
string='Rewarded by'
args: 'gamification.goal.definition', 'badge_unlocked_definition_rel'
granted_count
Integer
compute='_get_owners_info'
help='The number of time this badge has been received.'
args: 'Total'
granted_users_count
Integer
compute='_get_owners_info'
help='The number of time this badge has been received by unique users.'
args: 'Number of users'
level
Selection
default='bronze'
string='Forum Badge Level'
args: [('bronze', 'Bronze'), ('silver', 'Silver'), ('gold', 'Gold')]
name
Char
required=True
translate=True
args: 'Badge'
owner_ids
One2many → gamification.badge.user
help='The list of instances of this badge granted to users'
string='Owners'
args: 'gamification.badge.user', 'badge_id'
remaining_sending
Integer
compute='_remaining_sending_calc'
help='If a maximum is set'
args: 'Remaining Sending Allowed'
rule_auth
Selection
default='everyone'
help='Who can grant this badge'
required=True
string='Allowance to Grant'
args: [('everyone', 'Everyone'), ('users', 'A selected list of users'), ('having', 'People having some badges'), ('nobody', 'No one, assigned through challenges')]
rule_auth_badge_ids
Many2many → gamification.badge
help='Only the people having these badges can give this badge'
string='Required Badges'
args: 'gamification.badge', 'gamification_badge_rule_badge_rel', 'badge1_id', 'badge2_id'
rule_auth_user_ids
Many2many → res.users
help='Only these people can give this badge'
string='Authorized Users'
args: 'res.users', 'rel_badge_auth_users'
rule_max
Boolean
help='Check to set a monthly limit per person of sending this badge'
args: 'Monthly Limited Sending'
rule_max_number
Integer
help='The maximum number of time this badge can be sent per month per person.'
args: 'Limitation Number'
stat_my
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has received this badge.'
args: 'My Total'
stat_my_monthly_sending
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has sent this badge this month.'
args: 'My Monthly Sending Total'
stat_my_this_month
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has received this badge this month.'
args: 'My Monthly Total'
stat_this_month
Integer
compute='_get_badge_user_stats'
help='The number of time this badge has been received this month.'
args: 'Monthly total'
unique_owner_ids
Many2many → res.users
compute='_get_owners_info'
help='The list of unique users having received this badge.'
string='Unique Owners'
args: 'res.users'
check_granting(self)
badge_id
Many2one → gamification.badge
index=True
ondelete='cascade'
required=True
string='Badge'
args: 'gamification.badge'
badge_name
Char
readonly=False
related='badge_id.name'
string='Badge Name'
challenge_id
Many2one → gamification.challenge
help='If this badge was rewarded through a challenge'
string='Challenge originating'
args: 'gamification.challenge'
comment
Text
level
Selection
readonly=True
related='badge_id.level'
store=True
string='Badge Level'
sender_id
Many2one → res.users
help='The user who has send the badge'
string='Sender'
args: 'res.users'
user_id
Many2one → res.users
index=True
ondelete='cascade'
required=True
string='User'
args: 'res.users'
create(self, vals)
badge_id
Many2one → gamification.badge
required=True
string='Badge'
args: 'gamification.badge'
comment
Text
user_id
Many2one → res.users
required=True
string='User'
args: 'res.users'
action_grant_badge(self)
challenge_category
Selection
default='hr'
help='Define the visibility of the challenge through menus'
required=True
string='Appears in'
args: [('hr', 'Human Resources / Engagement'), ('other', 'Settings / Gamification Tools')]
description
Text
translate=True
args: 'Description'
end_date
Date
help='The day a new challenge will be automatically closed. If no periodicity is set, will use this date as the goal end date.'
args: 'End Date'
invited_user_ids
Many2many → res.users
string='Suggest to users'
args: 'res.users', 'gamification_invited_user_ids_rel'
last_report_date
Date
default=fields.Date.today
args: 'Last Report Date'
line_ids
One2many → gamification.challenge.line
copy=True
help='List of goals that will be set'
required=True
string='Lines'
args: 'gamification.challenge.line', 'challenge_id'
manager_id
Many2one → res.users
default=<expr>
help='The user responsible for the challenge.'
string='Responsible'
args: 'res.users'
name
Char
required=True
translate=True
args: 'Challenge Name'
next_report_date
Date
compute='_get_next_report_date'
store=True
args: 'Next Report Date'
period
Selection
default='once'
help='Period of automatic goal assigment. If none is selected, should be launched manually.'
required=True
string='Periodicity'
args: [('once', 'Non recurring'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('yearly', 'Yearly')]
remind_update_delay
Integer
help='Never reminded if no value or zero is specified.'
args: 'Non-updated manual goals will be reminded after'
report_message_frequency
Selection
default='never'
required=True
string='Report Frequency'
args: [('never', 'Never'), ('onchange', 'On change'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('yearly', 'Yearly')]
report_message_group_id
Many2one → mail.channel
help='Group that will receive a copy of the report in addition to the user'
string='Send a copy to'
args: 'mail.channel'
report_template_id
Many2one → mail.template
default=<expr>
required=True
string='Report Template'
args: 'mail.template'
reward_failure
Boolean
reward_first_id
Many2one → gamification.badge
string='For 1st user'
args: 'gamification.badge'
reward_id
Many2one → gamification.badge
string='For Every Succeeding User'
args: 'gamification.badge'
reward_realtime
Boolean
default=True
help='With this option enabled, a user can receive a badge only once. The top 3 badges are still rewarded only at the end of the challenge.'
args: 'Reward as soon as every goal is reached'
reward_second_id
Many2one → gamification.badge
string='For 2nd user'
args: 'gamification.badge'
reward_third_id
Many2one → gamification.badge
string='For 3rd user'
args: 'gamification.badge'
start_date
Date
help='The day a new challenge will be automatically started. If no periodicity is set, will use this date as the goal start date.'
args: 'Start Date'
state
Selection
copy=False
default='draft'
required=True
string='State'
tracking=True
args: [('draft', 'Draft'), ('inprogress', 'In Progress'), ('done', 'Done')]
user_domain
Char
help='Alternative to a list of users'
args: 'User domain'
user_ids
Many2many → res.users
help='List of users participating to the challenge'
string='Users'
args: 'res.users', 'gamification_challenge_users_rel'
visibility_mode
Selection
default='personal'
required=True
string='Display Mode'
args: [('personal', 'Individual Goals'), ('ranking', 'Leader Board (Group Ranking)')]
accept_challenge(self)
action_check(self)
action_report_progress(self)
action_start(self)
create(self, vals)
discard_challenge(self)
report_progress(self, users=(), subset_goals=False)
write(self, vals)
challenge_id
Many2one → gamification.challenge
ondelete='cascade'
required=True
string='Challenge'
args: 'gamification.challenge'
condition
Selection
readonly=True
related='definition_id.condition'
string='Condition'
definition_full_suffix
Char
readonly=True
related='definition_id.full_suffix'
args: 'Suffix'
definition_id
Many2one → gamification.goal.definition
ondelete='cascade'
required=True
string='Goal Definition'
args: 'gamification.goal.definition'
definition_monetary
Boolean
readonly=True
related='definition_id.monetary'
args: 'Monetary'
definition_suffix
Char
readonly=True
related='definition_id.suffix'
args: 'Unit'
name
Char
readonly=False
related='definition_id.name'
args: 'Name'
sequence
Integer
default=1
help='Sequence number for ordering'
args: 'Sequence'
target_goal
Float
required=True
args: 'Target Value to Reach'
No public methods.
challenge_id
Many2one
help='Challenge that generated the goal, assign challenge to users to generate goals with a value in this field.'
index=True
readonly=True
related='line_id.challenge_id'
store=True
closed
Boolean
help='These goals will not be recomputed.'
args: 'Closed goal'
completeness
Float
compute='_get_completion'
args: 'Completeness'
computation_mode
Selection
readonly=False
related='definition_id.computation_mode'
current
Float
default=0
required=True
args: 'Current Value'
definition_condition
Selection
readonly=True
related='definition_id.condition'
string='Definition Condition'
definition_description
Text
readonly=True
related='definition_id.description'
args: 'Definition Description'
definition_display
Selection
readonly=True
related='definition_id.display_mode'
string='Display Mode'
definition_id
Many2one → gamification.goal.definition
ondelete='cascade'
required=True
string='Goal Definition'
args: 'gamification.goal.definition'
definition_suffix
Char
readonly=True
related='definition_id.full_suffix'
args: 'Suffix'
end_date
Date
last_update
Date
help='In case of manual goal, reminders are sent if the goal as not been updated for a while (defined in challenge). Ignored in case of non-manual goal or goal not linked to a challenge.'
args: 'Last Update'
line_id
Many2one → gamification.challenge.line
ondelete='cascade'
string='Challenge Line'
args: 'gamification.challenge.line'
remind_update_delay
Integer
help='The number of days after which the user assigned to a manual goal will be reminded. Never reminded if no value is specified.'
args: 'Remind delay'
start_date
Date
default=fields.Date.today
args: 'Start Date'
state
Selection
default='draft'
required=True
string='State'
args: [('draft', 'Draft'), ('inprogress', 'In progress'), ('reached', 'Reached'), ('failed', 'Failed'), ('canceled', 'Canceled')]
target_goal
Float
required=True
args: 'To Reach'
to_update
Boolean
user_id
Many2one → res.users
auto_join=True
ondelete='cascade'
required=True
string='User'
args: 'res.users'
action_cancel(self)
action_fail(self)
action_reach(self)
action_start(self)
create(self, vals)
get_action(self)
update_goal(self)
write(self, vals)
action_id
Many2one → ir.actions.act_window
help='The action that will be called to update the goal value.'
string='Action'
args: 'ir.actions.act_window'
batch_distinctive_field
Many2one → ir.model.fields
help='In batch mode, this indicates which field distinguishes one user from the other, e.g. user_id, partner_id...'
string='Distinctive field for batch user'
args: 'ir.model.fields'
batch_mode
Boolean
help='Evaluate the expression in batch instead of once for each user'
args: 'Batch Mode'
batch_user_expression
Char
help="The value to compare with the distinctive field. The expression can contain reference to 'user' which is a browse record of the current user, e.g. user.id, user.partner_id.id..."
args: 'Evaluated expression for batch mode'
computation_mode
Selection
default='manually'
help="Define how the goals will be computed. The result of the operation will be stored in the field 'Current'."
required=True
string='Computation Mode'
args: [('manually', 'Recorded manually'), ('count', 'Automatic: number of records'), ('sum', 'Automatic: sum on a field'), ('python', 'Automatic: execute a specific Python code')]
compute_code
Text
help="Python code to be executed for each user. 'result' should contains the new current value. Evaluated user can be access through object.user_id."
args: 'Python Code'
condition
Selection
default='higher'
help='A goal is considered as completed when the current value is compared to the value to reach'
required=True
string='Goal Performance'
args: [('higher', 'The higher the better'), ('lower', 'The lower the better')]
description
Text
display_mode
Selection
default='progress'
required=True
string='Displayed as'
args: [('progress', 'Progressive (using numerical values)'), ('boolean', 'Exclusive (done or not-done)')]
domain
Char
default='[]'
help="Domain for filtering records. General rule, not user depending, e.g. [('state', '=', 'done')]. The expression can contain reference to 'user' which is a browse record of the current user if not in batch mode."
required=True
args: 'Filter Domain'
field_date_id
Many2one → ir.model.fields
domain=<expr>
help='The date to use for the time period evaluated'
string='Date Field'
args: 'ir.model.fields'
field_id
Many2one → ir.model.fields
domain=<expr>
help='The field containing the value to evaluate'
string='Field to Sum'
args: 'ir.model.fields'
full_suffix
Char
compute='_compute_full_suffix'
help='The currency and suffix field'
args: 'Full Suffix'
model_id
Many2one → ir.model
help='The model object for the field to evaluate'
string='Model'
args: 'ir.model'
model_inherited_ids
Many2many → ir.model
related='model_id.inherited_model_ids'
args: 'ir.model'
monetary
Boolean
default=False
help='The target and current value are defined in the company currency.'
args: 'Monetary Value'
name
Char
required=True
translate=True
args: 'Goal Definition'
res_id_field
Char
help='The field name on the user profile (res.users) containing the value for res_id for action.'
args: 'ID Field of user'
suffix
Char
help='The unit of the target and current values'
translate=True
args: 'Suffix'
create(self, vals)
write(self, vals)
current
Float
goal_id
Many2one → gamification.goal
required=True
string='Goal'
args: 'gamification.goal'
action_update_current(self)
description
Html
sanitize_attributes=False
string='Description'
translate=html_translate
description_motivational
Html
help='Motivational phrase to reach this rank'
sanitize_attributes=False
string='Motivational'
translate=html_translate
karma_min
Integer
default=1
help='Minimum karma needed to reach this rank'
required=True
string='Required Karma'
name
Text
required=True
string='Rank Name'
translate=True
rank_users_count
Integer
compute='_compute_rank_users_count'
args: '# Users'
user_ids
One2many → res.users
help='Users having this rank'
string='Users'
args: 'res.users', 'rank_id'
create(self, values_list)
write(self, vals)
consolidated
Boolean
new_value
Integer
readonly=True
required=True
args: 'New Karma Value'
old_value
Integer
readonly=True
required=True
args: 'Old Karma Value'
tracking_date
Date
default=fields.Date.context_today
user_id
Many2one → res.users
index=True
ondelete='cascade'
readonly=True
required=True
args: 'res.users', 'User'
No public methods.
badge_ids
One2many → gamification.badge.user
copy=False
string='Badges'
args: 'gamification.badge.user', 'user_id'
bronze_badge
Integer
compute='_get_user_badge_level'
args: 'Bronze badges count'
gold_badge
Integer
compute='_get_user_badge_level'
args: 'Gold badges count'
karma
Integer
copy=False
default=0
args: 'Karma'
karma_tracking_ids
One2many → gamification.karma.tracking
groups='base.group_system'
string='Karma Changes'
args: 'gamification.karma.tracking', 'user_id'
next_rank_id
Many2one → gamification.karma.rank
index=False
args: 'gamification.karma.rank', 'Next Rank'
rank_id
Many2one → gamification.karma.rank
index=False
args: 'gamification.karma.rank', 'Rank'
silver_badge
Integer
compute='_get_user_badge_level'
args: 'Silver badges count'
add_karma(self, karma)
create(self, values_list)
get_gamification_redirection_data(self)
write(self, vals)
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/13.0/gamification |
| VERSION | |
| VERSION | 1.0 |
| CATEGORY | |
| CATEGORY | Human Resources |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Raphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Nicolas Martinelli, Jeremy Kersten, Yannick Tivisse, qsm-odoo, Odoo Online, Adrien Dieudonne, Jorge Pinna Puissant, Alexandre Kühn, Adrian Torres, Aurélien Warnon, Xavier-Do, Sébastien Theys, fw-bot, Rémy Baranx (bar), Achraf (abz), David Beguin, fja-odoo, Yenthe666 |
| WEBSITE | |
| WEBSITE | |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:06:42 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - base_setup - web - bus - web_tour - web_kanban_gauge |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | Gamification process ==================== The Gamification module provides ways to evaluate and motivate the users of Odoo. The users can be evaluated using goals and numerical objectives to reach. **Goals** are assigned through **challenges** to evaluate and compare members of a team with each others and through time. For non-numerical achievements, **badges** can be granted to users. From a simple "thank you" to an exceptional achievement, a badge is an easy way to exprimate gratitude to a user for their good work. Both goals and badges are flexibles and can be adapted to a large range of modules and actions. When installed, this module creates easy goals to help new users to discover Odoo and configure their user profile. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
assets_backend |
gamification assets | ir.ui.view | qweb | Inherits web.assets_backend |
badge_form_view |
Badge Form | gamification.badge | form | New |
badge_kanban_view |
Badge Kanban View | gamification.badge | kanban | New |
badge_list_view |
Badge List | gamification.badge | tree | New |
badge_user_kanban_view |
Badge User Kanban View | gamification.badge.user | kanban | New |
challenge_form_view |
Challenge Form | gamification.challenge | form | New |
challenge_line_list_view |
Challenge line list | gamification.challenge.line | tree | New |
challenge_list_view |
Challenges List | gamification.challenge | tree | New |
challenge_search_view |
Challenge Search | gamification.challenge | search | New |
gamification_badge_view_search |
gamification.badge.view.search | gamification.badge | search | New |
gamification_karma_rank_view_form |
gamification.karma.rank.view.form | gamification.karma.rank | form | New |
gamification_karma_ranks_view_search |
gamification.karma.ranks.view.search | gamification.karma.rank | search | New |
gamification_karma_ranks_view_tree |
gamification.karma.ranks.view.tree | gamification.karma.rank | tree | New |
goal_definition_form_view |
Goal Definitions Form | gamification.goal.definition | form | New |
goal_definition_list_view |
Goal Definitions List | gamification.goal.definition | tree | New |
goal_definition_search_view |
Goal Definition Search | gamification.goal.definition | search | New |
goal_form_view |
Goal Form | gamification.goal | form | New |
goal_kanban_view |
Goal Kanban View | gamification.goal | kanban | New |
goal_list_view |
Goal List | gamification.goal | tree | New |
goal_search_view |
Goal Search | gamification.goal | search | New |
view_badge_wizard_grant |
Grant Badge User Form | gamification.badge.user.wizard | form | New |
view_challenge_kanban |
Challenge Kanban | gamification.challenge | kanban | New |
view_goal_wizard_update_current |
Update the current value of the Goal | gamification.goal.wizard | form | New |
active
Boolean
default=True
args: 'Active'
challenge_ids
One2many → gamification.challenge
string='Reward of Challenges'
args: 'gamification.challenge', 'reward_id'
description
Text
translate=True
args: 'Description'
goal_definition_ids
Many2many → gamification.goal.definition
help='The users that have succeeded theses goals will receive automatically the badge.'
string='Rewarded by'
args: 'gamification.goal.definition', 'badge_unlocked_definition_rel'
level
Selection
default='bronze'
string='Forum Badge Level'
args: [('bronze', 'Bronze'), ('silver', 'Silver'), ('gold', 'Gold')]
name
Char
required=True
translate=True
args: 'Badge'
owner_ids
One2many → gamification.badge.user
help='The list of instances of this badge granted to users'
string='Owners'
args: 'gamification.badge.user', 'badge_id'
remaining_sending
Integer
compute='_remaining_sending_calc'
help='If a maximum is set'
args: 'Remaining Sending Allowed'
rule_auth
Selection
default='everyone'
help='Who can grant this badge'
required=True
string='Allowance to Grant'
args: [('everyone', 'Everyone'), ('users', 'A selected list of users'), ('having', 'People having some badges'), ('nobody', 'No one, assigned through challenges')]
rule_auth_badge_ids
Many2many → gamification.badge
help='Only the people having these badges can give this badge'
string='Required Badges'
args: 'gamification.badge', 'gamification_badge_rule_badge_rel', 'badge1_id', 'badge2_id'
rule_auth_user_ids
Many2many → res.users
help='Only these people can give this badge'
string='Authorized Users'
args: 'res.users', 'rel_badge_auth_users'
rule_max
Boolean
help='Check to set a monthly limit per person of sending this badge'
args: 'Monthly Limited Sending'
rule_max_number
Integer
help='The maximum number of time this badge can be sent per month per person.'
args: 'Limitation Number'
stat_count
Integer
compute='_get_owners_info'
help='The number of time this badge has been received.'
args: 'Total'
stat_count_distinct
Integer
compute='_get_owners_info'
help='The number of time this badge has been received by unique users.'
args: 'Number of users'
stat_my
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has received this badge.'
args: 'My Total'
stat_my_monthly_sending
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has sent this badge this month.'
args: 'My Monthly Sending Total'
stat_my_this_month
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has received this badge this month.'
args: 'My Monthly Total'
stat_this_month
Integer
compute='_get_badge_user_stats'
help='The number of time this badge has been received this month.'
args: 'Monthly total'
unique_owner_ids
Many2many → res.users
compute='_get_owners_info'
help='The list of unique users having received this badge.'
string='Unique Owners'
args: 'res.users'
check_granting(self)
badge_id
Many2one → gamification.badge
index=True
ondelete='cascade'
required=True
string='Badge'
args: 'gamification.badge'
badge_name
Char
readonly=False
related='badge_id.name'
string='Badge Name'
challenge_id
Many2one → gamification.challenge
help='If this badge was rewarded through a challenge'
string='Challenge originating'
args: 'gamification.challenge'
comment
Text
level
Selection
readonly=True
related='badge_id.level'
store=True
string='Badge Level'
args: [('bronze', 'Bronze'), ('silver', 'Silver'), ('gold', 'Gold')]
sender_id
Many2one → res.users
help='The user who has send the badge'
string='Sender'
args: 'res.users'
user_id
Many2one → res.users
index=True
ondelete='cascade'
required=True
string='User'
args: 'res.users'
create(self, vals)
badge_id
Many2one → gamification.badge
required=True
string='Badge'
args: 'gamification.badge'
comment
Text
user_id
Many2one → res.users
required=True
string='User'
args: 'res.users'
action_grant_badge(self)
category
Selection
default='hr'
help='Define the visibility of the challenge through menus'
required=True
string='Appears in'
args: [('hr', 'Human Resources / Engagement'), ('other', 'Settings / Gamification Tools')]
description
Text
translate=True
args: 'Description'
end_date
Date
help='The day a new challenge will be automatically closed. If no periodicity is set, will use this date as the goal end date.'
args: 'End Date'
invited_user_ids
Many2many → res.users
string='Suggest to users'
args: 'res.users', 'gamification_invited_user_ids_rel'
last_report_date
Date
default=fields.Date.today
args: 'Last Report Date'
line_ids
One2many → gamification.challenge.line
copy=True
help='List of goals that will be set'
required=True
string='Lines'
args: 'gamification.challenge.line', 'challenge_id'
manager_id
Many2one → res.users
default=<expr>
help='The user responsible for the challenge.'
string='Responsible'
args: 'res.users'
name
Char
required=True
translate=True
args: 'Challenge Name'
next_report_date
Date
compute='_get_next_report_date'
store=True
args: 'Next Report Date'
period
Selection
default='once'
help='Period of automatic goal assigment. If none is selected, should be launched manually.'
required=True
string='Periodicity'
args: [('once', 'Non recurring'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('yearly', 'Yearly')]
remind_update_delay
Integer
help='Never reminded if no value or zero is specified.'
args: 'Non-updated manual goals will be reminded after'
report_message_frequency
Selection
default='never'
required=True
string='Report Frequency'
args: [('never', 'Never'), ('onchange', 'On change'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('yearly', 'Yearly')]
report_message_group_id
Many2one → mail.channel
help='Group that will receive a copy of the report in addition to the user'
string='Send a copy to'
args: 'mail.channel'
report_template_id
Many2one → mail.template
default=<expr>
required=True
string='Report Template'
args: 'mail.template'
reward_failure
Boolean
reward_first_id
Many2one → gamification.badge
string='For 1st user'
args: 'gamification.badge'
reward_id
Many2one → gamification.badge
string='For Every Succeeding User'
args: 'gamification.badge'
reward_realtime
Boolean
default=True
help='With this option enabled, a user can receive a badge only once. The top 3 badges are still rewarded only at the end of the challenge.'
args: 'Reward as soon as every goal is reached'
reward_second_id
Many2one → gamification.badge
string='For 2nd user'
args: 'gamification.badge'
reward_third_id
Many2one → gamification.badge
string='For 3rd user'
args: 'gamification.badge'
start_date
Date
help='The day a new challenge will be automatically started. If no periodicity is set, will use this date as the goal start date.'
args: 'Start Date'
state
Selection
copy=False
default='draft'
required=True
string='State'
tracking=True
args: [('draft', 'Draft'), ('inprogress', 'In Progress'), ('done', 'Done')]
user_domain
Char
help='Alternative to a list of users'
args: 'User domain'
user_ids
Many2many → res.users
help='List of users participating to the challenge'
string='Users'
args: 'res.users', 'gamification_challenge_users_rel'
visibility_mode
Selection
default='personal'
required=True
string='Display Mode'
args: [('personal', 'Individual Goals'), ('ranking', 'Leader Board (Group Ranking)')]
accept_challenge(self)
action_check(self)
action_report_progress(self)
action_start(self)
create(self, vals)
discard_challenge(self)
report_progress(self, users=(), subset_goals=False)
write(self, vals)
challenge_id
Many2one → gamification.challenge
ondelete='cascade'
required=True
string='Challenge'
args: 'gamification.challenge'
condition
Selection
readonly=True
related='definition_id.condition'
args: 'Condition'
definition_full_suffix
Char
readonly=True
related='definition_id.full_suffix'
args: 'Suffix'
definition_id
Many2one → gamification.goal.definition
ondelete='cascade'
required=True
string='Goal Definition'
args: 'gamification.goal.definition'
definition_monetary
Boolean
readonly=True
related='definition_id.monetary'
args: 'Monetary'
definition_suffix
Char
readonly=True
related='definition_id.suffix'
args: 'Unit'
name
Char
readonly=False
related='definition_id.name'
args: 'Name'
sequence
Integer
default=1
help='Sequence number for ordering'
args: 'Sequence'
target_goal
Float
required=True
args: 'Target Value to Reach'
No public methods.
challenge_id
Many2one
help='Challenge that generated the goal, assign challenge to users to generate goals with a value in this field.'
readonly=True
related='line_id.challenge_id'
store=True
closed
Boolean
help='These goals will not be recomputed.'
args: 'Closed goal'
completeness
Float
compute='_get_completion'
args: 'Completeness'
computation_mode
Selection
readonly=False
related='definition_id.computation_mode'
current
Float
default=0
required=True
tracking=True
args: 'Current Value'
definition_condition
Selection
readonly=True
related='definition_id.condition'
args: 'Definition Condition'
definition_description
Text
readonly=True
related='definition_id.description'
args: 'Definition Description'
definition_display
Selection
readonly=True
related='definition_id.display_mode'
args: 'Display Mode'
definition_id
Many2one → gamification.goal.definition
ondelete='cascade'
required=True
string='Goal Definition'
args: 'gamification.goal.definition'
definition_suffix
Char
readonly=True
related='definition_id.full_suffix'
args: 'Suffix'
end_date
Date
last_update
Date
help='In case of manual goal, reminders are sent if the goal as not been updated for a while (defined in challenge). Ignored in case of non-manual goal or goal not linked to a challenge.'
args: 'Last Update'
line_id
Many2one → gamification.challenge.line
ondelete='cascade'
string='Challenge Line'
args: 'gamification.challenge.line'
remind_update_delay
Integer
help='The number of days after which the user assigned to a manual goal will be reminded. Never reminded if no value is specified.'
args: 'Remind delay'
start_date
Date
default=fields.Date.today
args: 'Start Date'
state
Selection
default='draft'
required=True
string='State'
tracking=True
args: [('draft', 'Draft'), ('inprogress', 'In progress'), ('reached', 'Reached'), ('failed', 'Failed'), ('canceled', 'Canceled')]
target_goal
Float
required=True
tracking=True
args: 'To Reach'
to_update
Boolean
user_id
Many2one → res.users
auto_join=True
ondelete='cascade'
required=True
string='User'
args: 'res.users'
action_cancel(self)
action_fail(self)
action_reach(self)
action_start(self)
create(self, vals)
get_action(self)
update_goal(self)
write(self, vals)
action_id
Many2one → ir.actions.act_window
help='The action that will be called to update the goal value.'
string='Action'
args: 'ir.actions.act_window'
batch_distinctive_field
Many2one → ir.model.fields
help='In batch mode, this indicates which field distinct one user form the other, e.g. user_id, partner_id...'
string='Distinctive field for batch user'
args: 'ir.model.fields'
batch_mode
Boolean
help='Evaluate the expression in batch instead of once for each user'
args: 'Batch Mode'
batch_user_expression
Char
help="The value to compare with the distinctive field. The expression can contain reference to 'user' which is a browse record of the current user, e.g. user.id, user.partner_id.id..."
args: 'Evaluated expression for batch mode'
computation_mode
Selection
default='manually'
help="Defined how will be computed the goals. The result of the operation will be stored in the field 'Current'."
required=True
string='Computation Mode'
args: [('manually', 'Recorded manually'), ('count', 'Automatic: number of records'), ('sum', 'Automatic: sum on a field'), ('python', 'Automatic: execute a specific Python code')]
compute_code
Text
help="Python code to be executed for each user. 'result' should contains the new current value. Evaluated user can be access through object.user_id."
args: 'Python Code'
condition
Selection
default='higher'
help='A goal is considered as completed when the current value is compared to the value to reach'
required=True
string='Goal Performance'
args: [('higher', 'The higher the better'), ('lower', 'The lower the better')]
description
Text
display_mode
Selection
default='progress'
required=True
string='Displayed as'
args: [('progress', 'Progressive (using numerical values)'), ('boolean', 'Exclusive (done or not-done)')]
domain
Char
default='[]'
help="Domain for filtering records. General rule, not user depending, e.g. [('state', '=', 'done')]. The expression can contain reference to 'user' which is a browse record of the current user if not in batch mode."
required=True
args: 'Filter Domain'
field_date_id
Many2one → ir.model.fields
help='The date to use for the time period evaluated'
string='Date Field'
args: 'ir.model.fields'
field_id
Many2one → ir.model.fields
help='The field containing the value to evaluate'
string='Field to Sum'
args: 'ir.model.fields'
full_suffix
Char
compute='_compute_full_suffix'
help='The currency and suffix field'
args: 'Full Suffix'
model_id
Many2one → ir.model
help='The model object for the field to evaluate'
string='Model'
args: 'ir.model'
monetary
Boolean
default=False
help='The target and current value are defined in the company currency.'
args: 'Monetary Value'
name
Char
required=True
translate=True
args: 'Goal Definition'
res_id_field
Char
help='The field name on the user profile (res.users) containing the value for res_id for action.'
args: 'ID Field of user'
suffix
Char
help='The unit of the target and current values'
translate=True
args: 'Suffix'
create(self, vals)
write(self, vals)
current
Float
goal_id
Many2one → gamification.goal
required=True
string='Goal'
args: 'gamification.goal'
action_update_current(self)
description
Html
sanitize_attributes=False
string='Description'
translate=html_translate
description_motivational
Html
help='Motivational phrase to reach this rank'
sanitize_attributes=False
string='Motivational'
translate=html_translate
karma_min
Integer
help='Minimum karma needed to reach this rank'
string='Required Karma'
name
Text
required=True
string='Rank Name'
translate=True
user_ids
One2many → res.users
help='Users having this rank'
string='Users'
args: 'res.users', 'rank_id'
create(self, values_list)
write(self, vals)
badge_ids
One2many → gamification.badge.user
copy=False
string='Badges'
args: 'gamification.badge.user', 'user_id'
bronze_badge
Integer
compute='_get_user_badge_level'
args: 'Bronze badges count'
gold_badge
Integer
compute='_get_user_badge_level'
args: 'Gold badges count'
karma
Integer
default=0
args: 'Karma'
next_rank_id
Many2one → gamification.karma.rank
index=False
args: 'gamification.karma.rank', 'Next Rank'
rank_id
Many2one → gamification.karma.rank
index=False
args: 'gamification.karma.rank', 'Rank'
silver_badge
Integer
compute='_get_user_badge_level'
args: 'Silver badges count'
add_karma(self, karma)
create(self, values_list)
get_gamification_redirection_data(self)
write(self, vals)
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/12.0/gamification |
| VERSION | |
| VERSION | 1.0 |
| CATEGORY | |
| CATEGORY | Human Resources |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Raphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Christophe Simonis, Xavier Morel, GitHub, Yannick Tivisse, Alexandre Kühn, qsm-odoo, Martin Geubelle, RomainLibert, Christophe Monniez, Adrian Torres, XavierDo, Xavier-Do, fw-bot |
| WEBSITE | |
| WEBSITE | |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-05 23:57:01 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - base_setup - web - bus - web_tour - web_kanban_gauge |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | Gamification process ==================== The Gamification module provides ways to evaluate and motivate the users of Odoo. The users can be evaluated using goals and numerical objectives to reach. **Goals** are assigned through **challenges** to evaluate and compare members of a team with each others and through time. For non-numerical achievements, **badges** can be granted to users. From a simple "thank you" to an exceptional achievement, a badge is an easy way to exprimate gratitude to a user for their good work. Both goals and badges are flexibles and can be adapted to a large range of modules and actions. When installed, this module creates easy goals to help new users to discover Odoo and configure their user profile. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
assets_backend |
gamification assets | ir.ui.view | qweb | Inherits web.assets_backend |
badge_form_view |
Badge Form | gamification.badge | form | New |
badge_kanban_view |
Badge Kanban View | gamification.badge | kanban | New |
badge_list_view |
Badge List | gamification.badge | tree | New |
badge_user_kanban_view |
Badge User Kanban View | gamification.badge.user | kanban | New |
challenge_form_view |
Challenge Form | gamification.challenge | form | New |
challenge_line_list_view |
Challenge line list | gamification.challenge.line | tree | New |
challenge_list_view |
Challenges List | gamification.challenge | tree | New |
challenge_search_view |
Challenge Search | gamification.challenge | search | New |
goal_definition_form_view |
Goal Definitions Form | gamification.goal.definition | form | New |
goal_definition_list_view |
Goal Definitions List | gamification.goal.definition | tree | New |
goal_definition_search_view |
Goal Definition Search | gamification.goal.definition | search | New |
goal_form_view |
Goal Form | gamification.goal | form | New |
goal_kanban_view |
Goal Kanban View | gamification.goal | kanban | New |
goal_list_view |
Goal List | gamification.goal | tree | New |
goal_search_view |
Goal Search | gamification.goal | search | New |
view_badge_wizard_grant |
Grant Badge User Form | gamification.badge.user.wizard | form | New |
view_challenge_kanban |
Challenge Kanban | gamification.challenge | kanban | New |
view_goal_wizard_update_current |
Update the current value of the Goal | gamification.goal.wizard | form | New |
active
Boolean
default=True
args: 'Active'
challenge_ids
One2many → gamification.challenge
string='Reward of Challenges'
args: 'gamification.challenge', 'reward_id'
description
Text
translate=True
args: 'Description'
goal_definition_ids
Many2many → gamification.goal.definition
help='The users that have succeeded theses goals will receive automatically the badge.'
string='Rewarded by'
args: 'gamification.goal.definition', 'badge_unlocked_definition_rel'
image
Binary
attachment=True
help='This field holds the image used for the badge, limited to 256x256'
args: 'Image'
name
Char
required=True
translate=True
args: 'Badge'
owner_ids
One2many → gamification.badge.user
help='The list of instances of this badge granted to users'
string='Owners'
args: 'gamification.badge.user', 'badge_id'
remaining_sending
Integer
compute='_remaining_sending_calc'
help='If a maximum is set'
args: 'Remaining Sending Allowed'
rule_auth
Selection
default='everyone'
help='Who can grant this badge'
required=True
string='Allowance to Grant'
args: [('everyone', 'Everyone'), ('users', 'A selected list of users'), ('having', 'People having some badges'), ('nobody', 'No one, assigned through challenges')]
rule_auth_badge_ids
Many2many → gamification.badge
help='Only the people having these badges can give this badge'
string='Required Badges'
args: 'gamification.badge', 'gamification_badge_rule_badge_rel', 'badge1_id', 'badge2_id'
rule_auth_user_ids
Many2many → res.users
help='Only these people can give this badge'
string='Authorized Users'
args: 'res.users', 'rel_badge_auth_users'
rule_max
Boolean
help='Check to set a monthly limit per person of sending this badge'
args: 'Monthly Limited Sending'
rule_max_number
Integer
help='The maximum number of time this badge can be sent per month per person.'
args: 'Limitation Number'
stat_count
Integer
compute='_get_owners_info'
help='The number of time this badge has been received.'
args: 'Total'
stat_count_distinct
Integer
compute='_get_owners_info'
help='The number of time this badge has been received by unique users.'
args: 'Number of users'
stat_my
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has received this badge.'
args: 'My Total'
stat_my_monthly_sending
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has sent this badge this month.'
args: 'My Monthly Sending Total'
stat_my_this_month
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has received this badge this month.'
args: 'My Monthly Total'
stat_this_month
Integer
compute='_get_badge_user_stats'
help='The number of time this badge has been received this month.'
args: 'Monthly total'
unique_owner_ids
Many2many → res.users
compute='_get_owners_info'
help='The list of unique users having received this badge.'
string='Unique Owners'
args: 'res.users'
check_granting(self)
badge_id
Many2one → gamification.badge
index=True
ondelete='cascade'
required=True
string='Badge'
args: 'gamification.badge'
badge_name
Char
readonly=False
related='badge_id.name'
string='Badge Name'
challenge_id
Many2one → gamification.challenge
help='If this badge was rewarded through a challenge'
string='Challenge originating'
args: 'gamification.challenge'
comment
Text
sender_id
Many2one → res.users
help='The user who has send the badge'
string='Sender'
args: 'res.users'
user_id
Many2one → res.users
index=True
ondelete='cascade'
required=True
string='User'
args: 'res.users'
create(self, vals)
badge_id
Many2one → gamification.badge
required=True
string='Badge'
args: 'gamification.badge'
comment
Text
user_id
Many2one → res.users
required=True
string='User'
args: 'res.users'
action_grant_badge(self)
category
Selection
default='hr'
help='Define the visibility of the challenge through menus'
required=True
string='Appears in'
args: [('hr', 'Human Resources / Engagement'), ('other', 'Settings / Gamification Tools')]
description
Text
translate=True
args: 'Description'
end_date
Date
help='The day a new challenge will be automatically closed. If no periodicity is set, will use this date as the goal end date.'
args: 'End Date'
invited_user_ids
Many2many → res.users
string='Suggest to users'
args: 'res.users', 'gamification_invited_user_ids_rel'
last_report_date
Date
default=fields.Date.today
args: 'Last Report Date'
line_ids
One2many → gamification.challenge.line
copy=True
help='List of goals that will be set'
required=True
string='Lines'
args: 'gamification.challenge.line', 'challenge_id'
manager_id
Many2one → res.users
default=<expr>
help='The user responsible for the challenge.'
string='Responsible'
args: 'res.users'
name
Char
required=True
translate=True
args: 'Challenge Name'
next_report_date
Date
compute='_get_next_report_date'
store=True
args: 'Next Report Date'
period
Selection
default='once'
help='Period of automatic goal assigment. If none is selected, should be launched manually.'
required=True
string='Periodicity'
args: [('once', 'Non recurring'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('yearly', 'Yearly')]
remind_update_delay
Integer
help='Never reminded if no value or zero is specified.'
args: 'Non-updated manual goals will be reminded after'
report_message_frequency
Selection
default='never'
required=True
string='Report Frequency'
args: [('never', 'Never'), ('onchange', 'On change'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('yearly', 'Yearly')]
report_message_group_id
Many2one → mail.channel
help='Group that will receive a copy of the report in addition to the user'
string='Send a copy to'
args: 'mail.channel'
report_template_id
Many2one → mail.template
default=<expr>
required=True
string='Report Template'
args: 'mail.template'
reward_failure
Boolean
reward_first_id
Many2one → gamification.badge
string='For 1st user'
args: 'gamification.badge'
reward_id
Many2one → gamification.badge
string='For Every Succeeding User'
args: 'gamification.badge'
reward_realtime
Boolean
default=True
help='With this option enabled, a user can receive a badge only once. The top 3 badges are still rewarded only at the end of the challenge.'
args: 'Reward as soon as every goal is reached'
reward_second_id
Many2one → gamification.badge
string='For 2nd user'
args: 'gamification.badge'
reward_third_id
Many2one → gamification.badge
string='For 3rd user'
args: 'gamification.badge'
start_date
Date
help='The day a new challenge will be automatically started. If no periodicity is set, will use this date as the goal start date.'
args: 'Start Date'
state
Selection
copy=False
default='draft'
required=True
string='State'
track_visibility='onchange'
args: [('draft', 'Draft'), ('inprogress', 'In Progress'), ('done', 'Done')]
user_domain
Char
help='Alternative to a list of users'
args: 'User domain'
user_ids
Many2many → res.users
help='List of users participating to the challenge'
string='Users'
args: 'res.users', 'gamification_challenge_users_rel'
visibility_mode
Selection
default='personal'
required=True
string='Display Mode'
args: [('personal', 'Individual Goals'), ('ranking', 'Leader Board (Group Ranking)')]
accept_challenge(self)
action_check(self)
action_report_progress(self)
action_start(self)
create(self, vals)
discard_challenge(self)
report_progress(self, users=(), subset_goals=False)
write(self, vals)
challenge_id
Many2one → gamification.challenge
ondelete='cascade'
required=True
string='Challenge'
args: 'gamification.challenge'
condition
Selection
readonly=True
related='definition_id.condition'
args: 'Condition'
definition_full_suffix
Char
readonly=True
related='definition_id.full_suffix'
args: 'Suffix'
definition_id
Many2one → gamification.goal.definition
ondelete='cascade'
required=True
string='Goal Definition'
args: 'gamification.goal.definition'
definition_monetary
Boolean
readonly=True
related='definition_id.monetary'
args: 'Monetary'
definition_suffix
Char
readonly=True
related='definition_id.suffix'
args: 'Unit'
name
Char
readonly=False
related='definition_id.name'
args: 'Name'
sequence
Integer
default=1
help='Sequence number for ordering'
args: 'Sequence'
target_goal
Float
required=True
args: 'Target Value to Reach'
No public methods.
challenge_id
Many2one
help='Challenge that generated the goal, assign challenge to users to generate goals with a value in this field.'
readonly=True
related='line_id.challenge_id'
store=True
closed
Boolean
help='These goals will not be recomputed.'
args: 'Closed goal'
completeness
Float
compute='_get_completion'
args: 'Completeness'
computation_mode
Selection
readonly=False
related='definition_id.computation_mode'
current
Float
default=0
required=True
track_visibility='always'
args: 'Current Value'
definition_condition
Selection
readonly=True
related='definition_id.condition'
args: 'Definition Condition'
definition_description
Text
readonly=True
related='definition_id.description'
args: 'Definition Description'
definition_display
Selection
readonly=True
related='definition_id.display_mode'
args: 'Display Mode'
definition_id
Many2one → gamification.goal.definition
ondelete='cascade'
required=True
string='Goal Definition'
args: 'gamification.goal.definition'
definition_suffix
Char
readonly=True
related='definition_id.full_suffix'
args: 'Suffix'
end_date
Date
last_update
Date
help='In case of manual goal, reminders are sent if the goal as not been updated for a while (defined in challenge). Ignored in case of non-manual goal or goal not linked to a challenge.'
args: 'Last Update'
line_id
Many2one → gamification.challenge.line
ondelete='cascade'
string='Challenge Line'
args: 'gamification.challenge.line'
remind_update_delay
Integer
help='The number of days after which the user assigned to a manual goal will be reminded. Never reminded if no value is specified.'
args: 'Remind delay'
start_date
Date
default=fields.Date.today
args: 'Start Date'
state
Selection
default='draft'
required=True
string='State'
track_visibility='always'
args: [('draft', 'Draft'), ('inprogress', 'In progress'), ('reached', 'Reached'), ('failed', 'Failed'), ('canceled', 'Canceled')]
target_goal
Float
required=True
track_visibility='always'
args: 'To Reach'
to_update
Boolean
user_id
Many2one → res.users
auto_join=True
ondelete='cascade'
required=True
string='User'
args: 'res.users'
action_cancel(self)
action_fail(self)
action_reach(self)
action_start(self)
create(self, vals)
get_action(self)
update_goal(self)
write(self, vals)
action_id
Many2one → ir.actions.act_window
help='The action that will be called to update the goal value.'
string='Action'
args: 'ir.actions.act_window'
batch_distinctive_field
Many2one → ir.model.fields
help='In batch mode, this indicates which field distinct one user form the other, e.g. user_id, partner_id...'
string='Distinctive field for batch user'
args: 'ir.model.fields'
batch_mode
Boolean
help='Evaluate the expression in batch instead of once for each user'
args: 'Batch Mode'
batch_user_expression
Char
help="The value to compare with the distinctive field. The expression can contain reference to 'user' which is a browse record of the current user, e.g. user.id, user.partner_id.id..."
args: 'Evaluated expression for batch mode'
computation_mode
Selection
default='manually'
help="Defined how will be computed the goals. The result of the operation will be stored in the field 'Current'."
required=True
string='Computation Mode'
args: [('manually', 'Recorded manually'), ('count', 'Automatic: number of records'), ('sum', 'Automatic: sum on a field'), ('python', 'Automatic: execute a specific Python code')]
compute_code
Text
help="Python code to be executed for each user. 'result' should contains the new current value. Evaluated user can be access through object.user_id."
args: 'Python Code'
condition
Selection
default='higher'
help='A goal is considered as completed when the current value is compared to the value to reach'
required=True
string='Goal Performance'
args: [('higher', 'The higher the better'), ('lower', 'The lower the better')]
description
Text
display_mode
Selection
default='progress'
required=True
string='Displayed as'
args: [('progress', 'Progressive (using numerical values)'), ('boolean', 'Exclusive (done or not-done)')]
domain
Char
default='[]'
help="Domain for filtering records. General rule, not user depending, e.g. [('state', '=', 'done')]. The expression can contain reference to 'user' which is a browse record of the current user if not in batch mode."
required=True
args: 'Filter Domain'
field_date_id
Many2one → ir.model.fields
help='The date to use for the time period evaluated'
string='Date Field'
args: 'ir.model.fields'
field_id
Many2one → ir.model.fields
help='The field containing the value to evaluate'
string='Field to Sum'
args: 'ir.model.fields'
full_suffix
Char
compute='_compute_full_suffix'
help='The currency and suffix field'
args: 'Full Suffix'
model_id
Many2one → ir.model
help='The model object for the field to evaluate'
string='Model'
args: 'ir.model'
monetary
Boolean
default=False
help='The target and current value are defined in the company currency.'
args: 'Monetary Value'
name
Char
required=True
translate=True
args: 'Goal Definition'
res_id_field
Char
help='The field name on the user profile (res.users) containing the value for res_id for action.'
args: 'ID Field of user'
suffix
Char
help='The unit of the target and current values'
translate=True
args: 'Suffix'
create(self, vals)
write(self, vals)
current
Float
goal_id
Many2one → gamification.goal
required=True
string='Goal'
args: 'gamification.goal'
action_update_current(self)
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/11.0/gamification |
| VERSION | |
| VERSION | 1.0 |
| CATEGORY | |
| CATEGORY | Human Resources |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Christophe Simonis, Xavier Morel, Joren Van Onder, Jérome Maes, qdp-odoo, Aaron Bohy, ged-odoo, GitHub, Lucas Perais (lpe), qsm-odoo, Martin Geubelle, Odoo Online, alt-odoo |
| WEBSITE | |
| WEBSITE | https://www.odoo.com/page/gamification |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-05 23:53:43 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - base_setup - web - bus - web_tour - web_kanban_gauge |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | Gamification process ==================== The Gamification module provides ways to evaluate and motivate the users of Odoo. The users can be evaluated using goals and numerical objectives to reach. **Goals** are assigned through **challenges** to evaluate and compare members of a team with each others and through time. For non-numerical achievements, **badges** can be granted to users. From a simple "thank you" to an exceptional achievement, a badge is an easy way to exprimate gratitude to a user for their good work. Both goals and badges are flexibles and can be adapted to a large range of modules and actions. When installed, this module creates easy goals to help new users to discover Odoo and configure their user profile. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
assets_backend |
gamification assets | ir.ui.view | qweb | Inherits web.assets_backend |
badge_form_view |
Badge Form | gamification.badge | form | New |
badge_kanban_view |
Badge Kanban View | gamification.badge | kanban | New |
badge_list_view |
Badge List | gamification.badge | tree | New |
badge_user_kanban_view |
Badge User Kanban View | gamification.badge.user | kanban | New |
challenge_form_view |
Challenge Form | gamification.challenge | form | New |
challenge_line_list_view |
Challenge line list | gamification.challenge.line | tree | New |
challenge_list_view |
Challenges List | gamification.challenge | tree | New |
challenge_search_view |
Challenge Search | gamification.challenge | search | New |
goal_definition_form_view |
Goal Definitions Form | gamification.goal.definition | form | New |
goal_definition_list_view |
Goal Definitions List | gamification.goal.definition | tree | New |
goal_definition_search_view |
Goal Definition Search | gamification.goal.definition | search | New |
goal_form_view |
Goal Form | gamification.goal | form | New |
goal_kanban_view |
Goal Kanban View | gamification.goal | kanban | New |
goal_list_view |
Goal List | gamification.goal | tree | New |
goal_search_view |
Goal Search | gamification.goal | search | New |
view_badge_wizard_grant |
Grant Badge User Form | gamification.badge.user.wizard | form | New |
view_challenge_kanban |
Challenge Kanban | gamification.challenge | kanban | New |
view_goal_wizard_update_current |
Update the current value of the Goal | gamification.goal.wizard | form | New |
active
Boolean
default=True
args: 'Active'
challenge_ids
One2many → gamification.challenge
string='Reward of Challenges'
args: 'gamification.challenge', 'reward_id'
description
Text
translate=True
args: 'Description'
goal_definition_ids
Many2many → gamification.goal.definition
help='The users that have succeeded theses goals will receive automatically the badge.'
string='Rewarded by'
args: 'gamification.goal.definition', 'badge_unlocked_definition_rel'
image
Binary
attachment=True
help='This field holds the image used for the badge, limited to 256x256'
args: 'Image'
name
Char
required=True
translate=True
args: 'Badge'
owner_ids
One2many → gamification.badge.user
help='The list of instances of this badge granted to users'
string='Owners'
args: 'gamification.badge.user', 'badge_id'
remaining_sending
Integer
compute='_remaining_sending_calc'
help='If a maximum is set'
args: 'Remaining Sending Allowed'
rule_auth
Selection
default='everyone'
help='Who can grant this badge'
required=True
string='Allowance to Grant'
args: [('everyone', 'Everyone'), ('users', 'A selected list of users'), ('having', 'People having some badges'), ('nobody', 'No one, assigned through challenges')]
rule_auth_badge_ids
Many2many → gamification.badge
help='Only the people having these badges can give this badge'
string='Required Badges'
args: 'gamification.badge', 'gamification_badge_rule_badge_rel', 'badge1_id', 'badge2_id'
rule_auth_user_ids
Many2many → res.users
help='Only these people can give this badge'
string='Authorized Users'
args: 'res.users', 'rel_badge_auth_users'
rule_max
Boolean
help='Check to set a monthly limit per person of sending this badge'
args: 'Monthly Limited Sending'
rule_max_number
Integer
help='The maximum number of time this badge can be sent per month per person.'
args: 'Limitation Number'
stat_count
Integer
compute='_get_owners_info'
help='The number of time this badge has been received.'
args: 'Total'
stat_count_distinct
Integer
compute='_get_owners_info'
help='The number of time this badge has been received by unique users.'
args: 'Number of users'
stat_my
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has received this badge.'
args: 'My Total'
stat_my_monthly_sending
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has sent this badge this month.'
args: 'My Monthly Sending Total'
stat_my_this_month
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has received this badge this month.'
args: 'My Monthly Total'
stat_this_month
Integer
compute='_get_badge_user_stats'
help='The number of time this badge has been received this month.'
args: 'Monthly total'
unique_owner_ids
Many2many → res.users
compute='_get_owners_info'
help='The list of unique users having received this badge.'
string='Unique Owners'
args: 'res.users'
check_granting(self)
badge_id
Many2one → gamification.badge
index=True
ondelete='cascade'
required=True
string='Badge'
args: 'gamification.badge'
badge_name
Char
related='badge_id.name'
string='Badge Name'
challenge_id
Many2one → gamification.challenge
help='If this badge was rewarded through a challenge'
string='Challenge originating'
args: 'gamification.challenge'
comment
Text
create_date
Datetime
readonly=True
args: 'Created'
create_uid
Many2one → res.users
readonly=True
string='Creator'
args: 'res.users'
sender_id
Many2one → res.users
help='The user who has send the badge'
string='Sender'
args: 'res.users'
user_id
Many2one → res.users
index=True
ondelete='cascade'
required=True
string='User'
args: 'res.users'
create(self, vals)
badge_id
Many2one → gamification.badge
required=True
string='Badge'
args: 'gamification.badge'
comment
Text
user_id
Many2one → res.users
required=True
string='User'
args: 'res.users'
action_grant_badge(self)
category
Selection
default='hr'
help='Define the visibility of the challenge through menus'
required=True
string='Appears in'
args: [('hr', 'Human Resources / Engagement'), ('other', 'Settings / Gamification Tools')]
description
Text
translate=True
args: 'Description'
end_date
Date
help='The day a new challenge will be automatically closed. If no periodicity is set, will use this date as the goal end date.'
args: 'End Date'
invited_user_ids
Many2many → res.users
string='Suggest to users'
args: 'res.users', 'gamification_invited_user_ids_rel'
last_report_date
Date
default=fields.Date.today
args: 'Last Report Date'
line_ids
One2many → gamification.challenge.line
copy=True
help='List of goals that will be set'
required=True
string='Lines'
args: 'gamification.challenge.line', 'challenge_id'
manager_id
Many2one → res.users
default=<expr>
help='The user responsible for the challenge.'
string='Responsible'
args: 'res.users'
name
Char
required=True
translate=True
args: 'Challenge Name'
next_report_date
Date
compute='_get_next_report_date'
store=True
args: 'Next Report Date'
period
Selection
default='once'
help='Period of automatic goal assigment. If none is selected, should be launched manually.'
required=True
string='Periodicity'
args: [('once', 'Non recurring'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('yearly', 'Yearly')]
remind_update_delay
Integer
help='Never reminded if no value or zero is specified.'
args: 'Non-updated manual goals will be reminded after'
report_message_frequency
Selection
default='never'
required=True
string='Report Frequency'
args: [('never', 'Never'), ('onchange', 'On change'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('yearly', 'Yearly')]
report_message_group_id
Many2one → mail.channel
help='Group that will receive a copy of the report in addition to the user'
string='Send a copy to'
args: 'mail.channel'
report_template_id
Many2one → mail.template
default=<expr>
required=True
string='Report Template'
args: 'mail.template'
reward_failure
Boolean
reward_first_id
Many2one → gamification.badge
string='For 1st user'
args: 'gamification.badge'
reward_id
Many2one → gamification.badge
string='For Every Succeeding User'
args: 'gamification.badge'
reward_realtime
Boolean
default=True
help='With this option enabled, a user can receive a badge only once. The top 3 badges are still rewarded only at the end of the challenge.'
args: 'Reward as soon as every goal is reached'
reward_second_id
Many2one → gamification.badge
string='For 2nd user'
args: 'gamification.badge'
reward_third_id
Many2one → gamification.badge
string='For 3rd user'
args: 'gamification.badge'
start_date
Date
help='The day a new challenge will be automatically started. If no periodicity is set, will use this date as the goal start date.'
args: 'Start Date'
state
Selection
copy=False
default='draft'
required=True
string='State'
track_visibility='onchange'
args: [('draft', 'Draft'), ('inprogress', 'In Progress'), ('done', 'Done')]
user_domain
Char
help='Alternative to a list of users'
args: 'User domain'
user_ids
Many2many → res.users
help='List of users participating to the challenge'
string='Users'
args: 'res.users', 'gamification_challenge_users_rel'
visibility_mode
Selection
default='personal'
required=True
string='Display Mode'
args: [('personal', 'Individual Goals'), ('ranking', 'Leader Board (Group Ranking)')]
accept_challenge(self)
action_check(self)
action_report_progress(self)
action_start(self)
create(self, vals)
discard_challenge(self)
report_progress(self, users=(), subset_goals=False)
write(self, vals)
challenge_id
Many2one → gamification.challenge
ondelete='cascade'
required=True
string='Challenge'
args: 'gamification.challenge'
condition
Selection
readonly=True
related='definition_id.condition'
args: 'Condition'
definition_full_suffix
Char
readonly=True
related='definition_id.full_suffix'
args: 'Suffix'
definition_id
Many2one → gamification.goal.definition
ondelete='cascade'
required=True
string='Goal Definition'
args: 'gamification.goal.definition'
definition_monetary
Boolean
readonly=True
related='definition_id.monetary'
args: 'Monetary'
definition_suffix
Char
readonly=True
related='definition_id.suffix'
args: 'Unit'
name
Char
related='definition_id.name'
args: 'Name'
sequence
Integer
default=1
help='Sequence number for ordering'
args: 'Sequence'
target_goal
Float
required=True
args: 'Target Value to Reach'
No public methods.
challenge_id
Many2one
help='Challenge that generated the goal, assign challenge to users to generate goals with a value in this field.'
readonly=True
related='line_id.challenge_id'
store=True
closed
Boolean
help='These goals will not be recomputed.'
args: 'Closed goal'
completeness
Float
compute='_get_completion'
args: 'Completeness'
computation_mode
Selection
related='definition_id.computation_mode'
current
Float
default=0
required=True
track_visibility='always'
args: 'Current Value'
definition_condition
Selection
readonly=True
related='definition_id.condition'
args: 'Definition Condition'
definition_description
Text
readonly=True
related='definition_id.description'
args: 'Definition Description'
definition_display
Selection
readonly=True
related='definition_id.display_mode'
args: 'Display Mode'
definition_id
Many2one → gamification.goal.definition
ondelete='cascade'
required=True
string='Goal Definition'
args: 'gamification.goal.definition'
definition_suffix
Char
readonly=True
related='definition_id.full_suffix'
args: 'Suffix'
end_date
Date
last_update
Date
help='In case of manual goal, reminders are sent if the goal as not been updated for a while (defined in challenge). Ignored in case of non-manual goal or goal not linked to a challenge.'
args: 'Last Update'
line_id
Many2one → gamification.challenge.line
ondelete='cascade'
string='Challenge Line'
args: 'gamification.challenge.line'
remind_update_delay
Integer
help='The number of days after which the user assigned to a manual goal will be reminded. Never reminded if no value is specified.'
args: 'Remind delay'
start_date
Date
default=fields.Date.today
args: 'Start Date'
state
Selection
default='draft'
required=True
string='State'
track_visibility='always'
args: [('draft', 'Draft'), ('inprogress', 'In progress'), ('reached', 'Reached'), ('failed', 'Failed'), ('canceled', 'Canceled')]
target_goal
Float
required=True
track_visibility='always'
args: 'To Reach'
to_update
Boolean
user_id
Many2one → res.users
auto_join=True
ondelete='cascade'
required=True
string='User'
args: 'res.users'
action_cancel(self)
action_fail(self)
action_reach(self)
action_start(self)
create(self, vals)
get_action(self)
update_goal(self)
write(self, vals)
action_id
Many2one → ir.actions.act_window
help='The action that will be called to update the goal value.'
string='Action'
args: 'ir.actions.act_window'
batch_distinctive_field
Many2one → ir.model.fields
help='In batch mode, this indicates which field distinct one user form the other, e.g. user_id, partner_id...'
string='Distinctive field for batch user'
args: 'ir.model.fields'
batch_mode
Boolean
help='Evaluate the expression in batch instead of once for each user'
args: 'Batch Mode'
batch_user_expression
Char
help="The value to compare with the distinctive field. The expression can contain reference to 'user' which is a browse record of the current user, e.g. user.id, user.partner_id.id..."
args: 'Evaluated expression for batch mode'
computation_mode
Selection
default='manually'
help="Defined how will be computed the goals. The result of the operation will be stored in the field 'Current'."
required=True
string='Computation Mode'
args: [('manually', 'Recorded manually'), ('count', 'Automatic: number of records'), ('sum', 'Automatic: sum on a field'), ('python', 'Automatic: execute a specific Python code')]
compute_code
Text
help="Python code to be executed for each user. 'result' should contains the new current value. Evaluated user can be access through object.user_id."
args: 'Python Code'
condition
Selection
default='higher'
help='A goal is considered as completed when the current value is compared to the value to reach'
required=True
string='Goal Performance'
args: [('higher', 'The higher the better'), ('lower', 'The lower the better')]
description
Text
display_mode
Selection
default='progress'
required=True
string='Displayed as'
args: [('progress', 'Progressive (using numerical values)'), ('boolean', 'Exclusive (done or not-done)')]
domain
Char
default='[]'
help="Domain for filtering records. General rule, not user depending, e.g. [('state', '=', 'done')]. The expression can contain reference to 'user' which is a browse record of the current user if not in batch mode."
required=True
args: 'Filter Domain'
field_date_id
Many2one → ir.model.fields
help='The date to use for the time period evaluated'
string='Date Field'
args: 'ir.model.fields'
field_id
Many2one → ir.model.fields
help='The field containing the value to evaluate'
string='Field to Sum'
args: 'ir.model.fields'
full_suffix
Char
compute='_compute_full_suffix'
help='The currency and suffix field'
args: 'Full Suffix'
model_id
Many2one → ir.model
help='The model object for the field to evaluate'
string='Model'
args: 'ir.model'
monetary
Boolean
default=False
help='The target and current value are defined in the company currency.'
args: 'Monetary Value'
name
Char
required=True
translate=True
args: 'Goal Definition'
res_id_field
Char
help='The field name on the user profile (res.users) containing the value for res_id for action.'
args: 'ID Field of user'
suffix
Char
help='The unit of the target and current values'
translate=True
args: 'Suffix'
create(self, vals)
write(self, vals)
current
Float
goal_id
Many2one → gamification.goal
required=True
string='Goal'
args: 'gamification.goal'
action_update_current(self)
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/10.0/gamification |
| VERSION | |
| VERSION | 1.0 |
| CATEGORY | |
| CATEGORY | Human Resources |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Odoo Translation Bot, Christophe Matthieu, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Simon Lejeune, Nicolas Lempereur, Julien Legros, qdp-odoo, Jeremy Kersten, Yannick Tivisse |
| WEBSITE | |
| WEBSITE | https://www.odoo.com/page/gamification |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-05 23:50:48 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - base_setup - web_kanban - web - bus - web_tour - web_kanban_gauge |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | Gamification process ==================== The Gamification module provides ways to evaluate and motivate the users of Odoo. The users can be evaluated using goals and numerical objectives to reach. **Goals** are assigned through **challenges** to evaluate and compare members of a team with each others and through time. For non-numerical achievements, **badges** can be granted to users. From a simple "thank you" to an exceptional achievement, a badge is an easy way to exprimate gratitude to a user for their good work. Both goals and badges are flexibles and can be adapted to a large range of modules and actions. When installed, this module creates easy goals to help new users to discover Odoo and configure their user profile. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
assets_backend |
gamification assets | ir.ui.view | qweb | Inherits web.assets_backend |
badge_form_view |
Badge Form | gamification.badge | form | New |
badge_kanban_view |
Badge Kanban View | gamification.badge | kanban | New |
badge_list_view |
Badge List | gamification.badge | tree | New |
badge_user_kanban_view |
Badge User Kanban View | gamification.badge.user | kanban | New |
challenge_form_view |
Challenge Form | gamification.challenge | form | New |
challenge_line_list_view |
Challenge line list | gamification.challenge.line | tree | New |
challenge_list_view |
Challenges List | gamification.challenge | tree | New |
challenge_search_view |
Challenge Search | gamification.challenge | search | New |
goal_definition_form_view |
Goal Definitions Form | gamification.goal.definition | form | New |
goal_definition_list_view |
Goal Definitions List | gamification.goal.definition | tree | New |
goal_definition_search_view |
Goal Definition Search | gamification.goal.definition | search | New |
goal_form_view |
Goal Form | gamification.goal | form | New |
goal_kanban_view |
Goal Kanban View | gamification.goal | kanban | New |
goal_list_view |
Goal List | gamification.goal | tree | New |
goal_search_view |
Goal Search | gamification.goal | search | New |
view_badge_wizard_grant |
Grant Badge User Form | gamification.badge.user.wizard | form | New |
view_challenge_kanban |
Challenge Kanban | gamification.challenge | kanban | New |
view_goal_wizard_update_current |
Update the current value of the Goal | gamification.goal.wizard | form | New |
active
Boolean
default=True
args: 'Active'
challenge_ids
One2many → gamification.challenge
string='Reward of Challenges'
args: 'gamification.challenge', 'reward_id'
description
Text
translate=True
args: 'Description'
goal_definition_ids
Many2many → gamification.goal.definition
help='The users that have succeeded theses goals will receive automatically the badge.'
string='Rewarded by'
args: 'gamification.goal.definition', 'badge_unlocked_definition_rel'
image
Binary
attachment=True
help='This field holds the image used for the badge, limited to 256x256'
args: 'Image'
name
Char
required=True
translate=True
args: 'Badge'
owner_ids
One2many → gamification.badge.user
help='The list of instances of this badge granted to users'
string='Owners'
args: 'gamification.badge.user', 'badge_id'
remaining_sending
Integer
compute='_remaining_sending_calc'
help='If a maximum is set'
args: 'Remaining Sending Allowed'
rule_auth
Selection
default='everyone'
help='Who can grant this badge'
required=True
string='Allowance to Grant'
args: [('everyone', 'Everyone'), ('users', 'A selected list of users'), ('having', 'People having some badges'), ('nobody', 'No one, assigned through challenges')]
rule_auth_badge_ids
Many2many → gamification.badge
help='Only the people having these badges can give this badge'
string='Required Badges'
args: 'gamification.badge', 'gamification_badge_rule_badge_rel', 'badge1_id', 'badge2_id'
rule_auth_user_ids
Many2many → res.users
help='Only these people can give this badge'
string='Authorized Users'
args: 'res.users', 'rel_badge_auth_users'
rule_max
Boolean
help='Check to set a monthly limit per person of sending this badge'
args: 'Monthly Limited Sending'
rule_max_number
Integer
help='The maximum number of time this badge can be sent per month per person.'
args: 'Limitation Number'
stat_count
Integer
compute='_get_owners_info'
help='The number of time this badge has been received.'
args: 'Total'
stat_count_distinct
Integer
compute='_get_owners_info'
help='The number of time this badge has been received by unique users.'
args: 'Number of users'
stat_my
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has received this badge.'
args: 'My Total'
stat_my_monthly_sending
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has sent this badge this month.'
args: 'My Monthly Sending Total'
stat_my_this_month
Integer
compute='_get_badge_user_stats'
help='The number of time the current user has received this badge this month.'
args: 'My Monthly Total'
stat_this_month
Integer
compute='_get_badge_user_stats'
help='The number of time this badge has been received this month.'
args: 'Monthly total'
unique_owner_ids
Many2many → res.users
compute='_get_owners_info'
help='The list of unique users having received this badge.'
string='Unique Owners'
args: 'res.users'
check_granting(self)
badge_id
Many2one → gamification.badge
index=True
ondelete='cascade'
required=True
string='Badge'
args: 'gamification.badge'
badge_name
Char
related='badge_id.name'
string='Badge Name'
challenge_id
Many2one → gamification.challenge
help='If this badge was rewarded through a challenge'
string='Challenge originating'
args: 'gamification.challenge'
comment
Text
create_date
Datetime
readonly=True
args: 'Created'
create_uid
Many2one → res.users
readonly=True
string='Creator'
args: 'res.users'
sender_id
Many2one → res.users
help='The user who has send the badge'
string='Sender'
args: 'res.users'
user_id
Many2one → res.users
index=True
ondelete='cascade'
required=True
string='User'
args: 'res.users'
create(self, vals)
badge_id
Many2one → gamification.badge
required=True
string='Badge'
args: 'gamification.badge'
comment
Text
user_id
Many2one → res.users
required=True
string='User'
args: 'res.users'
action_grant_badge(self)
category
Selection
default='hr'
help='Define the visibility of the challenge through menus'
required=True
string='Appears in'
args: [('hr', 'Human Resources / Engagement'), ('other', 'Settings / Gamification Tools')]
description
Text
translate=True
args: 'Description'
end_date
Date
help='The day a new challenge will be automatically closed. If no periodicity is set, will use this date as the goal end date.'
args: 'End Date'
invited_user_ids
Many2many → res.users
string='Suggest to users'
args: 'res.users', 'gamification_invited_user_ids_rel'
last_report_date
Date
default=fields.Date.today
args: 'Last Report Date'
line_ids
One2many → gamification.challenge.line
copy=True
help='List of goals that will be set'
required=True
string='Lines'
args: 'gamification.challenge.line', 'challenge_id'
manager_id
Many2one → res.users
default=<expr>
help='The user responsible for the challenge.'
string='Responsible'
args: 'res.users'
name
Char
required=True
translate=True
args: 'Challenge Name'
next_report_date
Date
compute='_get_next_report_date'
store=True
args: 'Next Report Date'
period
Selection
default='once'
help='Period of automatic goal assigment. If none is selected, should be launched manually.'
required=True
string='Periodicity'
args: [('once', 'Non recurring'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('yearly', 'Yearly')]
remind_update_delay
Integer
help='Never reminded if no value or zero is specified.'
args: 'Non-updated manual goals will be reminded after'
report_message_frequency
Selection
default='never'
required=True
string='Report Frequency'
args: [('never', 'Never'), ('onchange', 'On change'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('yearly', 'Yearly')]
report_message_group_id
Many2one → mail.channel
help='Group that will receive a copy of the report in addition to the user'
string='Send a copy to'
args: 'mail.channel'
report_template_id
Many2one → mail.template
default=<expr>
required=True
string='Report Template'
args: 'mail.template'
reward_failure
Boolean
reward_first_id
Many2one → gamification.badge
string='For 1st user'
args: 'gamification.badge'
reward_id
Many2one → gamification.badge
string='For Every Succeeding User'
args: 'gamification.badge'
reward_realtime
Boolean
default=True
help='With this option enabled, a user can receive a badge only once. The top 3 badges are still rewarded only at the end of the challenge.'
args: 'Reward as soon as every goal is reached'
reward_second_id
Many2one → gamification.badge
string='For 2nd user'
args: 'gamification.badge'
reward_third_id
Many2one → gamification.badge
string='For 3rd user'
args: 'gamification.badge'
start_date
Date
help='The day a new challenge will be automatically started. If no periodicity is set, will use this date as the goal start date.'
args: 'Start Date'
state
Selection
copy=False
default='draft'
required=True
string='State'
track_visibility='onchange'
args: [('draft', 'Draft'), ('inprogress', 'In Progress'), ('done', 'Done')]
user_domain
Char
help='Alternative to a list of users'
args: 'User domain'
user_ids
Many2many → res.users
help='List of users participating to the challenge'
string='Users'
args: 'res.users', 'gamification_challenge_users_rel'
visibility_mode
Selection
default='personal'
required=True
string='Display Mode'
args: [('personal', 'Individual Goals'), ('ranking', 'Leader Board (Group Ranking)')]
accept_challenge(self)
action_check(self)
action_report_progress(self)
action_start(self)
create(self, vals)
discard_challenge(self)
report_progress(self, users=(), subset_goals=False)
write(self, vals)
challenge_id
Many2one → gamification.challenge
ondelete='cascade'
required=True
string='Challenge'
args: 'gamification.challenge'
condition
Selection
readonly=True
related='definition_id.condition'
args: 'Condition'
definition_full_suffix
Char
readonly=True
related='definition_id.full_suffix'
args: 'Suffix'
definition_id
Many2one → gamification.goal.definition
ondelete='cascade'
required=True
string='Goal Definition'
args: 'gamification.goal.definition'
definition_monetary
Boolean
readonly=True
related='definition_id.monetary'
args: 'Monetary'
definition_suffix
Char
readonly=True
related='definition_id.suffix'
args: 'Unit'
name
Char
related='definition_id.name'
args: 'Name'
sequence
Integer
default=1
help='Sequence number for ordering'
args: 'Sequence'
target_goal
Float
required=True
args: 'Target Value to Reach'
No public methods.
current
Float
goal_id
Many2one → gamification.goal
required=True
string='Goal'
args: 'gamification.goal'
action_update_current(self)
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/9.0/gamification |
| VERSION | |
| VERSION | 1.0 |
| CATEGORY | |
| CATEGORY | Human Resources |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | |
| MAINTAINERS | |
| MAINTAINERS | |
| COMMITTERS | |
| COMMITTERS | Raphael Collet, Odoo Translation Bot, Christophe Matthieu, Martin Trigaux, Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Thibault Delavallée, Denis Ledoux, Fabien Meghazi, Christophe Simonis, Nicolas Martinelli, Richard Mathot, Géry Debongnie, Aaron Bohy, Julien De Coster, Yannick Tivisse, qsm-odoo, Martin Geubelle |
| WEBSITE | |
| WEBSITE | https://www.odoo.com/page/gamification |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-05 23:48:30 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - base_setup - web_kanban - web - bus - web_kanban_gauge |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | Gamification process ==================== The Gamification module provides ways to evaluate and motivate the users of OpenERP. The users can be evaluated using goals and numerical objectives to reach. **Goals** are assigned through **challenges** to evaluate and compare members of a team with each others and through time. For non-numerical achievements, **badges** can be granted to users. From a simple "thank you" to an exceptional achievement, a badge is an easy way to exprimate gratitude to a user for their good work. Both goals and badges are flexibles and can be adapted to a large range of modules and actions. When installed, this module creates easy goals to help new users to discover OpenERP and configure their user profile. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
assets_backend |
gamification assets | ir.ui.view | qweb | Inherits web.assets_backend |
badge_form_view |
Badge Form | gamification.badge | form | New |
badge_kanban_view |
Badge Kanban View | gamification.badge | kanban | New |
badge_list_view |
Badge List | gamification.badge | tree | New |
badge_user_kanban_view |
Badge User Kanban View | gamification.badge.user | kanban | New |
challenge_form_view |
Challenge Form | gamification.challenge | form | New |
challenge_line_list_view |
Challenge line list | gamification.challenge.line | tree | New |
challenge_list_view |
Challenges List | gamification.challenge | tree | New |
challenge_search_view |
Challenge Search | gamification.challenge | search | New |
goal_definition_form_view |
Goal Definitions Form | gamification.goal.definition | form | New |
goal_definition_list_view |
Goal Definitions List | gamification.goal.definition | tree | New |
goal_definition_search_view |
Goal Definition Search | gamification.goal.definition | search | New |
goal_form_view |
Goal Form | gamification.goal | form | New |
goal_kanban_view |
Goal Kanban View | gamification.goal | kanban | New |
goal_list_view |
Goal List | gamification.goal | tree | New |
goal_search_view |
Goal Search | gamification.goal | search | New |
view_badge_wizard_grant |
Grant Badge User Form | gamification.badge.user.wizard | form | New |
view_challenge_kanban |
Challenge Kanban | gamification.challenge | kanban | New |
view_challenge_wizard |
Challenge Wizard | gamification.challenge | form | New |
view_goal_wizard_update_current |
Update the current value of the Goal | gamification.goal.wizard | form | New |
No new fields.
Public methods (2)check_granting(self, cr, uid, badge_id, context=None)
check_progress(self, cr, uid, context=None)
No new fields.
Public methods (1)create(self, cr, uid, vals, context=None)
No new fields.
Public methods (1)action_grant_badge(self, cr, uid, ids, context=None)
No new fields.
Public methods (13)accept_challenge(self, cr, uid, challenge_ids, context=None, user_id=None)
action_check(self, cr, uid, ids, context=None)
action_report_progress(self, cr, uid, ids, context=None)
action_start(self, cr, uid, ids, context=None)
check_challenge_reward(self, cr, uid, ids, force=False, context=None)
create(self, cr, uid, vals, context=None)
discard_challenge(self, cr, uid, challenge_ids, context=None, user_id=None)
get_top3_users(self, cr, uid, challenge, context=None)
quick_update(self, cr, uid, challenge_id, context=None)
reply_challenge_wizard(self, cr, uid, challenge_id, context=None)
report_progress(self, cr, uid, challenge, context=None, users=False, subset_goal_ids=False)
reward_user(self, cr, uid, user_id, badge_id, challenge_id=False, context=None)
write(self, cr, uid, ids, vals, context=None)
No new fields.
Public methods (1)on_change_definition_id(self, cr, uid, ids, definition_id=False, context=None)
No new fields.
Public methods (1)action_update_current(self, cr, uid, ids, context=None)
No new fields.
Public methods (2)get_challenge_suggestions(self, cr, uid, context=None)
get_serialised_gamification_summary(self, cr, uid, excluded_categories=None, context=None)
| REPOSITORY | |
|---|---|
| REPOSITORY | odoo/odoo |
| GIT | |
| GIT | https://github.com/odoo/odoo.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/odoo/odoo/tree/8.0/gamification |
| VERSION | |
| VERSION | 1.0 |
| CATEGORY | |
| CATEGORY | Human Resources |
| LICENSE | |
| LICENSE | LGPL-3 |
| APPLICATION | |
| APPLICATION | Yes |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | OpenERP SA |
| MAINTAINERS | |
| MAINTAINERS | OpenERP SA |
| COMMITTERS | |
| COMMITTERS | Stephane Wirtel, Odoo Translation Bot, Turkesh Patel (Open ERP), Martin Trigaux, Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Thibault Delavallée, Quentin (OpenERP), Denis Ledoux, Fabien Meghazi, niv-openerp, Christophe Simonis, Xavier Morel, Goffin Simon, Richard Mathot, Géry Debongnie, ged-odoo, Gery Debongnie, Randhir Mayatra rma-openerp, Yogesh Parekh (OpenERP), Nick-OpusVL |
| WEBSITE | |
| WEBSITE | https://www.odoo.com/page/gamification |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-05 23:45:39 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - base - base_setup - web_kanban - web - email_template - web_kanban_gauge |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | Gamification process ==================== The Gamification module provides ways to evaluate and motivate the users of OpenERP. The users can be evaluated using goals and numerical objectives to reach. **Goals** are assigned through **challenges** to evaluate and compare members of a team with each others and through time. For non-numerical achievements, **badges** can be granted to users. From a simple "thank you" to an exceptional achievement, a badge is an easy way to exprimate gratitude to a user for their good work. Both goals and badges are flexibles and can be adapted to a large range of modules and actions. When installed, this module creates easy goals to help new users to discover OpenERP and configure their user profile. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
assets_backend |
gamification assets | ir.ui.view | qweb | Inherits web.assets_backend |
badge_form_view |
Badge Form | gamification.badge | form | New |
badge_kanban_view |
Badge Kanban View | gamification.badge | kanban | New |
badge_list_view |
Badge List | gamification.badge | tree | New |
badge_user_kanban_view |
Badge User Kanban View | gamification.badge.user | kanban | New |
challenge_form_view |
Challenge Form | gamification.challenge | form | New |
challenge_line_list_view |
Challenge line list | gamification.challenge.line | tree | New |
challenge_list_view |
Challenges List | gamification.challenge | tree | New |
challenge_search_view |
Challenge Search | gamification.challenge | search | New |
goal_definition_form_view |
Goal Definitions Form | gamification.goal.definition | form | New |
goal_definition_list_view |
Goal Definitions List | gamification.goal.definition | tree | New |
goal_definition_search_view |
Goal Definition Search | gamification.goal.definition | search | New |
goal_form_view |
Goal Form | gamification.goal | form | New |
goal_kanban_view |
Goal Kanban View | gamification.goal | kanban | New |
goal_list_view |
Goal List | gamification.goal | tree | New |
goal_search_view |
Goal Search | gamification.goal | search | New |
view_badge_wizard_grant |
Grant Badge User Form | gamification.badge.user.wizard | form | New |
view_challenge_kanban |
Challenge Kanban | gamification.challenge | kanban | New |
view_challenge_wizard |
Challenge Wizard | gamification.challenge | form | New |
view_goal_wizard_update_current |
Update the current value of the Goal | gamification.goal.wizard | form | New |
No new fields.
Public methods (2)check_granting(self, cr, uid, badge_id, context=None)
check_progress(self, cr, uid, context=None)
No new fields.
Public methods (1)create(self, cr, uid, vals, context=None)
No new fields.
Public methods (1)action_grant_badge(self, cr, uid, ids, context=None)
No new fields.
Public methods (13)accept_challenge(self, cr, uid, challenge_ids, context=None, user_id=None)
action_check(self, cr, uid, ids, context=None)
action_report_progress(self, cr, uid, ids, context=None)
action_start(self, cr, uid, ids, context=None)
check_challenge_reward(self, cr, uid, ids, force=False, context=None)
create(self, cr, uid, vals, context=None)
discard_challenge(self, cr, uid, challenge_ids, context=None, user_id=None)
get_top3_users(self, cr, uid, challenge, context=None)
quick_update(self, cr, uid, challenge_id, context=None)
reply_challenge_wizard(self, cr, uid, challenge_id, context=None)
report_progress(self, cr, uid, challenge, context=None, users=False, subset_goal_ids=False)
reward_user(self, cr, uid, user_id, badge_id, challenge_id=False, context=None)
write(self, cr, uid, ids, vals, context=None)
No new fields.
Public methods (1)on_change_definition_id(self, cr, uid, ids, definition_id=False, context=None)
No new fields.
Public methods (1)action_update_current(self, cr, uid, ids, context=None)
No new fields.
Public methods (2)get_challenge_suggestions(self, cr, uid, context=None)
get_serialised_gamification_summary(self, cr, uid, excluded_categories=None, context=None)