2019-05-02 18:17:27 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
class SiteSerializer < ApplicationSerializer
|
|
|
|
|
2018-03-13 15:59:12 -04:00
|
|
|
attributes(
|
|
|
|
:default_archetype,
|
|
|
|
:notification_types,
|
|
|
|
:post_types,
|
2021-06-01 16:11:48 -04:00
|
|
|
:trust_levels,
|
2018-03-13 15:59:12 -04:00
|
|
|
:groups,
|
|
|
|
:filters,
|
|
|
|
:periods,
|
|
|
|
:top_menu_items,
|
|
|
|
:anonymous_top_menu_items,
|
|
|
|
:uncategorized_category_id, # this is hidden so putting it here
|
|
|
|
:user_field_max_length,
|
|
|
|
:post_action_types,
|
|
|
|
:topic_flag_types,
|
|
|
|
:can_create_tag,
|
|
|
|
:can_tag_topics,
|
|
|
|
:can_tag_pms,
|
|
|
|
:tags_filter_regexp,
|
|
|
|
:top_tags,
|
2021-12-09 07:30:27 -05:00
|
|
|
:can_associate_groups,
|
2018-03-13 15:59:12 -04:00
|
|
|
:wizard_required,
|
|
|
|
:topic_featured_link_allowed_category_ids,
|
|
|
|
:user_themes,
|
2020-08-28 10:36:52 -04:00
|
|
|
:user_color_schemes,
|
|
|
|
:default_dark_color_scheme,
|
2019-07-31 13:33:49 -04:00
|
|
|
:censored_regexp,
|
2020-05-27 14:11:52 -04:00
|
|
|
:shared_drafts_category_id,
|
2021-02-25 07:00:58 -05:00
|
|
|
:custom_emoji_translation,
|
2021-06-02 01:36:49 -04:00
|
|
|
:watched_words_replace,
|
2021-06-23 03:21:11 -04:00
|
|
|
:watched_words_link,
|
2022-01-27 22:02:02 -05:00
|
|
|
:categories,
|
FEATURE: Add plugin API to register About stat group (#17442)
This commit introduces a new plugin API to register
a group of stats that will be included in about.json
and also conditionally in the site about UI at /about.
The usage is like this:
```ruby
register_about_stat_group("chat_messages", show_in_ui: true) do
{
last_day: 1,
"7_days" => 10,
"30_days" => 100,
count: 1000,
previous_30_days: 120
}
end
```
In reality the stats will be generated any way the implementer
chooses within the plugin. The `last_day`, `7_days`, `30_days,` and `count`
keys must be present but apart from that additional stats may be added.
Only those core 4 stat keys will be shown in the UI, but everything will be shown
in about.json.
The stat group name is used to prefix the stats in about.json like so:
```json
"chat_messages_last_day": 2322,
"chat_messages_7_days": 2322,
"chat_messages_30_days": 2322,
"chat_messages_count": 2322,
```
The `show_in_ui` option (default false) is used to determine whether the
group of stats is shown on the site About page in the Site Statistics
table. Some stats may be needed purely for reporting purposes and thus
do not need to be shown in the UI to admins/users. An extension to the Site
serializer, `displayed_about_plugin_stat_groups`, has been added so this
can be inspected on the client-side.
2022-07-14 23:16:00 -04:00
|
|
|
:markdown_additional_options,
|
2022-08-09 12:22:39 -04:00
|
|
|
:displayed_about_plugin_stat_groups,
|
2022-08-23 04:20:46 -04:00
|
|
|
:show_welcome_topic_banner,
|
|
|
|
:anonymous_default_sidebar_tags
|
2018-03-13 15:59:12 -04:00
|
|
|
)
|
2013-02-20 13:15:50 -05:00
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
has_many :archetypes, embed: :objects, serializer: ArchetypeSerializer
|
2018-07-31 11:18:50 -04:00
|
|
|
has_many :user_fields, embed: :objects, serializer: UserFieldSerializer
|
|
|
|
has_many :auth_providers, embed: :objects, serializer: AuthProviderSerializer
|
2013-02-05 14:16:51 -05:00
|
|
|
|
2017-04-12 10:52:52 -04:00
|
|
|
def user_themes
|
|
|
|
cache_fragment("user_themes") do
|
2018-07-12 00:18:21 -04:00
|
|
|
Theme.where('id = :default OR user_selectable',
|
|
|
|
default: SiteSetting.default_theme_id)
|
2021-12-05 19:55:34 -05:00
|
|
|
.order("lower(name)")
|
2020-08-28 10:36:52 -04:00
|
|
|
.pluck(:id, :name, :color_scheme_id)
|
|
|
|
.map { |id, n, cs| { theme_id: id, name: n, default: id == SiteSetting.default_theme_id, color_scheme_id: cs } }
|
2017-04-12 10:52:52 -04:00
|
|
|
.as_json
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-08-28 10:36:52 -04:00
|
|
|
def user_color_schemes
|
|
|
|
cache_fragment("user_color_schemes") do
|
2021-06-02 01:26:09 -04:00
|
|
|
schemes = ColorScheme.includes(:color_scheme_colors).where('user_selectable').order(:name)
|
2020-08-28 10:36:52 -04:00
|
|
|
ActiveModel::ArraySerializer.new(schemes, each_serializer: ColorSchemeSelectableSerializer).as_json
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def default_dark_color_scheme
|
|
|
|
ColorScheme.find_by_id(SiteSetting.default_dark_mode_color_scheme_id).as_json
|
|
|
|
end
|
|
|
|
|
2015-09-28 02:43:38 -04:00
|
|
|
def groups
|
2019-02-14 18:24:29 -05:00
|
|
|
cache_anon_fragment("group_names") do
|
2021-04-06 11:13:06 -04:00
|
|
|
object.groups.order(:name)
|
2021-08-10 07:55:11 -04:00
|
|
|
.select(:id, :name, :flair_icon, :flair_upload_id, :flair_bg_color, :flair_color)
|
2021-04-06 11:13:06 -04:00
|
|
|
.map do |g|
|
|
|
|
{
|
|
|
|
id: g.id,
|
|
|
|
name: g.name,
|
|
|
|
flair_url: g.flair_url,
|
|
|
|
flair_bg_color: g.flair_bg_color,
|
|
|
|
flair_color: g.flair_color,
|
|
|
|
}
|
|
|
|
end.as_json
|
2019-02-14 18:24:29 -05:00
|
|
|
end
|
2015-09-28 02:43:38 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def post_action_types
|
2015-10-18 20:42:33 -04:00
|
|
|
cache_fragment("post_action_types_#{I18n.locale}") do
|
2019-12-27 06:41:50 -05:00
|
|
|
types = ordered_flags(PostActionType.types.values)
|
2017-10-17 13:31:45 -04:00
|
|
|
ActiveModel::ArraySerializer.new(types).as_json
|
2015-09-28 02:43:38 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def topic_flag_types
|
2015-10-18 20:42:33 -04:00
|
|
|
cache_fragment("post_action_flag_types_#{I18n.locale}") do
|
2019-12-27 06:41:50 -05:00
|
|
|
types = ordered_flags(PostActionType.topic_flag_types.values)
|
2017-10-19 14:27:38 -04:00
|
|
|
ActiveModel::ArraySerializer.new(types, each_serializer: TopicFlagTypeSerializer).as_json
|
2015-09-28 02:43:38 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
def default_archetype
|
|
|
|
Archetype.default
|
|
|
|
end
|
|
|
|
|
2013-02-20 13:15:50 -05:00
|
|
|
def post_types
|
2013-03-18 16:03:46 -04:00
|
|
|
Post.types
|
2013-02-20 13:15:50 -05:00
|
|
|
end
|
2013-02-25 11:42:20 -05:00
|
|
|
|
2014-01-14 12:48:57 -05:00
|
|
|
def filters
|
|
|
|
Discourse.filters.map(&:to_s)
|
|
|
|
end
|
|
|
|
|
|
|
|
def periods
|
|
|
|
TopTopic.periods.map(&:to_s)
|
|
|
|
end
|
2014-02-05 17:54:16 -05:00
|
|
|
|
2014-01-14 12:48:57 -05:00
|
|
|
def top_menu_items
|
|
|
|
Discourse.top_menu_items.map(&:to_s)
|
|
|
|
end
|
|
|
|
|
|
|
|
def anonymous_top_menu_items
|
|
|
|
Discourse.anonymous_top_menu_items.map(&:to_s)
|
|
|
|
end
|
|
|
|
|
2013-10-23 19:05:51 -04:00
|
|
|
def uncategorized_category_id
|
|
|
|
SiteSetting.uncategorized_category_id
|
2013-05-27 14:15:20 -04:00
|
|
|
end
|
|
|
|
|
2015-02-23 13:02:30 -05:00
|
|
|
def user_field_max_length
|
|
|
|
UserField.max_length
|
|
|
|
end
|
|
|
|
|
2016-04-25 15:55:15 -04:00
|
|
|
def can_create_tag
|
2018-02-13 15:46:25 -05:00
|
|
|
scope.can_create_tag?
|
2016-04-25 15:55:15 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def can_tag_topics
|
2018-02-13 15:46:25 -05:00
|
|
|
scope.can_tag_topics?
|
|
|
|
end
|
|
|
|
|
|
|
|
def can_tag_pms
|
|
|
|
scope.can_tag_pms?
|
2016-04-25 15:55:15 -04:00
|
|
|
end
|
|
|
|
|
2021-12-09 07:30:27 -05:00
|
|
|
def can_associate_groups
|
|
|
|
scope.can_associate_groups?
|
|
|
|
end
|
|
|
|
|
|
|
|
def include_can_associate_groups?
|
|
|
|
scope.is_admin?
|
|
|
|
end
|
|
|
|
|
2016-04-25 15:55:15 -04:00
|
|
|
def include_tags_filter_regexp?
|
|
|
|
SiteSetting.tagging_enabled
|
|
|
|
end
|
2016-07-07 09:17:56 -04:00
|
|
|
|
2016-04-25 15:55:15 -04:00
|
|
|
def tags_filter_regexp
|
|
|
|
DiscourseTagging::TAGS_FILTER_REGEXP.source
|
|
|
|
end
|
|
|
|
|
|
|
|
def include_top_tags?
|
2016-07-07 09:17:56 -04:00
|
|
|
Tag.include_tags?
|
2016-04-25 15:55:15 -04:00
|
|
|
end
|
2016-07-07 09:17:56 -04:00
|
|
|
|
2016-04-25 15:55:15 -04:00
|
|
|
def top_tags
|
2016-09-22 15:23:10 -04:00
|
|
|
Tag.top_tags(guardian: scope)
|
2016-04-25 15:55:15 -04:00
|
|
|
end
|
2016-09-14 16:36:08 -04:00
|
|
|
|
|
|
|
def wizard_required
|
|
|
|
true
|
|
|
|
end
|
|
|
|
|
|
|
|
def include_wizard_required?
|
2016-10-18 11:44:25 -04:00
|
|
|
Wizard.user_requires_completion?(scope.user)
|
2016-09-14 16:36:08 -04:00
|
|
|
end
|
2016-12-05 07:31:43 -05:00
|
|
|
|
|
|
|
def include_topic_featured_link_allowed_category_ids?
|
|
|
|
SiteSetting.topic_featured_link_enabled
|
|
|
|
end
|
|
|
|
|
|
|
|
def topic_featured_link_allowed_category_ids
|
|
|
|
scope.topic_featured_link_allowed_category_ids
|
|
|
|
end
|
2017-06-28 16:56:44 -04:00
|
|
|
|
2019-07-31 13:33:49 -04:00
|
|
|
def censored_regexp
|
2022-08-02 04:06:03 -04:00
|
|
|
WordWatcher.serializable_word_matcher_regexp(:censor)
|
2017-06-28 16:56:44 -04:00
|
|
|
end
|
2018-03-13 15:59:12 -04:00
|
|
|
|
2020-05-27 14:11:52 -04:00
|
|
|
def custom_emoji_translation
|
|
|
|
Plugin::CustomEmoji.translations
|
|
|
|
end
|
|
|
|
|
2018-03-13 15:59:12 -04:00
|
|
|
def shared_drafts_category_id
|
|
|
|
SiteSetting.shared_drafts_category.to_i
|
|
|
|
end
|
|
|
|
|
|
|
|
def include_shared_drafts_category_id?
|
2021-05-06 15:09:31 -04:00
|
|
|
scope.can_see_shared_draft? && SiteSetting.shared_drafts_enabled?
|
2018-03-13 15:59:12 -04:00
|
|
|
end
|
|
|
|
|
2021-02-25 07:00:58 -05:00
|
|
|
def watched_words_replace
|
2021-05-18 05:09:47 -04:00
|
|
|
WordWatcher.word_matcher_regexps(:replace)
|
2021-02-25 07:00:58 -05:00
|
|
|
end
|
|
|
|
|
2021-06-02 01:36:49 -04:00
|
|
|
def watched_words_link
|
|
|
|
WordWatcher.word_matcher_regexps(:link)
|
|
|
|
end
|
|
|
|
|
2021-06-23 03:21:11 -04:00
|
|
|
def categories
|
|
|
|
object.categories.map { |c| c.to_h }
|
|
|
|
end
|
|
|
|
|
2022-01-27 22:02:02 -05:00
|
|
|
def markdown_additional_options
|
|
|
|
Site.markdown_additional_options
|
|
|
|
end
|
|
|
|
|
FEATURE: Add plugin API to register About stat group (#17442)
This commit introduces a new plugin API to register
a group of stats that will be included in about.json
and also conditionally in the site about UI at /about.
The usage is like this:
```ruby
register_about_stat_group("chat_messages", show_in_ui: true) do
{
last_day: 1,
"7_days" => 10,
"30_days" => 100,
count: 1000,
previous_30_days: 120
}
end
```
In reality the stats will be generated any way the implementer
chooses within the plugin. The `last_day`, `7_days`, `30_days,` and `count`
keys must be present but apart from that additional stats may be added.
Only those core 4 stat keys will be shown in the UI, but everything will be shown
in about.json.
The stat group name is used to prefix the stats in about.json like so:
```json
"chat_messages_last_day": 2322,
"chat_messages_7_days": 2322,
"chat_messages_30_days": 2322,
"chat_messages_count": 2322,
```
The `show_in_ui` option (default false) is used to determine whether the
group of stats is shown on the site About page in the Site Statistics
table. Some stats may be needed purely for reporting purposes and thus
do not need to be shown in the UI to admins/users. An extension to the Site
serializer, `displayed_about_plugin_stat_groups`, has been added so this
can be inspected on the client-side.
2022-07-14 23:16:00 -04:00
|
|
|
def displayed_about_plugin_stat_groups
|
|
|
|
About.displayed_plugin_stat_groups
|
|
|
|
end
|
|
|
|
|
2022-08-09 12:22:39 -04:00
|
|
|
def show_welcome_topic_banner
|
|
|
|
Site.show_welcome_topic_banner?(scope)
|
|
|
|
end
|
|
|
|
|
2022-08-23 04:20:46 -04:00
|
|
|
def anonymous_default_sidebar_tags
|
|
|
|
User.new.sidebar_tags.pluck(:name)
|
|
|
|
end
|
|
|
|
|
|
|
|
def include_anonymous_default_sidebar_tags?
|
|
|
|
SiteSetting.default_sidebar_tags.present?
|
|
|
|
end
|
|
|
|
|
2019-12-27 06:41:50 -05:00
|
|
|
private
|
|
|
|
|
|
|
|
def ordered_flags(flags)
|
|
|
|
notify_moderators_type = PostActionType.flag_types[:notify_moderators]
|
|
|
|
types = flags
|
|
|
|
|
|
|
|
if notify_moderators_flag = types.index(notify_moderators_type)
|
|
|
|
types.insert(types.length, types.delete_at(notify_moderators_flag))
|
|
|
|
end
|
|
|
|
|
|
|
|
types.map { |id| PostActionType.new(id: id) }
|
|
|
|
end
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|