From e82e1a13ebbf6c1ac7046e4fd987301e83519afa Mon Sep 17 00:00:00 2001 From: Alex Sherman Date: Tue, 14 Jan 2020 17:03:23 +0500 Subject: [PATCH] Add poll message on start of grace period for soft delete Add removing forceDelete on registrant change. Restore email template choosing on safe force delete via admin dashboard. See https://github.com/internetee/registry/issues/1428#issuecomment-573766153 --- app/models/concerns/domain/force_delete.rb | 5 ++ app/models/concerns/job/force_delete.rb | 68 +++++++++++++++++++ app/models/domain.rb | 2 + app/models/domain_cron.rb | 49 +------------ .../domains/_force_delete_dialog.html.erb | 3 +- config/locales/en.yml | 3 +- config/schedule.rb | 2 +- 7 files changed, 80 insertions(+), 52 deletions(-) create mode 100644 app/models/concerns/job/force_delete.rb diff --git a/app/models/concerns/domain/force_delete.rb b/app/models/concerns/domain/force_delete.rb index d09ea37042..ffe9973226 100644 --- a/app/models/concerns/domain/force_delete.rb +++ b/app/models/concerns/domain/force_delete.rb @@ -11,6 +11,11 @@ def force_delete_scheduled? statuses.include?(DomainStatus::FORCE_DELETE) end + def should_notify_on_soft_force_delete? + force_delete_scheduled? && !statuses.include?(DomainStatus::CLIENT_HOLD) && + force_delete_start.present? && force_delete_start.to_date == Time.zone.now.to_date + end + def client_holdable? force_delete_scheduled? && !statuses.include?(DomainStatus::CLIENT_HOLD) && force_delete_start.present? && force_delete_lte_today && force_delete_lte_valid_date diff --git a/app/models/concerns/job/force_delete.rb b/app/models/concerns/job/force_delete.rb new file mode 100644 index 0000000000..26a9acf40e --- /dev/null +++ b/app/models/concerns/job/force_delete.rb @@ -0,0 +1,68 @@ +module Concerns + module Job + class ForceDelete + extend ActiveSupport::Concern + + def self.start_client_hold + log_prepare_client_hold + + ::PaperTrail.whodunnit = "cron - #{__method__}" + + marked = 0 + real = 0 + + Domain.force_delete_scheduled.each do |domain| + real += 1 + proceed_client_gold(domain: domain) + marked += 1 + end + + log_end_end_client_hold(marked: marked, real: real) + marked + end + + def self.proceed_client_gold(domain:) + notify_on_grace_period(domain) if domain.should_notify_on_soft_force_delete? + return unless domain.client_holdable? + + domain.statuses << DomainStatus::CLIENT_HOLD + log_start_client_hold(domain) + + domain.save(validate: false) and + notify_client_hold(domain) + end + + def self.log_prepare_client_hold + return if Rails.env.test? + + STDOUT << "#{Time.zone.now.utc} - Setting client_hold to domains\n" + end + + def self.log_start_client_hold(domain) + return if Rails.env.test? + + STDOUT << "#{Time.zone.now.utc} DomainCron.start_client_hold: ##{domain.id} "\ + "(#{domain.name}) #{domain.changes}\n" + end + + def self.log_end_end_client_hold(marked:, real:) + return if Rails.env.test? + + STDOUT << "#{Time.zone.now.utc} - Successfully set client_hold to #{marked} of #{real} "\ + "domains\n" + end + + def self.notify_client_hold(domain) + domain.registrar.notifications.create!(text: I18n.t('client_hold_set_on_domain', + domain_name: domain.name, + start_date: domain.force_delete_start)) + end + + def self.notify_on_grace_period(domain) + domain.registrar.notifications.create!(text: I18n.t('grace_period_started_domain', + domain_name: domain.name, + start_date: domain.force_delete_start)) + end + end + end +end diff --git a/app/models/domain.rb b/app/models/domain.rb index 50f41c38af..734243c0d3 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -547,6 +547,8 @@ def manage_automatic_statuses activate if nameservers.reject(&:marked_for_destruction?).size >= Setting.ns_min_count end + cancel_force_delete if force_delete_scheduled? && pending_json['new_registrant_id'] + if statuses.empty? && valid? statuses << DomainStatus::OK elsif (statuses.length > 1 && active?) || !valid? diff --git a/app/models/domain_cron.rb b/app/models/domain_cron.rb index 154c4ca191..4b51b5f57e 100644 --- a/app/models/domain_cron.rb +++ b/app/models/domain_cron.rb @@ -1,4 +1,5 @@ class DomainCron + include Concerns::Job::ForceDelete def self.clean_expired_pendings STDOUT << "#{Time.zone.now.utc} - Clean expired domain pendings\n" unless Rails.env.test? @@ -78,52 +79,4 @@ def self.start_redemption_grace_period STDOUT << "#{Time.zone.now.utc} - Successfully set server_hold to #{marked} of #{real} domains\n" unless Rails.env.test? marked end - - def self.start_client_hold - log_prepare_client_hold - - ::PaperTrail.whodunnit = "cron - #{__method__}" - - marked = 0 - real = 0 - - Domain.force_delete_scheduled.each do |domain| - next unless domain.client_holdable? - - real += 1 - domain.statuses << DomainStatus::CLIENT_HOLD - log_start_client_hold(domain) - - domain.save(validate: false) and marked += 1 and notify_client_hold(domain) - end - - log_end_end_client_hold(marked: marked, real: real) - marked - end - - def self.log_prepare_client_hold - return if Rails.env.test? - - STDOUT << "#{Time.zone.now.utc} - Setting client_hold to domains\n" - end - - def self.log_start_client_hold(domain) - return if Rails.env.test? - - STDOUT << "#{Time.zone.now.utc} DomainCron.start_client_hold: ##{domain.id} (#{domain.name})"\ - "#{domain.changes}\n" - end - - def self.log_end_end_client_hold(marked:, real:) - return if Rails.env.test? - - STDOUT << "#{Time.zone.now.utc} - Successfully set client_hold to #{marked} of #{real} "\ - "domains\n" - end - - def self.notify_client_hold(domain) - domain.registrar.notifications.create!(text: I18n.t('soft_force_delete_set_on_domain', - domain_name: domain.name, - start_date: domain.force_delete_start)) - end end diff --git a/app/views/admin/domains/_force_delete_dialog.html.erb b/app/views/admin/domains/_force_delete_dialog.html.erb index 6287abffe4..a76c14edd3 100644 --- a/app/views/admin/domains/_force_delete_dialog.html.erb +++ b/app/views/admin/domains/_force_delete_dialog.html.erb @@ -14,8 +14,7 @@
diff --git a/config/locales/en.yml b/config/locales/en.yml index eecd2a4ffb..4f498b8ac3 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -620,7 +620,8 @@ en: created_at_until: 'Created at until' is_registrant: 'Is registrant' force_delete_set_on_domain: 'Force delete set on domain %{domain_name}' - soft_force_delete_set_on_domain: 'clientHold status is set for domain %{domain_name}, ForceDelete is in effect from %{start_date}' + client_hold_set_on_domain: 'clientHold status is set for domain %{domain_name}, ForceDelete is in effect from %{start_date}' + grace_period_started_domain: 'For domain %{domain_name} started 45-days redemption grace period, ForceDelete will be in effect from %{start_date}' force_delete_cancelled: 'Force delete is cancelled on domain %{domain_name}' contact_is_not_valid: 'Contact %{value} is not valid, please fix the invalid contact' next: 'Next' diff --git a/config/schedule.rb b/config/schedule.rb index 07a04fa39e..089ce93f9d 100644 --- a/config/schedule.rb +++ b/config/schedule.rb @@ -46,7 +46,7 @@ runner 'DomainCron.start_redemption_grace_period' end - every 1.hour do + every 1.day do runner 'DomainCron.start_client_hold' end