From bfb37054e81fcb0a4c271f05fea8394ffb07d410 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 17 Jul 2014 16:10:44 +1000 Subject: [PATCH] Badge Grouping work in progress --- app/controllers/badges_controller.rb | 4 +- app/models/badge.rb | 35 +++++++++------ app/models/badge_grouping.rb | 21 +++++++++ app/models/invite.rb | 2 +- app/models/post.rb | 2 +- app/models/quoted_post.rb | 16 +++++++ app/models/user.rb | 1 - app/serializers/badge_grouping_serializer.rb | 3 ++ app/serializers/badge_serializer.rb | 1 + db/fixtures/006_badges.rb | 43 +++++++++++++++++++ ..._description_optional_in_badge_grouping.rb | 5 +++ 11 files changed, 114 insertions(+), 19 deletions(-) create mode 100644 app/serializers/badge_grouping_serializer.rb create mode 100644 db/migrate/20140717024528_description_optional_in_badge_grouping.rb diff --git a/app/controllers/badges_controller.rb b/app/controllers/badges_controller.rb index ec993069b9c..6f57c2b175f 100644 --- a/app/controllers/badges_controller.rb +++ b/app/controllers/badges_controller.rb @@ -4,12 +4,12 @@ class BadgesController < ApplicationController def index badges = Badge.all badges = badges.where(enabled: true, listable: true) if(params[:only_listable] == "true") || !request.xhr? - badges = badges.to_a + badges = badges.includes(:badge_grouping).to_a user_badges = nil if current_user user_badges = Set.new(current_user.user_badges.select('distinct badge_id').pluck(:badge_id)) end - serialized = MultiJson.dump(serialize_data(badges, BadgeSerializer, root: "badges", user_badges: user_badges)) + serialized = MultiJson.dump(serialize_data(badges, BadgeSerializer, root: "badges", user_badges: user_badges, include_grouping: true)) respond_to do |format| format.html do store_preloaded "badges", serialized diff --git a/app/models/badge.rb b/app/models/badge.rb index d9db26ab4f4..5936e2858f3 100644 --- a/app/models/badge.rb +++ b/app/models/badge.rb @@ -1,4 +1,5 @@ class Badge < ActiveRecord::Base + belongs_to :badge_grouping # badge ids Welcome = 5 @@ -178,26 +179,32 @@ SQL def default_name=(val) self.name ||= val end + + def default_badge_grouping_id=(val) + self.badge_grouping_id ||= val + end end # == Schema Information # # Table name: badges # -# id :integer not null, primary key -# name :string(255) not null -# description :text -# badge_type_id :integer not null -# grant_count :integer default(0), not null -# created_at :datetime -# updated_at :datetime -# allow_title :boolean default(FALSE), not null -# multiple_grant :boolean default(FALSE), not null -# icon :string(255) default("fa-certificate") -# listable :boolean default(TRUE) -# target_posts :boolean default(FALSE) -# query :text -# enabled :boolean default(TRUE), not null +# id :integer not null, primary key +# name :string(255) not null +# description :text +# badge_type_id :integer not null +# grant_count :integer default(0), not null +# created_at :datetime +# updated_at :datetime +# allow_title :boolean default(FALSE), not null +# multiple_grant :boolean default(FALSE), not null +# icon :string(255) default("fa-certificate") +# listable :boolean default(TRUE) +# target_posts :boolean default(FALSE) +# query :text +# enabled :boolean default(TRUE), not null +# auto_revoke :boolean default(TRUE), not null +# badge_grouping_id :integer # # Indexes # diff --git a/app/models/badge_grouping.rb b/app/models/badge_grouping.rb index 9a6fc917738..27d1694beea 100644 --- a/app/models/badge_grouping.rb +++ b/app/models/badge_grouping.rb @@ -1,3 +1,24 @@ class BadgeGrouping < ActiveRecord::Base + + module Position + GettingStarted = 10 + Community = 11 + Posting = 12 + TrustLevel = 13 + Other = 14 + end + has_many :badges end + +# == Schema Information +# +# Table name: badge_groupings +# +# id :integer not null, primary key +# name :string(255) not null +# description :string(255) not null +# position :integer not null +# created_at :datetime +# updated_at :datetime +# diff --git a/app/models/invite.rb b/app/models/invite.rb index fdeb76e0dfc..61e6759d40f 100644 --- a/app/models/invite.rb +++ b/app/models/invite.rb @@ -193,7 +193,7 @@ end # # id :integer not null, primary key # invite_key :string(32) not null -# email :string(255) not null +# email :string(255) # invited_by_id :integer not null # user_id :integer # redeemed_at :datetime diff --git a/app/models/post.rb b/app/models/post.rb index 6ad40bec33f..1c5a9f185d4 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -602,5 +602,5 @@ end # idx_posts_created_at_topic_id (created_at,topic_id) # idx_posts_user_id_deleted_at (user_id) # index_posts_on_reply_to_post_number (reply_to_post_number) -# index_posts_on_topic_id_and_post_number (topic_id,post_number) +# index_posts_on_topic_id_and_post_number (topic_id,post_number) UNIQUE # diff --git a/app/models/quoted_post.rb b/app/models/quoted_post.rb index 9460baa5acc..39e06d45f4f 100644 --- a/app/models/quoted_post.rb +++ b/app/models/quoted_post.rb @@ -46,3 +46,19 @@ class QuotedPost < ActiveRecord::Base end end + +# == Schema Information +# +# Table name: quoted_posts +# +# id :integer not null, primary key +# post_id :integer not null +# quoted_post_id :integer not null +# created_at :datetime +# updated_at :datetime +# +# Indexes +# +# index_quoted_posts_on_post_id_and_quoted_post_id (post_id,quoted_post_id) UNIQUE +# index_quoted_posts_on_quoted_post_id_and_post_id (quoted_post_id,post_id) UNIQUE +# diff --git a/app/models/user.rb b/app/models/user.rb index 8df23499ff0..0f97f1072de 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -787,7 +787,6 @@ end # Indexes # # index_users_on_auth_token (auth_token) -# index_users_on_email (email) UNIQUE # index_users_on_last_posted_at (last_posted_at) # index_users_on_username (username) UNIQUE # index_users_on_username_lower (username_lower) UNIQUE diff --git a/app/serializers/badge_grouping_serializer.rb b/app/serializers/badge_grouping_serializer.rb new file mode 100644 index 00000000000..694b3efe47d --- /dev/null +++ b/app/serializers/badge_grouping_serializer.rb @@ -0,0 +1,3 @@ +class BadgeGroupingSerializer < ApplicationSerializer + attributes :id, :name, :description +end diff --git a/app/serializers/badge_serializer.rb b/app/serializers/badge_serializer.rb index 86c7da9a2cf..25a05e4f4ef 100644 --- a/app/serializers/badge_serializer.rb +++ b/app/serializers/badge_serializer.rb @@ -1,6 +1,7 @@ class BadgeSerializer < ApplicationSerializer attributes :id, :name, :description, :grant_count, :allow_title, :multiple_grant, :icon, :listable, :enabled, :has_badge has_one :badge_type + has_one :badge_grouping def include_has_badge? @options[:user_badges] diff --git a/db/fixtures/006_badges.rb b/db/fixtures/006_badges.rb index 649fb0268e3..59fc5aa7742 100644 --- a/db/fixtures/006_badges.rb +++ b/db/fixtures/006_badges.rb @@ -1,3 +1,34 @@ + +BadgeGrouping.seed do |g| + g.id = 1 + g.name = "Getting Started" + g.position = BadgeGrouping::Position::GettingStarted +end + +BadgeGrouping.seed do |g| + g.id = 2 + g.name = "Community" + g.position = BadgeGrouping::Position::Community +end + +BadgeGrouping.seed do |g| + g.id = 3 + g.name = "Posting" + g.position = BadgeGrouping::Position::Posting +end + +BadgeGrouping.seed do |g| + g.id = 4 + g.name = "Trust Level" + g.position = BadgeGrouping::Position::TrustLevel +end + +BadgeGrouping.seed do |g| + g.id = 5 + g.name = "Other" + g.position = BadgeGrouping::Position::Other +end + # Trust level system badges. trust_level_badges = [ {id: 1, name: "Basic User", type: BadgeType::Bronze}, @@ -12,6 +43,7 @@ trust_level_badges.each do |spec| b.default_name = spec[:name] b.badge_type_id = spec[:type] b.query = Badge::Queries.trust_level(spec[:id]) + b.default_badge_grouping_id = BadgeGrouping::Position::TrustLevel # allow title for leader and elder b.allow_title = spec[:id] > 2 @@ -25,6 +57,7 @@ Badge.seed do |b| b.multiple_grant = false b.target_posts = false b.query = Badge::Queries::Reader + b.default_badge_grouping_id = BadgeGrouping::Position::GettingStarted b.auto_revoke = false end @@ -35,6 +68,7 @@ Badge.seed do |b| b.multiple_grant = false b.target_posts = false b.query = Badge::Queries::ReadGuidelines + b.default_badge_grouping_id = BadgeGrouping::Position::GettingStarted end Badge.seed do |b| @@ -44,6 +78,7 @@ Badge.seed do |b| b.multiple_grant = false b.target_posts = true b.query = Badge::Queries::FirstLink + b.default_badge_grouping_id = BadgeGrouping::Position::GettingStarted end Badge.seed do |b| @@ -53,6 +88,7 @@ Badge.seed do |b| b.multiple_grant = false b.target_posts = true b.query = Badge::Queries::FirstQuote + b.default_badge_grouping_id = BadgeGrouping::Position::GettingStarted end Badge.seed do |b| @@ -62,6 +98,7 @@ Badge.seed do |b| b.multiple_grant = false b.target_posts = true b.query = Badge::Queries::FirstLike + b.default_badge_grouping_id = BadgeGrouping::Position::GettingStarted end Badge.seed do |b| @@ -71,6 +108,7 @@ Badge.seed do |b| b.multiple_grant = false b.target_posts = false b.query = Badge::Queries::FirstFlag + b.default_badge_grouping_id = BadgeGrouping::Position::Community end Badge.seed do |b| @@ -80,6 +118,7 @@ Badge.seed do |b| b.multiple_grant = false b.target_posts = true b.query = Badge::Queries::FirstShare + b.default_badge_grouping_id = BadgeGrouping::Position::GettingStarted end Badge.seed do |b| @@ -89,6 +128,7 @@ Badge.seed do |b| b.multiple_grant = false b.target_posts = true b.query = Badge::Queries::Welcome + b.default_badge_grouping_id = BadgeGrouping::Position::Community end Badge.seed do |b| @@ -97,6 +137,7 @@ Badge.seed do |b| b.badge_type_id = BadgeType::Bronze b.multiple_grant = false b.query = Badge::Queries::Autobiographer + b.default_badge_grouping_id = BadgeGrouping::Position::GettingStarted end Badge.seed do |b| @@ -105,6 +146,7 @@ Badge.seed do |b| b.badge_type_id = BadgeType::Bronze b.multiple_grant = false b.query = Badge::Queries::Editor + b.default_badge_grouping_id = BadgeGrouping::Position::Community end # @@ -123,5 +165,6 @@ like_badges.each do |spec| b.multiple_grant = spec[:multiple] b.target_posts = true b.query = Badge::Queries.like_badge(Badge.like_badge_counts[spec[:id]]) + b.default_badge_grouping_id = BadgeGrouping::Position::Posting end end diff --git a/db/migrate/20140717024528_description_optional_in_badge_grouping.rb b/db/migrate/20140717024528_description_optional_in_badge_grouping.rb new file mode 100644 index 00000000000..d5be6dc5d7f --- /dev/null +++ b/db/migrate/20140717024528_description_optional_in_badge_grouping.rb @@ -0,0 +1,5 @@ +class DescriptionOptionalInBadgeGrouping < ActiveRecord::Migration + def change + change_column :badge_groupings, :description, :text, null: true + end +end