From f9c961cdc6b083e02ec88aababbac29e1061ff54 Mon Sep 17 00:00:00 2001 From: albert Date: Mon, 28 Mar 2011 18:48:02 -0400 Subject: [PATCH] * Removed unapprovals, added post flags and post appeals (still need to update tests) * Restyled text --- Gemfile | 2 +- Gemfile.lock | 84 ++++++----- app/controllers/comments_controller.rb | 4 + app/controllers/dtext_controller.rb | 2 +- app/controllers/post_appeals_controller.rb | 25 ++++ app/controllers/post_flags_controller.rb | 25 ++++ app/controllers/posts_controller.rb | 3 +- app/controllers/unapprovals_controller.rb | 32 ----- app/helpers/application_helper.rb | 4 - app/helpers/post_appeals_helper.rb | 9 ++ app/helpers/post_flags_helper.rb | 9 ++ app/logical/d_text.rb | 9 ++ app/models/comment.rb | 6 +- app/models/post.rb | 33 +++-- app/models/post_appeal.rb | 36 +++++ app/models/post_flag.rb | 34 +++++ app/models/unapproval.rb | 28 ---- app/models/user.rb | 10 +- app/views/artists/edit.html.erb | 5 +- app/views/artists/new.html.erb | 5 +- app/views/artists/search.html.erb | 2 +- app/views/artists/show.html.erb | 6 +- app/views/comments/_secondary_links.html.erb | 1 + app/views/comments/index_by_comment.html.erb | 12 +- .../comments/partials/show/_comment.html.erb | 2 +- app/views/comments/search.html.erb | 13 ++ app/views/forum_posts/_forum_post.html.erb | 6 +- app/views/forum_posts/edit.html.erb | 2 +- app/views/forum_posts/new.html.erb | 2 +- app/views/forum_posts/search.html.erb | 2 +- app/views/forum_topics/edit.html.erb | 2 +- app/views/forum_topics/index.html.erb | 2 +- app/views/forum_topics/new.html.erb | 2 +- app/views/forum_topics/show.html.erb | 20 +-- app/views/layouts/default.html.erb | 8 +- app/views/post_appeals/new.html.erb | 17 +++ .../{unapprovals => post_flags}/create.js.erb | 4 +- app/views/post_flags/new.html.erb | 25 ++++ app/views/post_moderation/approve.js.erb | 2 +- app/views/post_moderation/disapprove.js | 1 - app/views/post_moderation/moderate.html.erb | 5 +- .../posts/partials/index/_mode_menu.html.erb | 1 - .../posts/partials/show/_information.html.erb | 7 +- .../posts/partials/show/_options.html.erb | 3 +- app/views/posts/show.html.erb | 9 +- app/views/tag_aliases/new.html.erb | 2 +- app/views/tag_implications/new.html.erb | 2 +- app/views/tags/_secondary_links.html.erb | 2 - app/views/tags/search.html.erb | 2 + app/views/unapprovals/index.html.erb | 0 app/views/unapprovals/new.html.erb | 5 - config/routes.rb | 3 +- .../20100209201251_create_unapprovals.rb | 17 --- .../20110328215652_create_post_flags.rb | 19 +++ .../20110328215701_create_post_appeals.rb | 19 +++ public/javascripts/compiled/default.js | 68 +++++++-- public/javascripts/src/app/post_appeals.js | 40 ++++++ public/javascripts/src/app/post_flags.js | 40 ++++++ public/javascripts/src/app/unapprovals.js | 40 ------ public/stylesheets/compiled/default.css | 94 +++++-------- public/stylesheets/src/default.scss | 130 +++++++----------- script/custom/compile_javascripts | 3 +- test/fixtures/post_appeals.yml | 11 ++ test/fixtures/post_flags.yml | 11 ++ test/unit/post_appeal_test.rb | 8 ++ test/unit/post_flag_test.rb | 8 ++ 66 files changed, 642 insertions(+), 403 deletions(-) create mode 100644 app/controllers/post_appeals_controller.rb create mode 100644 app/controllers/post_flags_controller.rb delete mode 100644 app/controllers/unapprovals_controller.rb create mode 100644 app/helpers/post_appeals_helper.rb create mode 100644 app/helpers/post_flags_helper.rb create mode 100644 app/models/post_appeal.rb create mode 100644 app/models/post_flag.rb delete mode 100644 app/models/unapproval.rb create mode 100644 app/views/comments/search.html.erb create mode 100644 app/views/post_appeals/new.html.erb rename app/views/{unapprovals => post_flags}/create.js.erb (69%) create mode 100644 app/views/post_flags/new.html.erb delete mode 100644 app/views/unapprovals/index.html.erb delete mode 100644 app/views/unapprovals/new.html.erb delete mode 100644 db/migrate/20100209201251_create_unapprovals.rb create mode 100644 db/migrate/20110328215652_create_post_flags.rb create mode 100644 db/migrate/20110328215701_create_post_appeals.rb create mode 100644 public/javascripts/src/app/post_appeals.js create mode 100644 public/javascripts/src/app/post_flags.js delete mode 100644 public/javascripts/src/app/unapprovals.js create mode 100644 test/fixtures/post_appeals.yml create mode 100644 test/fixtures/post_flags.yml create mode 100644 test/unit/post_appeal_test.rb create mode 100644 test/unit/post_flag_test.rb diff --git a/Gemfile b/Gemfile index bf6126ed8..affb8349d 100644 --- a/Gemfile +++ b/Gemfile @@ -8,7 +8,7 @@ group :test do gem "simplecov", :require => false end -gem "rails", "3.0.3" +gem "rails", "3.0.5" gem "pg" gem "memcache-client", :require => "memcache" gem "imagesize", :require => "image_size" diff --git a/Gemfile.lock b/Gemfile.lock index ab4adcfe2..a543e5065 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,8 +1,8 @@ GIT remote: http://github.com/EmmanuelOga/ffaker.git - revision: 3298ebf33319b840f693a1a0ae2613eeb53e7dc4 + revision: fc090a6f62d63bd03546e8272e4c9ecd027a77de specs: - ffaker (1.0.0) + ffaker (1.4.0) GIT remote: http://github.com/mislav/will_paginate.git @@ -15,36 +15,36 @@ GEM remote: http://gemcutter.org/ specs: abstract (1.0.0) - actionmailer (3.0.3) - actionpack (= 3.0.3) - mail (~> 2.2.9) - actionpack (3.0.3) - activemodel (= 3.0.3) - activesupport (= 3.0.3) + actionmailer (3.0.5) + actionpack (= 3.0.5) + mail (~> 2.2.15) + actionpack (3.0.5) + activemodel (= 3.0.5) + activesupport (= 3.0.5) builder (~> 2.1.2) erubis (~> 2.6.6) i18n (~> 0.4) rack (~> 1.2.1) rack-mount (~> 0.6.13) - rack-test (~> 0.5.6) + rack-test (~> 0.5.7) tzinfo (~> 0.3.23) - activemodel (3.0.3) - activesupport (= 3.0.3) + activemodel (3.0.5) + activesupport (= 3.0.5) builder (~> 2.1.2) i18n (~> 0.4) - activerecord (3.0.3) - activemodel (= 3.0.3) - activesupport (= 3.0.3) + activerecord (3.0.5) + activemodel (= 3.0.5) + activesupport (= 3.0.5) arel (~> 2.0.2) tzinfo (~> 0.3.23) - activeresource (3.0.3) - activemodel (= 3.0.3) - activesupport (= 3.0.3) - activesupport (3.0.3) - arel (2.0.6) + activeresource (3.0.5) + activemodel (= 3.0.5) + activesupport (= 3.0.5) + activesupport (3.0.5) + arel (2.0.9) builder (2.1.2) daemons (1.1.0) - delayed_job (2.1.2) + delayed_job (2.1.4) activesupport (~> 3.0) daemons erubis (2.6.6) @@ -53,7 +53,7 @@ GEM haml (3.0.25) i18n (0.5.0) imagesize (0.1.1) - mail (2.2.14) + mail (2.2.15) activesupport (>= 2.3.6) i18n (>= 0.4.0) mime-types (~> 1.16) @@ -61,50 +61,48 @@ GEM mechanize (1.0.0) nokogiri (>= 1.2.1) memcache-client (1.8.5) - meta_search (0.9.11) + meta_search (1.0.3) actionpack (~> 3.0.2) activerecord (~> 3.0.2) activesupport (~> 3.0.2) arel (~> 2.0.2) mime-types (1.16) - mocha (0.9.10) - rake + mocha (0.9.12) nokogiri (1.4.4) - pg (0.10.0) + pg (0.10.1) polyglot (0.3.1) - rack (1.2.1) + rack (1.2.2) rack-mount (0.6.13) rack (>= 1.0.0) rack-test (0.5.7) rack (>= 1.0) - rails (3.0.3) - actionmailer (= 3.0.3) - actionpack (= 3.0.3) - activerecord (= 3.0.3) - activeresource (= 3.0.3) - activesupport (= 3.0.3) + rails (3.0.5) + actionmailer (= 3.0.5) + actionpack (= 3.0.5) + activerecord (= 3.0.5) + activeresource (= 3.0.5) + activesupport (= 3.0.5) bundler (~> 1.0) - railties (= 3.0.3) - railties (3.0.3) - actionpack (= 3.0.3) - activesupport (= 3.0.3) + railties (= 3.0.5) + railties (3.0.5) + actionpack (= 3.0.5) + activesupport (= 3.0.5) rake (>= 0.8.7) thor (~> 0.14.4) rake (0.8.7) shoulda (2.11.3) silent-postgres (0.0.7) - simple_form (1.3.0) - rails (~> 3.0.0) - simplecov (0.3.9) - simplecov-html (>= 0.3.7) - simplecov-html (0.3.9) + simple_form (1.3.1) + simplecov (0.4.1) + simplecov-html (~> 0.4.3) + simplecov-html (0.4.3) super_exception_notifier (3.0.13) actionmailer rake thor (0.14.6) treetop (1.4.9) polyglot (>= 0.3.1) - tzinfo (0.3.23) + tzinfo (0.3.25) PLATFORMS ruby @@ -121,7 +119,7 @@ DEPENDENCIES mocha nokogiri pg - rails (= 3.0.3) + rails (= 3.0.5) shoulda silent-postgres simple_form diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index fb2b1699a..0e1bfb2f4 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -10,6 +10,10 @@ class CommentsController < ApplicationController end end + def search + @search = Comment.search(params[:search]) + end + def update @comment = Comment.find(params[:id]) @comment.update_attributes(params[:comment]) diff --git a/app/controllers/dtext_controller.rb b/app/controllers/dtext_controller.rb index d820dc353..6746bc02e 100644 --- a/app/controllers/dtext_controller.rb +++ b/app/controllers/dtext_controller.rb @@ -1,5 +1,5 @@ class DtextController < ApplicationController def preview - render :inline => "

