From 9e082662af3f14fb28731f5e273a87f1bb8a5748 Mon Sep 17 00:00:00 2001 From: David Beguin Date: Fri, 25 Jan 2019 09:58:17 +0000 Subject: [PATCH] [IMP] gamification : add ranks based on karma To encourage forum and slides users to be more active ranks are now added. They are directly linked to karma. The more the user has karma the more his rank will be high. The default rank is Newbie, with 1 point of karma. Users with 0 karma are considered as inactive on forum or slides. When a user reach a new rank a mail is sent to him to congratulate him with his new rank. To add a button in the mail template to allow users to go directly on a website section (like forum or slides) simply override get_gamification_redirection_data to add the target url. Partial commit linked to eLearning project. Main specifications related to gamification and user profile can be found on task 1922159 (PR #30514). Main specifications related to eLearning can be found on task 1902304 (PR #29876). --- addons/gamification/__manifest__.py | 6 ++ .../data/gamification_karma_rank_data.xml | 13 ++++ .../data/gamification_karma_rank_demo.xml | 36 +++++++++ .../models/gamification_karma_rank.py | 45 +++++++++++ addons/gamification/models/res_users.py | 57 ++++++++++++-- .../gamification/security/ir.model.access.csv | 3 + .../gamification/static/img/rank_bachelor.png | Bin 0 -> 13745 bytes .../gamification/static/img/rank_doctor.png | Bin 0 -> 14122 bytes .../gamification/static/img/rank_master.png | Bin 0 -> 7037 bytes .../gamification/static/img/rank_newbie.png | Bin 0 -> 3550 bytes .../gamification/static/img/rank_student.png | Bin 0 -> 5891 bytes .../views/gamification_karma_rank_views.xml | 71 ++++++++++++++++++ addons/gamification/views/mail_templates.xml | 51 +++++++++++++ addons/website_forum/views/forum.xml | 2 +- 14 files changed, 277 insertions(+), 7 deletions(-) create mode 100644 addons/gamification/data/gamification_karma_rank_data.xml create mode 100644 addons/gamification/data/gamification_karma_rank_demo.xml create mode 100644 addons/gamification/static/img/rank_bachelor.png create mode 100644 addons/gamification/static/img/rank_doctor.png create mode 100644 addons/gamification/static/img/rank_master.png create mode 100644 addons/gamification/static/img/rank_newbie.png create mode 100644 addons/gamification/static/img/rank_student.png create mode 100644 addons/gamification/views/gamification_karma_rank_views.xml create mode 100644 addons/gamification/views/mail_templates.xml diff --git a/addons/gamification/__manifest__.py b/addons/gamification/__manifest__.py index 975c9bccfd6..0270a25a56b 100644 --- a/addons/gamification/__manifest__.py +++ b/addons/gamification/__manifest__.py @@ -30,6 +30,12 @@ Both goals and badges are flexibles and can be adapted to a large range of modul 'security/ir.model.access.csv', 'data/goal_base.xml', 'data/badge.xml', + 'data/gamification_karma_rank_data.xml', 'views/gamification.xml', + 'views/gamification_karma_rank_views.xml', + 'views/mail_templates.xml' + ], + 'demo': [ + 'data/gamification_karma_rank_demo.xml' ], } diff --git a/addons/gamification/data/gamification_karma_rank_data.xml b/addons/gamification/data/gamification_karma_rank_data.xml new file mode 100644 index 00000000000..616c143d985 --- /dev/null +++ b/addons/gamification/data/gamification_karma_rank_data.xml @@ -0,0 +1,13 @@ + + + + + + Newbie +

You just began the adventure! Welcome!

+

Keep going !

+ 1 + +
+
+
diff --git a/addons/gamification/data/gamification_karma_rank_demo.xml b/addons/gamification/data/gamification_karma_rank_demo.xml new file mode 100644 index 00000000000..d9c89691b3a --- /dev/null +++ b/addons/gamification/data/gamification_karma_rank_demo.xml @@ -0,0 +1,36 @@ + + + + + Student +

You begin to understand things ! Keep going!

+

Keep going !

+ 100 + +
+ + + Bachelor +

Hey ! You're not so dumb after all !

+

Keep going !

+ 500 + +
+ + + Master +

You're good ! Really Good !

+

Keep going !

+ 2000 + +
+ + + Doctor +

Ok, RESPECT !

+

Keep going !

+ 10000 + +
+ +
diff --git a/addons/gamification/models/gamification_karma_rank.py b/addons/gamification/models/gamification_karma_rank.py index 061082545b4..26b89a3db33 100644 --- a/addons/gamification/models/gamification_karma_rank.py +++ b/addons/gamification/models/gamification_karma_rank.py @@ -3,7 +3,52 @@ from werkzeug.exceptions import Forbidden +from odoo import api, tools, fields, models +from odoo.tools.translate import html_translate + class KarmaError(Forbidden): """ Karma-related error, used for forum and posts. """ pass + + +class KarmaRank(models.Model): + _name = 'gamification.karma.rank' + _description = 'Rank based on karma' + _order = 'karma_required' + + name = fields.Text(string='Rank Name', translate=True, required=True) + description = fields.Html(string='Description', translate=html_translate, sanitize_attributes=False,) + description_reach_next = fields.Html( + string='Motivation phrase', translate=html_translate, sanitize_attributes=False, + help="Motivation phrase to reach next rank") + karma_required = fields.Integer(string='Required Karma', help='Minimum karma needed to reach this rank') + user_ids = fields.One2many('res.users', 'rank_id', string='Users', help="Users having this rank") + image = fields.Binary('Rank Icon') + image_medium = fields.Binary( + "Medium-sized rank icon", + help="Medium-sized icon of the rank. It is automatically " + "resized as a 128x128px image, with aspect ratio preserved. " + "Use this field in form views or some kanban views.") + image_small = fields.Binary( + "Small-sized rank icon", + help="Small-sized icon of the rank. It is automatically " + "resized as a 64x64px image, with aspect ratio preserved. " + "Use this field anywhere a small image is required.") + + @api.model_create_multi + def create(self, values_list): + for vals in values_list: + tools.image_resize_images(vals) + res = super(KarmaRank, self).create(values_list) + users = self.env['res.users'].sudo().search([('karma', '>', 0)]) + users._recompute_rank() + return res + + @api.multi + def write(self, vals): + tools.image_resize_images(vals) + res = super(KarmaRank, self).write(vals) + users = self.env['res.users'].sudo().search([('karma', '>', 0)]) + users._recompute_rank() + return res diff --git a/addons/gamification/models/res_users.py b/addons/gamification/models/res_users.py index fccddf8bfb5..d7fd35769df 100644 --- a/addons/gamification/models/res_users.py +++ b/addons/gamification/models/res_users.py @@ -12,12 +12,8 @@ class Users(models.Model): gold_badge = fields.Integer('Gold badges count', compute="_get_user_badge_level") silver_badge = fields.Integer('Silver badges count', compute="_get_user_badge_level") bronze_badge = fields.Integer('Bronze badges count', compute="_get_user_badge_level") - - @api.multi - def add_karma(self, karma): - for user in self: - user.karma += karma - return True + rank_id = fields.Many2one('gamification.karma.rank', 'Rank', index=False) + next_rank_id = fields.Many2one('gamification.karma.rank', 'Next Rank', index=False) @api.multi @api.depends('badge_ids') @@ -42,3 +38,52 @@ class Users(models.Model): for (user_id, level, count) in self.env.cr.fetchall(): # levels are gold, silver, bronze but fields have _badge postfix self.browse(user_id)['{}_badge'.format(level)] = count + + @api.model_create_multi + def create(self, values_list): + res = super(Users, self).create(values_list) + res._recompute_rank() + return res + + @api.multi + def write(self, vals): + if 'karma' in vals: + self._recompute_rank() + return super(Users, self).write(vals) + + @api.multi + def add_karma(self, karma): + for user in self: + user.karma += karma + return True + + def _rank_changed(self): + if self.rank_id.karma_required > 0: + template = self.env.ref('gamification.mail_template_data_new_rank_reached', raise_if_not_found=False) + if template: + template.send_mail(self.id, force_send=True, notif_layout='mail.mail_notification_light') + + def _recompute_rank(self): + """ + The caller should filter the users on karma > 0 before calling this method + to avoid looping on every single users + """ + ranks = [{'rank': rank, 'karma_required': rank.karma_required} for rank in + self.env['gamification.karma.rank'].search([], order="karma_required DESC")] + for user in self: + for i in range(0, len(ranks)): + if user.karma >= ranks[i]['karma_required']: + if user.rank_id != ranks[i]['rank']: + user.rank_id = ranks[i]['rank'].id + user.next_rank_id = ranks[i - 1]['rank'].id if i > 0 else False + user._rank_changed() + break + + def 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'}] + """ + self.ensure_one() + return [] diff --git a/addons/gamification/security/ir.model.access.csv b/addons/gamification/security/ir.model.access.csv index 6a4d9f64a0a..41f36a87a5f 100644 --- a/addons/gamification/security/ir.model.access.csv +++ b/addons/gamification/security/ir.model.access.csv @@ -25,3 +25,6 @@ badge_user_employee,"Badge-user Employee",model_gamification_badge_user,base.gro badge_user_manager,"Badge-user Manager",model_gamification_badge_user,base.group_erp_manager,1,1,1,1 badge_user_portal,"Badge-user Portal",gamification.model_gamification_badge_user,base.group_portal,1,1,1,0 badge_user_public,"Badge-user Public",gamification.model_gamification_badge_user,base.group_public,1,0,0,0 + +gamification_karma_rank_access_all,gamification.karma.rank.access.all,gamification.model_gamification_karma_rank,,1,0,0,0 +gamification_karma_rank_access_user_manager,gamification.karma.rank.access.user.manager,gamification.model_gamification_karma_rank,base.group_erp_manager,1,1,1,1 diff --git a/addons/gamification/static/img/rank_bachelor.png b/addons/gamification/static/img/rank_bachelor.png new file mode 100644 index 0000000000000000000000000000000000000000..8dd6b54fd3fe3e8c37c8bc9a84c3cacaaa97fe2a GIT binary patch literal 13745 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

N02iZOZv7&XT z>+A4h{@b%YEGeF44(scG6>I4q6#1CU(ca^bdKL+&sVZOOw?#@!Qc4zKv@U|RG#o-L z-B}Hk?|4yrh+WIp;+5mb_-<8JiXPXtAZ|w#Noo!$Yh7jUrxSU;Q|xN6e#qyVr%rYu zT`Uzp5qLBh_53=bw|7Cd*LM7$f8)W*RAQUN3YkyA4M5es;2*?wNms(n7@18p82i0^ z&lw_gnq>^FKBEwFG|abga3FW}-Np)mewY!~amrh@RjKlD<4UFpr_2&17DyNLb4+b@ z7Is7X%J1<IOY!8MF-;nDx_x90ZP3-5?)Jm7)QvuYHLuSA^^>5Q~r*4LJs5Y9eb5 z$)?tdlT)gPovp+p-!12c0rrtYqPAd?NSNEk!I}scG%i?BYKcAOIphh;B^NbE$%S!c z$p&&q&99CX3COfq=?;~ihsyuplJmu4ShY!ji<2i7Cp$M<1RXgKyRhM$qAyx(AJl8~ zY#vmN{EFq%G2RxJLB8|i(6-lO2Ice}Sn4u?UR*?KGg9Ivy5ACVWn3$DNQnfvBGar} zr4m8D?g(QqDi$nK`+*lg(m05Q3Wt#JS#l0Kw)^ufZS(59eDr~`im$b27O31ZGL5uM z6USZUc%vs2o^)SXv(Xd-xDju+He6-}egVm_6iAb8dcHnRf~2Dz4L{I=m#(J=;#kvj zRT_gBwrA(~ph2GwJ}B$IA;=n%cQ&WAnMmna$*Rrk^K!G^7r}2pA0L!&3S+5~cc>b8 z=b$ya3o4=yNnwB=#G5VwZp7NPrXYq;z9@FWsWwo=lk0%w(2R_?lonr{OHhA05TvfJ z*Nm7?Y_oDwOB8762Qr!zj;pa{N_1SmH_%s_oucn)`67d(9xAW!#!^;#2_3(#Q=(>+ z_8ZwoUXC6<=X)K2)ob6~aiO3_Aq23R-K&4vDKXGZ$Q(jH_7#KD>FCDD(rSts4VXE3 zl0~;tpuv13y&;d5IZIH}Vlm4N57${Era7fBV4WV+O8g}&&$&&J#Kjz!t)6|T~{$l*Gym#ca0DkY6DZMEHY( zDz~KjGhLr`dj!JxYd5uGj*3PC+~MKOCtod+iB_8ToaJ#}t~-Mn+iQvC$i_uo1C{l^`8BYd!oUfH!Jh@B`p@|4hXj!Y=yY3H`0)p> z^EG~tzf%#iMRvaT>ph!<+W>ojN1Q6>ry8fc?UldzcRo@EQfx6z70C%dzy6c;36Cms z(SNapaTyXMt?X=4f~Za zZ56)DLCESWE^~z|dX3!XP)AEG1QaX&Y&fb0Uv@ zQj$e@Tko{=m4tYfz-58(7ug$c;@k<7Hx23EZ;q=LOKGnHSfhfQiX#yNP9h#w&eELA zyb#9(_;)Vb_ox5~f*sEt?S!MzAV-yHxlf@>`Qot7Bw$n)at|x!2d`N>_V^jnH)2ur z$~{MjSTEoZ?CBYA6iU;rp#!qFyiPwSTKgZK={gM{GHZhp*T6KN-8ODEBZ2kTv1~i% zG0buuv^tA1vEQdJ#y!8=J1zs_Tc&ncp4U_Td% zo=8G}e!OMOz|B#ZCw5DqprGKIdR0ztjv^iQi)#e~ZwUdFe7Kr3qh%g(p^iyJhxRF5 z0qhRB!RjGlpX%c3XiN8u9gCq#Wp`1k97ftrFIYVaI7L)G}V0sZ!?W%OV(MNb#bpyL?nK1n$ z;?BOd`kBW|CZ9ac`8UzV+L}mp2fqOv$$)!;L^=8!N8h)+XVifVK|xKpbc+$UJs^++ z0sF;|VZzO?CcUxW(7od@oPw#{85PbhSr7zlPQT9knsZ18LwwOm9)9?Vq9()-?mK2n zR~r((Xgt+UR1=RWUP?SMkcBCs3%=&&8k>2W=9qDlIC{Wa2|3}5Q7*}Gsw+mqUR zJ7X!E^n86 z>7Uog(kmn-grr>S;cK=Jj9PPCj$3Ah(<1-jiXoE_la!y9quemW(AWl&C;Z5?s^RmL zj~la2@z3nZ)jVMake61L`YvG<^1lH2w8gCe literal 0 HcmV?d00001 diff --git a/addons/gamification/static/img/rank_doctor.png b/addons/gamification/static/img/rank_doctor.png new file mode 100644 index 0000000000000000000000000000000000000000..1454d3f3c6d10883bc5c4c64a5a271be62e351d0 GIT binary patch literal 14122 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 literal 0 HcmV?d00001 diff --git a/addons/gamification/static/img/rank_master.png b/addons/gamification/static/img/rank_master.png new file mode 100644 index 0000000000000000000000000000000000000000..8354dd3cb6163c24c65235f832569fe604bc2e77 GIT binary patch literal 7037 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 literal 0 HcmV?d00001 diff --git a/addons/gamification/static/img/rank_student.png b/addons/gamification/static/img/rank_student.png new file mode 100644 index 0000000000000000000000000000000000000000..5a52b7ab9a237b3487b4f95284e33d2a16ce3a28 GIT binary patch literal 5891 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 Y#?+j|*NK%3V5$w$*EYIEMmaqCA6r+k$^ZZW literal 0 HcmV?d00001 diff --git a/addons/gamification/views/gamification_karma_rank_views.xml b/addons/gamification/views/gamification_karma_rank_views.xml new file mode 100644 index 00000000000..d0d84c5114f --- /dev/null +++ b/addons/gamification/views/gamification_karma_rank_views.xml @@ -0,0 +1,71 @@ + + + + + Ranks + gamification.karma.rank + tree,form + +

+ Create a new rank +

+ A rank correspond to a fixed karma level. The more you have karma, the more your rank is high. + This is used to quickly know which user is new or old or highly or not active. +

+ + + + + gamification.karma.ranks.view.search + gamification.karma.rank + + + + + + + + + + + + gamification.karma.ranks.view.tree + gamification.karma.rank + + + + + + + + + + + + gamification.karma.rank.view.form + gamification.karma.rank + +
+ +
+ +
+
+ + + + + + + + + + +
+ + + diff --git a/addons/gamification/views/mail_templates.xml b/addons/gamification/views/mail_templates.xml new file mode 100644 index 00000000000..cf840157222 --- /dev/null +++ b/addons/gamification/views/mail_templates.xml @@ -0,0 +1,51 @@ + + + + + New rank reached + + Reception of ${object.name} + ${(object.partner_id.email_formatted or object.email) |safe} + ${object.partner_id.id} + New rank: ${object.rank_id.name} + ${object.partner_id.lang} + + +
+ + + + + + + +
+

+ Congratulations + ${object.partner_id.name or ''}! +

+

+ You just reached a new rank : ${object.rank_id.name} +

+

Continue your work to become a ${object.next_rank_id.name} !

+
+ % set gamification_redirection_data = object.get_gamification_redirection_data() + % for data in gamification_redirection_data + % set url = data['url'] + % set label = data['label'] + ${label} + % endfor +
+
+

+ +

+
+
+
+ Thank you,
+
+
+
+
+
diff --git a/addons/website_forum/views/forum.xml b/addons/website_forum/views/forum.xml index 6a168613cdc..60fb3093ebb 100644 --- a/addons/website_forum/views/forum.xml +++ b/addons/website_forum/views/forum.xml @@ -293,6 +293,6 @@ - +