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.
This commit is contained in:
		
							parent
							
								
									bced70469a
								
							
						
					
					
						commit
						3a6b6c63f2
					
				
					 3 changed files with 57 additions and 0 deletions
				
			
		| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue