diff --git a/app/controllers/client/domain_transfers_controller.rb b/app/controllers/client/domain_transfers_controller.rb index a50b8f1b2..ec1711264 100644 --- a/app/controllers/client/domain_transfers_controller.rb +++ b/app/controllers/client/domain_transfers_controller.rb @@ -2,6 +2,12 @@ class Client::DomainTransfersController < ClientController before_action :set_domain_transfer, only: [:show, :approve] before_action :set_domain, only: [:create] + def index + @q = current_registrar.domain_transfers.search(params[:q]) + @q.sorts = 'created_at desc' if @q.sorts.empty? + @domain_transfers = @q.result.page(params[:page]) + end + def new @domain_transfer = DomainTransfer.new end diff --git a/app/models/domain_transfer.rb b/app/models/domain_transfer.rb index 62cc8896a..366b0872c 100644 --- a/app/models/domain_transfer.rb +++ b/app/models/domain_transfer.rb @@ -11,13 +11,16 @@ class DomainTransfer < ActiveRecord::Base SERVER_APPROVED = 'serverApproved' SERVER_CANCELLED = 'serverCancelled' - def approved? - status == CLIENT_APPROVED || status == SERVER_APPROVED + before_create :set_wait_until + + def set_wait_until + wait_time = SettingGroup.domain_general.setting(:transfer_wait_time).value.to_i + return if wait_time == 0 + self.wait_until = transfer_requested_at + wait_time.hours end - def transfer_confirm_time - wait_time = SettingGroup.domain_general.setting(:transfer_wait_time).value.to_i - transfer_requested_at + wait_time.hours + def approved? + status == CLIENT_APPROVED || status == SERVER_APPROVED end def approve_as_client diff --git a/app/models/registrar.rb b/app/models/registrar.rb index 910081b7a..d36da1f5f 100644 --- a/app/models/registrar.rb +++ b/app/models/registrar.rb @@ -4,7 +4,15 @@ class Registrar < ActiveRecord::Base has_many :ns_sets has_many :epp_users has_many :users - has_many :domain_transfers, foreign_key: 'transfer_to_id' + + def domain_transfers + at = DomainTransfer.arel_table + DomainTransfer.where( + at[:transfer_to_id].eq(id).or( + at[:transfer_from_id].eq(id) + ) + ) + end def to_s name diff --git a/app/views/client/domain_transfers/index.haml b/app/views/client/domain_transfers/index.haml new file mode 100644 index 000000000..c295020df --- /dev/null +++ b/app/views/client/domain_transfers/index.haml @@ -0,0 +1,39 @@ +.row + .col-sm-6 + %h2.text-center-xs= t('shared.domain_transfers') + .col-sm-6 + %h2.text-right.text-center-xs + = link_to(t('shared.request_domain_transfer'), new_client_domain_transfer_path, class: 'btn btn-primary') +%hr +.row + .col-md-12 + .table-responsive + %table.table.table-hover.table-bordered.table-condensed + %thead + %tr + %th{class: 'col-xs-2'} + = sort_link(@q, 'domain_name') + %th{class: 'col-xs-2'} + = sort_link(@q, 'status') + %th{class: 'col-xs-2'} + = sort_link(@q, 'transfer_from', t('shared.transfer_from')) + %th{class: 'col-xs-2'} + = sort_link(@q, 'transfer_to', t('shared.transfer_to')) + %th{class: 'col-xs-2'}=t('shared.actions') + %tbody + - @domain_transfers.each do |x| + %tr + - if current_registrar == x.domain.registrar + %td= link_to(x.domain, client_domain_path(x.domain)) + - else + %td= x.domain + %td= x.status + %td= x.transfer_from + %td= x.transfer_to + %td + = link_to(t('shared.details'), [:client, x], class: 'btn btn-xs btn-primary') + +.row + .col-md-12 + = paginate @domain_transfers + diff --git a/app/views/client/domain_transfers/new.haml b/app/views/client/domain_transfers/new.haml index 88a7af37a..c058a572d 100644 --- a/app/views/client/domain_transfers/new.haml +++ b/app/views/client/domain_transfers/new.haml @@ -1,4 +1,10 @@ -%h2= t('shared.transfer_domain') +.row + .col-sm-6 + %h2.text-center-xs= t('shared.transfer_domain') + .col-sm-6 + %h2.text-right.text-center-xs + = link_to(t('shared.domain_transfers'), client_domain_transfers_path, class: 'btn btn-default') + %hr = form_for([:client, @domain_transfer]) do |f| = render 'shared/errors', object: @domain_transfer diff --git a/app/views/client/domain_transfers/show.haml b/app/views/client/domain_transfers/show.haml index ff8ca0d4a..a5bf9ee60 100644 --- a/app/views/client/domain_transfers/show.haml +++ b/app/views/client/domain_transfers/show.haml @@ -4,14 +4,18 @@ = "#{t('shared.domain_transfer')}" .col-sm-6 %h2.text-right.text-center-xs + = link_to(t('shared.domain_transfers'), client_domain_transfers_path, class: 'btn btn-default') - if can? :approve_as_client, @domain_transfer - = button_to(t('shared.approve'), approve_client_domain_transfer_path, class: 'btn btn-success') + = link_to(t('shared.approve'), approve_client_domain_transfer_path, method: :post, class: 'btn btn-success') %hr .row .col-md-12 %dl.dl-horizontal %dt= t('shared.domain') - %dd= @domain_transfer.domain.name + - if current_registrar == @domain_transfer.domain.registrar + %dd= link_to(@domain_transfer.domain, client_domain_path(@domain_transfer.domain)) + - else + %dd= @domain_transfer.domain %dt= t('shared.status') %dd= @domain_transfer.status @@ -25,12 +29,11 @@ %dt= t('shared.transfer_to') %dd= @domain_transfer.transfer_to + %dt= t('shared.accept_time') - if @domain_transfer.transferred_at - %dt= t('shared.transferred_at') %dd= l(@domain_transfer.transferred_at) - else - %dt= t('shared.transfer_confirm_time') - %dd= l(@domain_transfer.transfer_confirm_time) + %dd= l(@domain_transfer.wait_until) %dt= t('shared.domain_valid_to') %dd= l(@domain_transfer.domain.valid_to) diff --git a/app/views/layouts/client.haml b/app/views/layouts/client.haml index 38dfaaec8..bcf26e9c5 100644 --- a/app/views/layouts/client.haml +++ b/app/views/layouts/client.haml @@ -32,7 +32,7 @@ %li = link_to t('shared.domain_list'), client_domains_path %li - = link_to t('shared.transfer_domain'), new_client_domain_transfer_path + = link_to t('shared.domain_transfers_list'), client_domain_transfers_path - active_class = ['client/contacts'].include?(params[:controller]) ? 'active' :nil %li.dropdown{class: active_class} diff --git a/config/locales/en.yml b/config/locales/en.yml index 00308afc8..f3d1d8fdf 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -288,10 +288,11 @@ en: domain_transfer: 'Domain transfer' request_domain_transfer: 'Request domain transfer' domain_valid_to: 'Domain valid to' - transfer_requested_at: 'Transfer requested at' + accept_time: 'Accept time' transfer_from: 'Transfer from' transferred_at: 'Transferred at' - transfer_confirm_time: 'Transfer confirm time' + domain_transfers_list: 'Domain transfers list' + domain_transfers: 'Domain transfers' password_invalid: 'Password invalid!' domain_was_not_found: 'Domain was not found!' diff --git a/db/migrate/20140929095329_add_wait_until_to_domain_transfer.rb b/db/migrate/20140929095329_add_wait_until_to_domain_transfer.rb new file mode 100644 index 000000000..b371a263d --- /dev/null +++ b/db/migrate/20140929095329_add_wait_until_to_domain_transfer.rb @@ -0,0 +1,5 @@ +class AddWaitUntilToDomainTransfer < ActiveRecord::Migration + def change + add_column :domain_transfers, :wait_until, :datetime + end +end diff --git a/db/schema.rb b/db/schema.rb index 2c4d7b713..15f5329e2 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20140925101927) do +ActiveRecord::Schema.define(version: 20140929095329) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -91,6 +91,7 @@ ActiveRecord::Schema.define(version: 20140925101927) do t.integer "transfer_to_id" t.datetime "created_at" t.datetime "updated_at" + t.datetime "wait_until" end create_table "domains", force: true do |t| diff --git a/spec/features/domain_transfer_spec.rb b/spec/features/domain_transfer_spec.rb index df51f062a..a1bd28756 100644 --- a/spec/features/domain_transfer_spec.rb +++ b/spec/features/domain_transfer_spec.rb @@ -15,7 +15,8 @@ feature 'Domain transfer', type: :feature do scenario 'Registrar requests transfer on own domain', js: true do sign_in zone_user click_on 'Domains' - click_on 'Transfer domain' + click_on 'Domain transfers list' + click_on 'Request domain transfer' fill_in 'Domain name', with: 'false' click_on 'Request domain transfer' @@ -81,6 +82,10 @@ feature 'Domain transfer', type: :feature do end scenario 'Domain owner approves request' do + s = Setting.find_by(code: 'transfer_wait_time') + s.value = 1 + s.save + d = Domain.first d.domain_transfers.create( status: DomainTransfer::PENDING, @@ -105,7 +110,7 @@ feature 'Domain transfer', type: :feature do fill_in 'Domain password', with: d.auth_info click_on 'Request domain transfer' - expect(page).to have_button('Approve') + expect(page).to have_link('Approve') click_on 'Approve' expect(page).to have_text('Domain transfer approved!')