From 2e52f795eaac7512f9cde0b8d9677b8c003e4fe1 Mon Sep 17 00:00:00 2001 From: Vikhyat Korrapati Date: Sat, 28 Jun 2014 00:38:03 +0530 Subject: [PATCH] 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