Add breakdown of usage by source to admin UI for hashtags (#11517)

Allows determining where the majority of posts in a hashtag come
from on a given day at a glance.
pull/11521/head
Eugen Rochko 2019-08-07 20:20:39 +02:00 committed by GitHub
parent bced70469a
commit 3a6b6c63f2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 57 additions and 0 deletions

View File

@ -4,6 +4,8 @@ module Admin
class TagsController < BaseController class TagsController < BaseController
before_action :set_tags, only: :index before_action :set_tags, only: :index
before_action :set_tag, except: :index before_action :set_tag, except: :index
before_action :set_usage_by_domain, except: :index
before_action :set_counters, except: :index
def index def index
authorize :tag, :index? authorize :tag, :index?
@ -33,6 +35,21 @@ module Admin
@tag = Tag.find(params[:id]) @tag = Tag.find(params[:id])
end end
def set_usage_by_domain
@usage_by_domain = @tag.statuses
.where(visibility: :public)
.where(Status.arel_table[:id].gteq(Mastodon::Snowflake.id_at(Time.now.utc.beginning_of_day)))
.joins(:account)
.group('accounts.domain')
.reorder('statuses_count desc')
.pluck('accounts.domain, count(*) AS statuses_count')
end
def set_counters
@accounts_today = @tag.history.first[:accounts]
@accounts_week = Redis.current.pfcount(*current_week_days.map { |day| "activity:tags:#{@tag.id}:#{day}:accounts" })
end
def filtered_tags def filtered_tags
scope = Tag scope = Tag
scope = scope.discoverable if filter_params[:context] == 'directory' scope = scope.discoverable if filter_params[:context] == 'directory'
@ -49,5 +66,13 @@ module Admin
def tag_params def tag_params
params.require(:tag).permit(:name, :trendable, :usable, :listable) params.require(:tag).permit(:name, :trendable, :usable, :listable)
end end
def current_week_days
now = Time.now.utc.beginning_of_day.to_date
(Date.commercial(now.cwyear, now.cweek)..now).map do |date|
date.to_time.utc.beginning_of_day.to_i
end
end
end end
end end

View File

@ -1,6 +1,22 @@
- content_for :page_title do - content_for :page_title do
= "##{@tag.name}" = "##{@tag.name}"
.dashboard__counters
%div
= link_to web_url("timelines/tag/#{@tag.name}") do
.dashboard__counters__num= number_with_delimiter @accounts_today
.dashboard__counters__label= t 'admin.tags.accounts_today'
%div
%div
.dashboard__counters__num= number_with_delimiter @accounts_week
.dashboard__counters__label= t 'admin.tags.accounts_week'
%div
= link_to explore_hashtag_path(@tag) do
.dashboard__counters__num= number_with_delimiter @tag.accounts_count
.dashboard__counters__label= t 'admin.tags.directory'
%hr.spacer/
= simple_form_for @tag, url: admin_tag_path(@tag.id) do |f| = simple_form_for @tag, url: admin_tag_path(@tag.id) do |f|
= render 'shared/error_messages', object: @tag = render 'shared/error_messages', object: @tag
@ -14,3 +30,16 @@
.actions .actions
= f.button :button, t('generic.save_changes'), type: :submit = f.button :button, t('generic.save_changes'), type: :submit
%hr.spacer/
%h3= t 'admin.tags.breakdown'
.table-wrapper
%table.table
%tbody
- @usage_by_domain.each do |(domain, count)|
%tr
%th= domain || site_hostname
%td= "#{number_with_delimiter((count.to_f / @tag.history[0][:uses].to_f) * 100)}%"
%td= number_with_delimiter count

View File

@ -498,6 +498,9 @@ en:
title: Account statuses title: Account statuses
with_media: With media with_media: With media
tags: tags:
accounts_today: Unique uses today
accounts_week: Unique uses this week
breakdown: Breakdown of today's usage by source
context: Context context: Context
directory: In directory directory: In directory
in_directory: "%{count} in directory" in_directory: "%{count} in directory"