Fix #4987: Can't populate tag string from upload url anymore.
Usage: https://danbooru.donmai.us/uploads/new?url=...&post[tag_string]=...&post[rating]=... * Pass the URL parameters from the /uploads/new page to the /uploads/:id page. * Fix the /uploads/:id page throwing an "unpermitted parameters" error when given URL params for the post edit form.
This commit is contained in:
@@ -102,7 +102,14 @@ export default class FileUploadComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (upload.status === "completed") {
|
if (upload.status === "completed") {
|
||||||
window.location.replace(`/uploads/${upload.id}`);
|
let params = new URLSearchParams(window.location.search);
|
||||||
|
params.delete("url");
|
||||||
|
params.delete("ref");
|
||||||
|
|
||||||
|
let url = new URL(`/uploads/${upload.id}`, window.location.origin);
|
||||||
|
url.search = params.toString();
|
||||||
|
|
||||||
|
window.location.replace(url);
|
||||||
} else {
|
} else {
|
||||||
this.$dropzone.removeClass("success");
|
this.$dropzone.removeClass("success");
|
||||||
this.$component.find("progress").addClass("hidden");
|
this.$component.find("progress").addClass("hidden");
|
||||||
|
|||||||
@@ -64,7 +64,8 @@ class PostsController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
@post = authorize Post.new_from_upload(permitted_attributes(Post))
|
@upload_media_asset = UploadMediaAsset.find(params[:upload_media_asset_id])
|
||||||
|
@post = authorize Post.new_from_upload(@upload_media_asset.upload, @upload_media_asset.media_asset, **permitted_attributes(Post).to_h.symbolize_keys)
|
||||||
@post.save
|
@post.save
|
||||||
|
|
||||||
if @post.errors.none?
|
if @post.errors.none?
|
||||||
@@ -79,7 +80,8 @@ class PostsController < ApplicationController
|
|||||||
flash[:notice] = "Duplicate of post ##{@original_post.id}; merging tags"
|
flash[:notice] = "Duplicate of post ##{@original_post.id}; merging tags"
|
||||||
redirect_to @original_post
|
redirect_to @original_post
|
||||||
else
|
else
|
||||||
@upload = UploadMediaAsset.find(params[:post][:upload_media_asset_id]).upload
|
@upload = @upload_media_asset.upload
|
||||||
|
@media_asset = @upload_media_asset.media_asset
|
||||||
flash[:notice] = @post.errors.full_messages.join("; ")
|
flash[:notice] = @post.errors.full_messages.join("; ")
|
||||||
respond_with(@post, render: { template: "uploads/show" })
|
respond_with(@post, render: { template: "uploads/show" })
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -46,7 +46,10 @@ class UploadsController < ApplicationController
|
|||||||
|
|
||||||
def show
|
def show
|
||||||
@upload = authorize Upload.find(params[:id])
|
@upload = authorize Upload.find(params[:id])
|
||||||
@post = Post.new(uploader: @upload.uploader, uploader_ip_addr: @upload.uploader_ip_addr, source: @upload.source, rating: nil, **permitted_attributes(Post))
|
@upload_media_asset = @upload.upload_media_assets.first
|
||||||
|
@media_asset = @upload_media_asset&.media_asset
|
||||||
|
|
||||||
|
@post = Post.new_from_upload(@upload, @media_asset, source: @upload.source, **permitted_attributes(Post).to_h.symbolize_keys)
|
||||||
@post.tag_string = "#{@post.tag_string} #{@upload.source_strategy&.artists.to_a.map(&:tag).map(&:name).join(" ")}".strip
|
@post.tag_string = "#{@post.tag_string} #{@upload.source_strategy&.artists.to_a.map(&:tag).map(&:name).join(" ")}".strip
|
||||||
@post.tag_string += " " if @post.tag_string.present?
|
@post.tag_string += " " if @post.tag_string.present?
|
||||||
|
|
||||||
|
|||||||
@@ -75,32 +75,28 @@ class Post < ApplicationRecord
|
|||||||
has_many :versions, -> { Rails.env.test? ? order("post_versions.updated_at ASC, post_versions.id ASC") : order("post_versions.updated_at ASC") }, class_name: "PostVersion", dependent: :destroy
|
has_many :versions, -> { Rails.env.test? ? order("post_versions.updated_at ASC, post_versions.id ASC") : order("post_versions.updated_at ASC") }, class_name: "PostVersion", dependent: :destroy
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.new_from_upload(params)
|
def self.new_from_upload(upload, media_asset, tag_string: nil, rating: nil, parent_id: nil, source: nil, artist_commentary_title: nil, artist_commentary_desc: nil, translated_commentary_title: nil, translated_commentary_desc: nil, is_pending: nil)
|
||||||
upload_media_asset = UploadMediaAsset.find(params[:upload_media_asset_id])
|
|
||||||
media_asset = upload_media_asset.media_asset
|
|
||||||
upload = upload_media_asset.upload
|
|
||||||
|
|
||||||
# XXX depends on CurrentUser
|
# XXX depends on CurrentUser
|
||||||
commentary = ArtistCommentary.new(
|
commentary = ArtistCommentary.new(
|
||||||
original_title: params[:artist_commentary_title],
|
original_title: artist_commentary_title,
|
||||||
original_description: params[:artist_commentary_desc],
|
original_description: artist_commentary_desc,
|
||||||
translated_title: params[:translated_commentary_title],
|
translated_title: translated_commentary_title,
|
||||||
translated_description: params[:translated_commentary_desc],
|
translated_description: translated_commentary_desc,
|
||||||
)
|
)
|
||||||
|
|
||||||
post = Post.new(
|
post = Post.new(
|
||||||
uploader: upload.uploader,
|
uploader: upload.uploader,
|
||||||
uploader_ip_addr: upload.uploader_ip_addr,
|
uploader_ip_addr: upload.uploader_ip_addr,
|
||||||
md5: media_asset.md5,
|
md5: media_asset&.md5,
|
||||||
file_ext: media_asset.file_ext,
|
file_ext: media_asset&.file_ext,
|
||||||
file_size: media_asset.file_size,
|
file_size: media_asset&.file_size,
|
||||||
image_width: media_asset.image_width,
|
image_width: media_asset&.image_width,
|
||||||
image_height: media_asset.image_height,
|
image_height: media_asset&.image_height,
|
||||||
source: params[:source].to_s,
|
source: source.to_s,
|
||||||
tag_string: params[:tag_string],
|
tag_string: tag_string,
|
||||||
rating: params[:rating],
|
rating: rating,
|
||||||
parent_id: params[:parent_id],
|
parent_id: parent_id,
|
||||||
is_pending: !upload.uploader.can_upload_free? || params[:is_pending].to_s.truthy?,
|
is_pending: !upload.uploader.can_upload_free? || is_pending.to_s.truthy?,
|
||||||
artist_commentary: (commentary if commentary.any_field_present?),
|
artist_commentary: (commentary if commentary.any_field_present?),
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -76,6 +76,12 @@ class PostPolicy < ApplicationPolicy
|
|||||||
translated_commentary_desc translated_commentary_title]
|
translated_commentary_desc translated_commentary_title]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# XXX For UploadsController#show action
|
||||||
|
def permitted_attributes_for_show
|
||||||
|
%i[tag_string rating parent_id source is_pending artist_commentary_desc
|
||||||
|
artist_commentary_title translated_commentary_desc translated_commentary_title]
|
||||||
|
end
|
||||||
|
|
||||||
def permitted_attributes_for_update
|
def permitted_attributes_for_update
|
||||||
%i[tag_string old_tag_string parent_id old_parent_id source old_source rating old_rating has_embedded_notes]
|
%i[tag_string old_tag_string parent_id old_parent_id source old_source rating old_rating has_embedded_notes]
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -29,9 +29,6 @@
|
|||||||
|
|
||||||
<div id="client-errors" class="error-messages ui-state-error ui-corner-all" style="display:none"></div>
|
<div id="client-errors" class="error-messages ui-state-error ui-corner-all" style="display:none"></div>
|
||||||
|
|
||||||
<% @upload_media_asset = @upload.upload_media_assets.first %>
|
|
||||||
<% @media_asset = @upload_media_asset.media_asset %>
|
|
||||||
|
|
||||||
<div id="upload-image">
|
<div id="upload-image">
|
||||||
<%= render MediaAssetComponent.new(media_asset: @media_asset) %>
|
<%= render MediaAssetComponent.new(media_asset: @media_asset) %>
|
||||||
|
|
||||||
@@ -51,9 +48,7 @@
|
|||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<%= edit_form_for(@post, html: { id: "form" }) do |f| %>
|
<%= edit_form_for(@post, html: { id: "form" }) do |f| %>
|
||||||
<%= f.input :upload_id, as: :hidden, input_html: { value: @upload.id } %>
|
<%= hidden_field_tag :upload_media_asset_id, @upload_media_asset.id %>
|
||||||
<%= f.input :media_asset_id, as: :hidden, input_html: { value: @media_asset.id } %>
|
|
||||||
<%= f.input :upload_media_asset_id, as: :hidden, input_html: { value: @upload_media_asset.id } %>
|
|
||||||
|
|
||||||
<%= f.input :source, as: :string, input_html: { value: @upload.source_strategy&.canonical_url } %>
|
<%= f.input :source, as: :string, input_html: { value: @upload.source_strategy&.canonical_url } %>
|
||||||
<%= f.input :rating, collection: [["Explicit", "e"], ["Questionable", "q"], ["Safe", "s"]], as: :radio_buttons, selected: @post.rating %>
|
<%= f.input :rating, collection: [["Explicit", "e"], ["Questionable", "q"], ["Safe", "s"]], as: :radio_buttons, selected: @post.rating %>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ class PostsControllerTest < ActionDispatch::IntegrationTest
|
|||||||
def create_post!(user: create(:user), media_asset: build(:media_asset), rating: "q", tag_string: "tagme", **params)
|
def create_post!(user: create(:user), media_asset: build(:media_asset), rating: "q", tag_string: "tagme", **params)
|
||||||
upload = build(:upload, uploader: user)
|
upload = build(:upload, uploader: user)
|
||||||
asset = create(:upload_media_asset, upload: upload, media_asset: media_asset)
|
asset = create(:upload_media_asset, upload: upload, media_asset: media_asset)
|
||||||
post_auth posts_path, user, params: { post: { upload_media_asset_id: asset.id, rating: rating, tag_string: tag_string, **params }}
|
post_auth posts_path, user, params: { upload_media_asset_id: asset.id, post: { rating: rating, tag_string: tag_string, **params }}
|
||||||
|
|
||||||
Post.last
|
Post.last
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -138,6 +138,14 @@ class UploadsControllerTest < ActionDispatch::IntegrationTest
|
|||||||
|
|
||||||
assert_redirected_to @post
|
assert_redirected_to @post
|
||||||
end
|
end
|
||||||
|
|
||||||
|
should "prefill the upload form with the URL parameters" do
|
||||||
|
upload = create(:completed_source_upload, uploader: @user)
|
||||||
|
get_auth upload_path(upload, post: { rating: "s" }), @user
|
||||||
|
|
||||||
|
assert_response :success
|
||||||
|
assert_select "#post_rating_s[checked]"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "create action" do
|
context "create action" do
|
||||||
|
|||||||
Reference in New Issue
Block a user