diff --git a/app/controllers/admin/domains/registry_lock_controller.rb b/app/controllers/admin/domains/registry_lock_controller.rb new file mode 100644 index 000000000..83304fb72 --- /dev/null +++ b/app/controllers/admin/domains/registry_lock_controller.rb @@ -0,0 +1,22 @@ +module Admin + module Domains + class RegistryLockController < BaseController + + def destroy + set_domain + authorize! :manage, @domain + if @domain.remove_registry_lock + redirect_to edit_admin_domain_url(@domain), notice: t('admin.domains.registry_lock_delete.success') + else + redirect_to edit_admin_domain_url(@domain), alert: t('admin.domains.registry_lock_delete.error') + end + end + + private + + def set_domain + @domain = Domain.find(params[:domain_id]) + end + end + end +end diff --git a/app/models/concerns/domain/lockable.rb b/app/models/concerns/domain/lockable.rb index 68721e595..8292138ed 100644 --- a/app/models/concerns/domain/lockable.rb +++ b/app/models/concerns/domain/lockable.rb @@ -5,26 +5,30 @@ module Concerns::Domain::Lockable return unless registry_lockable? return if locked_by_registrant? - statuses << DomainStatus::SERVER_UPDATE_PROHIBITED - statuses << DomainStatus::SERVER_DELETE_PROHIBITED - statuses << DomainStatus::SERVER_TRANSFER_PROHIBITED - - save + transaction do + statuses << DomainStatus::SERVER_UPDATE_PROHIBITED + statuses << DomainStatus::SERVER_DELETE_PROHIBITED + statuses << DomainStatus::SERVER_TRANSFER_PROHIBITED + self.locked_by_registrant_at = Time.zone.now + save + end end def registry_lockable? (statuses & [ - DomainStatus::PENDING_DELETE_CONFIRMATION, - DomainStatus::PENDING_CREATE, - DomainStatus::PENDING_UPDATE, - DomainStatus::PENDING_DELETE, - DomainStatus::PENDING_RENEW, - DomainStatus::PENDING_TRANSFER, - DomainStatus::FORCE_DELETE, - ]).empty? + DomainStatus::PENDING_DELETE_CONFIRMATION, + DomainStatus::PENDING_CREATE, + DomainStatus::PENDING_UPDATE, + DomainStatus::PENDING_DELETE, + DomainStatus::PENDING_RENEW, + DomainStatus::PENDING_TRANSFER, + DomainStatus::FORCE_DELETE, + ]).empty? end def locked_by_registrant? + return false unless locked_by_registrant_at + lock_statuses = [ DomainStatus::SERVER_UPDATE_PROHIBITED, DomainStatus::SERVER_DELETE_PROHIBITED, @@ -37,10 +41,13 @@ module Concerns::Domain::Lockable def remove_registry_lock return unless locked_by_registrant? - statuses.delete(DomainStatus::SERVER_UPDATE_PROHIBITED) - statuses.delete(DomainStatus::SERVER_DELETE_PROHIBITED) - statuses.delete(DomainStatus::SERVER_TRANSFER_PROHIBITED) + transaction do + statuses.delete(DomainStatus::SERVER_UPDATE_PROHIBITED) + statuses.delete(DomainStatus::SERVER_DELETE_PROHIBITED) + statuses.delete(DomainStatus::SERVER_TRANSFER_PROHIBITED) + self.locked_by_registrant_at = nil - save + save + end end end diff --git a/app/presenters/domain_presenter.rb b/app/presenters/domain_presenter.rb index aac3c1527..4a41a06a3 100644 --- a/app/presenters/domain_presenter.rb +++ b/app/presenters/domain_presenter.rb @@ -52,18 +52,29 @@ class DomainPresenter def force_delete_toggle_btn if !domain.force_delete_scheduled? view.content_tag(:a, view.t('admin.domains.force_delete_toggle_btn.schedule'), - class: 'btn btn-default', data: { toggle: 'modal', target: '.domain-edit-force-delete-dialog', - } + }, + class: 'dropdown-item' ) else view.link_to(view.t('admin.domains.force_delete_toggle_btn.cancel'), view.admin_domain_force_delete_path(domain), method: :delete, data: { confirm: view.t('admin.domains.force_delete_toggle_btn.cancel_confirm') }, - class: 'btn btn-primary') + class: 'dropdown-item') + end + end + + + def remove_registry_lock_btn + if domain.locked_by_registrant? + view.link_to(view.t('admin.domains.registry_lock_delete.btn'), + view.admin_domain_registry_lock_path(domain), + method: :delete, + data: { confirm: view.t('admin.domains.registry_lock_delete.confirm') }, + class: 'dropdown-item') end end diff --git a/app/views/admin/domains/edit.html.erb b/app/views/admin/domains/edit.html.erb index 3f831e86b..335d3b574 100644 --- a/app/views/admin/domains/edit.html.erb +++ b/app/views/admin/domains/edit.html.erb @@ -6,12 +6,22 @@ Edit: <%= domain.name %> -
-

