From 2354b10eb5e9c7382726bc5e6e041ea30a903c90 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 16 Jul 2018 01:11:53 +0200 Subject: Add admin dashboard (#8029) --- app/controllers/admin/dashboard_controller.rb | 42 +++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 app/controllers/admin/dashboard_controller.rb (limited to 'app/controllers') diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb new file mode 100644 index 000000000..01d4a9847 --- /dev/null +++ b/app/controllers/admin/dashboard_controller.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true +require 'sidekiq/api' + +module Admin + class DashboardController < BaseController + def index + @users_count = User.count + @registrations_week = Redis.current.get("activity:accounts:local:#{current_week}") || 0 + @logins_week = Redis.current.pfcount("activity:logins:#{current_week}") + @interactions_week = Redis.current.get("activity:interactions:#{current_week}") || 0 + @relay_enabled = Relay.enabled.exists? + @single_user_mode = Rails.configuration.x.single_user_mode + @registrations_enabled = Setting.open_registrations + @deletions_enabled = Setting.open_deletions + @invites_enabled = Setting.min_invite_role == 'user' + @search_enabled = Chewy.enabled? + @version = Mastodon::Version.to_s + @database_version = ActiveRecord::Base.connection.execute('SELECT VERSION()').first['version'].match(/\A(?:PostgreSQL |)([^\s]+).*\z/)[1] + @redis_version = redis_info['redis_version'] + @reports_count = Report.unresolved.count + @queue_backlog = Sidekiq::Stats.new.enqueued + @recent_users = User.confirmed.recent.includes(:account).limit(4) + @database_size = ActiveRecord::Base.connection.execute('SELECT pg_database_size(current_database())').first['pg_database_size'] + @redis_size = redis_info['used_memory'] + @ldap_enabled = ENV['LDAP_ENABLED'] == 'true' + @cas_enabled = ENV['CAS_ENABLED'] == 'true' + @saml_enabled = ENV['SAML_ENABLED'] == 'true' + @pam_enabled = ENV['PAM_ENABLED'] == 'true' + @hidden_service = ENV['ALLOW_ACCESS_TO_HIDDEN_SERVICE'] == 'true' + end + + private + + def current_week + @current_week ||= Time.now.utc.to_date.cweek + end + + def redis_info + @redis_info ||= Redis.current.info + end + end +end -- cgit From 04587116bd9965125cd0ec34261ea307e23aa357 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 16 Jul 2018 01:58:10 +0200 Subject: Fix typo in Admin::DashboardController#index --- app/controllers/admin/dashboard_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/controllers') diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb index 01d4a9847..af1ac7b5e 100644 --- a/app/controllers/admin/dashboard_controller.rb +++ b/app/controllers/admin/dashboard_controller.rb @@ -11,7 +11,7 @@ module Admin @relay_enabled = Relay.enabled.exists? @single_user_mode = Rails.configuration.x.single_user_mode @registrations_enabled = Setting.open_registrations - @deletions_enabled = Setting.open_deletions + @deletions_enabled = Setting.open_deletion @invites_enabled = Setting.min_invite_role == 'user' @search_enabled = Chewy.enabled? @version = Mastodon::Version.to_s -- cgit From 0d13e30ad2579a9fc55f1b57c80cf9a9a89b1491 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 16 Jul 2018 19:21:27 +0200 Subject: Display trending hashtags on admin dashboard (#8038) --- app/controllers/admin/dashboard_controller.rb | 1 + app/models/trending_tags.rb | 27 +++++++++++++++++++++++++++ app/views/admin/dashboard/index.html.haml | 9 +++++++++ 3 files changed, 37 insertions(+) (limited to 'app/controllers') diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb index af1ac7b5e..7be753c9b 100644 --- a/app/controllers/admin/dashboard_controller.rb +++ b/app/controllers/admin/dashboard_controller.rb @@ -27,6 +27,7 @@ module Admin @saml_enabled = ENV['SAML_ENABLED'] == 'true' @pam_enabled = ENV['PAM_ENABLED'] == 'true' @hidden_service = ENV['ALLOW_ACCESS_TO_HIDDEN_SERVICE'] == 'true' + @trending_hashtags = TrendingTags.get(7) end private diff --git a/app/models/trending_tags.rb b/app/models/trending_tags.rb index c3641d7fd..b11f35292 100644 --- a/app/models/trending_tags.rb +++ b/app/models/trending_tags.rb @@ -1,7 +1,10 @@ # frozen_string_literal: true class TrendingTags + KEY = 'trending_tags' EXPIRE_HISTORY_AFTER = 7.days.seconds + EXPIRE_TRENDS_AFTER = 1.day.seconds + THRESHOLD = 5 class << self def record_use!(tag, account, at_time = Time.now.utc) @@ -9,6 +12,14 @@ class TrendingTags increment_historical_use!(tag.id, at_time) increment_unique_use!(tag.id, account.id, at_time) + increment_vote!(tag.id, at_time) + end + + def get(limit) + key = "#{KEY}:#{Time.now.utc.beginning_of_day.to_i}" + tag_ids = redis.zrevrange(key, 0, limit).map(&:to_i) + tags = Tag.where(id: tag_ids).to_a.map { |tag| [tag.id, tag] }.to_h + tag_ids.map { |tag_id| tags[tag_id] }.compact end private @@ -25,6 +36,22 @@ class TrendingTags redis.expire(key, EXPIRE_HISTORY_AFTER) end + def increment_vote!(tag_id, at_time) + key = "#{KEY}:#{at_time.beginning_of_day.to_i}" + expected = redis.pfcount("activity:tags:#{tag_id}:#{(at_time - 1.day).beginning_of_day.to_i}:accounts").to_f + expected = 1.0 if expected.zero? + observed = redis.pfcount("activity:tags:#{tag_id}:#{at_time.beginning_of_day.to_i}:accounts").to_f + + if expected > observed || observed < THRESHOLD + redis.zrem(key, tag_id.to_s) + else + score = ((observed - expected)**2) / expected + redis.zadd(key, score, tag_id.to_s) + end + + redis.expire(key, EXPIRE_TRENDS_AFTER) + end + def disallowed_hashtags return @disallowed_hashtags if defined?(@disallowed_hashtags) diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index 50004de33..41a0ee5a1 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -138,3 +138,12 @@ %span.pull-right.positive-hint= fa_icon 'check fw' - else %span.pull-right.negative-hint= fa_icon 'times fw' + + .dashboard__widgets__trends + %div + %h4= t 'admin.dashboard.trends' + %ul + - @trending_hashtags.each do |tag| + %li + = link_to "##{tag.name}", web_url("timelines/tag/#{tag.name}") + %span.pull-right= number_with_delimiter(tag.history[0]['accounts'].to_i) -- cgit