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