TIP: You can type at any time to perform a new search.
Gamification
gamification · odoo/odoo
- Repository
- odoo/odoo · module folder
- Module version
- 1.0
- Category
- Human Resources
- Folder size
- 8.68 MB
- License
- LGPL-3
- Application
- No
- Auto-installable
- No
- Website
- None
- Last tracking update
- 2026-08-15 22:44:17
- Authors
- Odoo S.A.
- Maintainers
- Odoo S.A.
- Committers
- Xavier Morel, Raphael Collet, Thibault Delavallée, Odoo Translation Bot, 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
- Odoo dependencies
- Python dependencies
- None
- System dependencies
- None
- Required by
- gamification_sale_crm, hr_gamification, survey, website_membership_gamification, website_profile
- 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.
Code Analysis ⓘ
Views touched (26)
| 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 | form | 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 |
HTTP endpoints (0)
No HTTP endpoints found for this module.
Models touched (11)
New fields (20)
-
activeBooleandefault=True args: 'Active' -
challenge_idsOne2many → gamification.challengestring='Reward of Challenges' args: 'gamification.challenge', 'reward_id' -
descriptionHtmlsanitize_attributes=Falsetranslate=True args: 'Description' -
goal_definition_idsMany2many → gamification.goal.definitionhelp='The users that have succeeded these goals will receive automatically the badge.'string='Rewarded by' args: 'gamification.goal.definition', 'badge_unlocked_definition_rel' -
granted_countIntegercompute='_get_owners_info'help='The number of time this badge has been received.' args: 'Total' -
granted_users_countIntegercompute='_get_owners_info'help='The number of time this badge has been received by unique users.' args: 'Number of users' -
levelSelectiondefault='bronze'string='Forum Badge Level' args: [('bronze', 'Bronze'), ('silver', 'Silver'), ('gold', 'Gold')] -
nameCharrequired=Truetranslate=True args: 'Badge' -
owner_idsOne2many → gamification.badge.userhelp='The list of instances of this badge granted to users'string='Owners' args: 'gamification.badge.user', 'badge_id' -
remaining_sendingIntegercompute='_remaining_sending_calc'help='If a maximum is set' args: 'Remaining Sending Allowed' -
rule_authSelectiondefault='everyone'help='Who can grant this badge'required=Truestring='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_idsMany2many → gamification.badgehelp='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_idsMany2many → res.usershelp='Only these people can give this badge'string='Authorized Users' args: 'res.users', 'rel_badge_auth_users' -
rule_maxBooleanhelp='Check to set a monthly limit per person of sending this badge' args: 'Monthly Limited Sending' -
rule_max_numberIntegerhelp='The maximum number of time this badge can be sent per month per person.' args: 'Limitation Number' -
stat_myIntegercompute='_get_badge_user_stats'help='The number of time the current user has received this badge.' args: 'My Total' -
stat_my_monthly_sendingIntegercompute='_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_monthIntegercompute='_get_badge_user_stats'help='The number of time the current user has received this badge this month.' args: 'My Monthly Total' -
stat_this_monthIntegercompute='_get_badge_user_stats'help='The number of time this badge has been received this month.' args: 'Monthly total' -
unique_owner_idsMany2many → res.userscompute='_get_owners_info'help='The list of unique users having received this badge.'string='Unique Owners' args: 'res.users'
-
check_granting(self)Check the user 'uid' can grant the badge 'badge_id' and raise the appropriate exception if not Do not check for SUPERUSER_ID
New fields (8)
-
badge_idMany2one → gamification.badgeindex=Trueondelete='cascade'required=Truestring='Badge' args: 'gamification.badge' -
badge_nameCharreadonly=Falserelated='badge_id.name'string='Badge Name' -
challenge_idMany2one → gamification.challengestring='Challenge' args: 'gamification.challenge' -
commentTextargs: 'Comment' -
levelSelectionreadonly=Truerelated='badge_id.level'store=Truestring='Badge Level' -
sender_idMany2one → res.usersstring='Sender' args: 'res.users' -
user_idMany2one → res.usersindex=Trueondelete='cascade'required=Truestring='User' args: 'res.users' -
user_partner_idMany2one → res.partnerrelated='user_id.partner_id' args: 'res.partner'
-
create(self, vals_list)@api.model_create_multi
New fields (3)
-
badge_idMany2one → gamification.badgerequired=Truestring='Badge' args: 'gamification.badge' -
commentTextargs: 'Comment' -
user_idMany2one → res.usersrequired=Truestring='User' args: 'res.users'
-
action_grant_badge(self)Wizard action for sending a badge to a chosen user
New fields (26)
-
challenge_categorySelectiondefault='hr'help='Define the visibility of the challenge through menus'required=Truestring='Appears in' args: [('hr', 'Human Resources / Engagement'), ('other', 'Settings / Gamification Tools')] -
descriptionTexttranslate=True args: 'Description' -
end_dateDatehelp='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_idsMany2many → res.usersstring='Suggest to users' args: 'res.users', 'gamification_invited_user_ids_rel' -
last_report_dateDatedefault=fields.Date.today args: 'Last Report Date' -
line_idsOne2many → gamification.challenge.linecopy=Truehelp='List of goals that will be set'required=Truestring='Lines' args: 'gamification.challenge.line', 'challenge_id' -
manager_idMany2one → res.usersdefault=<expr>string='Responsible' args: 'res.users' -
nameCharrequired=Truetranslate=True args: 'Challenge Name' -
next_report_dateDatecompute='_get_next_report_date'store=True args: 'Next Report Date' -
periodSelectiondefault='once'help='Period of automatic goal assignment. If none is selected, should be launched manually.'required=Truestring='Periodicity' args: [('once', 'Non recurring'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('yearly', 'Yearly')] -
remind_update_delayIntegerhelp='Never reminded if no value or zero is specified.' args: 'Non-updated manual goals will be reminded after' -
report_message_frequencySelectiondefault='never'required=Truestring='Report Frequency' args: [('never', 'Never'), ('onchange', 'On change'), ('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('yearly', 'Yearly')] -
report_message_group_idMany2one → discuss.channelhelp='Group that will receive a copy of the report in addition to the user'string='Send a copy to' args: 'discuss.channel' -
report_template_idMany2one → mail.templatedefault=<expr>required=Truestring='Report Template' args: 'mail.template' -
reward_failureBooleanargs: 'Reward Bests if not Succeeded?' -
reward_first_idMany2one → gamification.badgestring='For 1st user' args: 'gamification.badge' -
reward_idMany2one → gamification.badgeindex='btree_not_null'string='For Every Succeeding User' args: 'gamification.badge' -
reward_realtimeBooleandefault=Truehelp='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_idMany2one → gamification.badgestring='For 2nd user' args: 'gamification.badge' -
reward_third_idMany2one → gamification.badgestring='For 3rd user' args: 'gamification.badge' -
start_dateDatehelp='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' -
stateSelectioncopy=Falsedefault='draft'required=Truestring='State'tracking=True args: [('draft', 'Draft'), ('inprogress', 'In Progress'), ('done', 'Done')] -
user_countIntegercompute='_compute_user_count' args: '# Users' -
user_domainCharargs: 'User domain' -
user_idsMany2many → res.usersstring='Participants' args: 'res.users', 'gamification_challenge_users_rel' -
visibility_modeSelectiondefault='personal'required=Truestring='Display Mode' args: [('personal', 'Individual Goals'), ('ranking', 'Leader Board (Group Ranking)')]
-
accept_challenge(self) -
action_check(self)Check a challenge Create goals that haven't been created yet (eg: if added users) Recompute the current value for each goal related -
action_report_progress(self)Manual report of a goal, does not influence automatic report frequency -
action_start(self)Start a challenge -
action_view_users(self)Redirect to the participants (users) list. -
create(self, vals_list)@api.model_create_multiOverwrite the create method to add the user of groups -
default_get(self, fields)@api.model -
discard_challenge(self)The user discard the suggested challenge -
report_progress(self, users=(), subset_goals=False)Post report about the progress of the goals :param users: users that are concerned by the report. If False, will send the report to every user concerned (goal users and group that receive a copy). Only used for challenge with a visibility mode set to 'personal'. :param subset_goals: goals to restrict the report -
write(self, vals)
New fields (9)
-
challenge_idMany2one → gamification.challengeindex=Trueondelete='cascade'required=Truestring='Challenge' args: 'gamification.challenge' -
conditionSelectionreadonly=Truerelated='definition_id.condition'string='Condition' -
definition_full_suffixCharreadonly=Truerelated='definition_id.full_suffix' args: 'Suffix' -
definition_idMany2one → gamification.goal.definitionondelete='cascade'required=Truestring='Goal Definition' args: 'gamification.goal.definition' -
definition_monetaryBooleanreadonly=Truerelated='definition_id.monetary' args: 'Monetary' -
definition_suffixCharreadonly=Truerelated='definition_id.suffix' args: 'Unit' -
nameCharreadonly=Falserelated='definition_id.name' args: 'Name' -
sequenceIntegerdefault=1 args: 'Sequence' -
target_goalFloatrequired=True args: 'Target Value to Reach'
No public methods.
New fields (21)
-
challenge_idMany2onehelp='Challenge that generated the goal, assign challenge to users to generate goals with a value in this field.'index=Truereadonly=Truerelated='line_id.challenge_id'store=True -
closedBooleanargs: 'Closed goal' -
colorIntegercompute='_compute_color' args: 'Color Index' -
completenessFloatcompute='_get_completion' args: 'Completeness' -
computation_modeSelectionreadonly=Falserelated='definition_id.computation_mode' -
currentFloatdefault=0required=True args: 'Current Value' -
definition_conditionSelectionreadonly=Truerelated='definition_id.condition'string='Definition Condition' -
definition_descriptionTextreadonly=Truerelated='definition_id.description' args: 'Definition Description' -
definition_displaySelectionreadonly=Truerelated='definition_id.display_mode'string='Display Mode' -
definition_idMany2one → gamification.goal.definitionondelete='cascade'required=Truestring='Goal Definition' args: 'gamification.goal.definition' -
definition_suffixCharreadonly=Truerelated='definition_id.full_suffix' args: 'Suffix' -
end_dateDateargs: 'End Date' -
last_updateDatehelp='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_idMany2one → gamification.challenge.lineondelete='cascade'string='Challenge Line' args: 'gamification.challenge.line' -
remind_update_delayIntegerhelp='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_dateDatedefault=fields.Date.today args: 'Start Date' -
stateSelectiondefault='draft'required=Truestring='State' args: [('draft', 'Draft'), ('inprogress', 'In progress'), ('reached', 'Reached'), ('failed', 'Failed'), ('canceled', 'Cancelled')] -
target_goalFloatrequired=True args: 'To Reach' -
to_updateBooleanargs: 'To update' -
user_idMany2one → res.usersbypass_search_access=Trueindex=Trueondelete='cascade'required=Truestring='User' args: 'res.users' -
user_partner_idMany2one → res.partnerrelated='user_id.partner_id' args: 'res.partner'
-
action_cancel(self)Reset the completion after setting a goal as reached or failed. This is only the current state, if the date and/or target criteria match the conditions for a change of state, this will be applied at the next goal update. -
action_fail(self)Set the state of the goal to failed. A failed goal will be ignored in future checks. -
action_reach(self)Mark a goal as reached. If the target goal condition is not met, the state will be reset to In Progress at the next goal update until the end date. -
action_start(self)Mark a goal as started. This should only be used when creating goals manually (in draft state) -
create(self, vals_list)@api.model_create_multi -
get_action(self)Get the ir.action related to update the goal In case of a manual goal, should return a wizard to update the value :return: action description in a dictionary -
update_goal(self)Update the goals to recomputes values and change of states If a manual goal is not updated for enough time, the user will be reminded to do so (done only once, in 'inprogress' state). If a goal reaches the target value, the status is set to reached If the end date is passed (at least +1 day, time not considered) without the target value being reached, the goal is set as failed. -
write(self, vals)Overwrite the write method to update the last_update field to today If the current value is changed and the report frequency is set to On change, a report is generated
New fields (19)
-
action_idMany2one → ir.actions.act_windowhelp='The action that will be called to update the goal value.'string='Action' args: 'ir.actions.act_window' -
batch_distinctive_fieldMany2one → ir.model.fieldshelp='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_modeBooleanhelp='Evaluate the expression in batch instead of once for each user' args: 'Batch Mode' -
batch_user_expressionCharhelp="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_modeSelectiondefault='manually'help="Define how the goals will be computed. The result of the operation will be stored in the field 'Current'."required=Truestring='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_codeTexthelp="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' -
conditionSelectiondefault='higher'help='A goal is considered as completed when the current value is compared to the value to reach'required=Truestring='Goal Performance' args: [('higher', 'The higher the better'), ('lower', 'The lower the better')] -
descriptionTextargs: 'Goal Description' -
display_modeSelectiondefault='progress'required=Truestring='Displayed as' args: [('progress', 'Progressive (using numerical values)'), ('boolean', 'Exclusive (done or not-done)')] -
domainChardefault='[]'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_idMany2one → ir.model.fieldsdomain=<expr>help='The date to use for the time period evaluated'string='Date Field' args: 'ir.model.fields' -
field_idMany2one → ir.model.fieldsdomain=<expr>string='Field to Sum' args: 'ir.model.fields' -
full_suffixCharcompute='_compute_full_suffix'help='The currency and suffix field' args: 'Full Suffix' -
model_idMany2one → ir.modelondelete='cascade'string='Model' args: 'ir.model' -
model_inherited_idsMany2many → ir.modelrelated='model_id.inherited_model_ids' args: 'ir.model' -
monetaryBooleandefault=Falsehelp='The target and current value are defined in the company currency.' args: 'Monetary Value' -
nameCharrequired=Truetranslate=True args: 'Goal Definition' -
res_id_fieldCharhelp='The field name on the user profile (res.users) containing the value for res_id for action.' args: 'ID Field of user' -
suffixCharhelp='The unit of the target and current values'translate=True args: 'Suffix'
-
create(self, vals_list)@api.model_create_multi -
write(self, vals)
New fields (2)
-
currentFloatargs: 'Current' -
goal_idMany2one → gamification.goalrequired=Truestring='Goal' args: 'gamification.goal'
-
action_update_current(self)Wizard action for updating the current value
New fields (6)
-
descriptionHtmlsanitize_attributes=Falsestring='Description'translate=html_translate -
description_motivationalHtmlhelp='Motivational phrase to reach this rank on your profile page'sanitize_attributes=Falsesanitize_overridable=Truestring='Motivational'translate=html_translate -
karma_minIntegerdefault=1required=Truestring='Required Karma' -
nameTextrequired=Truestring='Rank Name'translate=True -
rank_users_countIntegercompute='_compute_rank_users_count' args: '# Users' -
user_idsOne2many → res.usersstring='Users' args: 'res.users', 'rank_id'
-
create(self, vals_list)@api.model_create_multi -
write(self, vals)
New fields (9)
-
consolidatedBooleanargs: 'Consolidated' -
gainIntegercompute='_compute_gain'readonly=False args: 'Gain' -
new_valueIntegerrequired=True args: 'New Karma Value' -
old_valueIntegerreadonly=True args: 'Old Karma Value' -
origin_refReferencedefault=<expr>selection=<expr>string='Source' -
origin_ref_model_nameSelectioncompute='_compute_origin_ref_model_name'selection=<expr>store=Truestring='Source Type' -
reasonTextdefault=<expr>string='Description' -
tracking_dateDatetimedefault=fields.Datetime.nowindex=Truereadonly=True -
user_idMany2one → res.usersindex=Trueondelete='cascade'required=True args: 'res.users', 'User'
-
create(self, vals_list)@api.model_create_multi
New fields (8)
-
badge_idsOne2many → gamification.badge.usercopy=Falsestring='Badges' args: 'gamification.badge.user', 'user_id' -
bronze_badgeIntegercompute='_get_user_badge_level' args: 'Bronze badges count' -
gold_badgeIntegercompute='_get_user_badge_level' args: 'Gold badges count' -
karmaIntegercompute='_compute_karma'readonly=Falsestore=True args: 'Karma' -
karma_tracking_idsOne2many → gamification.karma.trackinggroups='base.group_system'string='Karma Changes' args: 'gamification.karma.tracking', 'user_id' -
next_rank_idMany2one → gamification.karma.rankargs: 'gamification.karma.rank', 'Next Rank' -
rank_idMany2one → gamification.karma.rankindex='btree_not_null' args: 'gamification.karma.rank', 'Rank' -
silver_badgeIntegercompute='_get_user_badge_level' args: 'Silver badges count'
-
action_karma_report(self) -
create(self, vals_list)@api.model_create_multi -
get_gamification_redirection_data(self)Hook for other modules to add redirect button(s) in new rank reached mail Must return a list of dictionnary including url and label. E.g. return [{'url': '/forum', label: 'Go to Forum'}] -
write(self, vals)
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…
Loading…