Commit bea83c2384fd561acb4cddf17454616dd91fabd7
Exists in
master
and in
1 other branch
Merge branch 'fix_pontuation_check' into 'master'
Fix pontuation check and add check for badges See merge request !5
Showing
2 changed files
with
51 additions
and
24 deletions
Show diff stats
lib/merit/point_rules.rb
script/check_merit_actions_vs_points.rb
... | ... | @@ -36,8 +36,8 @@ def create_action(obj, index, count) |
36 | 36 | end |
37 | 37 | |
38 | 38 | def recreate_actions person, objects, category |
39 | - puts "Recreating actions for #{person.identifier} on model #{objects.first.class.base_class.name}" | |
40 | - actions = Merit::Action.where(target_id: objects, target_model: objects.first.class.base_class.name.downcase, action_method: 'create') | |
39 | + puts "Recreating actions for #{person.identifier} on model #{objects.name}" | |
40 | + actions = Merit::Action.where(target_id: objects, target_model: objects.name.downcase, action_method: 'create') | |
41 | 41 | Merit::Score::Point.where(action_id: actions).destroy_all |
42 | 42 | actions.destroy_all |
43 | 43 | # erase remaining points if any (can be wrong on destroy cases ?) |
... | ... | @@ -65,11 +65,20 @@ class Article < ActiveRecord::Base |
65 | 65 | end |
66 | 66 | end |
67 | 67 | |
68 | -puts "Creaning up points from actions which don't exist" | |
68 | +puts "Cleaning up points from actions which don't exist" | |
69 | 69 | Merit::Score::Point.includes(:action).find_each(batch_size: 100) do |point| |
70 | 70 | point.destroy if point.action.nil? |
71 | 71 | end |
72 | 72 | |
73 | +# erase the badges spreadsheet | |
74 | +CSV.open( "gamification_wrong_badges.csv", 'w' ) do |csv| | |
75 | + csv << ['identifier', 'missing badges', 'exceeding badges'] | |
76 | +end | |
77 | +# erase the points spreadsheet | |
78 | +CSV.open( "gamification_points_out_expectation.csv", 'w' ) do |csv| | |
79 | + csv << ['identifier', 'name', 'action', 'profile', 'category id', 'category type', 'should have', 'have'] | |
80 | +end | |
81 | + | |
73 | 82 | Environment.all.each do |environment| |
74 | 83 | puts "Process environment #{environment.name}" |
75 | 84 | |
... | ... | @@ -82,12 +91,12 @@ Environment.all.each do |environment| |
82 | 91 | conditions = group_control.nil? ? {} : {:identifier => group_control.map{|k,v| v['profiles']}.flatten} |
83 | 92 | people_count = environment.people.where(conditions).count |
84 | 93 | person_index = 0 |
85 | - remaining_wrong_points = [] | |
86 | 94 | puts "Analising environment people" |
87 | 95 | environment.people.find_each(:conditions => conditions) do |person| |
88 | 96 | person_index += 1 |
89 | 97 | profile_ids = GamificationPlugin::PointsCategorization.uniq.pluck(:profile_id) |
90 | 98 | profile_ids.keep_if { |item| group_control.keys.include?(item) } unless group_control.nil? |
99 | + profile_ids.delete nil # avoid loosing time with generic for now | |
91 | 100 | profile_ids.each do |profile_id| |
92 | 101 | profile = Profile.where(id: profile_id).first |
93 | 102 | if profile.nil? |
... | ... | @@ -112,8 +121,34 @@ Environment.all.each do |environment| |
112 | 121 | follows_received = ArticleFollower.where(:article_id => person_articles) |
113 | 122 | |
114 | 123 | puts "#{person_index}/#{people_count} - Analising points for #{person.identifier} on #{profile_name}" |
115 | - puts "Proposed #{person_articles.count} times, Commented #{comments.count} times, Voted #{votes.count} times, Followed #{follows.count} times" | |
116 | - puts "Received #{votes_received.count} votes, #{comments_received.count} comments, #{follows_received.count} follows\n" | |
124 | + #puts "Proposed #{person_articles.count} times, Commented #{comments.count} times, Voted #{votes.count} times, Followed #{follows.count} times" | |
125 | + #puts "Received #{votes_received.count} votes, #{comments_received.count} comments, #{follows_received.count} follows\n" | |
126 | + | |
127 | + scope_by_badge_action = { | |
128 | + "articlefollower#create" => follows, "comment#create" => comments, "article#create" => person_articles, "vote#create" => votes | |
129 | + } | |
130 | + | |
131 | + # ignoring user badges out of environment badges | |
132 | + should_and_doesnt_have = [] | |
133 | + should_not_have = [] | |
134 | + should_have = true | |
135 | + environment.gamification_plugin_badges.each do |badge| | |
136 | + (badge.custom_fields || {}).each do |action, config| | |
137 | + break if scope_by_badge_action[action].nil? or config[:threshold].nil? | |
138 | + should_have &= scope_by_badge_action[action].count >= config[:threshold].to_i | |
139 | + end | |
140 | + have = person.badges.include? badge | |
141 | + if should_have && !have | |
142 | + should_and_doesnt_have << "#{badge.title} #{badge.level}" | |
143 | + elsif should_have && !have | |
144 | + should_not_have << "#{badge.title} #{badge.level}" | |
145 | + end | |
146 | + end | |
147 | + if should_and_doesnt_have.size > 0 || should_not_have.size > 0 | |
148 | + CSV.open( "gamification_points_out_expectation.csv", 'a' ) do |csv| | |
149 | + [person.identifier, should_and_doesnt_have.join(' | '), should_not_have.join(' | ')] | |
150 | + end | |
151 | + end | |
117 | 152 | |
118 | 153 | scope_by_type = { |
119 | 154 | article_author: person_articles, comment_author: comments, vote_voter: votes, follower: follows, |
... | ... | @@ -128,8 +163,15 @@ Environment.all.each do |environment| |
128 | 163 | if points != person.points(category: c.id.to_s) |
129 | 164 | recreate_actions person, scope, c.id.to_s |
130 | 165 | points = calc_points c, scope |
131 | - puts "after recreating points the person has: #{person.reload.points(category: c.id.to_s)} and should have #{points}" | |
132 | - remaining_wrong_points << [person.identifier, person.name, scope.first.class.base_class.name, profile_name, c.id, c.point_type.name, scope.count*c.weight, person.points(category: c.id.to_s)] if points != person.points(category: c.id.to_s) | |
166 | + if points != person.reload.points(category: c.id.to_s) | |
167 | + puts "after recreating points the person has: #{person.reload.points(category: c.id.to_s)} and should have #{points}" | |
168 | + # write to the spreadsheet the person points that couldn't regulate | |
169 | + CSV.open( "gamification_points_out_expectation.csv", 'a' ) do |csv| | |
170 | + [person.identifier, person.name, scope.first.class.base_class.name, profile_name, c.id, c.point_type.name, scope.count*c.weight, person.points(category: c.id.to_s)] | |
171 | + end | |
172 | + else | |
173 | + puts "points fixed for #{c.point_type.name}!" | |
174 | + end | |
133 | 175 | end |
134 | 176 | end |
135 | 177 | puts |
... | ... | @@ -142,20 +184,4 @@ Environment.all.each do |environment| |
142 | 184 | puts "Updating #{person.identifier} level\n" |
143 | 185 | person.update_attribute(:level, person.gamification_plugin_calculate_level) |
144 | 186 | end |
145 | - | |
146 | - # write to the spreadsheet the person points that couldn't regulate | |
147 | - unless remaining_wrong_points.blank? | |
148 | - CSV.open( "gamification_points_out_expectation.csv", 'w' ) do |csv| | |
149 | - csv << ['identifier', 'name', 'action', 'profile', 'category id', 'category type', 'should have', 'have'] | |
150 | - remaining_wrong_points.each do |line| | |
151 | - csv << line | |
152 | - end | |
153 | - end | |
154 | - end | |
155 | - | |
156 | - if remaining_wrong_points.count | |
157 | - puts "Finished. There was #{remaining_wrong_points.count} people/pontuation types with errors after check and fix. Please check the created spreadsheet." | |
158 | - else | |
159 | - puts "Finished. There was no errors after checking. \o/ Pontuation seems to be ok!" | |
160 | - end | |
161 | 187 | end | ... | ... |