mirror of
https://github.com/discourse/discourse.git
synced 2024-12-15 10:03:42 +08:00
30990006a9
This reduces chances of errors where consumers of strings mutate inputs and reduces memory usage of the app. Test suite passes now, but there may be some stuff left, so we will run a few sites on a branch prior to merging
112 lines
2.6 KiB
Ruby
112 lines
2.6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'base64'
|
|
|
|
class ThemeFieldSerializer < ApplicationSerializer
|
|
attributes :name, :target, :value, :error, :type_id, :upload_id, :url, :filename
|
|
|
|
def include_url?
|
|
object.upload
|
|
end
|
|
|
|
def include_upload_id?
|
|
object.upload
|
|
end
|
|
|
|
def include_filename?
|
|
object.upload
|
|
end
|
|
|
|
def url
|
|
object.upload&.url
|
|
end
|
|
|
|
def filename
|
|
object.upload&.original_filename
|
|
end
|
|
|
|
def target
|
|
Theme.lookup_target(object.target_id)&.to_s
|
|
end
|
|
|
|
def include_error?
|
|
object.error.present?
|
|
end
|
|
end
|
|
|
|
class BasicThemeSerializer < ApplicationSerializer
|
|
attributes :id, :name, :created_at, :updated_at, :default, :component
|
|
|
|
def include_default?
|
|
object.id == SiteSetting.default_theme_id
|
|
end
|
|
|
|
def default
|
|
true
|
|
end
|
|
end
|
|
|
|
class RemoteThemeSerializer < ApplicationSerializer
|
|
attributes :id, :remote_url, :remote_version, :local_version, :commits_behind,
|
|
:remote_updated_at, :updated_at, :github_diff_link, :last_error_text, :is_git?,
|
|
:license_url, :about_url, :authors, :theme_version, :minimum_discourse_version, :maximum_discourse_version
|
|
|
|
# wow, AMS has some pretty nutty logic where it tries to find the path here
|
|
# from action dispatch, tell it not to
|
|
def about_url
|
|
object.about_url
|
|
end
|
|
|
|
def include_github_diff_link?
|
|
github_diff_link.present?
|
|
end
|
|
end
|
|
|
|
class ThemeSerializer < BasicThemeSerializer
|
|
attributes :color_scheme, :color_scheme_id, :user_selectable, :remote_theme_id, :settings, :errors, :enabled?, :description
|
|
|
|
has_one :user, serializer: UserNameSerializer, embed: :object
|
|
|
|
has_many :theme_fields, serializer: ThemeFieldSerializer, embed: :objects
|
|
has_many :child_themes, serializer: BasicThemeSerializer, embed: :objects
|
|
has_many :parent_themes, serializer: BasicThemeSerializer, embed: :objects
|
|
has_one :remote_theme, serializer: RemoteThemeSerializer, embed: :objects
|
|
has_many :translations, serializer: ThemeTranslationSerializer, embed: :objects
|
|
|
|
def initialize(theme, options = {})
|
|
super
|
|
@errors = []
|
|
end
|
|
|
|
def child_themes
|
|
object.child_themes
|
|
end
|
|
|
|
def parent_themes
|
|
object.parent_themes
|
|
end
|
|
|
|
def settings
|
|
object.settings.map { |setting| ThemeSettingsSerializer.new(setting, root: false) }
|
|
rescue ThemeSettingsParser::InvalidYaml => e
|
|
@errors << e.message
|
|
nil
|
|
end
|
|
|
|
def include_child_themes?
|
|
!object.component?
|
|
end
|
|
|
|
def errors
|
|
@errors
|
|
end
|
|
|
|
def include_errors?
|
|
@errors.present?
|
|
end
|
|
|
|
def description
|
|
object.internal_translations.find { |t| t.key == "theme_metadata.description" } &.value
|
|
end
|
|
end
|