From b731df44ca1791e01d74077a9c4b94f999d3461d Mon Sep 17 00:00:00 2001 From: Ben Halpern Date: Fri, 7 Jun 2019 19:09:43 -0400 Subject: [PATCH] Add badges to key tags (#3074) * Add badges to key tags * Adjust vertical-align * Fix YouTube tag mistake and refactor map to pluck --- .../stylesheets/user-profile-header.scss | 6 +++ app/controllers/admin/tags_controller.rb | 2 + app/controllers/internal/tags_controller.rb | 2 +- app/labor/badge_rewarder.rb | 14 +++++ app/models/badge.rb | 1 + app/models/tag.rb | 11 +++- app/views/articles/tag_index.html.erb | 7 ++- app/views/internal/tags/index.html.erb | 2 + app/views/internal/tags/show.html.erb | 9 ++++ .../20190606202826_add_badge_id_to_tags.rb | 6 +++ db/schema.rb | 4 +- spec/labor/badge_rewarder_spec.rb | 51 +++++++++++++++++++ spec/models/tag_spec.rb | 4 ++ 13 files changed, 114 insertions(+), 5 deletions(-) create mode 100644 db/migrate/20190606202826_add_badge_id_to_tags.rb diff --git a/app/assets/stylesheets/user-profile-header.scss b/app/assets/stylesheets/user-profile-header.scss index 48baa027f..155841705 100644 --- a/app/assets/stylesheets/user-profile-header.scss +++ b/app/assets/stylesheets/user-profile-header.scss @@ -104,6 +104,12 @@ overflow-y: auto; h1 { position:relative; + img { + height: 1.5em; + width: 1.5em; + vertical-align: -0.22em; + margin-right: 0.15em; + } } a{ color:rgb(97, 97, 97); diff --git a/app/controllers/admin/tags_controller.rb b/app/controllers/admin/tags_controller.rb index 6066c0618..7d643962f 100644 --- a/app/controllers/admin/tags_controller.rb +++ b/app/controllers/admin/tags_controller.rb @@ -21,6 +21,8 @@ module Admin def tag_params accessible = %i[ name + category + badge_id supported alias_for wiki_body_markdown diff --git a/app/controllers/internal/tags_controller.rb b/app/controllers/internal/tags_controller.rb index 847649d2e..5f673254a 100644 --- a/app/controllers/internal/tags_controller.rb +++ b/app/controllers/internal/tags_controller.rb @@ -46,7 +46,7 @@ class Internal::TagsController < Internal::ApplicationController def tag_params allowed_params = %i[ supported rules_markdown short_summary pretty_name bg_color_hex - text_color_hex tag_moderator_id remove_moderator_id alias_for + text_color_hex tag_moderator_id remove_moderator_id alias_for badge_id category ] params.require(:tag).permit(allowed_params) end diff --git a/app/labor/badge_rewarder.rb b/app/labor/badge_rewarder.rb index adab08177..c369d7382 100644 --- a/app/labor/badge_rewarder.rb +++ b/app/labor/badge_rewarder.rb @@ -41,6 +41,20 @@ module BadgeRewarder award_badges(usernames, "dev-contributor", message_markdown) end + def self.award_tag_badges + Tag.where.not(badge_id: nil).find_each do |tag| + past_winner_user_ids = BadgeAchievement.where(badge_id: tag.badge_id).pluck(:user_id) + winning_article = Article.where("score > 100").where.not(user_id: past_winner_user_ids).order("score DESC").cached_tagged_with(tag).first + if winning_article + award_badges( + [winning_article.user.username], + tag.badge.slug, + "Congratulations on posting the most beloved [##{tag.name}](#{ApplicationConfig['APP_PROTOCOL'] + ApplicationConfig['APP_DOMAIN']}/t/#{tag.name}) post from the past week! 🙌", + ) + end + end + end + def self.award_contributor_badges_from_github(since = 1.day.ago, message_markdown = "Thank you so much for your contributions!") client = Octokit::Client.new badge = Badge.find_by(slug: "dev-contributor") diff --git a/app/models/badge.rb b/app/models/badge.rb index 4adf58ce5..877b29776 100644 --- a/app/models/badge.rb +++ b/app/models/badge.rb @@ -2,6 +2,7 @@ class Badge < ApplicationRecord mount_uploader :badge_image, BadgeUploader has_many :badge_achievements + has_many :tags has_many :users, through: :badge_achievements validates :title, presence: true, uniqueness: true diff --git a/app/models/tag.rb b/app/models/tag.rb index 676a04aae..3a76f6e75 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -8,13 +8,17 @@ class Tag < ActsAsTaggableOn::Tag NAMES = %w[ beginners career computerscience git go java javascript react vue webassembly linux productivity python security webdev css php laravel opensource npm a11y - ruby cpp dotnet swift testing devops vim kotlin rust elixir graphql blockchain + ruby cpp dotnet swift testing devops vim kotlin rust elixir graphql blockchain sre scala vscode docker kubernetes aws android ios angular csharp typescript django rails clojure ubuntu elm gamedev flutter dart bash machinelearning sql ].freeze + ALLOWED_CATEGORIES = %w[uncategorized language library tool site_mechanic location subcommunity].freeze + attr_accessor :tag_moderator_id, :remove_moderator_id + belongs_to :badge, optional: true + mount_uploader :profile_image, ProfileImageUploader mount_uploader :social_image, ProfileImageUploader @@ -22,6 +26,7 @@ class Tag < ActsAsTaggableOn::Tag format: /\A#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})\z/, allow_nil: true validates :bg_color_hex, format: /\A#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})\z/, allow_nil: true + validates :category, inclusion: { in: ALLOWED_CATEGORIES } validate :validate_alias before_validation :evaluate_markdown @@ -51,6 +56,10 @@ class Tag < ActsAsTaggableOn::Tag end end + def self.valid_categories + ALLOWED_CATEGORIES + end + private def evaluate_markdown diff --git a/app/views/articles/tag_index.html.erb b/app/views/articles/tag_index.html.erb index 2ca830fc0..144655fe3 100644 --- a/app/views/articles/tag_index.html.erb +++ b/app/views/articles/tag_index.html.erb @@ -2,8 +2,8 @@ <%= render "articles/tags/meta" %> <% end %> <% params.delete(:i) %> -<% expiry_minutes = (params[:timeframe].blank? || params[:timeframe] == "latest") ? 4 : 20 %> -<% cache("tag-stories-index-#{params.to_s}-#{true}-#{@tag_model.updated_at}", expires_in: expiry_minutes.minutes) do %> +<% expiry_minutes = params[:timeframe].blank? || params[:timeframe] == "latest" ? 4 : 20 %> +<% cache("tag-stories-index-#{params}-#{true}-#{@tag_model.updated_at}", expires_in: expiry_minutes.minutes) do %>