Merge branch 'master' into refactor-messages

# Conflicts:
#	db/structure.sql
This commit is contained in:
Artur Beljajev 2018-08-28 14:26:56 +03:00
commit aff5b68a2f
29 changed files with 297 additions and 93 deletions

View file

@ -1,7 +1,7 @@
module Admin
class DomainsController < BaseController
load_and_authorize_resource
before_action :set_domain, only: [:show, :edit, :update, :zonefile]
before_action :set_domain, only: %i[show edit update keep]
authorize_resource
helper_method :force_delete_templates
def index
@ -33,7 +33,8 @@ module Admin
end
def show
@domain.valid?
# Validation is needed to warn users
@domain.validate
end
def edit
@ -60,6 +61,11 @@ module Admin
@versions = @domain.versions
end
def keep
@domain.keep
redirect_to edit_admin_domain_url(@domain), notice: t('.kept')
end
private
def set_domain

View file

@ -1,16 +1,25 @@
module Concerns::Domain::Deletable
extend ActiveSupport::Concern
included do
alias_attribute :delete_time, :delete_at
private
def delete_later
deletion_time = Time.zone.at(rand(deletion_time_span))
DomainDeleteJob.enqueue(id, run_at: deletion_time, priority: 1)
logger.info "Domain #{name} is scheduled to be deleted around #{deletion_time}"
end
def discard
statuses << DomainStatus::DELETE_CANDIDATE
save
def do_not_delete_later
# Que job can be manually deleted in admin area UI
QueJob.find_by("args->>0 = '#{id}'", job_class: DomainDeleteJob.name)&.destroy
end
def discarded?
statuses.include?(DomainStatus::DELETE_CANDIDATE)
def deletion_time_span
range_params = [Time.zone.now.to_i, deletion_deadline.to_i].sort
Range.new(*range_params)
end
end
def deletion_deadline
delete_at + 24.hours
end
end

View file

@ -0,0 +1,40 @@
module Concerns::Domain::Discardable
extend ActiveSupport::Concern
class_methods do
def discard_domains
domains = where('delete_at < ? AND ? != ALL(coalesce(statuses, array[]::varchar[])) AND' \
' ? != ALL(COALESCE(statuses, array[]::varchar[]))',
Time.zone.now,
DomainStatus::SERVER_DELETE_PROHIBITED,
DomainStatus::DELETE_CANDIDATE)
domains.each do |domain|
domain.discard
yield domain if block_given?
end
end
end
def discard
raise 'Domain is already discarded' if discarded?
statuses << DomainStatus::DELETE_CANDIDATE
transaction do
save(validate: false)
delete_later
end
end
def keep
statuses.delete(DomainStatus::DELETE_CANDIDATE)
transaction do
save(validate: false)
do_not_delete_later
end
end
def discarded?
statuses.include?(DomainStatus::DELETE_CANDIDATE)
end
end

View file

@ -4,6 +4,7 @@ class Domain < ActiveRecord::Base
include Concerns::Domain::Expirable
include Concerns::Domain::Activatable
include Concerns::Domain::ForceDelete
include Concerns::Domain::Discardable
include Concerns::Domain::Deletable
include Concerns::Domain::Transferable
@ -249,13 +250,6 @@ class Domain < ActiveRecord::Base
true
end
def delete_candidateable?
return false if delete_at > Time.zone.now
return false if statuses.include?(DomainStatus::DELETE_CANDIDATE)
return false if statuses.include?(DomainStatus::SERVER_DELETE_PROHIBITED)
true
end
def renewable?
if Setting.days_to_renew_domain_before_expire != 0
# if you can renew domain at days_to_renew before domain expiration
@ -613,10 +607,6 @@ class Domain < ActiveRecord::Base
where("#{attribute_alias(:outzone_time)} < ?", Time.zone.now)
end
def self.delete_candidates
where("#{attribute_alias(:delete_time)} < ?", Time.zone.now)
end
def self.uses_zone?(zone)
exists?(["name ILIKE ?", "%.#{zone.origin}"])
end

View file

@ -84,22 +84,6 @@ class DomainCron
c = 0
domains = Domain.delete_candidates
domains.each do |domain|
next unless domain.delete_candidateable?
domain.statuses << DomainStatus::DELETE_CANDIDATE
# If domain successfully saved, add it to delete schedule
if domain.save(validate: false)
::PaperTrail.whodunnit = "cron - #{__method__}"
DomainDeleteJob.enqueue(domain.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 deleteCandidate status ##{domain.id} (#{domain.name})\n" unless Rails.env.test?
c += 1
end
end
Domain.where('force_delete_at <= ?', 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?

View file

@ -153,13 +153,11 @@ class DomainStatus < ActiveRecord::Base
[
['Hold', SERVER_HOLD],
['ManualInzone', SERVER_MANUAL_INZONE],
# [''],
['RenewProhibited', SERVER_RENEW_PROHIBITED],
['TransferProhibited', SERVER_TRANSFER_PROHIBITED],
['RegistrantChangeProhibited', SERVER_REGISTRANT_CHANGE_PROHIBITED],
['AdminChangeProhibited', SERVER_ADMIN_CHANGE_PROHIBITED],
['TechChangeProhibited', SERVER_TECH_CHANGE_PROHIBITED],
# [''],
['UpdateProhibited', SERVER_UPDATE_PROHIBITED],
['DeleteProhibited', SERVER_DELETE_PROHIBITED]
]
@ -171,11 +169,11 @@ class DomainStatus < ActiveRecord::Base
INACTIVE,
FORCE_DELETE,
PENDING_CREATE,
#PENDING_DELETE,
PENDING_RENEW,
PENDING_TRANSFER,
PENDING_UPDATE,
PENDING_DELETE_CONFIRMATION
PENDING_DELETE_CONFIRMATION,
DELETE_CANDIDATE,
]
end
end

4
app/models/que_job.rb Normal file
View file

@ -0,0 +1,4 @@
# To be able to remove existing jobs
class QueJob < ActiveRecord::Base
self.primary_key = 'job_id'
end

View file

@ -30,7 +30,7 @@ class DomainPresenter
end
def delete_date
view.l(domain.delete_time, format: :date) if domain.delete_time
view.l(domain.delete_at, format: :date) if domain.delete_at
end
def force_delete_date
@ -59,6 +59,15 @@ class DomainPresenter
end
end
def keep_btn
return unless domain.discarded?
view.link_to view.t('admin.domains.edit.keep_btn'), view.keep_admin_domain_path(@domain),
method: :patch,
data: { confirm: view.t('admin.domains.edit.keep_btn_confirm') },
class: 'btn btn-default'
end
private
def schedule_force_delete_btn

View file

@ -13,6 +13,7 @@
<div class="col-sm-8 text-right">
<%= link_to t('.add_new_status_btn'), '#', class: 'btn btn-primary js-add-status' %>
<%= domain.keep_btn %>
<%= domain.force_delete_toggle_btn %>
</div>
</div>