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/contacts_controller.rb b/app/controllers/admin/contacts_controller.rb
index a8a062af8..1388db636 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(
+ "contacts.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,21 @@ 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)
+ # 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
+
+ yield
+
+ params[:q][:created_at_lteq] = ca_cache
+ end
end
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/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/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/domain.rb b/app/models/domain.rb
index 9ed9afde4..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)
@@ -570,12 +571,23 @@ 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)
+ 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/MethodLength
# rubocop:enable Metrics/AbcSize
def unset_force_delete
diff --git a/app/models/mail_template.rb b/app/models/mail_template.rb
new file mode 100644
index 000000000..ee693a0a3
--- /dev/null
+++ b/app/models/mail_template.rb
@@ -0,0 +1,3 @@
+class MailTemplate < ActiveRecord::Base
+ validates :name, :subject, :from, :body, :text_body, presence: true
+end
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/app/views/admin/contacts/index.haml b/app/views/admin/contacts/index.haml
index a633c86eb..b8e7850e6 100644
--- a/app/views/admin/contacts/index.haml
+++ b/app/views/admin/contacts/index.haml
@@ -2,16 +2,75 @@
.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
+ = 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
+ = 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-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)
+ .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)
+ .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
+ = 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-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
@@ -26,7 +85,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
@@ -35,11 +94,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))
+ = 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/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/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/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
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
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 389616dff..5bd4c0f63 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'
@@ -911,3 +910,10 @@ en:
pending_epp: Pending epp
id: ID
hidden: '[hidden]'
+ 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}'
+ 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..ab956f5ed
--- /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 null: false
+ 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..79739bb06 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", null: false
+ t.datetime "updated_at", null: false
+ 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..74cddb0e9 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 NOT NULL,
+ updated_at timestamp without time zone NOT NULL
+);
+
+
+--
+-- 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,5 @@ INSERT INTO schema_migrations (version) VALUES ('20150803080914');
INSERT INTO schema_migrations (version) VALUES ('20150810114746');
+INSERT INTO schema_migrations (version) VALUES ('20150825125118');
+
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)
+
+
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
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 e88bb3a6e..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')
@@ -3096,5 +3103,13 @@ 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)
+ msg_q = response[:parsed].css('msgQ')
+ msg_q.css('msg').text.should == "Force delete set on domain #{domain.name}"
+ end
end
end
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/contact_spec.rb b/spec/features/admin/contact_spec.rb
index 2d5936266..6edaaf2d1 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
+ 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
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/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
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 6aad6246d..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) }
@@ -224,6 +232,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']
@@ -253,7 +265,6 @@ describe Domain do
"forceDelete",
"pendingDelete",
"serverHold",
- "serverManualInzone",
"serverRenewProhibited",
"serverTransferProhibited",
"serverUpdateProhibited"
@@ -570,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)