From bc6c4213f737cb9657a5cc84286c96346a402efe Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Tue, 18 Aug 2015 18:09:30 +0300 Subject: [PATCH 01/17] Work in progress search for contacts #2866 --- app/controllers/admin/contacts_controller.rb | 30 ++++++++ app/views/admin/contacts/index.haml | 76 +++++++++++++++++--- config/locales/en.yml | 2 + 3 files changed, 97 insertions(+), 11 deletions(-) diff --git a/app/controllers/admin/contacts_controller.rb b/app/controllers/admin/contacts_controller.rb index a8a062af8..33eba70ad 100644 --- a/app/controllers/admin/contacts_controller.rb +++ b/app/controllers/admin/contacts_controller.rb @@ -3,8 +3,24 @@ class Admin::ContactsController < AdminController before_action :set_contact, only: [:show] def index + params[:q] ||= {} @q = Contact.includes(:registrar).search(params[:q]) @contacts = @q.result.page(params[:page]) + + if params[:statuses_contains] + contacts = Contact.includes(:registrar).where( + "statuses @> ?::varchar[]", "{#{params[:statuses_contains].join(',')}}" + ) + else + contacts = Contact.includes(:registrar) + end + + normalize_search_parameters do + @q = contacts.search(params[:q]) + @contacts = @q.result.page(params[:page]) + end + + @contacts = @contacts.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 end def search @@ -45,4 +61,18 @@ class Admin::ContactsController < AdminController dp[:statuses].reject!(&:blank?) dp end + + def normalize_search_parameters + ca_cache = params[:q][:created_at_lteq] + begin + end_time = params[:q][:created_at_lteq].try(:to_date) + params[:q][:created_at_lteq] = end_time.try(:end_of_day) + rescue + logger.warn('Invalid date') + end + + yield + + params[:q][:created_at_lteq] = ca_cache + end end diff --git a/app/views/admin/contacts/index.haml b/app/views/admin/contacts/index.haml index a633c86eb..9325b59cb 100644 --- a/app/views/admin/contacts/index.haml +++ b/app/views/admin/contacts/index.haml @@ -1,17 +1,71 @@ = render 'shared/title', name: t(:contacts) +/ .row +/ .col-md-12 +/ = search_form_for [:admin, @q], html: { class: 'form-horizontal' } do |f| +/ .col-md-11 +/ .form-group +/ = f.search_field :name_cont, class: 'form-control' +/ .col-md-1.text-right.text-center-xs +/ .form-group +/ %button.btn.btn-primary +/   +/ %span.glyphicon.glyphicon-search +/   +/ %hr .row .col-md-12 - = search_form_for [:admin, @q], html: { class: 'form-horizontal' } do |f| - .col-md-11 - .form-group - = f.search_field :name_cont, class: 'form-control' - .col-md-1.text-right.text-center-xs - .form-group - %button.btn.btn-primary -   - %span.glyphicon.glyphicon-search -   + = search_form_for [:admin, @q], html: { style: 'margin-bottom: 0;', class: 'js-form', autocomplete: 'off' } do |f| + .row + .col-md-3 + .form-group + = f.label :name + = f.search_field :name_matches, value: params[:q][:name_matches], class: 'form-control', placeholder: t(:name) + .col-md-3 + .form-group + = f.label t(:id) + = f.search_field :code_eq, class: 'form-control', placeholder: t(:id) + .col-md-3 + .form-group + = f.label t(:ident) + = f.search_field :ident_matches, class: 'form-control', placeholder: t(:ident) + .col-md-3 + .form-group + = f.label t(:email) + = f.search_field :email_matches, class: 'form-control', placeholder: t(:email) + .row + .col-md-6 + .form-group + = f.label t(:registrar) + = f.select :registrar_id_eq, Registrar.all.map { |x| [x, x.id] }, { include_blank: true }, class: 'form-control selectize', placeholder: t(:choose) + .col-md-3 + .form-group + = f.label t(:created_at_from) + = f.search_field :created_at_gteq, value: params[:q][:created_at_gteq], class: 'form-control datepicker', placeholder: t(:created_at_from) + .col-md-3 + .form-group + = f.label t(:created_at_until) + = f.search_field :created_at_lteq, value: params[:q][:created_at_lteq], class: 'form-control datepicker', placeholder: t(:created_at_until) + .row + .col-md-6 + .form-group + = label_tag t(:status) + = select_tag :statuses_contains, options_for_select(Contact::STATUSES, params[:statuses_contains]), { multiple: true, placeholder: t(:choose), class: 'form-control js-combobox' } + .col-md-6 + .form-group + = label_tag t(:status) + = select_tag '[q][domain_contacts_type_in]', options_for_select(['AdminDomainContact', 'TechDomainContact'], params[:q][:domain_contacts_type_in]), { multiple: true, placeholder: t(:choose), class: 'form-control js-combobox' } + / .col-md-3 + / .form-group + / = label_tag t(:results_per_page) + / = text_field_tag :results_per_page, params[:results_per_page], class: 'form-control', placeholder: t(:results_per_page) + .col-md-3{style: 'padding-top: 25px;'} + %button.btn.btn-primary +   + %span.glyphicon.glyphicon-search +   + %button.btn.btn-default.js-reset-form + = t(:clear_fields) %hr .row .col-md-12 @@ -38,7 +92,7 @@ %td= contact.email %td - if contact.registrar - = link_to(contact.registrar, admin_registrar_path(contact.registrar)) + = link_to(contact.registrar, admin_registrar_path(contact.registrar)) .row .col-md-12 diff --git a/config/locales/en.yml b/config/locales/en.yml index 7d33957db..a80c47bb3 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -911,3 +911,5 @@ en: pending_epp: Pending epp id: ID hidden: '[hidden]' + created_at_from: 'Created at from' + created_at_until: 'Created at until' From 3600a9487e14fb9a14492c36255df39f8b303de1 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Wed, 19 Aug 2015 13:20:02 +0300 Subject: [PATCH 02/17] Add more search fields to contact #2866 --- app/controllers/admin/contacts_controller.rb | 2 +- app/views/admin/contacts/index.haml | 69 +++++++++++--------- config/locales/en.yml | 2 +- 3 files changed, 41 insertions(+), 32 deletions(-) diff --git a/app/controllers/admin/contacts_controller.rb b/app/controllers/admin/contacts_controller.rb index 33eba70ad..097445bd2 100644 --- a/app/controllers/admin/contacts_controller.rb +++ b/app/controllers/admin/contacts_controller.rb @@ -9,7 +9,7 @@ class Admin::ContactsController < AdminController if params[:statuses_contains] contacts = Contact.includes(:registrar).where( - "statuses @> ?::varchar[]", "{#{params[:statuses_contains].join(',')}}" + "contacts.statuses @> ?::varchar[]", "{#{params[:statuses_contains].join(',')}}" ) else contacts = Contact.includes(:registrar) diff --git a/app/views/admin/contacts/index.haml b/app/views/admin/contacts/index.haml index 9325b59cb..7bfb3ca11 100644 --- a/app/views/admin/contacts/index.haml +++ b/app/views/admin/contacts/index.haml @@ -1,18 +1,5 @@ = render 'shared/title', name: t(:contacts) -/ .row -/ .col-md-12 -/ = search_form_for [:admin, @q], html: { class: 'form-horizontal' } do |f| -/ .col-md-11 -/ .form-group -/ = f.search_field :name_cont, class: 'form-control' -/ .col-md-1.text-right.text-center-xs -/ .form-group -/ %button.btn.btn-primary -/   -/ %span.glyphicon.glyphicon-search -/   -/ %hr .row .col-md-12 = search_form_for [:admin, @q], html: { style: 'margin-bottom: 0;', class: 'js-form', autocomplete: 'off' } do |f| @@ -29,10 +16,28 @@ .form-group = f.label t(:ident) = f.search_field :ident_matches, class: 'form-control', placeholder: t(:ident) + .col-md-3 + .form-group + = label_tag t(:ident_type) + = select_tag '[q][ident_type_eq]', options_for_select(Contact::IDENT_TYPES, params[:q][:ident_type_eq]), { include_blank: true, placeholder: t(:choose), class: 'form-control selectize' } + .row .col-md-3 .form-group = f.label t(:email) = f.search_field :email_matches, class: 'form-control', placeholder: t(:email) + .col-md-3 + .form-group + = label_tag t(:country) + = select_tag '[q][country_code_eq]', SortedCountry.all_options(params[:q][:country_code_eq]), { include_blank: true, placeholder: t(:choose), class: 'form-control selectize' } + .col-md-3 + .form-group + = f.label t(:is_registrant) + %div + = f.check_box :registrant_domains_id_not_null + .col-md-3 + .form-group + = label_tag t(:contact_type) + = select_tag '[q][domain_contacts_type_in]', options_for_select([['admin', 'AdminDomainContact'], ['tech', 'TechDomainContact']], params[:q][:domain_contacts_type_in]), { multiple: true, placeholder: t(:choose), class: 'form-control js-combobox' } .row .col-md-6 .form-group @@ -51,21 +56,17 @@ .form-group = label_tag t(:status) = select_tag :statuses_contains, options_for_select(Contact::STATUSES, params[:statuses_contains]), { multiple: true, placeholder: t(:choose), class: 'form-control js-combobox' } - .col-md-6 + .col-md-3 .form-group - = label_tag t(:status) - = select_tag '[q][domain_contacts_type_in]', options_for_select(['AdminDomainContact', 'TechDomainContact'], params[:q][:domain_contacts_type_in]), { multiple: true, placeholder: t(:choose), class: 'form-control js-combobox' } - / .col-md-3 - / .form-group - / = label_tag t(:results_per_page) - / = text_field_tag :results_per_page, params[:results_per_page], class: 'form-control', placeholder: t(:results_per_page) - .col-md-3{style: 'padding-top: 25px;'} - %button.btn.btn-primary -   - %span.glyphicon.glyphicon-search -   - %button.btn.btn-default.js-reset-form - = t(:clear_fields) + = label_tag t(:results_per_page) + = text_field_tag :results_per_page, params[:results_per_page], class: 'form-control', placeholder: t(:results_per_page) + .col-md-3{style: 'padding-top: 25px;'} + %button.btn.btn-primary +   + %span.glyphicon.glyphicon-search +   + %button.btn.btn-default.js-reset-form + = t(:clear_fields) %hr .row .col-md-12 @@ -80,7 +81,7 @@ %th{class: 'col-xs-2'} = sort_link(@q, 'ident', t(:ident)) %th{class: 'col-xs-2'} - = sort_link(@q, 'email', t(:email)) + = sort_link(@q, 'email', t(:created_at)) %th{class: 'col-xs-2'} = sort_link(@q, 'registrar_name', t(:registrar)) %tbody @@ -89,11 +90,19 @@ %td= link_to(contact, admin_contact_path(contact)) %td= contact.code %td= ident_for(contact) - %td= contact.email + %td= l(contact.created_at, format: :short) %td - if contact.registrar = link_to(contact.registrar, admin_registrar_path(contact.registrar)) .row - .col-md-12 + .col-md-6 = paginate @contacts + .col-md-6.text-right + .pagination + = t(:result_count, count: @contacts.total_count) + +:coffee + $(".js-reset-form").on "click", (e) -> + e.preventDefault(); + window.location = "#{admin_contacts_path}" diff --git a/config/locales/en.yml b/config/locales/en.yml index a80c47bb3..36c1a304d 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -641,7 +641,6 @@ en: value: 'Value' phone: 'Phone' org_name: Org name - ident_type: Ident code country: Country period: Period birthday_format: 'Insert birthday in format: YYYY-MM-DD' @@ -913,3 +912,4 @@ en: hidden: '[hidden]' created_at_from: 'Created at from' created_at_until: 'Created at until' + is_registrant: 'Is registrant' From b68679623422576471a00b6c3d7d5146c1e03771 Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Wed, 19 Aug 2015 15:40:18 +0300 Subject: [PATCH 03/17] Ignore nil whitelist_emails_for_staging env setting #2880 --- config/initializers/settings.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/settings.rb b/config/initializers/settings.rb index 716fd5d52..eaaa12406 100644 --- a/config/initializers/settings.rb +++ b/config/initializers/settings.rb @@ -10,5 +10,5 @@ TEST_EMAILS = ) else ENV['whitelist_emails_for_staging'] ||= '' - ENV['whitelist_emails_for_staging'].split(',').map(&:strip) + ENV['whitelist_emails_for_staging'].to_s.split(',').map(&:strip) end From 5efdd47f62ee6a4d989d67a8d90333aaa1052199 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Wed, 19 Aug 2015 17:13:52 +0300 Subject: [PATCH 04/17] Add contact search test #2866 --- spec/features/admin/contact_spec.rb | 35 +++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/spec/features/admin/contact_spec.rb b/spec/features/admin/contact_spec.rb index 2d5936266..64ef6cc41 100644 --- a/spec/features/admin/contact_spec.rb +++ b/spec/features/admin/contact_spec.rb @@ -22,4 +22,39 @@ feature 'Admin contact', type: :feature do # indivitually running it's created by autotest page.should have_content(/by [unknown|autotest]/) end + + it 'should search contacts by name' do + d1 = Fabricate(:contact, name: 'first name') + Fabricate(:contact, name: 'second name') + Fabricate(:contact, name: 'third name') + sign_in @user + visit admin_contacts_url + + page.should have_content('first name') + page.should have_content('second name') + page.should have_content('third name') + + fill_in 'q_name_matches', with: 'first name' + find('.btn.btn-primary').click + + current_path.should == "/admin/contacts" + + page.should have_content('first name') + page.should_not have_content('second name') + page.should_not have_content('third name') + + fill_in 'q_name_matches', with: '%name' + find('.btn.btn-primary').click + + page.should have_content('first name') + page.should have_content('second name') + page.should have_content('third name') + + fill_in 'q_name_matches', with: 'sec___ name' + find('.btn.btn-primary').click + + page.should_not have_content('first name') + page.should have_content('second name') + page.should_not have_content('third name') + end end From b154c75106eaddbdd48536b5a31168af6ca2510a Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Wed, 19 Aug 2015 17:24:23 +0300 Subject: [PATCH 05/17] Fix rubocop #2866 --- spec/features/admin/contact_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/features/admin/contact_spec.rb b/spec/features/admin/contact_spec.rb index 64ef6cc41..6edaaf2d1 100644 --- a/spec/features/admin/contact_spec.rb +++ b/spec/features/admin/contact_spec.rb @@ -24,7 +24,7 @@ feature 'Admin contact', type: :feature do end it 'should search contacts by name' do - d1 = Fabricate(:contact, name: 'first name') + Fabricate(:contact, name: 'first name') Fabricate(:contact, name: 'second name') Fabricate(:contact, name: 'third name') sign_in @user From f5c379ca7244d59287f2851f3d96a4bc0578b6e0 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Wed, 19 Aug 2015 17:37:08 +0300 Subject: [PATCH 06/17] Add updated at field for contact search #2866 --- app/controllers/admin/contacts_controller.rb | 3 +++ app/views/admin/contacts/index.haml | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/controllers/admin/contacts_controller.rb b/app/controllers/admin/contacts_controller.rb index 097445bd2..1388db636 100644 --- a/app/controllers/admin/contacts_controller.rb +++ b/app/controllers/admin/contacts_controller.rb @@ -67,6 +67,9 @@ class Admin::ContactsController < AdminController begin end_time = params[:q][:created_at_lteq].try(:to_date) params[:q][:created_at_lteq] = end_time.try(:end_of_day) + # updated at + end_time = params[:q][:updated_at_gteq].try(:to_date) + params[:q][:updated_at_lteq] = end_time.try(:end_of_day) rescue logger.warn('Invalid date') end diff --git a/app/views/admin/contacts/index.haml b/app/views/admin/contacts/index.haml index 7bfb3ca11..b8e7850e6 100644 --- a/app/views/admin/contacts/index.haml +++ b/app/views/admin/contacts/index.haml @@ -39,7 +39,7 @@ = label_tag t(:contact_type) = select_tag '[q][domain_contacts_type_in]', options_for_select([['admin', 'AdminDomainContact'], ['tech', 'TechDomainContact']], params[:q][:domain_contacts_type_in]), { multiple: true, placeholder: t(:choose), class: 'form-control js-combobox' } .row - .col-md-6 + .col-md-3 .form-group = f.label t(:registrar) = f.select :registrar_id_eq, Registrar.all.map { |x| [x, x.id] }, { include_blank: true }, class: 'form-control selectize', placeholder: t(:choose) @@ -51,6 +51,10 @@ .form-group = f.label t(:created_at_until) = f.search_field :created_at_lteq, value: params[:q][:created_at_lteq], class: 'form-control datepicker', placeholder: t(:created_at_until) + .col-md-3 + .form-group + = f.label t(:updated_at) + = f.search_field :updated_at_gteq, value: params[:q][:updated_at_gteq], class: 'form-control datepicker', placeholder: t(:updated_at) .row .col-md-6 .form-group From fbd281007ce7209ff60830126f0d704949fc4a99 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Mon, 24 Aug 2015 12:08:44 +0300 Subject: [PATCH 07/17] Do not set manualInZone on force delete when hold status exists #2870 --- app/models/domain.rb | 5 ++++- spec/models/domain_spec.rb | 1 - 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/models/domain.rb b/app/models/domain.rb index 9ed9afde4..0d7fb4c56 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -570,9 +570,12 @@ class Domain < ActiveRecord::Base statuses << DomainStatus::SERVER_RENEW_PROHIBITED statuses << DomainStatus::SERVER_TRANSFER_PROHIBITED statuses << DomainStatus::SERVER_UPDATE_PROHIBITED - statuses << DomainStatus::SERVER_MANUAL_INZONE statuses << DomainStatus::PENDING_DELETE + if (statuses & [DomainStatus::SERVER_HOLD, DomainStatus::CLIENT_HOLD]).empty? + statuses << DomainStatus::SERVER_MANUAL_INZONE + end + self.force_delete_at = Time.zone.now + Setting.redemption_grace_period.days unless force_delete_at save(validate: false) end diff --git a/spec/models/domain_spec.rb b/spec/models/domain_spec.rb index 6aad6246d..d2c7c8d4e 100644 --- a/spec/models/domain_spec.rb +++ b/spec/models/domain_spec.rb @@ -253,7 +253,6 @@ describe Domain do "forceDelete", "pendingDelete", "serverHold", - "serverManualInzone", "serverRenewProhibited", "serverTransferProhibited", "serverUpdateProhibited" From 827e3f8a0d0d819a3a73c0c6ce079fac569baf02 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Tue, 25 Aug 2015 10:50:31 +0300 Subject: [PATCH 08/17] Add force delete message to poll #2882 --- app/models/domain.rb | 9 ++++++++- .../registrar/xml_consoles/epp_requests/poll/poll.xml | 7 +++++++ app/views/registrar/xml_consoles/show.haml | 6 +++--- config/locales/en.yml | 1 + spec/epp/domain_spec.rb | 7 +++++++ spec/models/domain_spec.rb | 4 ++++ 6 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 app/views/registrar/xml_consoles/epp_requests/poll/poll.xml diff --git a/app/models/domain.rb b/app/models/domain.rb index 0d7fb4c56..4f098ba46 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -577,7 +577,14 @@ class Domain < ActiveRecord::Base end self.force_delete_at = Time.zone.now + Setting.redemption_grace_period.days unless force_delete_at - save(validate: false) + transaction do + save!(validate: false) + registrar.messages.create!( + body: I18n.t('force_delete_set_on_domain', domain: name) + ) + return true + end + false end # rubocop:enable Metrics/AbcSize diff --git a/app/views/registrar/xml_consoles/epp_requests/poll/poll.xml b/app/views/registrar/xml_consoles/epp_requests/poll/poll.xml new file mode 100644 index 000000000..08c097196 --- /dev/null +++ b/app/views/registrar/xml_consoles/epp_requests/poll/poll.xml @@ -0,0 +1,7 @@ + + + + + ABC-12345 + + diff --git a/app/views/registrar/xml_consoles/show.haml b/app/views/registrar/xml_consoles/show.haml index b80d49c45..4b07f6aec 100644 --- a/app/views/registrar/xml_consoles/show.haml +++ b/app/views/registrar/xml_consoles/show.haml @@ -30,9 +30,9 @@ %a.js-load-xml{href: 'javascript:void(0)', data: {obj: 'domain', epp_action: 'delete'}} Delete - %h4 Keyrelay - %a.js-load-xml{href: 'javascript:void(0)', data: {obj: 'keyrelay', epp_action: 'keyrelay'}} - Keyrelay + %h4 Poll + %a.js-load-xml{href: 'javascript:void(0)', data: {obj: 'poll', epp_action: 'poll'}} + Poll %h4 Contact %a.js-load-xml{href: 'javascript:void(0)', data: {obj: 'contact', epp_action: 'create'}} diff --git a/config/locales/en.yml b/config/locales/en.yml index a9c2bc4f2..900ea3b8f 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -913,3 +913,4 @@ en: created_at_from: 'Created at from' created_at_until: 'Created at until' is_registrant: 'Is registrant' + force_delete_set_on_domain: 'Force delete set on domain %{domain}' diff --git a/spec/epp/domain_spec.rb b/spec/epp/domain_spec.rb index e88bb3a6e..2c242fb14 100644 --- a/spec/epp/domain_spec.rb +++ b/spec/epp/domain_spec.rb @@ -3096,5 +3096,12 @@ describe 'EPP Domain', epp: true do name[:avail].should == '0' reason.text.should == 'invalid format' end + + ### POLL ### + it 'should show force delete in poll' do + domain.set_force_delete + response = epp_plain_request(@epp_xml.session.poll) + binding.pry + end end end diff --git a/spec/models/domain_spec.rb b/spec/models/domain_spec.rb index d2c7c8d4e..e76529f27 100644 --- a/spec/models/domain_spec.rb +++ b/spec/models/domain_spec.rb @@ -224,6 +224,10 @@ describe Domain do fda = Time.zone.now + Setting.redemption_grace_period.days @domain.force_delete_at.should be_within(20).of(fda) + @domain.registrar.messages.count.should == 1 + m = @domain.registrar.messages.first + m.body.should == "Force delete set on domain #{@domain.name}" + @domain.unset_force_delete @domain.statuses.should == ['ok'] From 8a6444bbf94c13e500be7703ecfc3e31ed69bbc8 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Tue, 25 Aug 2015 11:01:38 +0300 Subject: [PATCH 09/17] Remove pry #2882 --- spec/epp/domain_spec.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/spec/epp/domain_spec.rb b/spec/epp/domain_spec.rb index 2c242fb14..3f99539df 100644 --- a/spec/epp/domain_spec.rb +++ b/spec/epp/domain_spec.rb @@ -3101,7 +3101,6 @@ describe 'EPP Domain', epp: true do it 'should show force delete in poll' do domain.set_force_delete response = epp_plain_request(@epp_xml.session.poll) - binding.pry end end end From 305b666e5d0e91a362af280c93273a533185a11e Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Tue, 25 Aug 2015 11:23:50 +0300 Subject: [PATCH 10/17] Update test #2882 --- spec/epp/domain_spec.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spec/epp/domain_spec.rb b/spec/epp/domain_spec.rb index 3f99539df..6df222aa5 100644 --- a/spec/epp/domain_spec.rb +++ b/spec/epp/domain_spec.rb @@ -3101,6 +3101,8 @@ describe 'EPP Domain', epp: true do it 'should show force delete in poll' do domain.set_force_delete response = epp_plain_request(@epp_xml.session.poll) + msg_q = response[:parsed].css('msgQ') + msg_q.css('msg').text.should == "Force delete set on domain #{domain.name}" end end end From ad53278e24a8b0950bb83faff499f539508715f9 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Tue, 25 Aug 2015 11:35:34 +0300 Subject: [PATCH 11/17] Fix rubocop #2882 --- app/models/domain.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/models/domain.rb b/app/models/domain.rb index 4f098ba46..3a7b401a9 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -550,6 +550,7 @@ class Domain < ActiveRecord::Base end # rubocop:disable Metrics/AbcSize + # rubocop:disable Metrics/MethodLength def set_force_delete self.statuses_backup = statuses statuses.delete(DomainStatus::CLIENT_DELETE_PROHIBITED) @@ -586,6 +587,7 @@ class Domain < ActiveRecord::Base end false end + # rubocop: enable Metrics/MethodLength # rubocop:enable Metrics/AbcSize def unset_force_delete From 6ab72e6f1a43306ece90a7b05f04cecc5c1cbc52 Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Tue, 25 Aug 2015 12:11:22 +0300 Subject: [PATCH 12/17] Added dubilcate application link to config file --- doc/application_build_doc.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/application_build_doc.md b/doc/application_build_doc.md index 800e014b9..4dc9535b4 100644 --- a/doc/application_build_doc.md +++ b/doc/application_build_doc.md @@ -127,3 +127,10 @@ Crontab can be setup after deploy. Jobs can be viewed [here](/config/schedule.rb Zonefile procedure must be set up in server after deploy. The same command must be run whenever procedure is updated (see changelog). bundle exec rake zonefile:replace_procedure + + +### Application settings + +Application settings locate at [config/application-example.yml](/config/application-example.yml) + + From 32dd7de28a864b39bae5bd1679ac8d8343088544 Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Tue, 25 Aug 2015 12:14:46 +0300 Subject: [PATCH 13/17] Added desc to whitelist_emails_for_staging env #2789 --- config/application-example.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/config/application-example.yml b/config/application-example.yml index f8cb0f26e..f6f18315e 100644 --- a/config/application-example.yml +++ b/config/application-example.yml @@ -22,9 +22,13 @@ smtp_enable_starttls_auto: 'true' # 'false' # If your mail server requires authentication, please change. smtp_authentication: 'plain' # 'plain', 'login', 'cram_md5' registrant_url: 'https:/registrant.example.com' # for valid email body registrant links +# Staging env does not send any emails unless they are whitelisted whitelist_emails_for_staging: > - test@example.org, old@example.org, - new@example.org, old@example.com, new@example.com + test@example.org, + old@example.org, + new@example.org, + old@example.com, + new@example.com # # ADMIN server From 5ba39fb4062ff6489cff1635c65e85c1251b3ef7 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Tue, 25 Aug 2015 16:33:47 +0300 Subject: [PATCH 14/17] Validate origin domains #2849 --- app/controllers/epp/domains_controller.rb | 1 - app/validators/domain_name_validator.rb | 13 ++++++--- spec/epp/contact_spec.rb | 6 ++++ spec/epp/domain_spec.rb | 7 +++++ spec/epp/keyrelay_spec.rb | 1 + spec/features/admin/blocked_domain_spec.rb | 1 + spec/features/admin/domain_spec.rb | 2 ++ spec/features/admin/reserved_domain_spec.rb | 1 + .../registrant/domain_delete_confirm_spec.rb | 4 +++ .../registrant/domain_update_confirm_spec.rb | 4 +++ spec/features/registrar/domain_spec.rb | 6 +++- spec/features/sessions_spec.rb | 1 + spec/mailers/contact_mailer_spec.rb | 5 ++-- spec/mailers/domain_mailer_spec.rb | 28 +++++++++++-------- spec/models/contact_spec.rb | 2 ++ spec/models/dnskey_spec.rb | 4 +++ spec/models/domain_spec.rb | 17 ++++++++--- spec/models/domain_transfer_spec.rb | 4 +++ spec/models/keyrelay_spec.rb | 4 +++ spec/models/nameserver_spec.rb | 4 +++ spec/models/registrant_verification_spec.rb | 3 ++ spec/models/whois_record_spec.rb | 4 +++ spec/requests/v1/domain_spec.rb | 1 + 23 files changed, 99 insertions(+), 24 deletions(-) diff --git a/app/controllers/epp/domains_controller.rb b/app/controllers/epp/domains_controller.rb index 5d942882b..d3111ddfa 100644 --- a/app/controllers/epp/domains_controller.rb +++ b/app/controllers/epp/domains_controller.rb @@ -29,7 +29,6 @@ class Epp::DomainsController < EppController handle_errors(@domain) and return if @domain.errors.any? handle_errors and return unless balance_ok?('create') - ActiveRecord::Base.transaction do if @domain.save # TODO: Maybe use validate: false here because we have already validated the domain? current_user.registrar.debit!({ diff --git a/app/validators/domain_name_validator.rb b/app/validators/domain_name_validator.rb index c8ed2813c..e39437f2b 100644 --- a/app/validators/domain_name_validator.rb +++ b/app/validators/domain_name_validator.rb @@ -9,22 +9,27 @@ class DomainNameValidator < ActiveModel::EachValidator class << self def validate_format(value) - return true if value == 'ee' return true unless value value = value.mb_chars.downcase.strip - general_domains = /(.pri.ee|.com.ee|.fie.ee|.med.ee|.ee)/ + origins = ZonefileSetting.pluck(:origin) + # if someone tries to register an origin domain, let this validation pass + # the error will be catched in blocked domains validator + return true if origins.include?(value) + + general_domains = /(#{origins.join('|')})/ + # general_domains = /(.pri.ee|.com.ee|.fie.ee|.med.ee|.ee)/ # it's punycode if value[2] == '-' && value[3] == '-' - regexp = /\Axn--[a-zA-Z0-9-]{0,59}#{general_domains}\z/ + regexp = /\Axn--[a-zA-Z0-9-]{0,59}\.#{general_domains}\z/ return false unless value =~ regexp value = SimpleIDN.to_unicode(value).mb_chars.downcase.strip end # rubocop: disable Metrics/LineLength unicode_chars = /\u00E4\u00F5\u00F6\u00FC\u0161\u017E/ # äõöüšž - regexp = /\A[a-zA-Z0-9#{unicode_chars.source}][a-zA-Z0-9#{unicode_chars.source}-]{0,61}[a-zA-Z0-9#{unicode_chars.source}]#{general_domains.source}\z/ + regexp = /\A[a-zA-Z0-9#{unicode_chars.source}][a-zA-Z0-9#{unicode_chars.source}-]{0,61}[a-zA-Z0-9#{unicode_chars.source}]\.#{general_domains.source}\z/ # rubocop: enable Metrics/LineLength # rubocop: disable Style/DoubleNegation !!(value =~ regexp) diff --git a/spec/epp/contact_spec.rb b/spec/epp/contact_spec.rb index 36926e66c..4a8f35bb6 100644 --- a/spec/epp/contact_spec.rb +++ b/spec/epp/contact_spec.rb @@ -3,6 +3,12 @@ require 'rails_helper' describe 'EPP Contact', epp: true do before :all do @xsd = Nokogiri::XML::Schema(File.read('lib/schemas/contact-eis-1.0.xsd')) + Fabricate(:zonefile_setting, origin: 'ee') + Fabricate(:zonefile_setting, origin: 'pri.ee') + Fabricate(:zonefile_setting, origin: 'med.ee') + Fabricate(:zonefile_setting, origin: 'fie.ee') + Fabricate(:zonefile_setting, origin: 'com.ee') + @registrar1 = Fabricate(:registrar1) @registrar2 = Fabricate(:registrar2) @epp_xml = EppXml::Contact.new(cl_trid: 'ABC-12345') diff --git a/spec/epp/domain_spec.rb b/spec/epp/domain_spec.rb index 6df222aa5..2b4026126 100644 --- a/spec/epp/domain_spec.rb +++ b/spec/epp/domain_spec.rb @@ -4,6 +4,13 @@ describe 'EPP Domain', epp: true do before(:all) do @xsd = Nokogiri::XML::Schema(File.read('lib/schemas/domain-eis-1.0.xsd')) @epp_xml = EppXml.new(cl_trid: 'ABC-12345') + + Fabricate(:zonefile_setting, origin: 'ee') + Fabricate(:zonefile_setting, origin: 'pri.ee') + Fabricate(:zonefile_setting, origin: 'med.ee') + Fabricate(:zonefile_setting, origin: 'fie.ee') + Fabricate(:zonefile_setting, origin: 'com.ee') + @registrar1 = Fabricate(:registrar1, code: 'REGDOMAIN1') @registrar1.credit!({ sum: 10000 }) @registrar2 = Fabricate(:registrar2, code: 'REGDOMAIN2') diff --git a/spec/epp/keyrelay_spec.rb b/spec/epp/keyrelay_spec.rb index 17823e9c9..d42d96f4b 100644 --- a/spec/epp/keyrelay_spec.rb +++ b/spec/epp/keyrelay_spec.rb @@ -2,6 +2,7 @@ require 'rails_helper' describe 'EPP Keyrelay', epp: true do before(:all) do + Fabricate(:zonefile_setting, origin: 'ee') @registrar1 = Fabricate(:registrar1) @registrar2 = Fabricate(:registrar2) @domain = Fabricate(:domain, registrar: @registrar2) diff --git a/spec/features/admin/blocked_domain_spec.rb b/spec/features/admin/blocked_domain_spec.rb index 5f2535484..432556d64 100644 --- a/spec/features/admin/blocked_domain_spec.rb +++ b/spec/features/admin/blocked_domain_spec.rb @@ -2,6 +2,7 @@ require 'rails_helper' feature 'BlockedDomain', type: :feature do before :all do + Fabricate(:zonefile_setting, origin: 'ee') @user = Fabricate(:admin_user) end diff --git a/spec/features/admin/domain_spec.rb b/spec/features/admin/domain_spec.rb index 101ba5e8c..fc9548996 100644 --- a/spec/features/admin/domain_spec.rb +++ b/spec/features/admin/domain_spec.rb @@ -2,6 +2,8 @@ require 'rails_helper' feature 'Domain', type: :feature do before :all do + Fabricate(:zonefile_setting, origin: 'ee') + Fabricate(:zonefile_setting, origin: 'pri.ee') @user = Fabricate(:admin_user) end diff --git a/spec/features/admin/reserved_domain_spec.rb b/spec/features/admin/reserved_domain_spec.rb index 9c780285f..276907c6b 100644 --- a/spec/features/admin/reserved_domain_spec.rb +++ b/spec/features/admin/reserved_domain_spec.rb @@ -2,6 +2,7 @@ require 'rails_helper' feature 'ReservedDomain', type: :feature do before :all do + Fabricate(:zonefile_setting, origin: 'ee') @user = Fabricate(:admin_user) end diff --git a/spec/features/registrant/domain_delete_confirm_spec.rb b/spec/features/registrant/domain_delete_confirm_spec.rb index f51374540..db5b0237d 100644 --- a/spec/features/registrant/domain_delete_confirm_spec.rb +++ b/spec/features/registrant/domain_delete_confirm_spec.rb @@ -1,6 +1,10 @@ require 'rails_helper' feature 'DomainDeleteConfirm', type: :feature do + before :all do + Fabricate(:zonefile_setting, origin: 'ee') + end + context 'as unknown user with domain without token' do before :all do @domain = Fabricate(:domain) diff --git a/spec/features/registrant/domain_update_confirm_spec.rb b/spec/features/registrant/domain_update_confirm_spec.rb index 0af47e43b..b9703165e 100644 --- a/spec/features/registrant/domain_update_confirm_spec.rb +++ b/spec/features/registrant/domain_update_confirm_spec.rb @@ -1,6 +1,10 @@ require 'rails_helper' feature 'DomainUpdateConfirm', type: :feature do + before :all do + Fabricate(:zonefile_setting, origin: 'ee') + end + context 'as unknown user with domain without update token' do before :all do @domain = Fabricate(:domain) diff --git a/spec/features/registrar/domain_spec.rb b/spec/features/registrar/domain_spec.rb index f9eb76c76..3eecd5d10 100644 --- a/spec/features/registrar/domain_spec.rb +++ b/spec/features/registrar/domain_spec.rb @@ -2,6 +2,8 @@ require 'rails_helper' feature 'Domains', type: :feature do before :all do + Fabricate(:zonefile_setting, origin: 'ee') + Fabricate(:zonefile_setting, origin: 'pri.ee') @user = Fabricate(:api_user) end @@ -58,7 +60,9 @@ feature 'Domains', type: :feature do it 'should search domains' do # having shared state across tests is really annoying sometimes... - click_link "#{@user} (#{@user.roles.first}) - #{@user.registrar}" + within('.dropdown-menu') do + click_link "#{@user} (#{@user.roles.first}) - #{@user.registrar}" + end Fabricate(:domain, name: 'abcde.ee', registrar: @user.registrar) Fabricate(:domain, name: 'abcdee.ee', registrar: @user.registrar) diff --git a/spec/features/sessions_spec.rb b/spec/features/sessions_spec.rb index 1419b2f2c..8eba74afc 100644 --- a/spec/features/sessions_spec.rb +++ b/spec/features/sessions_spec.rb @@ -2,6 +2,7 @@ require 'rails_helper' feature 'Sessions', type: :feature do before :all do + Fabricate(:zonefile_setting, origin: 'ee') @user = Fabricate(:ee_user) @registrar1 = Fabricate(:registrar1) @registrar2 = Fabricate(:registrar2) diff --git a/spec/mailers/contact_mailer_spec.rb b/spec/mailers/contact_mailer_spec.rb index ce4adabef..60699a2f9 100644 --- a/spec/mailers/contact_mailer_spec.rb +++ b/spec/mailers/contact_mailer_spec.rb @@ -2,7 +2,7 @@ require 'rails_helper' describe ContactMailer do describe 'email changed notification when delivery turned off' do - before :all do + before :all do @contact = Fabricate(:contact, email: 'test@example.ee') @mail = ContactMailer.email_updated('test@example.com', @contact) end @@ -25,7 +25,8 @@ describe ContactMailer do end describe 'email changed notification' do - before :all do + before :all do + Fabricate(:zonefile_setting, origin: 'ee') @domain = Fabricate(:domain) @contact = @domain.registrant @contact.reload # until figured out why registrant_domains not loaded diff --git a/spec/mailers/domain_mailer_spec.rb b/spec/mailers/domain_mailer_spec.rb index ec9fd4672..71ed183ce 100644 --- a/spec/mailers/domain_mailer_spec.rb +++ b/spec/mailers/domain_mailer_spec.rb @@ -1,8 +1,12 @@ require 'rails_helper' describe DomainMailer do + before :all do + Fabricate(:zonefile_setting, origin: 'ee') + end + describe 'pending update request for an old registrant when delivery turned off' do - before :all do + before :all do @registrant = Fabricate(:registrant, email: 'test@example.com') @domain = Fabricate(:domain, registrant: @registrant) @mail = DomainMailer.pending_update_request_for_old_registrant(@domain) @@ -26,7 +30,7 @@ describe DomainMailer do end describe 'pending update request for an old registrant' do - before :all do + before :all do @registrant = Fabricate(:registrant, email: 'test@example.com') @new_registrant = Fabricate(:registrant, email: 'test@example.org') @domain = Fabricate(:domain, registrant: @registrant) @@ -59,7 +63,7 @@ describe DomainMailer do end describe 'pending upadte notification for a new registrant' do - before :all do + before :all do @registrant = Fabricate(:registrant, email: 'old@example.com') @new_registrant = Fabricate(:registrant, email: 'new@example.org') @domain = Fabricate(:domain, registrant: @registrant) @@ -88,7 +92,7 @@ describe DomainMailer do end describe 'pending update notification for a new registrant' do - before :all do + before :all do @registrant = Fabricate(:registrant, email: 'old@example.com') @new_registrant = Fabricate(:registrant, email: 'new@example.org') @domain = Fabricate(:domain, registrant: @registrant) @@ -117,7 +121,7 @@ describe DomainMailer do end describe 'pending update rejected notification for a new registrant' do - before :all do + before :all do @registrant = Fabricate(:registrant, email: 'old@example.com') @new_registrant = Fabricate(:registrant, email: 'new@example.org') @domain = Fabricate(:domain, registrant: @registrant) @@ -145,7 +149,7 @@ describe DomainMailer do end describe 'registrant updated notification for a new registrant' do - before :all do + before :all do @registrant = Fabricate(:registrant, email: 'test@example.com') @domain = Fabricate(:domain, registrant: @registrant) @domain.deliver_emails = true @@ -170,7 +174,7 @@ describe DomainMailer do end describe 'registrant updated notification for a old registrant' do - before :all do + before :all do @registrant = Fabricate(:registrant, email: 'test@example.com') @domain = Fabricate(:domain, registrant: @registrant) @domain.deliver_emails = true @@ -195,7 +199,7 @@ describe DomainMailer do end describe 'domain pending delete notification when delivery turned off' do - before :all do + before :all do @registrant = Fabricate(:registrant, email: 'test@example.com') @domain = Fabricate(:domain, registrant: @registrant) @mail = DomainMailer.pending_deleted(@domain) @@ -219,7 +223,7 @@ describe DomainMailer do end describe 'email pending delete notification' do - before :all do + before :all do @registrant = Fabricate(:registrant, email: 'test@example.com') @domain = Fabricate(:domain, name: 'delete-pending.ee', registrant: @registrant) @domain.deliver_emails = true @@ -250,7 +254,7 @@ describe DomainMailer do end describe 'pending delete rejected notification' do - before :all do + before :all do @registrant = Fabricate(:registrant, email: 'test@example.com') @domain = Fabricate(:domain, name: 'delete-pending-rejected.ee', registrant: @registrant) @domain.deliver_emails = true @@ -277,7 +281,7 @@ describe DomainMailer do end describe 'pending delete expired notification' do - before :all do + before :all do @registrant = Fabricate(:registrant, email: 'test@example.com') @domain = Fabricate(:domain, name: 'pending-delete-expired.ee', registrant: @registrant) @domain.deliver_emails = true @@ -304,7 +308,7 @@ describe DomainMailer do end describe 'pending delete rejected notification' do - before :all do + before :all do @registrant = Fabricate(:registrant, email: 'test@example.com') @domain = Fabricate(:domain, name: 'delete-confirmed.ee', registrant: @registrant) @domain.deliver_emails = true diff --git a/spec/models/contact_spec.rb b/spec/models/contact_spec.rb index 303a5d415..4407fdac2 100644 --- a/spec/models/contact_spec.rb +++ b/spec/models/contact_spec.rb @@ -2,6 +2,7 @@ require 'rails_helper' describe Contact do before :all do + Fabricate(:zonefile_setting, origin: 'ee') @api_user = Fabricate(:api_user) end @@ -383,6 +384,7 @@ end describe Contact, '.destroy_orphans' do before do + Fabricate(:zonefile_setting, origin: 'ee') @contact_1 = Fabricate(:contact, code: 'asd12') @contact_2 = Fabricate(:contact, code: 'asd13') end diff --git a/spec/models/dnskey_spec.rb b/spec/models/dnskey_spec.rb index a7ddfece4..8d1185cbd 100644 --- a/spec/models/dnskey_spec.rb +++ b/spec/models/dnskey_spec.rb @@ -1,6 +1,10 @@ require 'rails_helper' describe Dnskey do + before :all do + Fabricate(:zonefile_setting, origin: 'ee') + end + it { should belong_to(:domain) } context 'with invalid attribute' do diff --git a/spec/models/domain_spec.rb b/spec/models/domain_spec.rb index e76529f27..015a407e0 100644 --- a/spec/models/domain_spec.rb +++ b/spec/models/domain_spec.rb @@ -1,6 +1,14 @@ require 'rails_helper' describe Domain do + before :all do + Fabricate(:zonefile_setting, origin: 'ee') + Fabricate(:zonefile_setting, origin: 'pri.ee') + Fabricate(:zonefile_setting, origin: 'med.ee') + Fabricate(:zonefile_setting, origin: 'fie.ee') + Fabricate(:zonefile_setting, origin: 'com.ee') + end + it { should belong_to(:registrar) } it { should have_many(:nameservers) } it { should belong_to(:registrant) } @@ -573,16 +581,17 @@ describe Domain do end it 'should not create zone origin domain' do - zs = Fabricate(:zonefile_setting) d = Fabricate.build(:domain, name: 'ee') d.save.should == false d.errors.full_messages.should match_array([ "Data management policy violation: Domain name is blocked [name]" ]) - zs.destroy - - d.save.should == true + d = Fabricate.build(:domain, name: 'bla') + d.save.should == false + d.errors.full_messages.should match_array([ + "Domain name Domain name is invalid" + ]) end # d = Domain.new diff --git a/spec/models/domain_transfer_spec.rb b/spec/models/domain_transfer_spec.rb index 72892b68d..169b9f24e 100644 --- a/spec/models/domain_transfer_spec.rb +++ b/spec/models/domain_transfer_spec.rb @@ -1,6 +1,10 @@ require 'rails_helper' describe DomainTransfer do + before :all do + Fabricate(:zonefile_setting, origin: 'ee') + end + it { should belong_to(:domain) } context 'with invalid attribute' do diff --git a/spec/models/keyrelay_spec.rb b/spec/models/keyrelay_spec.rb index 5cd5ff9ef..372c63332 100644 --- a/spec/models/keyrelay_spec.rb +++ b/spec/models/keyrelay_spec.rb @@ -1,6 +1,10 @@ require 'rails_helper' describe Keyrelay do + before :all do + Fabricate(:zonefile_setting, origin: 'ee') + end + it { should belong_to(:domain) } it { should belong_to(:requester) } it { should belong_to(:accepter) } diff --git a/spec/models/nameserver_spec.rb b/spec/models/nameserver_spec.rb index 6d2b539e2..64487722b 100644 --- a/spec/models/nameserver_spec.rb +++ b/spec/models/nameserver_spec.rb @@ -1,6 +1,10 @@ require 'rails_helper' describe Nameserver do + before :all do + Fabricate(:zonefile_setting, origin: 'ee') + end + it { should belong_to(:domain) } context 'with invalid attribute' do diff --git a/spec/models/registrant_verification_spec.rb b/spec/models/registrant_verification_spec.rb index 97d165923..c9278cd4a 100644 --- a/spec/models/registrant_verification_spec.rb +++ b/spec/models/registrant_verification_spec.rb @@ -1,6 +1,9 @@ require 'rails_helper' describe RegistrantVerification do + before :all do + Fabricate(:zonefile_setting, origin: 'ee') + end context 'with invalid attribute' do before :all do @registrant_verification = RegistrantVerification.new diff --git a/spec/models/whois_record_spec.rb b/spec/models/whois_record_spec.rb index bf0d5b9ed..95c4c2082 100644 --- a/spec/models/whois_record_spec.rb +++ b/spec/models/whois_record_spec.rb @@ -1,6 +1,10 @@ require 'rails_helper' describe WhoisRecord do + before :all do + Fabricate(:zonefile_setting, origin: 'ee') + end + context 'with invalid attribute' do before :all do @whois_record = WhoisRecord.new diff --git a/spec/requests/v1/domain_spec.rb b/spec/requests/v1/domain_spec.rb index 47b37ea76..e79f2e71b 100644 --- a/spec/requests/v1/domain_spec.rb +++ b/spec/requests/v1/domain_spec.rb @@ -2,6 +2,7 @@ require 'rails_helper' describe Repp::DomainV1 do before :all do + Fabricate(:zonefile_setting, origin: 'ee') @registrar1 = Fabricate(:registrar1) @api_user = Fabricate(:gitlab_api_user, registrar: @registrar1) Fabricate.times(2, :domain, registrar: @api_user.registrar) From 032cff3cf34a8481f39f064479dbc77f150b81d0 Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Tue, 25 Aug 2015 21:11:36 +0300 Subject: [PATCH 15/17] Added initial mail template editor #2369 --- Gemfile | 1 + Gemfile.lock | 5 ++ .../admin/mail_templates_controller.rb | 61 +++++++++++++++++++ app/models/ability.rb | 1 + app/models/mail_template.rb | 10 +++ app/views/admin/mail_templates/_form.haml | 54 ++++++++++++++++ app/views/admin/mail_templates/edit.haml | 3 + app/views/admin/mail_templates/index.haml | 26 ++++++++ app/views/admin/mail_templates/new.haml | 3 + app/views/admin/mail_templates/show.haml | 41 +++++++++++++ app/views/layouts/admin/application.haml | 1 + config/locales/en.yml | 3 + config/routes.rb | 1 + .../20150825125118_create_email_templates.rb | 19 ++++++ db/schema-read-only.rb | 14 ++++- db/structure.sql | 56 +++++++++++++++++ 16 files changed, 298 insertions(+), 1 deletion(-) create mode 100644 app/controllers/admin/mail_templates_controller.rb create mode 100644 app/models/mail_template.rb create mode 100644 app/views/admin/mail_templates/_form.haml create mode 100644 app/views/admin/mail_templates/edit.haml create mode 100644 app/views/admin/mail_templates/index.haml create mode 100644 app/views/admin/mail_templates/new.haml create mode 100644 app/views/admin/mail_templates/show.haml create mode 100644 db/migrate/20150825125118_create_email_templates.rb diff --git a/Gemfile b/Gemfile index 57d252870..2505655cb 100644 --- a/Gemfile +++ b/Gemfile @@ -51,6 +51,7 @@ gem 'html5_validators', '~> 1.2.0' # model requements now automatically on htm gem 'coderay', '~> 1.1.0' # xml console visualize gem 'select2-rails', '~> 3.5.9.3' # for autocomplete gem 'bootstrap-datepicker-rails', '~> 1.3.1.1' # datepicker +gem 'liquid', '~> 3.0.6' # for email templates # rights gem 'devise', '~> 3.5.1' # authenitcation diff --git a/Gemfile.lock b/Gemfile.lock index d8d12b077..5a137da04 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -278,6 +278,7 @@ GEM addressable (~> 2.3) libv8 (3.16.14.11) libxml-ruby (2.8.0) + liquid (3.0.6) listen (3.0.3) rb-fsevent (>= 0.9.3) rb-inotify (>= 0.9) @@ -583,6 +584,7 @@ DEPENDENCIES jquery-validation-rails (~> 1.13.1) kaminari (~> 0.16.3) launchy (~> 2.4.3) + liquid (~> 3.0.6) mina (~> 0.3.1) money-rails (~> 1.4.1) newrelic_rpm (~> 3.12.0.288) @@ -622,3 +624,6 @@ DEPENDENCIES uuidtools (~> 2.1.4) validates_email_format_of (~> 1.6.3) whenever (~> 0.9.4) + +BUNDLED WITH + 1.10.6 diff --git a/app/controllers/admin/mail_templates_controller.rb b/app/controllers/admin/mail_templates_controller.rb new file mode 100644 index 000000000..9d7d88c3d --- /dev/null +++ b/app/controllers/admin/mail_templates_controller.rb @@ -0,0 +1,61 @@ +class Admin::MailTemplatesController < AdminController + load_and_authorize_resource + + def index + @q = MailTemplate.search(params[:q]) + @mail_templates = @q.result.page(params[:page]) + end + + def new + @mail_tempalte = MailTemplate.new + end + + def show + @mail_template = MailTemplate.find(params[:id]) + @subject = Liquid::Template.parse(@mail_template.subject).render.html_safe + @html_body = Liquid::Template.parse(@mail_template.body).render.html_safe + @text_body = Liquid::Template.parse(@mail_template.text_body).render.html_safe + end + + def edit + @mail_template = MailTemplate.find(params[:id]) + end + + def create + @mail_template = MailTemplate.new(mail_template_params) + + if @mail_template.save + redirect_to [:admin, @mail_template] + else + flash.now[:alert] = I18n.t(:failure) + render 'new' + end + end + + def update + @mail_template = MailTemplate.find(params[:id]) + + if @mail_template.update_attributes(mail_template_params) + redirect_to [:admin, @mail_template] + else + flash.now[:alert] = I18n.t(:failure) + render 'edit' + end + end + + def destroy + @mail_template = MailTemplate.find(params[:id]) + if @mail_template.destroy + redirect_to admin_mail_templates_path, notise: t(:deleted) + else + flash.now[:alert] = I18n.t(:failure) + render 'show' + end + end + + private + + def mail_template_params + params.require(:mail_template).permit(:name, :subject, :from, :bcc, :cc, :body, :text_body) + end +end diff --git a/app/models/ability.rb b/app/models/ability.rb index 0c659026b..fc874f129 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -96,6 +96,7 @@ class Ability can :manage, LegalDocument can :manage, BankStatement can :manage, BankTransaction + can :manage, MailTemplate can :manage, Invoice can :manage, WhiteIp can :read, ApiLog::EppLog diff --git a/app/models/mail_template.rb b/app/models/mail_template.rb new file mode 100644 index 000000000..ed0e78919 --- /dev/null +++ b/app/models/mail_template.rb @@ -0,0 +1,10 @@ +class MailTemplate < ActiveRecord::Base + + validates :name, :subject, :from, :body, :text_body, presence: true + + def to_html(body) + template = Erubis::Eruby.new(content, escape: true) + template_result = template.result(context) + Sanitize.clean(RDiscount.new(template_result).to_html.encode('UTF-8', undef: :replace), Sanitize::Config::RELAXED) + end +end diff --git a/app/views/admin/mail_templates/_form.haml b/app/views/admin/mail_templates/_form.haml new file mode 100644 index 000000000..6e9d828c5 --- /dev/null +++ b/app/views/admin/mail_templates/_form.haml @@ -0,0 +1,54 @@ += form_for([:admin, mail_template], html: {class: 'form-horizontal'}) do |f| + = render 'shared/full_errors', object: mail_template + + + - liquid_help = link_to 'Liquid info', 'https://github.com/Shopify/liquid/wiki/Liquid-for-Designers' + + .row + .col-md-12 + .panel.panel-default + .panel-body + .form-group + .col-md-4.control-label + = f.label :name + .col-md-7 + = f.text_field(:name, class: 'form-control') + .form-group + .col-md-4.control-label + = f.label :subject + %br + = liquid_help + .col-md-7 + = f.text_field(:subject, class: 'form-control') + .form-group + .col-md-4.control-label + = f.label :from + .col-md-7 + = f.text_field(:from, class: 'form-control', lax_email: true) + .form-group + .col-md-4.control-label + = f.label :cc + .col-md-7 + = f.text_field(:cc, class: 'form-control', lax_email: true) + .form-group + .col-md-4.control-label + = f.label :bcc + .col-md-7 + = f.text_field(:bcc, class: 'form-control', lax_email: true) + .form-group + .col-md-12 + = f.label :body, t(:html_body) + = liquid_help + .col-md-12 + = f.text_area(:body, class: 'form-control', size: '15x15') + .form-group + .col-md-12 + = f.label :text_body + = liquid_help + .col-md-12 + = f.text_area(:text_body, class: 'form-control', size: '15x15') + + %hr + .row + .col-md-12.text-right + = button_tag(t(:save), class: 'btn btn-primary') diff --git a/app/views/admin/mail_templates/edit.haml b/app/views/admin/mail_templates/edit.haml new file mode 100644 index 000000000..9516671c6 --- /dev/null +++ b/app/views/admin/mail_templates/edit.haml @@ -0,0 +1,3 @@ += render 'shared/title', name: "#{t(:edit)}: #{@mail_template.name}" + += render 'form', mail_template: @mail_template diff --git a/app/views/admin/mail_templates/index.haml b/app/views/admin/mail_templates/index.haml new file mode 100644 index 000000000..7fa1913ae --- /dev/null +++ b/app/views/admin/mail_templates/index.haml @@ -0,0 +1,26 @@ +- content_for :actions do + = link_to(t(:new), new_admin_mail_template_path, class: 'btn btn-primary') += render 'shared/title', name: t(:mail_templates) + +.row + .col-md-12 + .table-responsive + %table.table.table-hover.table-bordered.table-condensed + %thead + %tr + %th{class: 'col-xs-3'}= sort_link(@q, 'name', t(:name)) + %th{class: 'col-xs-3'}= sort_link(@q, 'subject') + %th{class: 'col-xs-3'}= sort_link(@q, 'updated_at') + %th{class: 'col-xs-3'}= t(:actions) + %tbody + - @mail_templates.each do |mt| + %tr + %td= link_to(truncate(mt.name), admin_mail_template_path(mt)) + %td= truncate(mt.subject) + %td= l(mt.updated_at) + %td + = link_to(t(:edit), edit_admin_mail_template_path(mt), class: 'btn btn-primary btn-xs') + +.row + .col-md-12 + = paginate @mail_templates diff --git a/app/views/admin/mail_templates/new.haml b/app/views/admin/mail_templates/new.haml new file mode 100644 index 000000000..e5889e2b3 --- /dev/null +++ b/app/views/admin/mail_templates/new.haml @@ -0,0 +1,3 @@ += render 'shared/title', name: t(:new_mail_template) + += render 'form', mail_template: @mail_template diff --git a/app/views/admin/mail_templates/show.haml b/app/views/admin/mail_templates/show.haml new file mode 100644 index 000000000..31739bbf9 --- /dev/null +++ b/app/views/admin/mail_templates/show.haml @@ -0,0 +1,41 @@ +- content_for :actions do + = link_to(t(:edit), edit_admin_mail_template_path(@mail_template.id), class: 'btn btn-primary') + = link_to(t(:delete), admin_mail_template_path(@mail_template.id), + method: :delete, data: { confirm: t(:are_you_sure) }, class: 'btn btn-danger') + = link_to(t(:email_templates), admin_mail_templates_path, class: 'btn btn-default') += render 'shared/title', name: @mail_template.name + +.row + .col-md-12 + .panel.panel-default + .panel-heading + %h3.panel-title= t(:general) + .panel-body + %dl.dl-horizontal + %dt= t(:subject) + %dd= @mail_template.subject + + %dt= t(:from) + %dd= @mail_template.from + + - if @mail_template.cc.present? + %dt= t(:cc) + %dd= @mail_template.cc + + - if @mail_template.bcc.present? + %dt= t(:bcc) + %dd= @mail_template.bcc + + .col-md-12 + .panel.panel-default + .panel-heading + %h3.panel-title= t(:html_body) + .panel-body + = @html_body + + .col-md-12 + .panel.panel-default + .panel-heading + %h3.panel-title= t(:text_body) + .panel-body + = @text_body diff --git a/app/views/layouts/admin/application.haml b/app/views/layouts/admin/application.haml index da411864c..d224b1464 100644 --- a/app/views/layouts/admin/application.haml +++ b/app/views/layouts/admin/application.haml @@ -61,6 +61,7 @@ %li= link_to t(:zonefile), admin_zonefile_settings_path %li= link_to t(:blocked_domains), admin_blocked_domains_path %li= link_to t(:reserved_domains), admin_reserved_domains_path + %li= link_to t(:mail_templates), admin_mail_templates_path -# %li= link_to t(:domains_history), admin_domain_versions_path %li= link_to t(:epp_logs), admin_epp_logs_path %li= link_to t(:repp_logs), admin_repp_logs_path diff --git a/config/locales/en.yml b/config/locales/en.yml index 900ea3b8f..5bd4c0f63 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -914,3 +914,6 @@ en: created_at_until: 'Created at until' is_registrant: 'Is registrant' force_delete_set_on_domain: 'Force delete set on domain %{domain}' + mail_templates: Mail Templates + new_mail_template: New mail template + failure: "It was not saved" diff --git a/config/routes.rb b/config/routes.rb index feffb2665..5ea7beff7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -160,6 +160,7 @@ Rails.application.routes.draw do resources :legal_documents resources :keyrelays resources :pricelists + resources :mail_templates resources :bank_statements do resources :bank_transactions diff --git a/db/migrate/20150825125118_create_email_templates.rb b/db/migrate/20150825125118_create_email_templates.rb new file mode 100644 index 000000000..60e374247 --- /dev/null +++ b/db/migrate/20150825125118_create_email_templates.rb @@ -0,0 +1,19 @@ +class CreateEmailTemplates < ActiveRecord::Migration + def self.up + create_table :mail_templates do |t| + t.string :name, null: false + t.string :subject + t.string :from + t.string :bcc + t.string :cc + t.text :body, null: false + t.text :text_body, null: false + t.timestamps + end + end + + def self.down + drop_table :mail_templates + end +end + diff --git a/db/schema-read-only.rb b/db/schema-read-only.rb index 5eee65c59..4839d519e 100644 --- a/db/schema-read-only.rb +++ b/db/schema-read-only.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20150810114746) do +ActiveRecord::Schema.define(version: 20150825125118) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -878,6 +878,18 @@ ActiveRecord::Schema.define(version: 20150810114746) do add_index "log_zonefile_settings", ["item_type", "item_id"], name: "index_log_zonefile_settings_on_item_type_and_item_id", using: :btree add_index "log_zonefile_settings", ["whodunnit"], name: "index_log_zonefile_settings_on_whodunnit", using: :btree + create_table "mail_templates", force: :cascade do |t| + t.string "name", null: false + t.string "subject" + t.string "from" + t.string "bcc" + t.string "cc" + t.text "body", null: false + t.text "text_body", null: false + t.datetime "created_at" + t.datetime "updated_at" + end + create_table "messages", force: :cascade do |t| t.integer "registrar_id" t.string "body" diff --git a/db/structure.sql b/db/structure.sql index 62d98a861..65b344c97 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -2228,6 +2228,43 @@ CREATE SEQUENCE log_zonefile_settings_id_seq ALTER SEQUENCE log_zonefile_settings_id_seq OWNED BY log_zonefile_settings.id; +-- +-- Name: mail_templates; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- + +CREATE TABLE mail_templates ( + id integer NOT NULL, + name character varying NOT NULL, + subject character varying, + "from" character varying, + bcc character varying, + cc character varying, + body text NOT NULL, + text_body text NOT NULL, + created_at timestamp without time zone, + updated_at timestamp without time zone +); + + +-- +-- Name: mail_templates_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE mail_templates_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: mail_templates_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - +-- + +ALTER SEQUENCE mail_templates_id_seq OWNED BY mail_templates.id; + + -- -- Name: messages; Type: TABLE; Schema: public; Owner: -; Tablespace: -- @@ -3154,6 +3191,13 @@ ALTER TABLE ONLY log_white_ips ALTER COLUMN id SET DEFAULT nextval('log_white_ip ALTER TABLE ONLY log_zonefile_settings ALTER COLUMN id SET DEFAULT nextval('log_zonefile_settings_id_seq'::regclass); +-- +-- Name: id; Type: DEFAULT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY mail_templates ALTER COLUMN id SET DEFAULT nextval('mail_templates_id_seq'::regclass); + + -- -- Name: id; Type: DEFAULT; Schema: public; Owner: - -- @@ -3676,6 +3720,14 @@ ALTER TABLE ONLY log_zonefile_settings ADD CONSTRAINT log_zonefile_settings_pkey PRIMARY KEY (id); +-- +-- Name: mail_templates_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- + +ALTER TABLE ONLY mail_templates + ADD CONSTRAINT mail_templates_pkey PRIMARY KEY (id); + + -- -- Name: messages_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- @@ -4874,3 +4926,7 @@ INSERT INTO schema_migrations (version) VALUES ('20150803080914'); INSERT INTO schema_migrations (version) VALUES ('20150810114746'); +INSERT INTO schema_migrations (version) VALUES ('20150810114747'); + +INSERT INTO schema_migrations (version) VALUES ('20150825125118'); + From d11aee7e958f68a5be4323070ae3367891d0f8ab Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Tue, 25 Aug 2015 22:09:15 +0300 Subject: [PATCH 16/17] Added feature test for mailer #2369 --- app/models/mail_template.rb | 7 --- .../20150825125118_create_email_templates.rb | 2 +- db/schema-read-only.rb | 4 +- db/structure.sql | 6 +-- spec/features/admin/mail_templates_spec.rb | 47 +++++++++++++++++++ 5 files changed, 52 insertions(+), 14 deletions(-) create mode 100644 spec/features/admin/mail_templates_spec.rb diff --git a/app/models/mail_template.rb b/app/models/mail_template.rb index ed0e78919..ee693a0a3 100644 --- a/app/models/mail_template.rb +++ b/app/models/mail_template.rb @@ -1,10 +1,3 @@ class MailTemplate < ActiveRecord::Base - validates :name, :subject, :from, :body, :text_body, presence: true - - def to_html(body) - template = Erubis::Eruby.new(content, escape: true) - template_result = template.result(context) - Sanitize.clean(RDiscount.new(template_result).to_html.encode('UTF-8', undef: :replace), Sanitize::Config::RELAXED) - end end diff --git a/db/migrate/20150825125118_create_email_templates.rb b/db/migrate/20150825125118_create_email_templates.rb index 60e374247..ab956f5ed 100644 --- a/db/migrate/20150825125118_create_email_templates.rb +++ b/db/migrate/20150825125118_create_email_templates.rb @@ -8,7 +8,7 @@ class CreateEmailTemplates < ActiveRecord::Migration t.string :cc t.text :body, null: false t.text :text_body, null: false - t.timestamps + t.timestamps null: false end end diff --git a/db/schema-read-only.rb b/db/schema-read-only.rb index 4839d519e..79739bb06 100644 --- a/db/schema-read-only.rb +++ b/db/schema-read-only.rb @@ -886,8 +886,8 @@ ActiveRecord::Schema.define(version: 20150825125118) do t.string "cc" t.text "body", null: false t.text "text_body", null: false - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false end create_table "messages", force: :cascade do |t| diff --git a/db/structure.sql b/db/structure.sql index 65b344c97..74cddb0e9 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -2241,8 +2241,8 @@ CREATE TABLE mail_templates ( cc character varying, body text NOT NULL, text_body text NOT NULL, - created_at timestamp without time zone, - updated_at timestamp without time zone + created_at timestamp without time zone NOT NULL, + updated_at timestamp without time zone NOT NULL ); @@ -4926,7 +4926,5 @@ INSERT INTO schema_migrations (version) VALUES ('20150803080914'); INSERT INTO schema_migrations (version) VALUES ('20150810114746'); -INSERT INTO schema_migrations (version) VALUES ('20150810114747'); - INSERT INTO schema_migrations (version) VALUES ('20150825125118'); diff --git a/spec/features/admin/mail_templates_spec.rb b/spec/features/admin/mail_templates_spec.rb new file mode 100644 index 000000000..c6dfdaaf6 --- /dev/null +++ b/spec/features/admin/mail_templates_spec.rb @@ -0,0 +1,47 @@ +require 'rails_helper' + +feature 'MailTemplate', type: :feature do + before :all do + @user = Fabricate(:admin_user) + end + + before do + sign_in @user + end + + it 'should add a bank statement and transactions manually' do + visit admin_mail_templates_url + + click_link 'New' + fill_in 'Name', with: 'Testing email template' + fill_in 'Subject', with: 'Test subject' + fill_in 'From', with: 'example@example.com' + fill_in 'mail_template_body', with: 'Liquid

