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