Commit e01af1ea8b363866fb976ec0aee5fc27c749b1f5
1 parent
ab14f92a
Exists in
master
and in
1 other branch
Add owner field in badge form
Showing
6 changed files
with
61 additions
and
4 deletions
Show diff stats
controllers/admin/gamification_plugin_badges_controller.rb
... | ... | @@ -17,8 +17,13 @@ class GamificationPluginBadgesController < PluginAdminController |
17 | 17 | end |
18 | 18 | |
19 | 19 | def create |
20 | + owner_id = params[:gamification_plugin_badge].delete(:owner_id) | |
20 | 21 | @gamification_plugin_badge = GamificationPlugin::Badge.new(params[:gamification_plugin_badge]) |
21 | - @gamification_plugin_badge.owner = environment | |
22 | + if owner_id.present? | |
23 | + @gamification_plugin_badge.owner = environment.organizations.find(owner_id) | |
24 | + else | |
25 | + @gamification_plugin_badge.owner = environment | |
26 | + end | |
22 | 27 | |
23 | 28 | if @gamification_plugin_badge.save |
24 | 29 | session[:notice] = _('Badge was successfully created.') |
... | ... | @@ -31,6 +36,14 @@ class GamificationPluginBadgesController < PluginAdminController |
31 | 36 | def update |
32 | 37 | @gamification_plugin_badge = environment.gamification_plugin_badges.find(params[:id]) |
33 | 38 | |
39 | + # FIXME avoid code duplication | |
40 | + owner_id = params[:gamification_plugin_badge].delete(:owner_id) | |
41 | + if owner_id.present? | |
42 | + @gamification_plugin_badge.owner = environment.organizations.find(owner_id) | |
43 | + else | |
44 | + @gamification_plugin_badge.owner = environment | |
45 | + end | |
46 | + | |
34 | 47 | if @gamification_plugin_badge.update_attributes(params[:gamification_plugin_badge]) |
35 | 48 | session[:notice] = _('Badge was successfully updated.') |
36 | 49 | redirect_to :action => :index |
... | ... | @@ -39,6 +52,10 @@ class GamificationPluginBadgesController < PluginAdminController |
39 | 52 | end |
40 | 53 | end |
41 | 54 | |
55 | + def search_owners | |
56 | + render :text => prepare_to_token_input(environment.organizations).to_json | |
57 | + end | |
58 | + | |
42 | 59 | def destroy |
43 | 60 | @gamification_plugin_badge = environment.gamification_plugin_badges.find(params[:id]) |
44 | 61 | @gamification_plugin_badge.destroy | ... | ... |
lib/ext/environment.rb
... | ... | @@ -2,7 +2,11 @@ require_dependency 'environment' |
2 | 2 | |
3 | 3 | class Environment |
4 | 4 | |
5 | - has_many :gamification_plugin_badges, :class_name => 'GamificationPlugin::Badge', :foreign_key => 'owner_id', :source => :owner | |
5 | + has_many :gamification_plugin_environment_badges, :class_name => 'GamificationPlugin::Badge', :foreign_key => 'owner_id', :source => :owner | |
6 | 6 | has_many :gamification_plugin_organization_badges, :through => :organizations |
7 | 7 | |
8 | + def gamification_plugin_badges | |
9 | + GamificationPlugin::Badge.from("#{gamification_plugin_organization_badges.union(gamification_plugin_environment_badges).to_sql} as #{GamificationPlugin::Badge.table_name}") | |
10 | + end | |
11 | + | |
8 | 12 | end | ... | ... |
lib/merit/badge_rules.rb
... | ... | @@ -173,8 +173,7 @@ module Merit |
173 | 173 | rules = AVAILABLE_RULES |
174 | 174 | rules.merge! CONFERENCE_RULES if defined? CONFERENCE_RULES |
175 | 175 | |
176 | - gamification_plugin_badges = environment.gamification_plugin_badges + environment.gamification_plugin_organization_badges | |
177 | - gamification_plugin_badges.each do |badge| | |
176 | + environment.gamification_plugin_badges.each do |badge| | |
178 | 177 | next if rules[badge.name.to_sym].nil? |
179 | 178 | rules[badge.name.to_sym].each do |setting| |
180 | 179 | options = {badge: badge.name, level: badge.level, to: setting[:to]} | ... | ... |
test/functional/gamification_plugin_badges_controller_test.rb
... | ... | @@ -25,6 +25,14 @@ class GamificationPluginBadgesControllerTest < ActionController::TestCase |
25 | 25 | end |
26 | 26 | end |
27 | 27 | |
28 | + should "should create gamification_plugin_badge with organization as owner" do | |
29 | + organization = fast_create(Organization) | |
30 | + assert_difference('GamificationPlugin::Badge.count') do | |
31 | + post :create, gamification_plugin_badge: { description: @gamification_plugin_badge.description, level: @gamification_plugin_badge.level, name: @gamification_plugin_badge.name, custom_fields: {threshold: @gamification_plugin_badge.threshold}, owner_id: organization.id } | |
32 | + assert_equal organization, GamificationPlugin::Badge.last.owner | |
33 | + end | |
34 | + end | |
35 | + | |
28 | 36 | should "should show gamification_plugin_badge" do |
29 | 37 | get :show, id: @gamification_plugin_badge |
30 | 38 | assert_response :success |
... | ... | @@ -40,6 +48,23 @@ class GamificationPluginBadgesControllerTest < ActionController::TestCase |
40 | 48 | assert assigns(:gamification_plugin_badge) |
41 | 49 | end |
42 | 50 | |
51 | + should "should change badge owner" do | |
52 | + organization = fast_create(Organization) | |
53 | + put :update, id: @gamification_plugin_badge, gamification_plugin_badge: { description: @gamification_plugin_badge.description, level: @gamification_plugin_badge.level, name: @gamification_plugin_badge.name, custom_fields: {threshold: @gamification_plugin_badge.threshold}, owner_id: organization.id } | |
54 | + assert assigns(:gamification_plugin_badge) | |
55 | + assert_equal organization, @gamification_plugin_badge.reload.owner | |
56 | + end | |
57 | + | |
58 | + should "should keep badge owner when update" do | |
59 | + organization = fast_create(Organization) | |
60 | + @gamification_plugin_badge.owner = organization | |
61 | + @gamification_plugin_badge.save! | |
62 | + | |
63 | + put :update, id: @gamification_plugin_badge, gamification_plugin_badge: { description: @gamification_plugin_badge.description, level: @gamification_plugin_badge.level, name: @gamification_plugin_badge.name, custom_fields: {threshold: @gamification_plugin_badge.threshold}, owner_id: organization.id } | |
64 | + assert assigns(:gamification_plugin_badge) | |
65 | + assert_equal organization, @gamification_plugin_badge.reload.owner | |
66 | + end | |
67 | + | |
43 | 68 | should "should destroy gamification_plugin_badge" do |
44 | 69 | assert_difference('GamificationPlugin::Badge.count', -1) do |
45 | 70 | delete :destroy, id: @gamification_plugin_badge | ... | ... |
views/gamification_plugin_badges/_form.html.erb
... | ... | @@ -29,6 +29,11 @@ |
29 | 29 | <%= f.label :level %><br /> |
30 | 30 | <%= f.text_field :level %> |
31 | 31 | </div> |
32 | + <div class="field"> | |
33 | + <%= f.label :profile_owner %><br /> | |
34 | + <% tokenized_owner = @gamification_plugin_badge.owner.present? && @gamification_plugin_badge.owner.kind_of?(Organization) ? prepare_to_token_input([@gamification_plugin_badge.owner]) : nil %> | |
35 | + <%= token_input_field_tag('gamification_plugin_badge[owner_id]', 'badge-owner', {:action => 'search_owners'}, {:focus => false, :hint_text => _('Choose a profile or leave it blank for a global badge'), :token_limit => 1, :pre_populate => tokenized_owner}) %> | |
36 | + </div> | |
32 | 37 | <h4><%= _('Actions') %></h4> |
33 | 38 | <%= f.fields_for :custom_fields do |c| %> |
34 | 39 | <% rules.each do |name, settings| %> | ... | ... |
views/gamification_plugin_badges/show.html.erb
... | ... | @@ -22,6 +22,13 @@ |
22 | 22 | <%= @gamification_plugin_badge.level %> |
23 | 23 | </p> |
24 | 24 | |
25 | +<% if @gamification_plugin_badge.owner.kind_of?(Organization) %> | |
26 | +<p> | |
27 | + <b><%= _('Profile owner:') %></b> | |
28 | + <%= @gamification_plugin_badge.owner.name %> | |
29 | + </p> | |
30 | +<% end %> | |
31 | + | |
25 | 32 | <p> |
26 | 33 | <b>Threshold:</b> |
27 | 34 | <% if @gamification_plugin_badge.custom_fields.is_a? Hash %> | ... | ... |