Test

' + fill_in 'mail_template_text_body', with: 'Liquid static test' + click_button 'Save' + + page.should have_content('Testing email template') + page.should have_content('Test subject') + page.should have_content('example@example.com') + page.should have_content('Liquid Test') + page.should have_content('Liquid static test') + + click_link 'Email Templates' + page.should have_content('Mail Templates') + page.should have_content('Test subject') + + click_link 'Testing email template' + page.should have_content('Testing email template') + + click_link 'Edit' + page.should have_content('Edit: Testing email template') + fill_in 'Subject', with: 'New edited test subject' + click_button 'Save' + + page.should have_content 'New edited test subject' + click_link 'Delete' + + page.should have_content 'Mail Templates' + page.should_not have_content 'New edited test subject' + end +end From 112fe578ae3e62d27431792b8045da2bfc66a8f9 Mon Sep 17 00:00:00 2001 From: Priit Tark Date: Wed, 26 Aug 2015 13:31:56 +0300 Subject: [PATCH 17/17] Added statuses map #2779 --- lib/tasks/statuses.rake | 625 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 625 insertions(+) create mode 100644 lib/tasks/statuses.rake diff --git a/lib/tasks/statuses.rake b/lib/tasks/statuses.rake new file mode 100644 index 000000000..b3d1ace84 --- /dev/null +++ b/lib/tasks/statuses.rake @@ -0,0 +1,625 @@ +desc 'Schema load for all databases: registry, api_log and whois' +task statuses: [:environment] do + statuses = { + 'ok': [ + ], + 'inactive': [ + 'clientDeleteProhibited', + 'serverDeleteProhibited', + 'clientHold', + 'serverHold', + 'clientRenewProhibited', + 'serverRenewProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + 'serverRegistrantChangeProhibited', + 'serverAdminChangeProhibited', + 'serverTechChangeProhibited', + 'forceDelete', + 'deleteCandidate', + 'expired' + ], + 'clientDeleteProhibited': [ + 'serverDeleteProhibited', + 'clientHold', + 'serverHold', + 'clientRenewProhibited', + 'serverRenewProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + 'inactive', + 'serverManualInzone', + 'serverRegistrantChangeProhibited', + 'serverAdminChangeProhibited', + 'serverTechChangeProhibited', + 'forceDelete', + 'deleteCandidate', + 'expired', + ], + 'serverDeleteProhibited': [ + 'clientDeleteProhibited', + 'clientHold', + 'serverHold', + 'clientRenewProhibited', + 'serverRenewProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + 'inactive', + 'serverManualInzone', + 'serverRegistrantChangeProhibited', + 'serverAdminChangeProhibited', + 'serverTechChangeProhibited', + 'forceDelete', + 'deleteCandidate', + 'expired', + ], + 'clientHold': [ + 'clientDeleteProhibited', + 'serverDeleteProhibited', + 'serverHold', + 'clientRenewProhibited', + 'serverRenewProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + 'inactive', + 'serverRegistrantChangeProhibited', + 'serverAdminChangeProhibited', + 'serverTechChangeProhibited', + 'forceDelete', + 'deleteCandidate', + 'expired', + ], + 'serverHold': [ + 'clientDeleteProhibited', + 'serverDeleteProhibited', + 'clientHold', + 'clientRenewProhibited', + 'serverRenewProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + 'inactive', + 'serverRegistrantChangeProhibited', + 'serverAdminChangeProhibited', + 'serverTechChangeProhibited', + 'forceDelete', + 'deleteCandidate', + 'expired', + ], + 'clientRenewProhibited': [ + 'clientDeleteProhibited', + 'serverDeleteProhibited', + 'clientHold', + 'serverHold', + 'serverRenewProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + 'inactive', + 'pendingCreate', + 'pendingDelete', + 'pendingDeleteConfirmation', + 'pendingTransfer', + 'pendingUpdate', + 'serverManualInzone', + 'serverRegistrantChangeProhibited', + 'serverAdminChangeProhibited', + 'serverTechChangeProhibited', + 'forceDelete', + 'deleteCandidate', + 'expired', + ], + 'serverRenewProhibited': [ + 'clientDeleteProhibited', + 'serverDeleteProhibited', + 'clientHold', + 'serverHold', + 'clientRenewProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + 'inactive', + 'pendingCreate', + 'pendingDelete', + 'pendingDeleteConfirmation', + 'pendingTransfer', + 'pendingUpdate', + 'serverManualInzone', + 'serverRegistrantChangeProhibited', + 'serverAdminChangeProhibited', + 'serverTechChangeProhibited', + 'forceDelete', + 'deleteCandidate', + 'expired', + ], + 'clientTransferProhibited': [ + 'clientDeleteProhibited', + 'serverDeleteProhibited', + 'clientHold', + 'serverHold', + 'clientRenewProhibited', + 'serverRenewProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + 'inactive', + 'pendingCreate', + 'pendingDelete', + 'pendingDeleteConfirmation', + 'pendingRenew', + 'pendingUpdate', + 'serverManualInzone', + 'serverRegistrantChangeProhibited', + 'serverAdminChangeProhibited', + 'serverTechChangeProhibited', + 'forceDelete', + 'deleteCandidate', + 'expired', + ], + 'serverTransferProhibited': [ + 'clientDeleteProhibited', + 'serverDeleteProhibited', + 'clientHold', + 'serverHold', + 'clientRenewProhibited', + 'serverRenewProhibited', + 'clientTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + 'inactive', + 'pendingCreate', + 'pendingDelete', + 'pendingDeleteConfirmation', + 'pendingRenew', + 'pendingUpdate', + 'serverManualInzone', + 'serverRegistrantChangeProhibited', + 'serverAdminChangeProhibited', + 'serverTechChangeProhibited', + 'forceDelete', + 'deleteCandidate', + 'expired', + ], + 'clientUpdateProhibited': [ + 'clientDeleteProhibited', + 'serverDeleteProhibited', + 'clientHold', + 'serverHold', + 'clientRenewProhibited', + 'serverRenewProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'serverUpdateProhibited', + 'inactive', + 'pendingCreate', + 'pendingDelete', + 'pendingDeleteConfirmation', + 'pendingRenew', + 'pendingTransfer', + 'serverManualInzone', + 'serverRegistrantChangeProhibited', + 'serverAdminChangeProhibited', + 'serverTechChangeProhibited', + 'forceDelete', + 'deleteCandidate', + 'expired', + ], + 'serverUpdateProhibited': [ + 'clientDeleteProhibited', + 'serverDeleteProhibited', + 'clientHold', + 'serverHold', + 'clientRenewProhibited', + 'serverRenewProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'inactive', + 'pendingCreate', + 'pendingDelete', + 'pendingDeleteConfirmation', + 'pendingRenew', + 'pendingTransfer', + 'serverManualInzone', + 'serverRegistrantChangeProhibited', + 'serverAdminChangeProhibited', + 'serverTechChangeProhibited', + 'forceDelete', + 'deleteCandidate', + 'expired', + ], + 'pendingCreate': [ + 'clientDeleteProhibited', + 'serverDeleteProhibited', + 'clientHold', + 'serverHold', + 'clientRenewProhibited', + 'serverRenewProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + 'inactive', + 'serverManualInzone', + 'serverRegistrantChangeProhibited', + 'serverAdminChangeProhibited', + 'serverTechChangeProhibited', + 'forceDelete', + 'deleteCandidate', + 'expired', + ], + 'pendingDelete': [ + 'clientHold', + 'serverHold', + 'clientRenewProhibited', + 'serverRenewProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + 'inactive', + 'pendingDeleteConfirmation', + 'serverManualInzone', + 'serverRegistrantChangeProhibited', + 'serverAdminChangeProhibited', + 'serverTechChangeProhibited', + 'forceDelete', + 'deleteCandidate', + 'expired', + ], + 'pendingRenew': [ + 'clientDeleteProhibited', + 'serverDeleteProhibited', + 'clientHold', + 'serverHold', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + 'inactive', + 'serverManualInzone', + 'serverRegistrantChangeProhibited', + 'serverAdminChangeProhibited', + 'serverTechChangeProhibited', + 'forceDelete', + 'deleteCandidate', + 'expired', + + ], + 'pendingTransfer': [ + 'clientDeleteProhibited', + 'serverDeleteProhibited', + 'clientHold', + 'serverHold', + 'clientRenewProhibited', + 'serverRenewProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + 'inactive', + 'serverManualInzone', + 'serverRegistrantChangeProhibited', + 'serverAdminChangeProhibited', + 'serverTechChangeProhibited', + 'forceDelete', + 'deleteCandidate', + 'expired', + ], + 'pendingUpdate': [ + 'clientDeleteProhibited', + 'serverDeleteProhibited', + 'clientHold', + 'serverHold', + 'clientRenewProhibited', + 'serverRenewProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'inactive', + 'serverManualInzone', + 'serverRegistrantChangeProhibited', + 'serverAdminChangeProhibited', + 'serverTechChangeProhibited', + 'forceDelete', + 'deleteCandidate', + 'expired', + ], + 'serverManualInzone': [ + 'clientDeleteProhibited', + 'serverDeleteProhibited', + 'clientHold', + 'serverHold', + 'clientRenewProhibited', + 'serverRenewProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + 'pendingCreate', + 'pendingDelete', + 'pendingDeleteConfirmation', + 'pendingRenew', + 'pendingTransfer', + 'pendingUpdate', + 'serverRegistrantChangeProhibited', + 'serverAdminChangeProhibited', + 'serverTechChangeProhibited', + 'forceDelete', + 'deleteCandidate', + 'expired', + ], + 'serverRegistrantChangeProhibited': [ + 'clientDeleteProhibited', + 'serverDeleteProhibited', + 'clientHold', + 'serverHold', + 'clientRenewProhibited', + 'serverRenewProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + 'inactive', + 'pendingCreate', + 'pendingDelete', + 'pendingDeleteConfirmation', + 'pendingRenew', + 'pendingTransfer', + 'pendingUpdate', + 'serverManualInzone', + 'serverAdminChangeProhibited', + 'serverTechChangeProhibited', + 'forceDelete', + 'deleteCandidate', + 'expired', + ], + 'serverAdminChangeProhibited': [ + 'clientDeleteProhibited', + 'serverDeleteProhibited', + 'clientHold', + 'serverHold', + 'clientRenewProhibited', + 'serverRenewProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + 'inactive', + 'pendingCreate', + 'pendingDelete', + 'pendingDeleteConfirmation', + 'pendingRenew', + 'pendingTransfer', + 'pendingUpdate', + 'serverManualInzone', + 'serverRegistrantChangeProhibited', + 'serverTechChangeProhibited', + 'forceDelete', + 'deleteCandidate', + 'expired', + ], + 'serverTechChangeProhibited': [ + 'clientDeleteProhibited', + 'serverDeleteProhibited', + 'clientHold', + 'serverHold', + 'clientRenewProhibited', + 'serverRenewProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + 'inactive', + 'pendingCreate', + 'pendingDelete', + 'pendingDeleteConfirmation', + 'pendingRenew', + 'pendingTransfer', + 'pendingUpdate', + 'serverManualInzone', + 'serverRegistrantChangeProhibited', + 'serverAdminChangeProhibited', + 'forceDelete', + 'deleteCandidate', + 'expired', + ], + 'forceDelete': [ + 'clientHold', + 'serverHold', + 'inactive', + 'serverManualInzone', + 'serverRegistrantChangeProhibited', + 'serverAdminChangeProhibited', + 'serverTechChangeProhibited', + 'deleteCandidate', + 'expired', + ], + 'deleteCandidate': [ + 'clientDeleteProhibited', + 'serverDeleteProhibited', + 'clientHold', + 'serverHold', + 'clientRenewProhibited', + 'serverRenewProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + 'inactive', + 'pendingCreate', + 'pendingDelete', + 'pendingDeleteConfirmation', + 'pendingRenew', + 'pendingTransfer', + 'pendingUpdate', + 'serverManualInzone', + 'serverRegistrantChangeProhibited', + 'serverAdminChangeProhibited', + 'serverTechChangeProhibited', + 'forceDelete', + 'deleteCandidate', + 'expired', + ], + 'expired': [ + 'clientDeleteProhibited', + 'serverDeleteProhibited', + 'clientHold', + 'serverHold', + 'clientRenewProhibited', + 'serverRenewProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + 'inactive', + 'pendingCreate', + 'pendingDelete', + 'pendingDeleteConfirmation', + 'pendingRenew', + 'pendingTransfer', + 'pendingUpdate', + 'serverManualInzone', + 'serverRegistrantChangeProhibited', + 'serverAdminChangeProhibited', + 'serverTechChangeProhibited', + 'forceDelete', + 'deleteCandidate', + ] + } + + puts "\nDomain status can be with other statuses map\n" + puts "---------------------------------------------" + statuses.each do |s,v| + puts "\n#{s} =>" + statuses[s].map { |u| puts " #{u}" } + puts + end + + contact_statuses = { + 'ok': [ + 'linked' + ], + 'linked': [ + 'ok' + ], + 'clientDeleteProhibited': [ + 'linked', + 'serverDeleteProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + 'pendingCreate', + 'pendingTransfer', + 'pendingUpdate', + ], + 'serverDeleteProhibited': [ + 'linked', + 'clientDeleteProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + 'pendingCreate', + 'pendingTransfer', + 'pendingUpdate', + ], + 'clientTransferProhibited': [ + 'linked', + 'serverDeleteProhibited', + 'clientDeleteProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + 'pendingCreate', + 'pendingDelete', + 'pendingUpdate', + ], + 'serverTransferProhibited': [ + 'linked', + 'serverDeleteProhibited', + 'clientDeleteProhibited', + 'clientTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + 'pendingCreate', + 'pendingDelete', + 'pendingUpdate', + ], + 'clientUpdateProhibited': [ + 'linked', + 'serverDeleteProhibited', + 'clientDeleteProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'serverUpdateProhibited', + 'pendingCreate', + 'pendingDelete', + 'pendingTransfer', + ], + 'serverUpdateProhibited': [ + 'linked', + 'serverDeleteProhibited', + 'clientDeleteProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'pendingCreate', + 'pendingDelete', + 'pendingTransfer', + ], + 'pendingCreate': [ + 'linked', + 'clientDeleteProhibited', + 'serverDeleteProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + ], + 'pendingDelete': [ + 'linked', + 'clientDeleteProhibited', + 'serverDeleteProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + ], + 'pendingTransfer': [ + 'linked', + 'clientDeleteProhibited', + 'serverDeleteProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + ], + 'pendingUpdate': [ + 'linked', + 'clientDeleteProhibited', + 'serverDeleteProhibited', + 'clientTransferProhibited', + 'serverTransferProhibited', + 'clientUpdateProhibited', + 'serverUpdateProhibited', + ], + } + + puts "\n\nContact status can be with other statuses map\n" + puts "---------------------------------------------" + contact_statuses.each do |s,v| + puts "\n#{s} =>" + contact_statuses[s].map { |u| puts " #{u}" } + puts + end +end