- <%= link_to t('.add_new_status_btn'), '#', class: 'btn btn-primary js-add-status' %> - <%= domain.force_delete_toggle_btn %> +
+
<%= link_to t('.back_btn'), [:admin, @domain], class: 'btn btn-default' %> -

+
+
+ + +

diff --git a/app/views/admin/domains/partials/_general.html.erb b/app/views/admin/domains/partials/_general.html.erb index 7e09a7756..cf57e64d0 100644 --- a/app/views/admin/domains/partials/_general.html.erb +++ b/app/views/admin/domains/partials/_general.html.erb @@ -33,6 +33,9 @@
<%= t('.force_delete_time') %>
<%= l(@domain.force_delete_at) %>
+ +
<%= t('.locked_by_registrant_at') %>
+
<%= l(@domain.locked_by_registrant_at) %>
diff --git a/config/locales/admin/domains.en.yml b/config/locales/admin/domains.en.yml index 87c2c9c6a..bbe23e990 100644 --- a/config/locales/admin/domains.en.yml +++ b/config/locales/admin/domains.en.yml @@ -23,6 +23,12 @@ en: close_btn: Close dialog submit_btn: Force delete domain + registry_lock_delete: + btn: Remove registry lock + confirm: Are you sure you want to remove registry lock that was set by registrant? + success: Registry lock removed + error: Registry lock could not be removed + versions: time: Time registrant: Registrant @@ -34,6 +40,7 @@ en: outzone_time: Outzone time delete_time: Delete time force_delete_time: Force delete time + locked_by_registrant_at: Registry lock time admin_contacts: title: Admin. contacts diff --git a/config/routes.rb b/config/routes.rb index 3ae18a7cd..c79822f28 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -182,6 +182,7 @@ Rails.application.routes.draw do resources :pending_updates resources :pending_deletes resource :force_delete, controller: 'domains/force_delete', only: %i[create destroy] + resource :registry_lock, controller: 'domains/registry_lock', only: :destroy end resources :domain_versions do diff --git a/test/models/domain/lockable_test.rb b/test/models/domain/lockable_test.rb index 5b62df355..2f14f99da 100644 --- a/test/models/domain/lockable_test.rb +++ b/test/models/domain/lockable_test.rb @@ -4,7 +4,7 @@ class DomainLockableTest < ActiveSupport::TestCase def setup super - @domain = domains(:shop) + @domain = domains(:airport) end def test_registry_lock_on_lockable_domain @@ -19,18 +19,21 @@ class DomainLockableTest < ActiveSupport::TestCase ) assert(@domain.locked_by_registrant?) + assert(@domain.locked_by_registrant_at) end def test_registry_lock_cannot_be_applied_twice @domain.apply_registry_lock refute(@domain.apply_registry_lock) assert(@domain.locked_by_registrant?) + assert(@domain.locked_by_registrant_at) end def test_registry_lock_cannot_be_applied_on_pending_statuses @domain.statuses << DomainStatus::PENDING_RENEW refute(@domain.apply_registry_lock) refute(@domain.locked_by_registrant?) + refute(@domain.locked_by_registrant_at) end def test_remove_registry_lock_on_locked_domain @@ -47,6 +50,7 @@ class DomainLockableTest < ActiveSupport::TestCase assert_equal(["ok"], @domain.statuses) refute(@domain.locked_by_registrant?) + refute(@domain.locked_by_registrant_at) end def test_remove_registry_lock_on_non_locked_domain @@ -55,5 +59,14 @@ class DomainLockableTest < ActiveSupport::TestCase assert_equal([], @domain.statuses) refute(@domain.locked_by_registrant?) + refute(@domain.locked_by_registrant_at) + end + + def test_registry_lock_cannot_be_removed_if_statuses_were_set_by_admin + @domain.statuses << DomainStatus::SERVER_UPDATE_PROHIBITED + @domain.statuses << DomainStatus::SERVER_DELETE_PROHIBITED + @domain.statuses << DomainStatus::SERVER_TRANSFER_PROHIBITED + + refute(@domain.remove_registry_lock) end end diff --git a/test/system/admin_area/domains/registry_lock_test.rb b/test/system/admin_area/domains/registry_lock_test.rb new file mode 100644 index 000000000..47b1f8329 --- /dev/null +++ b/test/system/admin_area/domains/registry_lock_test.rb @@ -0,0 +1,55 @@ +require 'test_helper' + +class RegistryLockTest < JavaScriptApplicationSystemTestCase + def setup + super + WebMock.allow_net_connect! + + sign_in users(:admin) + travel_to Time.zone.parse('2010-07-05 00:30:00') + @domain = domains(:airport) + end + + def teardown + travel_back + end + + def test_does_not_have_link_when_domain_is_not_locked + visit edit_admin_domain_path(@domain) + refute(page.has_link?('Remove registry lock')) + end + + def test_can_remove_registry_lock_from_a_domain + @domain.apply_registry_lock + + visit edit_admin_domain_path(@domain) + click_link_or_button('Actions') + assert(page.has_link?('Remove registry lock')) + + accept_confirm('Are you sure you want to remove registry lock that was set by registrant?') do + click_link_or_button('Remove registry lock') + end + + assert_text('Registry lock removed') + + @domain.reload + refute @domain.locked_by_registrant? + end + + def test_cannot_remove_registry_lock_from_not_locked_domain + @domain.apply_registry_lock + visit edit_admin_domain_path(@domain) + @domain.remove_registry_lock + + refute @domain.locked_by_registrant? + + click_link_or_button('Actions') + assert(page.has_link?('Remove registry lock')) + + accept_confirm('Are you sure you want to remove registry lock that was set by registrant?') do + click_link_or_button('Remove registry lock') + end + + assert_text('Registry lock could not be removed') + end +end diff --git a/test/system/admin_area/domains_test.rb b/test/system/admin_area/domains_test.rb index 538de2604..8103f2a8a 100644 --- a/test/system/admin_area/domains_test.rb +++ b/test/system/admin_area/domains_test.rb @@ -3,11 +3,27 @@ require 'test_helper' class AdminDomainsTestTest < ApplicationSystemTestCase setup do sign_in users(:admin) + travel_to Time.zone.parse('2010-07-05 00:30:00') + @domain = domains(:shop) + end + + teardown do + travel_back end def test_shows_details - domain = domains(:shop) - visit admin_domain_path(domain) - assert_field nil, with: domain.transfer_code + visit admin_domain_path(@domain) + assert_field nil, with: @domain.transfer_code + end + + def test_admin_registry_lock_date + visit admin_domain_path(@domain) + refute_text 'Registry lock time 2010-07-05 00:30' + + lockable_domain = domains(:airport) + lockable_domain.apply_registry_lock + + visit admin_domain_path(lockable_domain) + assert_text 'Registry lock time 2010-07-05 00:30' end end