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