Commit e01af1ea8b363866fb976ec0aee5fc27c749b1f5

Authored by Victor Costa
1 parent ab14f92a

Add owner field in badge form

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 %>
... ...