Commit 6334307e88f9b1df606c2793eab8743b0acf9e0b

Authored by Victor Costa
1 parent ce884bd9

Dynamically define badge rules

lib/gamification_plugin.rb
... ... @@ -17,7 +17,9 @@ class GamificationPlugin < Noosfero::Plugin
17 17 # Override initial rules with environment specific rules
18 18 def self.gamification_set_rules(environment)
19 19 Merit::AppPointRules.clear
  20 + Merit::AppBadgeRules.clear
20 21 Merit::AppPointRules.merge!(Merit::PointRules.new(environment).defined_rules)
  22 + Merit::AppBadgeRules.merge!(Merit::BadgeRules.new(environment).defined_rules)
21 23 end
22 24  
23 25 def application_controller_filters
... ... @@ -37,23 +39,23 @@ class GamificationPlugin < Noosfero::Plugin
37 39  
38 40 Merit::Badge.create!(
39 41 id: 1,
40   - name: "commenter",
  42 + name: "comment_author",
41 43 description: "Commenter"
42 44 )
43 45 Merit::Badge.create!(
44 46 id: 2,
45   - name: "relevant-commenter",
  47 + name: "relevant_commenter",
46 48 description: "Relevant Commenter"
47 49 )
48 50 Merit::Badge.create!(
49 51 id: 3,
50   - name: "article-creator",
  52 + name: "article_author",
51 53 description: "Article Creator",
52 54 level: 1
53 55 )
54 56 Merit::Badge.create!(
55 57 id: 4,
56   - name: "article-creator",
  58 + name: "article_author",
57 59 description: "Article Creator",
58 60 level: 2
59 61 )
... ...
lib/merit/badge_rules.rb
... ... @@ -20,17 +20,40 @@ module Merit
20 20 class BadgeRules
21 21 include Merit::BadgeRulesMethods
22 22  
23   - def initialize
  23 + AVAILABLE_RULES = {
  24 + :comment_author => {
  25 + :action => 'comment#create',
  26 + :default_threshold => 5,
  27 + :value => lambda { |comment| comment.author.present? ? comment.author.comments.count : 0 }
  28 + },
  29 + :article_author => {
  30 + :action => 'article#create',
  31 + :default_threshold => 5,
  32 + :value => lambda { |article| article.author.present? ? article.author.articles.count : 0 }
  33 + },
  34 + :relevant_commenter => {
  35 + :action => 'vote_plugin_profile#vote',
  36 + :default_threshold => 5,
  37 + :value => lambda { |voteable| voteable.kind_of?(Comment) ? voteable.votes.count : 0 }
  38 + }
  39 + }
24 40  
25   - grant_on 'comment#create', badge: 'commenter' do |comment|
26   - comment.author.present? && comment.author.comments.count >= 5
  41 + def initialize(environment=nil)
  42 + return if environment.nil?
  43 + @environment = environment
  44 +
  45 + Merit::Badge.all.each do |badge|
  46 + setting = AVAILABLE_RULES[badge.name.to_sym]
  47 + grant_on setting[:action], :badge => badge.name do |source|
  48 + setting[:value].call(source) >= setting[:default_threshold]
  49 + end
27 50 end
28 51  
29   - grant_on 'article#create', badge: 'article-creator', level: 1 do |article|
  52 + grant_on 'article#create', badge: 'article_author', level: 1 do |article|
30 53 article.author.present? && article.author.articles.count >= 5
31 54 end
32 55  
33   - grant_on 'article#create', badge: 'article-creator', level: 2 do |article|
  56 + grant_on 'article#create', badge: 'article_author', level: 2 do |article|
34 57 article.author.present? && article.author.articles.count >= 10
35 58 end
36 59  
... ...
lib/merit/point_rules.rb
... ... @@ -33,9 +33,9 @@ module Merit
33 33 :value => lambda {|vote| vote.vote},
34 34 :default_weight => 5
35 35 },
  36 + # TODO comment_voter and article_voter
36 37 }
37 38  
38   - # FIXME get value from environment
39 39 def weight(category)
40 40 settings = Noosfero::Plugin::Settings.new(@environment, GamificationPlugin)
41 41 settings.settings.fetch(:point_rules, {}).fetch(category.to_s, {}).fetch('weight', AVAILABLE_RULES[category][:default_weight]).to_i
... ...
test/unit/article_test.rb
... ... @@ -24,13 +24,13 @@ class ArticleTest < ActiveSupport::TestCase
24 24  
25 25 should 'add merit badge to author when create 5 new articles' do
26 26 5.times { create(Article, :profile_id => person.id, :author => person) }
27   - assert_equal 'article-creator', person.badges.first.name
  27 + assert_equal 'article_author', person.badges.first.name
28 28 assert_equal 1, person.badges.first.level
29 29 end
30 30  
31 31 should 'add merit badge level 2 to author when create 10 new articles' do
32 32 10.times { create(Article, :profile_id => person.id, :author => person) }
33   - assert_equal ['article-creator'], person.badges.map(&:name).uniq
  33 + assert_equal ['article_author'], person.badges.map(&:name).uniq
34 34 assert_equal [1, 2], person.badges.map(&:level)
35 35 end
36 36  
... ...
test/unit/comment_test.rb
... ... @@ -24,7 +24,7 @@ class CommentTest < ActiveSupport::TestCase
24 24  
25 25 should 'add merit badge to author when create 5 new comments' do
26 26 5.times { create(Comment, :source => article, :author_id => person.id) }
27   - assert_equal 'commenter', person.badges.first.name
  27 + assert_equal 'comment_author', person.badges.first.name
28 28 end
29 29  
30 30 should 'add merit points to comment owner when an user like his comment' do
... ...