diff --git a/app/assets/javascripts/admin/templates/badges.js.handlebars b/app/assets/javascripts/admin/templates/badges.js.handlebars index e7a869f46..8ee9affe5 100644 --- a/app/assets/javascripts/admin/templates/badges.js.handlebars +++ b/app/assets/javascripts/admin/templates/badges.js.handlebars @@ -77,13 +77,20 @@ </span> </div> - {{#unless readOnly}} - <div class='buttons'> - <button {{action save}} {{bind-attr disabled=controller.disableSave}} class='btn btn-primary'>{{i18n admin.badges.save}}</button> - <span class='saving'>{{savingStatus}}</span> + <div> + <span> + {{input type="checkbox" checked=enabled}} + {{i18n admin.badges.enabled}} + </span> + </div> + + <div class='buttons'> + <button {{action save}} {{bind-attr disabled=controller.disableSave}} class='btn btn-primary'>{{i18n admin.badges.save}}</button> + <span class='saving'>{{savingStatus}}</span> + {{#unless readOnly}} <a {{action destroy}} class='delete-link'>{{i18n admin.badges.delete}}</a> - </div> - {{/unless}} + {{/unless}} + </div> </form> </div> diff --git a/app/assets/javascripts/discourse/models/badge.js b/app/assets/javascripts/discourse/models/badge.js index ebbf09a1b..a848d3268 100644 --- a/app/assets/javascripts/discourse/models/badge.js +++ b/app/assets/javascripts/discourse/models/badge.js @@ -118,6 +118,7 @@ Discourse.Badge = Discourse.Model.extend({ allow_title: !!this.get('allow_title'), multiple_grant: !!this.get('multiple_grant'), listable: !!this.get('listable'), + enabled: !!this.get('enabled'), icon: this.get('icon') } }).then(function(json) { diff --git a/app/controllers/admin/badges_controller.rb b/app/controllers/admin/badges_controller.rb index 9fbf58cbf..f85633954 100644 --- a/app/controllers/admin/badges_controller.rb +++ b/app/controllers/admin/badges_controller.rb @@ -30,7 +30,7 @@ class Admin::BadgesController < Admin::AdminController end def update_badge_from_params(badge) - params.permit(:name, :description, :badge_type_id, :allow_title, :multiple_grant, :listable) + params.permit(:name, :description, :badge_type_id, :allow_title, :multiple_grant, :listable, :enabled) badge.name = params[:name] badge.description = params[:description] badge.badge_type = BadgeType.find(params[:badge_type_id]) @@ -38,6 +38,7 @@ class Admin::BadgesController < Admin::AdminController badge.multiple_grant = params[:multiple_grant] badge.icon = params[:icon] badge.listable = params[:listable] + badge.enabled = params[:enabled] badge end end diff --git a/app/controllers/badges_controller.rb b/app/controllers/badges_controller.rb index 603dc89ef..3520f0dfe 100644 --- a/app/controllers/badges_controller.rb +++ b/app/controllers/badges_controller.rb @@ -3,7 +3,7 @@ class BadgesController < ApplicationController def index badges = Badge.all - badges = badges.where(listable: true) if(params[:only_listable] == "true") || !request.xhr? + badges = badges.where(enabled: true, listable: true) if(params[:only_listable] == "true") || !request.xhr? badges = badges.to_a serialized = MultiJson.dump(serialize_data(badges, BadgeSerializer, root: "badges")) respond_to do |format| @@ -17,7 +17,7 @@ class BadgesController < ApplicationController def show params.require(:id) - badge = Badge.find(params[:id]) + badge = Badge.enabled.find(params[:id]) if current_user user_badge = UserBadge.find_by(user_id: current_user.id, badge_id: badge.id) diff --git a/app/controllers/user_badges_controller.rb b/app/controllers/user_badges_controller.rb index 1372adc62..946289a00 100644 --- a/app/controllers/user_badges_controller.rb +++ b/app/controllers/user_badges_controller.rb @@ -17,7 +17,8 @@ class UserBadgesController < ApplicationController user_badges = user_badges.includes(:user, :granted_by, badge: :badge_type, post: :topic) if params[:grouped] - user_badges = user_badges.group(:badge_id).select(UserBadge.attribute_names.map {|x| "MAX(#{x}) as #{x}" }, 'COUNT(*) as count') + user_badges = user_badges.group(:badge_id) + .select(UserBadge.attribute_names.map {|x| "MAX(#{x}) as #{x}" }, 'COUNT(*) as count') end render_serialized(user_badges, UserBadgeSerializer, root: "user_badges") @@ -60,9 +61,9 @@ class UserBadgesController < ApplicationController params.permit(:badge_name) if params[:badge_name].nil? params.require(:badge_id) - badge = Badge.find_by(id: params[:badge_id]) + badge = Badge.find_by(id: params[:badge_id], enabled: true) else - badge = Badge.find_by(name: params[:badge_name]) + badge = Badge.find_by(name: params[:badge_name], enabled: true) end raise Discourse::NotFound.new if badge.blank? diff --git a/app/models/badge.rb b/app/models/badge.rb index c5c9252a7..9eff812bb 100644 --- a/app/models/badge.rb +++ b/app/models/badge.rb @@ -134,6 +134,8 @@ SQL validates :allow_title, inclusion: [true, false] validates :multiple_grant, inclusion: [true, false] + scope :enabled, ->{ where(enabled: true) } + def self.trust_level_badge_ids (1..4).to_a diff --git a/app/models/user.rb b/app/models/user.rb index 318ce9f12..4b8e07673 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -23,7 +23,7 @@ class User < ActiveRecord::Base has_many :user_open_ids, dependent: :destroy has_many :user_actions, dependent: :destroy has_many :post_actions, dependent: :destroy - has_many :user_badges, dependent: :destroy + has_many :user_badges, -> {where('user_badges.badge_id IN (SELECT id FROM badges where enabled)')}, dependent: :destroy has_many :badges, through: :user_badges has_many :email_logs, dependent: :destroy has_many :post_timings diff --git a/app/serializers/badge_serializer.rb b/app/serializers/badge_serializer.rb index 4848536ce..9cb4b40ed 100644 --- a/app/serializers/badge_serializer.rb +++ b/app/serializers/badge_serializer.rb @@ -1,5 +1,5 @@ class BadgeSerializer < ApplicationSerializer - attributes :id, :name, :description, :grant_count, :allow_title, :multiple_grant, :icon, :listable + attributes :id, :name, :description, :grant_count, :allow_title, :multiple_grant, :icon, :listable, :enabled has_one :badge_type end diff --git a/app/services/badge_granter.rb b/app/services/badge_granter.rb index 24d6e81dc..f7fd0624b 100644 --- a/app/services/badge_granter.rb +++ b/app/services/badge_granter.rb @@ -62,7 +62,7 @@ class BadgeGranter end def self.backfill(badge) - return unless badge.query.present? + return unless badge.query.present? && badge.enabled post_clause = badge.target_posts ? "AND q.post_id = ub.post_id" : "" post_id_field = badge.target_posts ? "q.post_id" : "NULL" diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 1bc19fe8f..87e59b774 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -1892,6 +1892,7 @@ en: allow_title: Allow badge to be used as a title multiple_grant: Can be granted multiple times listable: Show badge on the public badges page + enabled: Enable badge icon: Icon lightbox: diff --git a/db/migrate/20140714060646_add_enabled_to_badges.rb b/db/migrate/20140714060646_add_enabled_to_badges.rb new file mode 100644 index 000000000..c381511a0 --- /dev/null +++ b/db/migrate/20140714060646_add_enabled_to_badges.rb @@ -0,0 +1,5 @@ +class AddEnabledToBadges < ActiveRecord::Migration + def change + add_column :badges, :enabled, :boolean, default: true, null: false + end +end diff --git a/spec/controllers/admin/badges_controller_spec.rb b/spec/controllers/admin/badges_controller_spec.rb index 478b61b68..5d418ba99 100644 --- a/spec/controllers/admin/badges_controller_spec.rb +++ b/spec/controllers/admin/badges_controller_spec.rb @@ -35,12 +35,12 @@ describe Admin::BadgesController do context '.update' do it 'returns success' do - xhr :put, :update, id: badge.id, name: "123456", badge_type_id: badge.badge_type_id, allow_title: false, multiple_grant: false + xhr :put, :update, id: badge.id, name: "123456", badge_type_id: badge.badge_type_id, allow_title: false, multiple_grant: false, enabled: true response.should be_success end it 'updates the badge' do - xhr :put, :update, id: badge.id, name: "123456", badge_type_id: badge.badge_type_id, allow_title: false, multiple_grant: true + xhr :put, :update, id: badge.id, name: "123456", badge_type_id: badge.badge_type_id, allow_title: false, multiple_grant: true, enabled: true badge.reload.name.should eq('123456') end end