Preview

<%= format_text(params[:body]) %>" + render :inline => "

Preview

<%= format_text(params[:body]) %>" end end diff --git a/app/controllers/post_appeals_controller.rb b/app/controllers/post_appeals_controller.rb new file mode 100644 index 000000000..15ac81715 --- /dev/null +++ b/app/controllers/post_appeals_controller.rb @@ -0,0 +1,25 @@ +class PostAppealsController < ApplicationController + before_filter :member_only + respond_to :html, :xml, :json, :js + rescue_from User::PrivilegeError, :with => "static/access_denied" + + def new + @post_appeal = PostAppeal.new + respond_with(@post_appeal) + end + + def index + @search = PostAppeal.search(params[:search]) + @post_appeals = @search.paginate(:page => params[:page]) + end + + def create + @post_appeal = PostAppeal.create(params[:post_appeal]) + respond_with(@post_appeal) + end + +private + def check_privilege(post_appeal) + raise User::PrivilegeError unless (post_appeal.creator_id == CurrentUser.id || CurrentUser.is_moderator?) + end +end diff --git a/app/controllers/post_flags_controller.rb b/app/controllers/post_flags_controller.rb new file mode 100644 index 000000000..fdea1151e --- /dev/null +++ b/app/controllers/post_flags_controller.rb @@ -0,0 +1,25 @@ +class PostFlagsController < ApplicationController + before_filter :member_only + respond_to :html, :xml, :json, :js + rescue_from User::PrivilegeError, :with => "static/access_denied" + + def new + @post_flag = PostFlag.new + respond_with(@post_flag) + end + + def index + @search = PostFlag.search(params[:search]) + @post_flags = @search.paginate(:page => params[:page]) + end + + def create + @post_flag = PostFlag.create(params[:post_flag]) + respond_with(@post_flag) + end + +private + def check_privilege(post_flag) + raise User::PrivilegeError unless (post_flag.creator_id == CurrentUser.id || CurrentUser.is_moderator?) + end +end diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index 52ee3eb6d..62d23975e 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -10,7 +10,8 @@ class PostsController < ApplicationController def show @post = Post.find(params[:id]) - @unapproval = Unapproval.new(:post_id => @post) + @post_flag = PostFlag.new(:post_id => @post) + @post_appeal = PostAppeal.new(:post_id => @post) respond_with(@post) end diff --git a/app/controllers/unapprovals_controller.rb b/app/controllers/unapprovals_controller.rb deleted file mode 100644 index 0c0cdd67d..000000000 --- a/app/controllers/unapprovals_controller.rb +++ /dev/null @@ -1,32 +0,0 @@ -class UnapprovalsController < ApplicationController - before_filter :member_only - respond_to :html, :xml, :json, :js - rescue_from User::PrivilegeError, :with => "static/access_denied" - - def new - @unapproval = Unapproval.new - respond_with(@unapproval) - end - - def index - @search = Unapproval.search(params[:search]) - @unapprovals = @search.paginate(:page => params[:page]) - end - - def create - @unapproval = Unapproval.create(params[:unapproval]) - respond_with(@unapproval) - end - - def destroy - @unapproval = Unapproval.find(params[:id]) - check_privilege(@unapproval) - @unapproval.destroy - respond_with(@unapproval) - end - -private - def check_privilege(unapproval) - raise User::PrivilegeError unless (unapproval.unapprover_id == CurrentUser.id || CurrentUser.is_moderator?) - end -end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 5817bbaee..538516ea3 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -33,10 +33,6 @@ module ApplicationHelper end end - def wait_image(html_id) - ('').html_safe - end - protected def nav_link_match(controller, url) url =~ case controller diff --git a/app/helpers/post_appeals_helper.rb b/app/helpers/post_appeals_helper.rb new file mode 100644 index 000000000..409f3f800 --- /dev/null +++ b/app/helpers/post_appeals_helper.rb @@ -0,0 +1,9 @@ +module PostAppealsHelper + def post_appeal_reason(post) + post.appeals.map do |appeal| + content_tag("span", :class => "flag-and-reason-count") do + appeal.reason + " (" + link_to(appeal.creator.name, :controller => "user", :action => "show", :id => appeal.creator_id) + ")" + end + end.join("; ") + end +end \ No newline at end of file diff --git a/app/helpers/post_flags_helper.rb b/app/helpers/post_flags_helper.rb new file mode 100644 index 000000000..2efac5e16 --- /dev/null +++ b/app/helpers/post_flags_helper.rb @@ -0,0 +1,9 @@ +module PostFlagsHelper + def post_flag_reason(post) + post.flags.map do |flag| + content_tag("span", :class => "flag-and-reason-count") do + flag.reason + " (" + link_to(flag.creator.name, :controller => "user", :action => "show", :id => flag.creator_id) + ")" + end + end.join("; ") + end +end diff --git a/app/logical/d_text.rb b/app/logical/d_text.rb index 3c25ff6eb..284d34962 100644 --- a/app/logical/d_text.rb +++ b/app/logical/d_text.rb @@ -1,6 +1,15 @@ require 'cgi' +require 'uri' class DText + def self.u(string) + CGI.escape(string) + end + + def self.h(string) + CGI.escapeHTML(string) + end + def self.parse_inline(str, options = {}) str = parse_aliased_wiki_links(str) str = parse_wiki_links(str) diff --git a/app/models/comment.rb b/app/models/comment.rb index e6b853364..c599c4f94 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -10,8 +10,12 @@ class Comment < ActiveRecord::Base attr_accessor :do_not_bump_post scope :recent, :order => "comments.id desc", :limit => 6 - scope :search_body, lambda {|query| where("body_index @@ plainto_tsquery(?)", query).order("comments.id DESC")} + scope :body_matches, lambda {|query| where("body_index @@ plainto_tsquery(?)", query).order("comments.id DESC")} scope :hidden, lambda {|user| where("score < ?", user.comment_threshold)} + scope :post_tag_match, lambda {|query| joins(:post).where("posts.tag_index @@ to_tsquery('danbooru', ?)", query)} + + search_method :body_matches + search_method :post_tag_match def initialize_creator self.creator_id = CurrentUser.user.id diff --git a/app/models/post.rb b/app/models/post.rb index 5ec5ee21f..1e0888716 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -15,8 +15,9 @@ class Post < ActiveRecord::Base belongs_to :updater, :class_name => "User" belongs_to :approver, :class_name => "User" belongs_to :parent, :class_name => "Post" - has_one :unapproval, :dependent => :destroy has_one :upload, :dependent => :destroy + has_many :flags, :class_name => "PostFlag", :dependent => :destroy + has_many :appeals, :class_name => "PostAppeal", :dependent => :destroy has_many :versions, :class_name => "PostVersion", :dependent => :destroy, :order => "post_versions.id ASC" has_many :votes, :class_name => "PostVote", :dependent => :destroy has_many :notes, :dependent => :destroy @@ -30,8 +31,10 @@ class Post < ActiveRecord::Base scope :pending, where(["is_pending = ?", true]) scope :pending_or_flagged, where(["(is_pending = ? OR is_flagged = ?)", true, true]) scope :undeleted, where(["is_deleted = ?", false]) + scope :deleted, where(["is_deleted = ?", true]) scope :visible, lambda {|user| Danbooru.config.can_user_see_post_conditions(user)} scope :commented_before, lambda {|date| where("last_commented_at < ?", date).order("last_commented_at DESC")} + scope :for_user, lambda {|user_id| where(["uploader_string = ?", "uploader:#{user_id}"])} scope :available_for_moderation, lambda {where(["id NOT IN (SELECT pd.post_id FROM post_disapprovals pd WHERE pd.user_id = ?)", CurrentUser.id])} scope :hidden_from_moderation, lambda {where(["id IN (SELECT pd.post_id FROM post_disapprovals pd WHERE pd.user_id = ?)", CurrentUser.id])} scope :before_id, lambda {|id| id.present? ? where(["posts.id < ?", id]) : where("TRUE")} @@ -212,31 +215,27 @@ class Post < ActiveRecord::Base end module ApprovalMethods - def is_unapprovable? - is_pending == false && is_flagged == false && unapproval.nil? - end - def is_approvable? (is_pending? || is_flagged?) && approver_string != "approver:#{CurrentUser.name}" end - def unapprove!(reason) - raise Unapproval::Error.new("This post is still pending approval") if is_pending? - raise Unapproval::Error.new("This post has already been flagged") if is_flagged? - raise Unapproval::Error.new("This post has already been unapproved once") unless unapproval.nil? + def flag!(reason) + flag = create_flag(:reason => reason) - unapproval = create_unapproval( - :unapprover_id => CurrentUser.user.id, - :unapprover_ip_addr => CurrentUser.ip_addr, - :reason => reason - ) - - if unapproval.errors.any? - raise Unapproval::Error.new(unapproval.errors.full_messages.join("; ")) + if flag.errors.any? + raise PostFlag::Error.new(flag.errors.full_messages.join("; ")) end update_attribute(:is_flagged, true) end + + def appeal!(reason) + appeal = create_appeal(:reason => reason) + + if appeal.errors.any? + raise PostAppeal::Error.new(appeal.errors.full_messages.join("; ")) + end + end def approve! raise ApprovalError.new("You have previously approved this post and cannot approve it again") if approver_string == "approver:#{CurrentUser.name}" diff --git a/app/models/post_appeal.rb b/app/models/post_appeal.rb new file mode 100644 index 000000000..f8d34247e --- /dev/null +++ b/app/models/post_appeal.rb @@ -0,0 +1,36 @@ +class PostAppeal < ActiveRecord::Base + class Error < Exception ; end + + belongs_to :creator, :class_name => "User" + belongs_to :post + validates_presence_of :reason, :creator_id, :creator_ip_addr + validate :validate_post_is_inactive + validate :creator_is_not_limited + before_validation :initialize_creator, :on => :create + validates_uniqueness_of :creator_id, :scope => :post_id + scope :for_user, lambda {|user_id| where(["creator_id = ?", user_id])} + scope :recent, lambda {where(["created_at >= ?", 1.day.ago])} + + def validate_creator_is_not_limited + if PostAppeal.for_user(creator_id).recent.count >= 5 + errors[:creator] << "can appeal 5 posts a day" + false + else + true + end + end + + def validate_post_is_inactive + if !post.is_deleted? && !post.is_flagged? + errors[:post] << "is inactive" + false + else + true + end + end + + def initialize_creator + self.creator_id = CurrentUser.id + self.creator_ip_addr = CurrentUser.ip_addr + end +end diff --git a/app/models/post_flag.rb b/app/models/post_flag.rb new file mode 100644 index 000000000..114d29773 --- /dev/null +++ b/app/models/post_flag.rb @@ -0,0 +1,34 @@ +class PostFlag < ActiveRecord::Base + class Error < Exception ; end + + belongs_to :creator, :class_name => "User" + belongs_to :post + validates_presence_of :reason, :creator_id, :creator_ip_addr + validate :creator_is_not_limited + validate :validate_post_is_active + before_validation :initialize_creator, :on => :create + validates_uniqueness_of :creator_id, :scope => :post_id + + def validate_creator_is_not_limited + if PostAppeal.for_user(creator_id).recent.count >= 10 + errors[:creator] << "can flag 10 posts a day" + false + else + true + end + end + + def validate_post_is_active + if post.is_deleted? + errors[:post] << "is deleted" + false + else + true + end + end + + def initialize_creator + self.creator_id = CurrentUser.id + self.creator_ip_addr = CurrentUser.ip_addr + end +end diff --git a/app/models/unapproval.rb b/app/models/unapproval.rb deleted file mode 100644 index 0eae29127..000000000 --- a/app/models/unapproval.rb +++ /dev/null @@ -1,28 +0,0 @@ -class Unapproval < ActiveRecord::Base - class Error < Exception ; end - - belongs_to :unapprover, :class_name => "User" - belongs_to :post - validates_presence_of :reason, :unapprover_id, :unapprover_ip_addr - validate :validate_post_is_active - before_validation :initialize_unapprover, :on => :create - before_save :flag_post - - def validate_post_is_active - if post.is_pending? || post.is_flagged? || post.is_deleted? - errors[:post] << "is inactive" - false - else - true - end - end - - def flag_post - post.update_attribute(:is_flagged, true) - end - - def initialize_unapprover - self.unapprover_id = CurrentUser.id - self.unapprover_ip_addr = CurrentUser.ip_addr - end -end diff --git a/app/models/user.rb b/app/models/user.rb index 37afeee69..0d8782446 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -228,11 +228,15 @@ class User < ActiveRecord::Base end def upload_limit - deleted_count = RemovedPost.where("user_id = ?", id).count - unapproved_count = Post.where("is_pending = true and user_id = ?", id).count + deleted_count = Post.for_user(id).deleted.count + pending_count = Post.for_user(id).pending.count approved_count = Post.where("is_flagged = false and is_pending = false and user_id = ?", id).count - limit = base_upload_limit + (approved_count / 10) - (deleted_count / 4) - unapproved_count + if base_upload_limit + limit = base_upload_limit - pending_count + else + limit = 10 + (approved_count / 10) - (deleted_count / 4) - pending_count + end if limit > 20 limit = 20 diff --git a/app/views/artists/edit.html.erb b/app/views/artists/edit.html.erb index 0a4beb690..d632ead87 100644 --- a/app/views/artists/edit.html.erb +++ b/app/views/artists/edit.html.erb @@ -1,5 +1,6 @@ -
-
+
+
+

Edit Artist

<%= render "form" %>
diff --git a/app/views/artists/new.html.erb b/app/views/artists/new.html.erb index 0b69d7c2a..a0a57cc02 100644 --- a/app/views/artists/new.html.erb +++ b/app/views/artists/new.html.erb @@ -1,5 +1,6 @@ -
-
+
+
+

New Artist

<%= render "form" %>
diff --git a/app/views/artists/search.html.erb b/app/views/artists/search.html.erb index 064f86af2..7053b6ea6 100644 --- a/app/views/artists/search.html.erb +++ b/app/views/artists/search.html.erb @@ -1,6 +1,6 @@