]> git.openstreetmap.org Git - rails.git/commitdiff
Prevent reactivating inactive blocks
authorAnton Khorev <tony29@yandex.ru>
Thu, 15 Aug 2024 09:59:49 +0000 (12:59 +0300)
committerAnton Khorev <tony29@yandex.ru>
Thu, 15 Aug 2024 09:59:49 +0000 (12:59 +0300)
app/controllers/user_blocks_controller.rb
config/locales/en.yml
test/controllers/user_blocks_controller_test.rb

index 664ac56815d6e541de2de2e839b04aa188867f38..3b7ef30f9c96256962187173e5ee317408e05d58 100644 (file)
@@ -67,15 +67,20 @@ class UserBlocksController < ApplicationController
          current_user != @user_block.revoker
         flash[:error] = t(@user_block.revoker ? ".only_creator_or_revoker_can_edit" : ".only_creator_can_edit")
         redirect_to :action => "edit"
-      elsif @user_block.update(
-        :ends_at => Time.now.utc + @block_period.hours,
-        :reason => params[:user_block][:reason],
-        :needs_view => params[:user_block][:needs_view]
-      )
-        flash[:notice] = t(".success")
-        redirect_to(@user_block)
       else
-        render :action => "edit"
+        user_block_was_active = @user_block.active?
+        @user_block.reason = params[:user_block][:reason]
+        @user_block.needs_view = params[:user_block][:needs_view]
+        @user_block.ends_at = Time.now.utc + @block_period.hours
+        if !user_block_was_active && @user_block.active?
+          flash.now[:error] = t(".inactive_block_cannot_be_reactivated")
+          render :action => "edit"
+        elsif @user_block.save
+          flash[:notice] = t(".success")
+          redirect_to @user_block
+        else
+          render :action => "edit"
+        end
       end
     else
       redirect_to edit_user_block_path(:id => params[:id])
index ac41952c7a51ab540ea01b2e19c3530691c9a253..c4cae4b221b79bfbba7559635ef4f145f053451b 100644 (file)
@@ -2950,6 +2950,7 @@ en:
     update:
       only_creator_can_edit: "Only the moderator who created this block can edit it."
       only_creator_or_revoker_can_edit: "Only the moderators who created or revoked this block can edit it."
+      inactive_block_cannot_be_reactivated: "This block is inactive and cannot be reactivated."
       success: "Block updated."
     index:
       title: "User blocks"
index b172945ec056ea635a90973b0cb9c2627e9c89f7..d28194fdcf1735538e0a7af490e413a384b46206 100644 (file)
@@ -469,7 +469,7 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
     assert_equal "Original Reason", block.reason
 
     session_for(creator_user)
-    check_block_updates(block)
+    check_inactive_block_updates(block)
   end
 
   ##
@@ -491,10 +491,10 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
     assert_equal "Original Reason", block.reason
 
     session_for(creator_user)
-    check_block_updates(block)
+    check_inactive_block_updates(block)
 
     session_for(revoker_user)
-    check_block_updates(block)
+    check_inactive_block_updates(block)
   end
 
   ##
@@ -798,7 +798,7 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
     end
   end
 
-  def check_block_updates(block)
+  def check_inactive_block_updates(block)
     put user_block_path(block,
                         :user_block_period => "0",
                         :user_block => { :needs_view => false, :reason => "Updated Reason" })
@@ -810,12 +810,30 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
 
     put user_block_path(block,
                         :user_block_period => "0",
-                        :user_block => { :needs_view => true, :reason => "Updated Reason 2" })
+                        :user_block => { :needs_view => true, :reason => "Updated Reason Needs View" })
+    assert_response :success
+    assert_equal "This block is inactive and cannot be reactivated.", flash[:error]
+    block.reload
+    assert_not_predicate block, :active?
+    assert_equal "Updated Reason", block.reason
+
+    put user_block_path(block,
+                        :user_block_period => "1",
+                        :user_block => { :needs_view => false, :reason => "Updated Reason Duration Extended" })
+    assert_response :success
+    assert_equal "This block is inactive and cannot be reactivated.", flash[:error]
+    block.reload
+    assert_not_predicate block, :active?
+    assert_equal "Updated Reason", block.reason
+
+    put user_block_path(block,
+                        :user_block_period => "0",
+                        :user_block => { :needs_view => false, :reason => "Updated Reason Again" })
     assert_redirected_to user_block_path(block)
     assert_equal "Block updated.", flash[:notice]
     block.reload
-    assert_predicate block, :active?
-    assert_equal "Updated Reason 2", block.reason
+    assert_not_predicate block, :active?
+    assert_equal "Updated Reason Again", block.reason
   end
 
   def check_user_blocks_table(user_blocks)