From e01af1ea8b363866fb976ec0aee5fc27c749b1f5 Mon Sep 17 00:00:00 2001 From: Victor Costa Date: Thu, 5 Nov 2015 11:39:18 -0300 Subject: [PATCH] Add owner field in badge form --- controllers/admin/gamification_plugin_badges_controller.rb | 19 ++++++++++++++++++- lib/ext/environment.rb | 6 +++++- lib/merit/badge_rules.rb | 3 +-- test/functional/gamification_plugin_badges_controller_test.rb | 25 +++++++++++++++++++++++++ views/gamification_plugin_badges/_form.html.erb | 5 +++++ views/gamification_plugin_badges/show.html.erb | 7 +++++++ 6 files changed, 61 insertions(+), 4 deletions(-) diff --git a/controllers/admin/gamification_plugin_badges_controller.rb b/controllers/admin/gamification_plugin_badges_controller.rb index 4267481..18803e0 100644 --- a/controllers/admin/gamification_plugin_badges_controller.rb +++ b/controllers/admin/gamification_plugin_badges_controller.rb @@ -17,8 +17,13 @@ class GamificationPluginBadgesController < PluginAdminController end def create + owner_id = params[:gamification_plugin_badge].delete(:owner_id) @gamification_plugin_badge = GamificationPlugin::Badge.new(params[:gamification_plugin_badge]) - @gamification_plugin_badge.owner = environment + if owner_id.present? + @gamification_plugin_badge.owner = environment.organizations.find(owner_id) + else + @gamification_plugin_badge.owner = environment + end if @gamification_plugin_badge.save session[:notice] = _('Badge was successfully created.') @@ -31,6 +36,14 @@ class GamificationPluginBadgesController < PluginAdminController def update @gamification_plugin_badge = environment.gamification_plugin_badges.find(params[:id]) + # FIXME avoid code duplication + owner_id = params[:gamification_plugin_badge].delete(:owner_id) + if owner_id.present? + @gamification_plugin_badge.owner = environment.organizations.find(owner_id) + else + @gamification_plugin_badge.owner = environment + end + if @gamification_plugin_badge.update_attributes(params[:gamification_plugin_badge]) session[:notice] = _('Badge was successfully updated.') redirect_to :action => :index @@ -39,6 +52,10 @@ class GamificationPluginBadgesController < PluginAdminController end end + def search_owners + render :text => prepare_to_token_input(environment.organizations).to_json + end + def destroy @gamification_plugin_badge = environment.gamification_plugin_badges.find(params[:id]) @gamification_plugin_badge.destroy diff --git a/lib/ext/environment.rb b/lib/ext/environment.rb index ce683d6..948dc1d 100644 --- a/lib/ext/environment.rb +++ b/lib/ext/environment.rb @@ -2,7 +2,11 @@ require_dependency 'environment' class Environment - has_many :gamification_plugin_badges, :class_name => 'GamificationPlugin::Badge', :foreign_key => 'owner_id', :source => :owner + has_many :gamification_plugin_environment_badges, :class_name => 'GamificationPlugin::Badge', :foreign_key => 'owner_id', :source => :owner has_many :gamification_plugin_organization_badges, :through => :organizations + def gamification_plugin_badges + GamificationPlugin::Badge.from("#{gamification_plugin_organization_badges.union(gamification_plugin_environment_badges).to_sql} as #{GamificationPlugin::Badge.table_name}") + end + end diff --git a/lib/merit/badge_rules.rb b/lib/merit/badge_rules.rb index 8f2a8e2..8b3faa0 100644 --- a/lib/merit/badge_rules.rb +++ b/lib/merit/badge_rules.rb @@ -173,8 +173,7 @@ module Merit rules = AVAILABLE_RULES rules.merge! CONFERENCE_RULES if defined? CONFERENCE_RULES - gamification_plugin_badges = environment.gamification_plugin_badges + environment.gamification_plugin_organization_badges - gamification_plugin_badges.each do |badge| + environment.gamification_plugin_badges.each do |badge| next if rules[badge.name.to_sym].nil? rules[badge.name.to_sym].each do |setting| options = {badge: badge.name, level: badge.level, to: setting[:to]} diff --git a/test/functional/gamification_plugin_badges_controller_test.rb b/test/functional/gamification_plugin_badges_controller_test.rb index 42e3de3..59729ba 100644 --- a/test/functional/gamification_plugin_badges_controller_test.rb +++ b/test/functional/gamification_plugin_badges_controller_test.rb @@ -25,6 +25,14 @@ class GamificationPluginBadgesControllerTest < ActionController::TestCase end end + should "should create gamification_plugin_badge with organization as owner" do + organization = fast_create(Organization) + assert_difference('GamificationPlugin::Badge.count') do + 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 } + assert_equal organization, GamificationPlugin::Badge.last.owner + end + end + should "should show gamification_plugin_badge" do get :show, id: @gamification_plugin_badge assert_response :success @@ -40,6 +48,23 @@ class GamificationPluginBadgesControllerTest < ActionController::TestCase assert assigns(:gamification_plugin_badge) end + should "should change badge owner" do + organization = fast_create(Organization) + 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 } + assert assigns(:gamification_plugin_badge) + assert_equal organization, @gamification_plugin_badge.reload.owner + end + + should "should keep badge owner when update" do + organization = fast_create(Organization) + @gamification_plugin_badge.owner = organization + @gamification_plugin_badge.save! + + 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 } + assert assigns(:gamification_plugin_badge) + assert_equal organization, @gamification_plugin_badge.reload.owner + end + should "should destroy gamification_plugin_badge" do assert_difference('GamificationPlugin::Badge.count', -1) do delete :destroy, id: @gamification_plugin_badge diff --git a/views/gamification_plugin_badges/_form.html.erb b/views/gamification_plugin_badges/_form.html.erb index a639256..5fc2acd 100644 --- a/views/gamification_plugin_badges/_form.html.erb +++ b/views/gamification_plugin_badges/_form.html.erb @@ -29,6 +29,11 @@ <%= f.label :level %>
<%= f.text_field :level %> +
+ <%= f.label :profile_owner %>
+ <% tokenized_owner = @gamification_plugin_badge.owner.present? && @gamification_plugin_badge.owner.kind_of?(Organization) ? prepare_to_token_input([@gamification_plugin_badge.owner]) : nil %> + <%= 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}) %> +

<%= _('Actions') %>

<%= f.fields_for :custom_fields do |c| %> <% rules.each do |name, settings| %> diff --git a/views/gamification_plugin_badges/show.html.erb b/views/gamification_plugin_badges/show.html.erb index 50306d5..9c7ad4f 100644 --- a/views/gamification_plugin_badges/show.html.erb +++ b/views/gamification_plugin_badges/show.html.erb @@ -22,6 +22,13 @@ <%= @gamification_plugin_badge.level %>

+<% if @gamification_plugin_badge.owner.kind_of?(Organization) %> +

+ <%= _('Profile owner:') %> + <%= @gamification_plugin_badge.owner.name %> +

+<% end %> +

Threshold: <% if @gamification_plugin_badge.custom_fields.is_a? Hash %> -- libgit2 0.21.2