From 9916ca52cbdcfc4771898dedc51e74b505450ecb 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 | 31 ++++++++++++ .../concerns/job/force_delete_messages.rb | 40 +++++++++++++++ app/models/domain.rb | 2 + app/models/domain_cron.rb | 50 +------------------ .../domains/_force_delete_dialog.html.erb | 3 +- config/locales/en.yml | 3 +- config/schedule.rb | 2 +- 8 files changed, 84 insertions(+), 52 deletions(-) create mode 100644 app/models/concerns/job/force_delete.rb create mode 100644 app/models/concerns/job/force_delete_messages.rb diff --git a/app/models/concerns/domain/force_delete.rb b/app/models/concerns/domain/force_delete.rb index d09ea3704..ffe997322 100644 --- a/app/models/concerns/domain/force_delete.rb +++ b/app/models/concerns/domain/force_delete.rb @@ -11,6 +11,11 @@ module Concerns::Domain::ForceDelete 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 000000000..727ddaa3b --- /dev/null +++ b/app/models/concerns/job/force_delete.rb @@ -0,0 +1,31 @@ +module Concerns + module Job + module ForceDelete + extend ActiveSupport::Concern + + class_methods do + def start_client_hold + log_prepare_client_hold + + ::PaperTrail.whodunnit = "cron - #{__method__}" + + ::Domain.force_delete_scheduled.each do |domain| + proceed_client_hold(domain: domain) + log_end_end_client_hold(domain) + end + end + + def proceed_client_hold(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) + notify_client_hold(domain) + end + end + end + end +end diff --git a/app/models/concerns/job/force_delete_messages.rb b/app/models/concerns/job/force_delete_messages.rb new file mode 100644 index 000000000..cb4f298a8 --- /dev/null +++ b/app/models/concerns/job/force_delete_messages.rb @@ -0,0 +1,40 @@ +module Concerns + module Job + module ForceDeleteMessages + extend ActiveSupport::Concern + + class_methods do + def log_prepare_client_hold + return if Rails.env.test? + + STDOUT << "#{Time.zone.now.utc} - Setting client_hold to domains\n" + end + + def 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 log_end_end_client_hold(domain) + return if Rails.env.test? + + STDOUT << "#{Time.zone.now.utc} - Successfully set client_hold on (#{domain.name})" + end + + def notify_client_hold(domain) + domain.registrar.notifications.create!(text: I18n.t('client_hold_set_on_domain', + domain_name: domain.name, + date: domain.force_delete_start)) + end + + def notify_on_grace_period(domain) + domain.registrar.notifications.create!(text: I18n.t('grace_period_started_domain', + domain_name: domain.name, + date: domain.force_delete_start)) + end + end + end + end +end diff --git a/app/models/domain.rb b/app/models/domain.rb index 50f41c38a..734243c0d 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -547,6 +547,8 @@ class Domain < ApplicationRecord 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 154c4ca19..47e5a99b5 100644 --- a/app/models/domain_cron.rb +++ b/app/models/domain_cron.rb @@ -1,4 +1,6 @@ class DomainCron + include Concerns::Job::ForceDelete + include Concerns::Job::ForceDeleteMessages def self.clean_expired_pendings STDOUT << "#{Time.zone.now.utc} - Clean expired domain pendings\n" unless Rails.env.test? @@ -78,52 +80,4 @@ class DomainCron 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 6287abffe..a76c14edd 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 b4a5d1c18..0d76a030d 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -619,7 +619,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 %{date}' + grace_period_started_domain: 'For domain %{domain_name} started 45-days redemption grace period, ForceDelete will be in effect from %{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 07a04fa39..089ce93f9 100644 --- a/config/schedule.rb +++ b/config/schedule.rb @@ -46,7 +46,7 @@ if @cron_group == 'registry' runner 'DomainCron.start_redemption_grace_period' end - every 1.hour do + every 1.day do runner 'DomainCron.start_client_hold' end