BURs: remove ability to skip secondary validations.

Remove the ability to skip secondary validations when creating a BUR.
The only skippable validation that still existed was the requirement
that both tags in an implication must have wiki pages. It's now
mandatory to write wiki pages for tags before you can request an
implication. This doesn't apply to empty tags.
This commit is contained in:
evazion
2020-11-12 20:08:13 -06:00
parent 25cba710bf
commit 7f90bc4216
13 changed files with 38 additions and 65 deletions

View File

@@ -4,7 +4,7 @@ class BulkUpdateRequestProcessor
class Error < StandardError; end class Error < StandardError; end
attr_reader :bulk_update_request attr_reader :bulk_update_request
delegate :script, :forum_topic_id, :skip_secondary_validations, to: :bulk_update_request delegate :script, :forum_topic_id, to: :bulk_update_request
validate :validate_script validate :validate_script
def initialize(bulk_update_request) def initialize(bulk_update_request)
@@ -42,17 +42,25 @@ class BulkUpdateRequestProcessor
commands.each do |command, *args| commands.each do |command, *args|
case command case command
when :create_alias when :create_alias
tag_alias = TagAlias.new(creator: User.system, antecedent_name: args[0], consequent_name: args[1], skip_secondary_validations: skip_secondary_validations) tag_alias = TagAlias.new(creator: User.system, antecedent_name: args[0], consequent_name: args[1])
if tag_alias.invalid? if tag_alias.invalid?
errors[:base] << "Can't create alias #{tag_alias.antecedent_name} -> #{tag_alias.consequent_name} (#{tag_alias.errors.full_messages.join("; ")})" errors[:base] << "Can't create alias #{tag_alias.antecedent_name} -> #{tag_alias.consequent_name} (#{tag_alias.errors.full_messages.join("; ")})"
end end
when :create_implication when :create_implication
tag_implication = TagImplication.new(creator: User.system, antecedent_name: args[0], consequent_name: args[1], skip_secondary_validations: skip_secondary_validations, status: "active") tag_implication = TagImplication.new(creator: User.system, antecedent_name: args[0], consequent_name: args[1], status: "active")
if tag_implication.invalid? if tag_implication.invalid?
errors[:base] << "Can't create implication #{tag_implication.antecedent_name} -> #{tag_implication.consequent_name} (#{tag_implication.errors.full_messages.join("; ")})" errors[:base] << "Can't create implication #{tag_implication.antecedent_name} -> #{tag_implication.consequent_name} (#{tag_implication.errors.full_messages.join("; ")})"
end end
if !tag_implication.antecedent_tag.empty? && tag_implication.antecedent_wiki.blank?
errors[:base] << "'#{tag_implication.antecedent_tag.name}' must have a wiki page"
end
if !tag_implication.consequent_tag.empty? && tag_implication.consequent_wiki.blank?
errors[:base] << "'#{tag_implication.consequent_tag.name}' must have a wiki page"
end
when :remove_alias when :remove_alias
tag_alias = TagAlias.active.find_by(antecedent_name: args[0], consequent_name: args[1]) tag_alias = TagAlias.active.find_by(antecedent_name: args[0], consequent_name: args[1])
if tag_alias.nil? if tag_alias.nil?
@@ -97,11 +105,11 @@ class BulkUpdateRequestProcessor
commands.map do |command, *args| commands.map do |command, *args|
case command case command
when :create_alias when :create_alias
tag_alias = TagAlias.create!(creator: approver, forum_topic_id: forum_topic_id, status: "pending", antecedent_name: args[0], consequent_name: args[1], skip_secondary_validations: skip_secondary_validations) tag_alias = TagAlias.create!(creator: approver, forum_topic_id: forum_topic_id, status: "pending", antecedent_name: args[0], consequent_name: args[1])
tag_alias.approve!(approver) tag_alias.approve!(approver)
when :create_implication when :create_implication
tag_implication = TagImplication.create!(creator: approver, forum_topic_id: forum_topic_id, status: "pending", antecedent_name: args[0], consequent_name: args[1], skip_secondary_validations: skip_secondary_validations) tag_implication = TagImplication.create!(creator: approver, forum_topic_id: forum_topic_id, status: "pending", antecedent_name: args[0], consequent_name: args[1])
tag_implication.approve!(approver) tag_implication.approve!(approver)
when :remove_alias when :remove_alias

View File

@@ -192,7 +192,7 @@ class Artist < ApplicationRecord
# potential race condition but unlikely # potential race condition but unlikely
unless TagImplication.where(:antecedent_name => name, :consequent_name => "banned_artist").exists? unless TagImplication.where(:antecedent_name => name, :consequent_name => "banned_artist").exists?
tag_implication = TagImplication.create!(antecedent_name: name, consequent_name: "banned_artist", skip_secondary_validations: true, creator: banner) tag_implication = TagImplication.create!(antecedent_name: name, consequent_name: "banned_artist", creator: banner)
tag_implication.approve!(banner) tag_implication.approve!(banner)
end end

