From d286a67cc0e73e04cd944f8584ef78140ea9b600 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Mon, 15 Sep 2014 17:27:48 +0300 Subject: [PATCH] Add validation --- .../admin/admin_contacts_controller.rb | 48 +++++++++++++++++++ .../admin/tech_contacts_controller.rb | 2 +- app/models/domain.rb | 6 +++ app/views/admin/admin_contacts/new.haml | 22 +++++++++ .../domains/partials/_admin_contacts.haml | 8 +++- app/views/admin/tech_contacts/new.haml | 4 +- config/locales/en.yml | 2 + config/routes.rb | 1 + 8 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 app/controllers/admin/admin_contacts_controller.rb create mode 100644 app/views/admin/admin_contacts/new.haml diff --git a/app/controllers/admin/admin_contacts_controller.rb b/app/controllers/admin/admin_contacts_controller.rb new file mode 100644 index 000000000..48bbc0c05 --- /dev/null +++ b/app/controllers/admin/admin_contacts_controller.rb @@ -0,0 +1,48 @@ +class Admin::AdminContactsController < ApplicationController + before_action :set_domain + before_action :set_contact, only: [:destroy] + + def new; end + + def create + contact = Contact.find_by(id: params[:contact_id]) + unless contact + flash.now[:alert] = I18n.t('shared.contact_was_not_found') + render 'new' and return + end + + if @domain.admin_contacts.exists?(contact) + flash.now[:alert] = I18n.t('shared.contact_already_exists') + render 'new' and return + end + + @domain.admin_contacts << contact + flash[:notice] = I18n.t('shared.contact_added') + redirect_to [:admin, @domain] + end + + def destroy + unless @domain.can_remove_admin_contact? + flash[:alert] = @domain.errors[:admin_contacts].first + redirect_to [:admin, @domain] and return + end + + if @domain.admin_contacts.delete(@contact) + flash[:notice] = I18n.t('shared.contact_detached') + else + flash[:alert] = I18n.t('shared.failed_to_detach_contact') + end + + redirect_to [:admin, @domain] + end + + private + + def set_domain + @domain = Domain.find(params[:domain_id]) + end + + def set_contact + @contact = Contact.find(params[:id]) + end +end diff --git a/app/controllers/admin/tech_contacts_controller.rb b/app/controllers/admin/tech_contacts_controller.rb index f80554dbe..9c9f3a5d7 100644 --- a/app/controllers/admin/tech_contacts_controller.rb +++ b/app/controllers/admin/tech_contacts_controller.rb @@ -5,7 +5,7 @@ class Admin::TechContactsController < ApplicationController def new; end def create - contact = Contact.find_by(id: params[:tech_contact_id]) + contact = Contact.find_by(id: params[:contact_id]) unless contact flash.now[:alert] = I18n.t('shared.contact_was_not_found') diff --git a/app/models/domain.rb b/app/models/domain.rb index d729ceaee..87e038c1d 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -64,6 +64,12 @@ class Domain < ActiveRecord::Base false end + def can_remove_admin_contact? + return true if admin_contacts.length > 1 + errors.add(:admin_contacts, :less_than_or_equal_to, { count: 1 }) + false + end + def validate_nameservers_count sg = SettingGroup.domain_validation min, max = sg.setting(:ns_min_count).value.to_i, sg.setting(:ns_max_count).value.to_i diff --git a/app/views/admin/admin_contacts/new.haml b/app/views/admin/admin_contacts/new.haml new file mode 100644 index 000000000..9cc28b656 --- /dev/null +++ b/app/views/admin/admin_contacts/new.haml @@ -0,0 +1,22 @@ +.row + .col-sm-6 + %h2.text-center-xs + = "#{t('shared.new_admin_contact')}" + .col-sm-6 + %h2.text-right.text-center-xs + = link_to(t('shared.back_to_domain'), [:admin, @domain], class: 'btn btn-default') +%hr += form_tag(admin_domain_admin_contacts_path(@domain)) do |f| + .row + .col-md-12 + .form-group.has-feedback + .form-group.has-feedback + = label_tag :tech_contact + = text_field_tag(:domain_contact, params[:domain_contact], class: 'form-control js-contact-typeahead', placeholder: t('shared.contact_code'), autocomplete: 'off') + %span.glyphicon.glyphicon-ok.form-control-feedback.js-typeahead-ok.hidden + %span.glyphicon.glyphicon-remove.form-control-feedback.js-typeahead-remove + = hidden_field_tag(:contact_id, params[:contact_id], class: 'js-contact-id') + .row + .col-md-12.text-right + = button_tag(t('shared.save'), class: 'btn btn-primary') + diff --git a/app/views/admin/domains/partials/_admin_contacts.haml b/app/views/admin/domains/partials/_admin_contacts.haml index bb9c5c796..f8fda3b9c 100644 --- a/app/views/admin/domains/partials/_admin_contacts.haml +++ b/app/views/admin/domains/partials/_admin_contacts.haml @@ -1,6 +1,10 @@ - panel_class = @domain.errors.messages[:admin_contacts] ? 'panel-danger' : 'panel-default' .panel{class: panel_class} - .panel-heading= t('shared.admin_contacts') + .panel-heading.clearfix + .pull-left + = t('shared.admin_contacts') + .pull-right + = link_to(t('shared.add'), new_admin_domain_admin_contact_path(@domain), class: 'btn btn-primary btn-xs') .table-responsive %table.table.table-hover.table-bordered.table-condensed %thead @@ -15,7 +19,7 @@ %td= x.email %td = link_to(t('shared.edit'), root_path, class: 'btn btn-primary btn-xs') - = link_to(t('shared.detach'), root_path, method: :delete, data: { confirm: t('shared.are_you_sure') }, class: 'btn btn-warning btn-xs') + = link_to(t('shared.detach'), admin_domain_admin_contact_path(@domain, x), method: :delete, data: { confirm: t('shared.are_you_sure') }, class: 'btn btn-warning btn-xs') - if @domain.errors.messages[:admin_contacts] %tfoot - @domain.errors.messages[:admin_contacts].each do |x| diff --git a/app/views/admin/tech_contacts/new.haml b/app/views/admin/tech_contacts/new.haml index a513c8408..245f3a943 100644 --- a/app/views/admin/tech_contacts/new.haml +++ b/app/views/admin/tech_contacts/new.haml @@ -12,10 +12,10 @@ .form-group.has-feedback .form-group.has-feedback = label_tag :tech_contact - = text_field_tag(:domain_tech_contact, params[:domain_tech_contact], class: 'form-control js-contact-typeahead', placeholder: t('shared.contact_code'), autocomplete: 'off') + = text_field_tag(:domain_contact, params[:domain_contact], class: 'form-control js-contact-typeahead', placeholder: t('shared.contact_code'), autocomplete: 'off') %span.glyphicon.glyphicon-ok.form-control-feedback.js-typeahead-ok.hidden %span.glyphicon.glyphicon-remove.form-control-feedback.js-typeahead-remove - = hidden_field_tag(:tech_contact_id, params[:tech_contact_id], class: 'js-contact-id') + = hidden_field_tag(:contact_id, params[:contact_id], class: 'js-contact-id') .row .col-md-12.text-right = button_tag(t('shared.save'), class: 'btn btn-primary') diff --git a/config/locales/en.yml b/config/locales/en.yml index 973928625..f95e70976 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -80,6 +80,8 @@ en: not_found: 'Contact was not found' admin_contacts: out_of_range: 'Admin contacts count must be between 1 - infinity' + less_than_or_equal_to: 'Admin contacts count must be less than or equal to %{count}' + greater_than_or_equal_to: 'Admin contacts count must be greater than or equal to %{count}' nameservers: invalid: 'Nameserver is invalid' out_of_range: 'Nameservers count must be between %{min}-%{max}' diff --git a/config/routes.rb b/config/routes.rb index d9ff89b0f..72f71747e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -9,6 +9,7 @@ Rails.application.routes.draw do resources :domains do resources :nameservers resources :tech_contacts + resources :admin_contacts end resources :setting_groups