Files
danbooru/app/controllers/artists_controller.rb
evazion ef3188a7fe artists/edit: refactor editing nested wiki pages.
Refactor to use accepts_nested_attributes_for instead of the notes
attribute to facilitate editing wikis on the artist edit page.

This fixes the notes attribute unintentionally showing up in the API.

This also changes it so that renaming an artist entry doesn't
automatically rename the corresponding wiki page. This had bad behavior
when there was a conflict between wiki pages (the wikis would be
silently merged, which usually isn't what you want). It also didn't warn
about wiki links being broken by renames.
2020-02-16 18:48:41 -06:00

104 lines
2.7 KiB
Ruby

class ArtistsController < ApplicationController
respond_to :html, :xml, :json, :js
before_action :member_only, :except => [:index, :show, :show_or_new, :banned]
before_action :admin_only, :only => [:ban, :unban]
before_action :load_artist, :only => [:ban, :unban, :show, :edit, :update, :destroy, :undelete]
def new
@artist = Artist.new_with_defaults(artist_params(:new))
@artist.build_wiki_page if @artist.wiki_page.nil?
respond_with(@artist)
end
def edit
@artist.build_wiki_page if @artist.wiki_page.nil?
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.ban!(banner: CurrentUser.user)
redirect_to(artist_path(@artist), :notice => "Artist was banned")
end
def unban
@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 = Artist.paginated_search(params)
@artists = @artists.includes(:urls, :tag) if request.format.html?
respond_with(@artists)
end
def show
@artist = Artist.find(params[:id])
respond_with(@artist)
end
def create
@artist = Artist.create(artist_params.merge(creator: CurrentUser.user))
respond_with(@artist)
end
def update
@artist.update(artist_params)
flash[:notice] = @artist.valid? ? "Artist updated" : @artist.errors.full_messages.join("; ")
respond_with(@artist)
end
def destroy
@artist.update_attribute(:is_active, false)
redirect_to(artist_path(@artist), :notice => "Artist deleted")
end
def revert
@artist = 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(artist_params(:new))
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
def load_artist
@artist = Artist.find(params[:id])
end
def artist_params(context = nil)
permitted_params = %i[name other_names other_names_string group_name url_string notes is_active]
permitted_params << { wiki_page_attributes: %i[id body] }
permitted_params << :source if context == :new
params.fetch(:artist, {}).permit(permitted_params)
end
end