mirror of
https://github.com/discourse/discourse.git
synced 2024-11-29 10:55:25 +08:00
6039b513fe
This commit introduces the foundation for a new design for the /about page that we're currently working on. The current version will remain available and still be the default until we finish the new version and are ready to roll out. To opt into the new version right now, add one or more group to the `experimental_redesigned_about_page_groups` site setting and members in those groups will get the new version. Internal topic: t/128545.
120 lines
2.7 KiB
Ruby
120 lines
2.7 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class About
|
|
def self.displayed_plugin_stat_groups
|
|
DiscoursePluginRegistry.stats.select { |stat| stat.show_in_ui }.map { |stat| stat.name }
|
|
end
|
|
|
|
class CategoryMods
|
|
include ActiveModel::Serialization
|
|
attr_reader :category, :moderators
|
|
|
|
def initialize(category, moderators)
|
|
@category = category
|
|
@moderators = moderators
|
|
end
|
|
|
|
def parent_category
|
|
category.parent_category
|
|
end
|
|
end
|
|
|
|
include ActiveModel::Serialization
|
|
include StatsCacheable
|
|
|
|
def self.stats_cache_key
|
|
"about-stats"
|
|
end
|
|
|
|
def self.fetch_stats
|
|
Stat.api_stats
|
|
end
|
|
|
|
def initialize(user = nil)
|
|
@user = user
|
|
end
|
|
|
|
def version
|
|
Discourse::VERSION::STRING
|
|
end
|
|
|
|
def https
|
|
SiteSetting.force_https
|
|
end
|
|
|
|
def title
|
|
SiteSetting.title
|
|
end
|
|
|
|
def locale
|
|
SiteSetting.default_locale
|
|
end
|
|
|
|
def description
|
|
SiteSetting.site_description
|
|
end
|
|
|
|
def extended_site_description
|
|
SiteSetting.extended_site_description_cooked
|
|
end
|
|
|
|
def banner_image
|
|
url = SiteSetting.about_banner_image&.url
|
|
return if url.blank?
|
|
GlobalPath.full_cdn_url(url)
|
|
end
|
|
|
|
def moderators
|
|
@moderators ||= User.where(moderator: true, admin: false).human_users.order("last_seen_at DESC")
|
|
end
|
|
|
|
def admins
|
|
@admins ||=
|
|
DiscoursePluginRegistry.apply_modifier(
|
|
:about_admins,
|
|
User.where(admin: true).human_users.order("last_seen_at DESC"),
|
|
)
|
|
end
|
|
|
|
def stats
|
|
@stats ||= About.fetch_stats
|
|
end
|
|
|
|
def category_moderators
|
|
allowed_cats = Guardian.new(@user).allowed_category_ids
|
|
return [] if allowed_cats.blank?
|
|
|
|
cats_with_mods = Category.where.not(reviewable_by_group_id: nil).pluck(:id)
|
|
|
|
category_ids = cats_with_mods & allowed_cats
|
|
return [] if category_ids.blank?
|
|
|
|
per_cat_limit = category_mods_limit / category_ids.size
|
|
per_cat_limit = 1 if per_cat_limit < 1
|
|
|
|
results = DB.query(<<~SQL, category_ids: category_ids)
|
|
SELECT c.id category_id
|
|
, (ARRAY_AGG(u.id ORDER BY u.last_seen_at DESC))[:#{per_cat_limit}] user_ids
|
|
FROM categories c
|
|
JOIN group_users gu ON gu.group_id = c.reviewable_by_group_id
|
|
JOIN users u ON u.id = gu.user_id
|
|
WHERE c.id IN (:category_ids)
|
|
GROUP BY c.id
|
|
ORDER BY c.position
|
|
SQL
|
|
|
|
cats = Category.where(id: results.map(&:category_id)).index_by(&:id)
|
|
mods = User.where(id: results.map(&:user_ids).flatten.uniq).index_by(&:id)
|
|
|
|
results.map { |row| CategoryMods.new(cats[row.category_id], mods.values_at(*row.user_ids)) }
|
|
end
|
|
|
|
def category_mods_limit
|
|
@category_mods_limit || 100
|
|
end
|
|
|
|
def category_mods_limit=(number)
|
|
@category_mods_limit = number
|
|
end
|
|
end
|