From 2e52f795eaac7512f9cde0b8d9677b8c003e4fe1 Mon Sep 17 00:00:00 2001 From: Vikhyat Korrapati Date: Sat, 28 Jun 2014 00:38:03 +0530 Subject: [PATCH 1/4] Backend changes to support improved badge pages. --- .../javascripts/discourse/models/user_badge.js | 10 ++++++++++ app/controllers/user_badges_controller.rb | 2 +- app/models/user_badge.rb | 1 + app/serializers/user_badge_serializer.rb | 12 +++++++++++- 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/discourse/models/user_badge.js b/app/assets/javascripts/discourse/models/user_badge.js index 410dbd4c880..85c05cc6a33 100644 --- a/app/assets/javascripts/discourse/models/user_badge.js +++ b/app/assets/javascripts/discourse/models/user_badge.js @@ -36,6 +36,13 @@ Discourse.UserBadge.reopenClass({ users[userJson.id] = Discourse.User.create(userJson); }); + // Create Topic objects. + if (json.topics === undefined) { json.topics = []; } + var topics = {}; + json.topics.forEach(function(topicJson) { + topics[topicJson.id] = Discourse.Topic.create(topicJson); + }); + // Create the badges. if (json.badges === undefined) { json.badges = []; } var badges = {}; @@ -64,6 +71,9 @@ Discourse.UserBadge.reopenClass({ if (userBadge.get('granted_by_id')) { userBadge.set('granted_by', users[userBadge.get('granted_by_id')]); } + if (userBadge.get('topic_id')) { + userBadge.set('topic', topics[userBadge.get('topic_id')]); + } return userBadge; }); diff --git a/app/controllers/user_badges_controller.rb b/app/controllers/user_badges_controller.rb index e2f96d6ec58..1372adc62b7 100644 --- a/app/controllers/user_badges_controller.rb +++ b/app/controllers/user_badges_controller.rb @@ -14,7 +14,7 @@ class UserBadgesController < ApplicationController user_badges = user_badges.where('granted_at < ?', Time.at(params[:granted_before].to_f)) end - user_badges = user_badges.includes(:user, :granted_by, badge: :badge_type) + 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') diff --git a/app/models/user_badge.rb b/app/models/user_badge.rb index 24532195171..f9bee5acde6 100644 --- a/app/models/user_badge.rb +++ b/app/models/user_badge.rb @@ -3,6 +3,7 @@ class UserBadge < ActiveRecord::Base belongs_to :user belongs_to :granted_by, class_name: 'User' belongs_to :notification, dependent: :destroy + belongs_to :post validates :badge_id, presence: true, uniqueness: {scope: :user_id}, if: 'badge.single_grant?' validates :user_id, presence: true diff --git a/app/serializers/user_badge_serializer.rb b/app/serializers/user_badge_serializer.rb index c2235dcf071..561b26f4476 100644 --- a/app/serializers/user_badge_serializer.rb +++ b/app/serializers/user_badge_serializer.rb @@ -1,11 +1,21 @@ class UserBadgeSerializer < ApplicationSerializer - attributes :id, :granted_at, :count + attributes :id, :granted_at, :count, :post_id has_one :badge has_one :user, serializer: BasicUserSerializer, root: :users has_one :granted_by, serializer: BasicUserSerializer, root: :users + has_one :topic, serializer: BasicTopicSerializer def include_count? object.respond_to? :count end + + def include_post_id? + !object.post_id.nil? + end + alias :include_topic? :include_post_id? + + def topic + object.post.topic + end end From 83749779cc3e2ec89c693c273cf2a24853e32924 Mon Sep 17 00:00:00 2001 From: Vikhyat Korrapati Date: Sat, 28 Jun 2014 00:57:26 +0530 Subject: [PATCH 2/4] Add consistency check to revoke duplicate badges. --- app/jobs/scheduled/ensure_db_consistency.rb | 1 + app/models/user_badge.rb | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/app/jobs/scheduled/ensure_db_consistency.rb b/app/jobs/scheduled/ensure_db_consistency.rb index ca3104522a4..e12c404cb3a 100644 --- a/app/jobs/scheduled/ensure_db_consistency.rb +++ b/app/jobs/scheduled/ensure_db_consistency.rb @@ -9,6 +9,7 @@ module Jobs Group.refresh_automatic_groups! Notification.ensure_consistency! UserAction.ensure_consistency! + UserBadge.ensure_consistency! end end end diff --git a/app/models/user_badge.rb b/app/models/user_badge.rb index f9bee5acde6..9802f9e6d5b 100644 --- a/app/models/user_badge.rb +++ b/app/models/user_badge.rb @@ -17,6 +17,17 @@ class UserBadge < ActiveRecord::Base after_destroy do Badge.decrement_counter 'grant_count', self.badge_id end + + # Make sure we don't have duplicate badges. + def self.ensure_consistency! + dup_ids = [] + # Single grant badges shouldn't have duplicates at all. + dup_ids += exec_sql("SELECT u1.id FROM user_badges u1, user_badges u2, badges WHERE u1.badge_id = badges.id AND u1.user_id = u2.user_id AND u1.badge_id = u2.badge_id AND (NOT badges.multiple_grant) AND u1.granted_at > u2.granted_at").to_a + # Multiple grant badges can have duplicates but not with the same post_ids. + dup_ids += exec_sql("SELECT u1.id FROM user_badges u1, user_badges u2, badges WHERE u1.badge_id = badges.id AND u1.user_id = u2.user_id AND u1.badge_id = u2.badge_id AND badges.multiple_grant AND u1.post_id = u2.post_id AND u1.granted_at > u2.granted_at").to_a + dup_ids = dup_ids.map {|x| x["id"].to_i } + UserBadge.where(id: dup_ids).destroy_all + end end # == Schema Information From 0d16ae0ecf812de37a554238bf98b5453d669744 Mon Sep 17 00:00:00 2001 From: Vikhyat Korrapati Date: Sat, 28 Jun 2014 01:02:14 +0530 Subject: [PATCH 3/4] Fix typo. --- app/assets/javascripts/admin/templates/badges.js.handlebars | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/admin/templates/badges.js.handlebars b/app/assets/javascripts/admin/templates/badges.js.handlebars index f9c08422ae4..da91f543116 100644 --- a/app/assets/javascripts/admin/templates/badges.js.handlebars +++ b/app/assets/javascripts/admin/templates/badges.js.handlebars @@ -23,7 +23,7 @@
- {{input type="text" name="name" value=name disabled=readonly}} + {{input type="text" name="name" value=name disabled=readOnly}}
{{#if showDisplayName}} @@ -35,7 +35,7 @@
- {{input type="text" name="name" value=icon disabled=readonly}} + {{input type="text" name="name" value=icon disabled=readOnly}}
From 228a2a8992bf7662dd61ea9bd5d908ee5b6525d8 Mon Sep 17 00:00:00 2001 From: Vikhyat Korrapati Date: Sat, 28 Jun 2014 01:21:41 +0530 Subject: [PATCH 4/4] Show number of grants on the admin badge pages. --- app/assets/javascripts/admin/templates/badges.js.handlebars | 6 ++++++ app/assets/stylesheets/common/admin/admin_base.scss | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/app/assets/javascripts/admin/templates/badges.js.handlebars b/app/assets/javascripts/admin/templates/badges.js.handlebars index da91f543116..d11259b713a 100644 --- a/app/assets/javascripts/admin/templates/badges.js.handlebars +++ b/app/assets/javascripts/admin/templates/badges.js.handlebars @@ -79,6 +79,12 @@ {{/unless}}
+ +
+
+ {{#link-to 'badges.show' this classNames="btn btn-primary"}}{{i18n badges.granted count=grant_count}}{{/link-to}} +
+
{{/with}} {{/if}} diff --git a/app/assets/stylesheets/common/admin/admin_base.scss b/app/assets/stylesheets/common/admin/admin_base.scss index 1f96eb6083a..d92c4a27500 100644 --- a/app/assets/stylesheets/common/admin/admin_base.scss +++ b/app/assets/stylesheets/common/admin/admin_base.scss @@ -403,6 +403,12 @@ section.details { } } + .current-badge-actions { + margin: 10px; + padding: 10px; + border-top: 1px solid scale-color($primary, $lightness: 80%); + } + .buttons { float: left; width: 200px;