mirror of
https://github.com/discourse/discourse.git
synced 2026-08-04 10:23:17 -05:00
FIX: import/export theme should work with uploads
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
require_dependency 'upload_creator'
|
||||
require 'base64'
|
||||
|
||||
class Admin::ThemesController < Admin::AdminController
|
||||
|
||||
@@ -31,7 +32,28 @@ class Admin::ThemesController < Admin::AdminController
|
||||
|
||||
@theme = Theme.new(name: theme["name"], user_id: current_user.id)
|
||||
theme["theme_fields"]&.each do |field|
|
||||
@theme.set_field(target: field["target"], name: field["name"], value: field["value"])
|
||||
|
||||
if field["raw_upload"]
|
||||
begin
|
||||
tmp = Tempfile.new
|
||||
tmp.binmode
|
||||
file = Base64.decode64(field["raw_upload"])
|
||||
tmp.write(file)
|
||||
tmp.rewind
|
||||
upload = UploadCreator.new(tmp, field["filename"]).create_for(current_user.id)
|
||||
field["upload_id"] = upload.id
|
||||
ensure
|
||||
tmp.unlink
|
||||
end
|
||||
end
|
||||
|
||||
@theme.set_field(
|
||||
target: field["target"],
|
||||
name: field["name"],
|
||||
value: field["value"],
|
||||
type_id: field["type_id"],
|
||||
upload_id: field["upload_id"]
|
||||
)
|
||||
end
|
||||
|
||||
if @theme.save
|
||||
@@ -168,7 +190,7 @@ class Admin::ThemesController < Admin::AdminController
|
||||
|
||||
response.headers['Content-Disposition'] = "attachment; filename=#{@theme.name.parameterize}.dcstyle.json"
|
||||
response.sending_file = true
|
||||
render json: ThemeSerializer.new(@theme)
|
||||
render json: ThemeWithEmbeddedUploadsSerializer.new(@theme, root: 'theme')
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
require 'base64'
|
||||
|
||||
class ThemeFieldSerializer < ApplicationSerializer
|
||||
attributes :name, :target, :value, :error, :type_id, :upload_id, :url, :filename
|
||||
|
||||
@@ -68,3 +70,28 @@ class ThemeSerializer < ChildThemeSerializer
|
||||
object.child_themes.order(:name)
|
||||
end
|
||||
end
|
||||
|
||||
class ThemeFieldWithEmbeddedUploadsSerializer < ThemeFieldSerializer
|
||||
attributes :raw_upload
|
||||
|
||||
def include_raw_upload?
|
||||
object.upload
|
||||
end
|
||||
|
||||
def raw_upload
|
||||
filename = Discourse.store.path_for(object.upload)
|
||||
raw = nil
|
||||
|
||||
if filename
|
||||
raw = File.read(filename)
|
||||
else
|
||||
raw = Discourse.store.download(object.upload).read
|
||||
end
|
||||
|
||||
Base64.encode64(raw)
|
||||
end
|
||||
end
|
||||
|
||||
class ThemeWithEmbeddedUploadsSerializer < ThemeSerializer
|
||||
has_many :theme_fields, serializer: ThemeFieldWithEmbeddedUploadsSerializer, embed: :objects
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user