View File

@@ -1,7 +1,6 @@
class BulkUpdateRequest < ApplicationRecord class BulkUpdateRequest < ApplicationRecord
attr_accessor :title attr_accessor :title
attr_accessor :reason attr_accessor :reason
attr_reader :skip_secondary_validations
belongs_to :user belongs_to :user
belongs_to :forum_topic, optional: true belongs_to :forum_topic, optional: true
@@ -75,7 +74,7 @@ class BulkUpdateRequest < ApplicationRecord
transaction do transaction do
CurrentUser.scoped(approver) do CurrentUser.scoped(approver) do
processor.process!(approver) processor.process!(approver)
update!(status: "approved", approver: approver, skip_secondary_validations: true) update!(status: "approved", approver: approver)
forum_updater.update("The #{bulk_update_request_link} (forum ##{forum_post.id}) has been approved by @#{approver.name}.") forum_updater.update("The #{bulk_update_request_link} (forum ##{forum_post.id}) has been approved by @#{approver.name}.")
end end
end end
@@ -120,10 +119,6 @@ class BulkUpdateRequest < ApplicationRecord
self.tags = processor.affected_tags self.tags = processor.affected_tags
end end
def skip_secondary_validations=(v)
@skip_secondary_validations = v.to_s.truthy?
end
def processor def processor
@processor ||= BulkUpdateRequestProcessor.new(self) @processor ||= BulkUpdateRequestProcessor.new(self)
end end

View File

@@ -8,7 +8,6 @@ class TagImplication < TagRelationship
validate :absence_of_transitive_relation validate :absence_of_transitive_relation
validate :antecedent_is_not_aliased validate :antecedent_is_not_aliased
validate :consequent_is_not_aliased validate :consequent_is_not_aliased
validate :wiki_pages_present, on: :create, unless: :skip_secondary_validations
module DescendantMethods module DescendantMethods
extend ActiveSupport::Concern extend ActiveSupport::Concern
@@ -107,16 +106,6 @@ class TagImplication < TagRelationship
errors[:base] << "Consequent tag must not be aliased to another tag" errors[:base] << "Consequent tag must not be aliased to another tag"
end end
end end
def wiki_pages_present
if consequent_wiki.blank?
errors[:base] << "The #{consequent_name} tag needs a corresponding wiki page"
end
if antecedent_wiki.blank?
errors[:base] << "The #{antecedent_name} tag needs a corresponding wiki page"
end
end
end end
module ApprovalMethods module ApprovalMethods

View File

@@ -4,8 +4,6 @@ class TagRelationship < ApplicationRecord
EXPIRY = 60 EXPIRY = 60
EXPIRY_WARNING = 55 EXPIRY_WARNING = 55
attr_accessor :skip_secondary_validations
belongs_to :creator, class_name: "User" belongs_to :creator, class_name: "User"
belongs_to :approver, class_name: "User", optional: true belongs_to :approver, class_name: "User", optional: true
belongs_to :forum_post, optional: true belongs_to :forum_post, optional: true

View File

@@ -20,14 +20,14 @@ class BulkUpdateRequestPolicy < ApplicationPolicy
end end
def permitted_attributes_for_create def permitted_attributes_for_create
[:script, :skip_secondary_validations, :title, :reason, :forum_topic_id] [:script, :title, :reason, :forum_topic_id]
end end
def permitted_attributes_for_update def permitted_attributes_for_update
if can_update_forum? if can_update_forum?
[:script, :skip_secondary_validations, :forum_topic_id, :forum_post_id] [:script, :forum_topic_id, :forum_post_id]
else else
[:script, :skip_secondary_validations] [:script]
end end
end end
end end

View File

@@ -28,16 +28,6 @@
</div> </div>
<% end %> <% end %>
<% if @bulk_update_request.errors.any? %>
<div class="input">
<label class="checkbox optional" for="bulk_update_request_skip_secondary_validations">
<%= check_box "bulk_update_request", "skip_secondary_validations" %>
Skip validations
</label>
<p class="hint">You can ignore the wiki page and minimum count requirements</p>
</div>
<% end %>
<% if @bulk_update_request.persisted? && policy(@bulk_update_request).can_update_forum? %> <% if @bulk_update_request.persisted? && policy(@bulk_update_request).can_update_forum? %>
<%= f.input :forum_topic_id %> <%= f.input :forum_topic_id %>
<%= f.input :forum_post_id %> <%= f.input :forum_post_id %>

View File

@@ -4,6 +4,5 @@ FactoryBot.define do
title {"xxx"} title {"xxx"}
script {"create alias aaa -> bbb"} script {"create alias aaa -> bbb"}
reason { FFaker::Lorem.sentences.join(" ") } reason { FFaker::Lorem.sentences.join(" ") }
skip_secondary_validations {true}
end end
end end

View File

