Files
danbooru/app/controllers/artists_controller.rb
evazion ca00563a4d Fix #4303: Unable to rename artist entries with wiki pages
Remove the ability to edit an artist's wiki page directly from the
artist edit page. Instead the artist edit page has a link to open the
wiki edit page if you need to edit the wiki too.

Fixes an error being thrown when renaming an artist with a wiki page.
The problem is that changing the artist's name breaks the artist's
association with the old wiki page. Rails really wants nested
associations to be based on immutable IDs, not on mutable names, so
dealing with this correctly is difficult.

We don't really want to encourage people to create wiki pages for
artists to begin with, since they're usually just used to duplicate
the artist urls. Making it less convenient to edit artist wiki pages is
an intentional change to discourage creating unnecessary artist wikis.

Finally, this fixes an exploit where it was possible to edit locked wiki
pages through the artist edit page.
2020-05-12 16:57:05 -05:00

93 lines
2.3 KiB
Ruby

class ArtistsController < ApplicationController
respond_to :html, :xml, :json, :js
def new
@artist = authorize Artist.new_with_defaults(permitted_attributes(Artist))
respond_with(@artist)
end
def edit
@artist = authorize Artist.find(params[:id])
respond_with(@artist)
end
def banned
redirect_to artists_path(search: { is_banned: "true", order: "updated_at" }, format: request.format.symbol)
end
def ban
@artist = authorize Artist.find(params[:id])
@artist.ban!(banner: CurrentUser.user)
redirect_to(artist_path(@artist), :notice => "Artist was banned")
end
def unban
@artist = authorize Artist.find(params[:id])
@artist.unban!
redirect_to(artist_path(@artist), :notice => "Artist was unbanned")
end
def index
# XXX
params[:search][:name] = params.delete(:name) if params[:name]
@artists = authorize Artist.paginated_search(params)
@artists = @artists.includes(:urls, :tag) if request.format.html?
respond_with(@artists)
end
def show
@artist = authorize Artist.find(params[:id])
respond_with(@artist)
end
def create
@artist = authorize Artist.new(permitted_attributes(Artist))
@artist.save
respond_with(@artist)
end
def update
@artist = authorize Artist.find(params[:id])
@artist.update(permitted_attributes(@artist))
flash[:notice] = @artist.valid? ? "Artist updated" : @artist.errors.full_messages.join("; ")
respond_with(@artist)
end
def destroy
@artist = authorize Artist.find(params[:id])
@artist.update_attribute(:is_deleted, true)
redirect_to(artist_path(@artist), :notice => "Artist deleted")
end
def revert
@artist = authorize Artist.find(params[:id])
@version = @artist.versions.find(params[:version_id])
@artist.revert_to!(@version)
respond_with(@artist)
end
def show_or_new
@artist = Artist.find_by_name(params[:name])
if params[:name].blank?
redirect_to new_artist_path(permitted_attributes(Artist))
elsif @artist.present?
redirect_to artist_path(@artist)
else
@artist = Artist.new(name: params[:name])
respond_with(@artist)
end
end
private
def item_matches_params(artist)
if params[:search][:any_name_or_url_matches]
artist.name == Artist.normalize_name(params[:search][:any_name_or_url_matches])
else
true
end
end
end