diff --git a/app/controllers/admin/administrators_controller.rb b/app/controllers/admin/administrators_controller.rb
new file mode 100644
index 000000000..938a7570d
--- /dev/null
+++ b/app/controllers/admin/administrators_controller.rb
@@ -0,0 +1,37 @@
+class Admin::AdministratorsController < Admin::BaseController
+ load_and_authorize_resource
+
+ def index
+ @administrators = @administrators.page(params[:page])
+ end
+
+ def search
+ @user = User.find_by(email: params[:email])
+
+ respond_to do |format|
+ if @user
+ @administrator = Administrator.find_or_initialize_by(user: @user)
+ format.js
+ else
+ format.js { render "user_not_found" }
+ end
+ end
+ end
+
+ def create
+ @administrator.user_id = params[:user_id]
+ @administrator.save
+
+ redirect_to admin_administrators_path
+ end
+
+ def destroy
+ if current_user.id == @administrator.user_id
+ flash[:error] = I18n.t("admin.administrators.administrator.restricted_removal")
+ else
+ @administrator.destroy
+ end
+
+ redirect_to admin_administrators_path
+ end
+end
diff --git a/app/helpers/admin_helper.rb b/app/helpers/admin_helper.rb
index 3f0d4db4b..8ca439a1c 100644
--- a/app/helpers/admin_helper.rb
+++ b/app/helpers/admin_helper.rb
@@ -29,7 +29,7 @@ module AdminHelper
end
def menu_profiles?
- ["organizations", "officials", "moderators", "valuators", "managers"].include? controller_name
+ ["administrators", "organizations", "officials", "moderators", "valuators", "managers"].include? controller_name
end
def menu_banners?
diff --git a/app/models/abilities/administrator.rb b/app/models/abilities/administrator.rb
index 8df52e6eb..f2fe7aed9 100644
--- a/app/models/abilities/administrator.rb
+++ b/app/models/abilities/administrator.rb
@@ -34,6 +34,7 @@ module Abilities
can :comment_as_administrator, [Debate, Comment, Proposal, Poll::Question, Budget::Investment]
+ can [:search, :create, :index, :destroy], ::Administrator
can [:search, :create, :index, :destroy], ::Moderator
can [:search, :create, :index, :summary], ::Valuator
can [:search, :create, :index, :destroy], ::Manager
diff --git a/app/views/admin/_menu.html.erb b/app/views/admin/_menu.html.erb
index 43c53df36..3499cd345 100644
--- a/app/views/admin/_menu.html.erb
+++ b/app/views/admin/_menu.html.erb
@@ -95,6 +95,10 @@
<%= t("admin.menu.title_profiles") %>
>
+ - >
+ <%= link_to t("admin.menu.administrators"), admin_administrators_path %>
+
+
- >
<%= link_to t("admin.menu.organizations"), admin_organizations_path %>
diff --git a/app/views/admin/administrators/_administrator.html.erb b/app/views/admin/administrators/_administrator.html.erb
new file mode 100644
index 000000000..d948e1eed
--- /dev/null
+++ b/app/views/admin/administrators/_administrator.html.erb
@@ -0,0 +1,26 @@
+
+
+
+
+ |
+ <%= administrator.name %>
+ |
+
+ <%= administrator.email %>
+ |
+
+ <% if administrator.persisted? %>
+ <%= link_to t('admin.administrators.administrator.delete'),
+ admin_administrator_path(administrator),
+ method: :delete,
+ class: "button hollow alert" %>
+ <% else %>
+ <%= link_to t('admin.administrators.administrator.add'),{ controller: "admin/administrators", action: :create, user_id: administrator.user_id },
+ method: :post,
+ class: "button success" %>
+ <% end %>
+ |
+
+
+
+
diff --git a/app/views/admin/administrators/index.html.erb b/app/views/admin/administrators/index.html.erb
new file mode 100644
index 000000000..1cfbf5079
--- /dev/null
+++ b/app/views/admin/administrators/index.html.erb
@@ -0,0 +1,46 @@
+<%= t("admin.administrators.index.title") %>
+
+
+ <%= form_tag search_admin_administrators_path, method: :get, remote: true do %>
+
+ <%= text_field_tag :email, '', placeholder: t('admin.administrators.search.email_placeholder') %>
+
+
+ <%= submit_tag t('admin.administrators.search.search'), class: 'button' %>
+
+ <% end %>
+
+
+
+
+<%= page_entries_info @administrators %>
+
+
+ <% @administrators.each do |administrator| %>
+
+ |
+ <%= administrator.name %>
+ |
+
+ <%= administrator.email %>
+ |
+
+ <% if administrator.persisted? %>
+ <%= link_to t('admin.administrators.administrator.delete'),
+ admin_administrator_path(administrator),
+ method: :delete,
+ class: "button hollow alert"
+ %>
+ <% else %>
+ <%= link_to t('admin.administrators.administrator.add'),
+ { controller: "admin/administrators", action: :create,
+ user_id: administrator.user_id },
+ method: :post,
+ class: "button success" %>
+ <% end %>
+ |
+
+ <% end %>
+
+
+<%= paginate @administrators %>
diff --git a/app/views/admin/administrators/search.js.erb b/app/views/admin/administrators/search.js.erb
new file mode 100644
index 000000000..1c30d9595
--- /dev/null
+++ b/app/views/admin/administrators/search.js.erb
@@ -0,0 +1 @@
+$("#search-result").html("<%= j render 'administrator', administrator: @administrator %>");
diff --git a/app/views/admin/administrators/user_not_found.js.erb b/app/views/admin/administrators/user_not_found.js.erb
new file mode 100644
index 000000000..ba707fc9d
--- /dev/null
+++ b/app/views/admin/administrators/user_not_found.js.erb
@@ -0,0 +1 @@
+$("#search-result").html("<%= j t('admin.administrators.search.user_not_found') %>
");
diff --git a/config/locales/admin.en.yml b/config/locales/admin.en.yml
index 914ce0ed2..083787627 100755
--- a/config/locales/admin.en.yml
+++ b/config/locales/admin.en.yml
@@ -203,6 +203,7 @@ en:
hidden_debates: Hidden debates
hidden_proposals: Hidden proposals
hidden_users: Hidden users
+ administrators: Administrators
managers: Managers
moderators: Moderators
newsletter: Newsletters
@@ -227,6 +228,17 @@ en:
title_profiles: Profiles
title_banners: Banners
title_site_customization: Site customization
+ administrators:
+ index:
+ title: Administrators
+ administrator:
+ add: Add
+ delete: Delete
+ restricted_removal: "Sorry, you can't remove yourself from the administrators"
+ search:
+ email_placeholder: Search user by email
+ search: Search
+ user_not_found: User not found
moderators:
index:
title: Moderators
diff --git a/config/locales/admin.es.yml b/config/locales/admin.es.yml
index 5b18eb445..94e9f0494 100644
--- a/config/locales/admin.es.yml
+++ b/config/locales/admin.es.yml
@@ -181,6 +181,17 @@ es:
with_confirmed_hide: Confirmados
without_confirmed_hide: Pendientes
title: Debates ocultos
+ administrators:
+ index:
+ title: Administradores
+ administrator:
+ add: Añadir como Administrador
+ delete: Borrar
+ restricted_removal: "Lo sentimos, no puedes te eliminar a ti mismo de la lista"
+ search:
+ email_placeholder: Buscar usuario por email
+ search: Buscar
+ user_not_found: Usuario no encontrado
managers:
index:
title: Gestores
@@ -204,6 +215,7 @@ es:
hidden_proposals: Propuestas ocultas
hidden_users: Usuarios bloqueados
managers: Gestores
+ administrators: Administradores
moderators: Moderadores
newsletter: Envío de Newsletters
valuators: Evaluadores
diff --git a/config/routes.rb b/config/routes.rb
index c016cce56..ebd275353 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -207,6 +207,10 @@ Rails.application.routes.draw do
get :search, on: :collection
end
+ resources :administrators, only: [:index, :create, :destroy] do
+ get :search, on: :collection
+ end
+
scope module: :poll do
resources :polls do
get :search_questions, on: :member
diff --git a/spec/features/admin/administrators_spec.rb b/spec/features/admin/administrators_spec.rb
new file mode 100644
index 000000000..bef57b75d
--- /dev/null
+++ b/spec/features/admin/administrators_spec.rb
@@ -0,0 +1,45 @@
+require 'rails_helper'
+
+feature 'Admin administrators' do
+ background do
+ @admin = create(:administrator)
+ @user = create(:user, username: 'Jose Luis Balbin')
+ @administrator = create(:administrator)
+ login_as(@admin.user)
+ visit admin_administrators_path
+ end
+
+ scenario 'Index' do
+ expect(page).to have_content @administrator.name
+ expect(page).to have_content @administrator.email
+ expect(page).to_not have_content @user.name
+ end
+
+ scenario 'Create Administrator', :js do
+ fill_in 'email', with: @user.email
+ click_button 'Search'
+
+ expect(page).to have_content @user.name
+ click_link 'Add'
+ within("#administrators") do
+ expect(page).to have_content @user.name
+ end
+ end
+
+ scenario 'Delete Administrator' do
+ find(:xpath, "//tr[contains(.,'#{@administrator.name}')]/td/a", text: 'Delete').click
+
+ within("#administrators") do
+ expect(page).to_not have_content @administrator.name
+ end
+ end
+
+ scenario 'Delete Administrator when its the current user' do
+ find(:xpath, "//tr[contains(.,'#{@admin.name}')]/td/a", text: 'Delete').click
+
+ within("#error") do
+ expect(page).to have_content I18n.t("admin.administrators.administrator.restricted_removal")
+ end
+ end
+end
+