@@ -4,6 +4,5 @@ FactoryBot.define do
antecedent_name {"#{FFaker::Name.first_name.downcase}#{rand(1000)}"} antecedent_name {"#{FFaker::Name.first_name.downcase}#{rand(1000)}"}
consequent_name {"#{FFaker::Name.first_name.downcase}#{rand(1000)}"} consequent_name {"#{FFaker::Name.first_name.downcase}#{rand(1000)}"}
status {"active"} status {"active"}
skip_secondary_validations {true}
end end
end end

View File

@@ -4,6 +4,5 @@ FactoryBot.define do
antecedent_name {"#{FFaker::Name.first_name.downcase}#{rand(1000)}"} antecedent_name {"#{FFaker::Name.first_name.downcase}#{rand(1000)}"}
consequent_name {"#{FFaker::Name.first_name.downcase}#{rand(1000)}"} consequent_name {"#{FFaker::Name.first_name.downcase}#{rand(1000)}"}
status {"active"} status {"active"}
skip_secondary_validations {true}
end end
end end

View File

@@ -48,26 +48,14 @@ class BulkUpdateRequestsControllerTest < ActionDispatch::IntegrationTest
end end
context "#update" do context "#update" do
should "still handle enabled secondary validations correctly" do
put_auth bulk_update_request_path(@bulk_update_request.id), @user, params: {bulk_update_request: {script: "create alias zzz -> 222", skip_secondary_validations: "0"}}
assert_response :redirect
assert_equal("create alias zzz -> 222", @bulk_update_request.reload.script)
end
should "still handle disabled secondary validations correctly" do
put_auth bulk_update_request_path(@bulk_update_request.id), @user, params: {bulk_update_request: {script: "create alias zzz -> 222", skip_secondary_validations: "1"}}
assert_response :redirect
assert_equal("create alias zzz -> 222", @bulk_update_request.reload.script)
end
should "allow builders to update other people's requests" do should "allow builders to update other people's requests" do
put_auth bulk_update_request_path(@bulk_update_request.id), create(:builder_user), params: {bulk_update_request: {script: "create alias zzz -> 222", skip_secondary_validations: "0"}} put_auth bulk_update_request_path(@bulk_update_request.id), create(:builder_user), params: {bulk_update_request: {script: "create alias zzz -> 222" }}
assert_response :redirect assert_response :redirect
assert_equal("create alias zzz -> 222", @bulk_update_request.reload.script) assert_equal("create alias zzz -> 222", @bulk_update_request.reload.script)
end end
should "not allow members to update other people's requests" do should "not allow members to update other people's requests" do
put_auth bulk_update_request_path(@bulk_update_request.id), create(:user), params: {bulk_update_request: {script: "create alias zzz -> 222", skip_secondary_validations: "0"}} put_auth bulk_update_request_path(@bulk_update_request.id), create(:user), params: {bulk_update_request: {script: "create alias zzz -> 222" }}
assert_response 403 assert_response 403
assert_equal("create alias aaa -> bbb", @bulk_update_request.reload.script) assert_equal("create alias aaa -> bbb", @bulk_update_request.reload.script)
end end

View File

@@ -309,6 +309,24 @@ class BulkUpdateRequestTest < ActiveSupport::TestCase
assert_equal(true, @bur.valid?) assert_equal(true, @bur.valid?)
end end
end end
context "requesting an implication for an empty tag without a wiki" do
should "succeed" do
@bur = create(:bulk_update_request, script: "imply a -> b")
assert_equal(true, @bur.valid?)
end
end
context "requesting an implication for a populated tag without a wiki" do
should "fail" do
create(:tag, name: "a", post_count: 1)
create(:tag, name: "b", post_count: 1)
@bur = build(:bulk_update_request, script: "imply a -> b")
assert_equal(false, @bur.valid?)
assert_equal(["'a' must have a wiki page; 'b' must have a wiki page"], @bur.errors.full_messages)
end
end
end end
context "when the script is updated" do context "when the script is updated" do

View File

@@ -61,16 +61,6 @@ class TagImplicationTest < ActiveSupport::TestCase
end end
end end
context "on secondary validation" do
should "warn if either tag is missing a wiki" do
ti = FactoryBot.build(:tag_implication, antecedent_name: "aaa", consequent_name: "bbb", skip_secondary_validations: false)
assert(ti.invalid?)
assert_includes(ti.errors[:base], "The aaa tag needs a corresponding wiki page")
assert_includes(ti.errors[:base], "The bbb tag needs a corresponding wiki page")
end
end
should "populate the creator information" do should "populate the creator information" do
ti = create(:tag_implication, antecedent_name: "aaa", consequent_name: "bbb", creator: CurrentUser.user) ti = create(:tag_implication, antecedent_name: "aaa", consequent_name: "bbb", creator: CurrentUser.user)
assert_equal(CurrentUser.user.id, ti.creator_id) assert_equal(CurrentUser.user.id, ti.creator_id)