diff --git a/app/models/concerns/domain/force_delete.rb b/app/models/concerns/domain/force_delete.rb
index 9f69316d7..5247ce93d 100644
--- a/app/models/concerns/domain/force_delete.rb
+++ b/app/models/concerns/domain/force_delete.rb
@@ -12,8 +12,7 @@ module Concerns::Domain::ForceDelete
preserve_current_statuses_for_force_delete
add_force_delete_statuses
- self.force_delete_at = (Time.zone.now + (Setting.redemption_grace_period.days + 1.day)).utc
- .beginning_of_day
+ self.force_delete_date = Time.zone.today + Setting.redemption_grace_period.days + 1.day
stop_all_pending_actions
allow_deletion
save(validate: false)
@@ -22,7 +21,7 @@ module Concerns::Domain::ForceDelete
def cancel_force_delete
restore_statuses_before_force_delete
remove_force_delete_statuses
- self.force_delete_at = nil
+ self.force_delete_date = nil
save(validate: false)
end
diff --git a/app/models/domain.rb b/app/models/domain.rb
index c0e89d34f..fd5d920c2 100644
--- a/app/models/domain.rb
+++ b/app/models/domain.rb
@@ -501,7 +501,7 @@ class Domain < ActiveRecord::Base
when DomainStatus::PENDING_DELETE
self.delete_at = nil
when DomainStatus::SERVER_MANUAL_INZONE # removal causes server hold to set
- self.outzone_at = Time.zone.now if self.force_delete_at.present?
+ self.outzone_at = Time.zone.now if force_delete_scheduled?
when DomainStatus::DomainStatus::EXPIRED # removal causes server hold to set
self.outzone_at = self.expire_time + 15.day
when DomainStatus::DomainStatus::SERVER_HOLD # removal causes server hold to set
diff --git a/app/models/domain_cron.rb b/app/models/domain_cron.rb
index 2d208d647..c05167a82 100644
--- a/app/models/domain_cron.rb
+++ b/app/models/domain_cron.rb
@@ -84,7 +84,7 @@ class DomainCron
c = 0
- Domain.where('force_delete_at <= ?', Time.zone.now.end_of_day.utc).each do |x|
+ Domain.where('force_delete_date <= ?', Time.zone.now.end_of_day.utc).each do |x|
DomainDeleteJob.enqueue(x.id, run_at: rand(((24*60) - (DateTime.now.hour * 60 + DateTime.now.minute))).minutes.from_now)
STDOUT << "#{Time.zone.now.utc} DomainCron.destroy_delete_candidates: job added by force delete time ##{x.id} (#{x.name})\n" unless Rails.env.test?
c += 1
diff --git a/app/models/whois_record.rb b/app/models/whois_record.rb
index b2a0349aa..ad0036315 100644
--- a/app/models/whois_record.rb
+++ b/app/models/whois_record.rb
@@ -40,7 +40,8 @@ class WhoisRecord < ActiveRecord::Base
h[:changed] = domain.updated_at.try(:to_s, :iso8601)
h[:expire] = domain.valid_to.to_date.to_s
h[:outzone] = domain.outzone_at.try(:to_date).try(:to_s)
- h[:delete] = [domain.delete_at, domain.force_delete_at].compact.min.try(:to_date).try(:to_s)
+ h[:delete] = [domain.delete_at, domain.force_delete_date].compact.min.try(:to_date)
+ .try(:to_s)
h[:registrant] = registrant.name
h[:registrant_kind] = registrant.kind
diff --git a/app/presenters/domain_presenter.rb b/app/presenters/domain_presenter.rb
index 445e5b87d..d58163aae 100644
--- a/app/presenters/domain_presenter.rb
+++ b/app/presenters/domain_presenter.rb
@@ -39,7 +39,7 @@ class DomainPresenter
end
def force_delete_date
- view.l(domain.force_delete_at, format: :date) if domain.force_delete_at
+ view.l(domain.force_delete_date) if domain.force_delete_scheduled?
end
def admin_contact_names
diff --git a/app/views/admin/domains/partials/_general.html.erb b/app/views/admin/domains/partials/_general.html.erb
index 3c6d3e986..feeaeb01f 100644
--- a/app/views/admin/domains/partials/_general.html.erb
+++ b/app/views/admin/domains/partials/_general.html.erb
@@ -31,8 +31,8 @@
<%= t('.delete_time') %>
<%= l(@domain.delete_at) %>
- <%= Domain.human_attribute_name :force_delete_at %>
- <%= l @domain.force_delete_at %>
+ <%= Domain.human_attribute_name :force_delete_date %>
+ <%= l @domain.force_delete_date %>
<%= t('.locked_by_registrant_at') %>
<%= l(@domain.locked_by_registrant_at) %>
diff --git a/app/views/registrant/domains/partials/_general.html.erb b/app/views/registrant/domains/partials/_general.html.erb
index 46d55bd85..842d4e8e3 100644
--- a/app/views/registrant/domains/partials/_general.html.erb
+++ b/app/views/registrant/domains/partials/_general.html.erb
@@ -31,8 +31,8 @@
<%= Domain.human_attribute_name :delete_at %>
<%= l(@domain.delete_at) %>
- <%= Domain.human_attribute_name :force_delete_at %>
- <%= l(@domain.force_delete_at) %>
+ <%= Domain.human_attribute_name :force_delete_date %>
+ <%= l @domain.force_delete_date %>
diff --git a/config/locales/admin/domains.en.yml b/config/locales/admin/domains.en.yml
index c4fd1ccb2..9e1b98781 100644
--- a/config/locales/admin/domains.en.yml
+++ b/config/locales/admin/domains.en.yml
@@ -52,7 +52,6 @@ en:
general:
outzone_time: Outzone time
delete_time: Delete time
- force_delete_time: Force delete time
locked_by_registrant_at: Registry lock time
admin_contacts:
diff --git a/db/migrate/20190322152123_change_domains_force_delete_at_to_date.rb b/db/migrate/20190322152123_change_domains_force_delete_at_to_date.rb
new file mode 100644
index 000000000..e0264681a
--- /dev/null
+++ b/db/migrate/20190322152123_change_domains_force_delete_at_to_date.rb
@@ -0,0 +1,5 @@
+class ChangeDomainsForceDeleteAtToDate < ActiveRecord::Migration
+ def change
+ change_column :domains, :force_delete_at, :date
+ end
+end
diff --git a/db/migrate/20190322152529_rename_domains_force_delete_at_to_force_delete_date.rb b/db/migrate/20190322152529_rename_domains_force_delete_at_to_force_delete_date.rb
new file mode 100644
index 000000000..c722bc257
--- /dev/null
+++ b/db/migrate/20190322152529_rename_domains_force_delete_at_to_force_delete_date.rb
@@ -0,0 +1,5 @@
+class RenameDomainsForceDeleteAtToForceDeleteDate < ActiveRecord::Migration
+ def change
+ rename_column :domains, :force_delete_at, :force_delete_date
+ end
+end
diff --git a/db/structure.sql b/db/structure.sql
index 2417e89cd..88871b4ef 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -936,7 +936,7 @@ CREATE TABLE public.domains (
registrant_verification_asked_at timestamp without time zone,
registrant_verification_token character varying,
pending_json jsonb,
- force_delete_at timestamp without time zone,
+ force_delete_date date,
statuses character varying[],
reserved boolean DEFAULT false,
status_notes public.hstore,
@@ -4935,3 +4935,7 @@ INSERT INTO schema_migrations (version) VALUES ('20190311111718');
INSERT INTO schema_migrations (version) VALUES ('20190312211614');
+INSERT INTO schema_migrations (version) VALUES ('20190322152123');
+
+INSERT INTO schema_migrations (version) VALUES ('20190322152529');
+
diff --git a/doc/registrant-api/v1/domain.md b/doc/registrant-api/v1/domain.md
index eeb1bfccc..883745dff 100644
--- a/doc/registrant-api/v1/domain.md
+++ b/doc/registrant-api/v1/domain.md
@@ -71,7 +71,7 @@ Content-Type: application/json
"pending_json":{
},
- "force_delete_at":null,
+ "force_delete_date":null,
"statuses":[
"ok"
],
@@ -187,7 +187,7 @@ Content-Type: application/json
"pending_json":{
},
- "force_delete_at":null,
+ "force_delete_date":null,
"statuses":[
"ok"
],
@@ -295,7 +295,7 @@ Content-Type: application/json
"pending_json":{
},
- "force_delete_at":null,
+ "force_delete_date":null,
"statuses":[
"ok"
],
diff --git a/doc/registrant-api/v1/registry_lock.md b/doc/registrant-api/v1/registry_lock.md
index 553c7b28e..dea3ea5a3 100644
--- a/doc/registrant-api/v1/registry_lock.md
+++ b/doc/registrant-api/v1/registry_lock.md
@@ -71,7 +71,7 @@ Content-Type: application/json
"pending_json":{
},
- "force_delete_at":null,
+ "force_delete_date":null,
"statuses":[
"serverUpdateProhibited",
"serverDeleteProhibited",
@@ -216,7 +216,7 @@ Content-Type: application/json
"pending_json":{
},
- "force_delete_at":null,
+ "force_delete_date":null,
"statuses":[
"ok"
],
diff --git a/doc/repp/v1/domain.md b/doc/repp/v1/domain.md
index 4c9476125..8c46240a7 100644
--- a/doc/repp/v1/domain.md
+++ b/doc/repp/v1/domain.md
@@ -57,7 +57,7 @@ Content-Type: application/json
"registrant_verification_token": null,
"pending_json": {
},
- "force_delete_at": null,
+ "force_delete_date": null,
"statuses": [
"ok"
],
diff --git a/lib/serializers/registrant_api/domain.rb b/lib/serializers/registrant_api/domain.rb
index d6adf61ee..feec4bd15 100644
--- a/lib/serializers/registrant_api/domain.rb
+++ b/lib/serializers/registrant_api/domain.rb
@@ -40,7 +40,7 @@ module Serializers
registrant_verification_asked_at: domain.registrant_verification_asked_at,
registrant_verification_token: domain.registrant_verification_token,
pending_json: domain.pending_json,
- force_delete_at: domain.force_delete_at,
+ force_delete_date: domain.force_delete_date,
statuses: domain.statuses,
locked_by_registrant_at: domain.locked_by_registrant_at,
reserved: domain.reserved,
diff --git a/spec/presenters/domain_presenter_spec.rb b/spec/presenters/domain_presenter_spec.rb
index ff4fc2841..0b475d6fd 100644
--- a/spec/presenters/domain_presenter_spec.rb
+++ b/spec/presenters/domain_presenter_spec.rb
@@ -63,16 +63,16 @@ RSpec.describe DomainPresenter do
subject(:force_delete_date) { presenter.force_delete_date }
context 'when present' do
- let(:domain) { instance_double(Domain, force_delete_at: '05.07.2010') }
+ let(:domain) { instance_double(Domain, force_delete_date: '05.07.2010', force_delete_scheduled?: true) }
it 'returns localized date' do
- expect(view).to receive(:l).with('05.07.2010', format: :date).and_return('delete date')
+ expect(view).to receive(:l).with('05.07.2010').and_return('delete date')
expect(force_delete_date).to eq('delete date')
end
end
context 'when absent' do
- let(:domain) { instance_double(Domain, force_delete_at: nil) }
+ let(:domain) { instance_double(Domain, force_delete_date: nil, force_delete_scheduled?: false) }
specify { expect(force_delete_date).to be_nil }
end
diff --git a/test/fixtures/domains.yml b/test/fixtures/domains.yml
index 792953bbd..cce7298cf 100644
--- a/test/fixtures/domains.yml
+++ b/test/fixtures/domains.yml
@@ -8,7 +8,7 @@ shop:
valid_to: <%= Time.zone.parse('2010-07-05').to_s(:db) %>
outzone_at: <%= Time.zone.parse('2010-07-06').to_s(:db) %>
delete_at: <%= Time.zone.parse('2010-07-07').to_s(:db) %>
- force_delete_at: <%= Time.zone.parse('2010-07-08').to_s(:db) %>
+ force_delete_date: 2010-07-08
period: 1
period_unit: m
uuid: 1b3ee442-e8fe-4922-9492-8fcb9dccc69c
diff --git a/test/lib/serializers/registrant_api/domain_test.rb b/test/lib/serializers/registrant_api/domain_test.rb
index a592edf45..57b494ddb 100644
--- a/test/lib/serializers/registrant_api/domain_test.rb
+++ b/test/lib/serializers/registrant_api/domain_test.rb
@@ -73,7 +73,7 @@ class SerializersRegistrantApiDomainTest < ActiveSupport::TestCase
registrant tech_contacts admin_contacts transfer_code name_dirty name_puny period
period_unit creator_str updator_str legacy_id legacy_registrar_id legacy_registrant_id
outzone_at delete_at registrant_verification_asked_at
- registrant_verification_token pending_json force_delete_at statuses
+ registrant_verification_token pending_json force_delete_date statuses
locked_by_registrant_at reserved status_notes nameservers]
assert_equal(keys, @json.keys & keys)
diff --git a/test/models/domain/force_delete_test.rb b/test/models/domain/force_delete_test.rb
index 646a34015..9092fad86 100644
--- a/test/models/domain/force_delete_test.rb
+++ b/test/models/domain/force_delete_test.rb
@@ -3,21 +3,23 @@ require 'test_helper'
class DomainForceDeleteTest < ActiveSupport::TestCase
setup do
@domain = domains(:shop)
+ @original_redemption_grace_period = Setting.redemption_grace_period
end
- def test_schedule_force_delete
- @original_redemption_grace_period = Setting.redemption_grace_period
+ teardown do
+ Setting.redemption_grace_period = @original_redemption_grace_period
+ end
+
+ def test_schedules_force_delete
+ assert_not @domain.force_delete_scheduled?
Setting.redemption_grace_period = 30
- travel_to Time.zone.parse('2010-07-05 00:00')
+ travel_to Time.zone.parse('2010-07-05')
@domain.schedule_force_delete
@domain.reload
assert @domain.force_delete_scheduled?
- assert_equal Time.zone.parse('2010-08-04 03:00'), @domain.force_delete_at
-
- travel_back
- Setting.redemption_grace_period = @original_redemption_grace_period
+ assert_equal Date.parse('2010-08-05'), @domain.force_delete_date
end
def test_scheduling_force_delete_adds_corresponding_statuses
@@ -80,6 +82,17 @@ class DomainForceDeleteTest < ActiveSupport::TestCase
end
end
+ def test_cancels_force_delete
+ @domain.update_columns(statuses: [DomainStatus::FORCE_DELETE], force_delete_date: '2010-07-05')
+ assert @domain.force_delete_scheduled?
+
+ @domain.cancel_force_delete
+ @domain.reload
+
+ assert_not @domain.force_delete_scheduled?
+ assert_nil @domain.force_delete_date
+ end
+
def test_cancelling_force_delete_bypasses_validation
@domain = domains(:invalid)
@domain.schedule_force_delete
diff --git a/test/system/registrant_area/domains/details_test.rb b/test/system/registrant_area/domains/details_test.rb
index 875203c1b..b23686b97 100644
--- a/test/system/registrant_area/domains/details_test.rb
+++ b/test/system/registrant_area/domains/details_test.rb
@@ -7,7 +7,10 @@ class RegistrantAreaDomainDetailsTest < ApplicationSystemTestCase
end
def test_general_data
+ @domain.update_columns(force_delete_date: '2010-07-08', statuses: [DomainStatus::FORCE_DELETE])
+
visit registrant_domain_url(@domain)
+
assert_text 'Name shop.test'
assert_text "Registered at #{l Time.zone.parse('2010-07-04')}"
assert_link 'Best Names', href: registrant_registrar_path(@domain.registrar)
@@ -18,7 +21,7 @@ class RegistrantAreaDomainDetailsTest < ApplicationSystemTestCase
assert_text "Valid to #{l Time.zone.parse('2010-07-05')}"
assert_text "Outzone at #{l Time.zone.parse('2010-07-06')}"
assert_text "Delete at #{l Time.zone.parse('2010-07-07')}"
- assert_text "Force delete at #{l Time.zone.parse('2010-07-08')}"
+ assert_text "Force delete date #{l Date.parse('2010-07-08')}"
end
def test_registrant