diff --git a/Gemfile.lock b/Gemfile.lock
index 60af34f06..32d697aca 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -436,6 +436,3 @@ DEPENDENCIES
uglifier (>= 1.3.0)
unicorn
web-console (~> 2.0)
-
-BUNDLED WITH
- 1.10.6
diff --git a/app/controllers/admin/moderators_controller.rb b/app/controllers/admin/moderators_controller.rb
new file mode 100644
index 000000000..f2ef6f1c3
--- /dev/null
+++ b/app/controllers/admin/moderators_controller.rb
@@ -0,0 +1,33 @@
+class Admin::ModeratorsController < Admin::BaseController
+
+ load_and_authorize_resource
+
+ def index
+ @moderators = @moderators.page(params[:page])
+ end
+
+ def search
+ @user = User.find_by(email: params[:email])
+
+ respond_to do |format|
+ if @user
+ @moderator = Moderator.find_or_initialize_by(user: @user)
+ format.js
+ else
+ format.js { render "user_not_found" }
+ end
+ end
+ end
+
+ def destroy
+ @moderator.destroy
+ redirect_to admin_moderators_path
+ end
+
+ def create
+ @moderator.user_id = params[:user_id]
+ @moderator.save
+
+ redirect_to admin_moderators_path
+ end
+end
diff --git a/app/models/ability.rb b/app/models/ability.rb
index e931d037f..d8436a700 100644
--- a/app/models/ability.rb
+++ b/app/models/ability.rb
@@ -90,6 +90,8 @@ class Ability
cannot :confirm_hide, User, hidden_at: nil
can :comment_as_administrator, [Debate, Comment]
+
+ can :manage, Moderator
end
end
end
diff --git a/app/views/admin/_menu.html.erb b/app/views/admin/_menu.html.erb
index a76ecfe0f..80744f635 100644
--- a/app/views/admin/_menu.html.erb
+++ b/app/views/admin/_menu.html.erb
@@ -46,7 +46,14 @@
<% end %>
-
>
+ >
+ <%= link_to admin_moderators_path do %>
+
+ <%= t('admin.menu.moderators') %>
+ <% end %>
+
+
+ >
<%= link_to admin_settings_path do %>
<%= t("admin.menu.settings") %>
diff --git a/app/views/admin/moderators/_moderator.html.erb b/app/views/admin/moderators/_moderator.html.erb
new file mode 100644
index 000000000..00fd9c602
--- /dev/null
+++ b/app/views/admin/moderators/_moderator.html.erb
@@ -0,0 +1,13 @@
+<%= moderator.name %>
+ •
+<%= moderator.email %>
+<% if moderator.persisted? %>
+ <%= link_to t('admin.moderators.moderator.delete'),
+ admin_moderator_path(moderator),
+ method: :delete,
+ class: "button tiny radius alert right"
+ %>
+<% else %>
+ <%= link_to t('admin.moderators.moderator.add'),{ controller: "admin/moderators", action: :create, user_id: moderator.user_id },
+ method: :post, class: "button tiny radius success right" %>
+<% end %>
diff --git a/app/views/admin/moderators/index.html.erb b/app/views/admin/moderators/index.html.erb
new file mode 100644
index 000000000..cf3855d05
--- /dev/null
+++ b/app/views/admin/moderators/index.html.erb
@@ -0,0 +1,24 @@
+<%= t("admin.moderators.index.title") %>
+
+
+ <%= form_tag search_admin_moderators_path, method: :get, remote: true do %>
+
+ <%= text_field_tag :email, '', placeholder: t('admin.moderators.search.email_placeholder') %>
+
+
+ <%= submit_tag t('admin.moderators.search.search'), class: 'button radius' %>
+
+ <% end %>
+
+
+
+<%= page_entries_info @moderators %>
+
+ <% @moderators.each do |moderator| %>
+ -
+ <%= render 'moderator', moderator: moderator %>
+
+ <% end %>
+
+
+<%= paginate @moderators %>
diff --git a/app/views/admin/moderators/search.js.erb b/app/views/admin/moderators/search.js.erb
new file mode 100644
index 000000000..5b8a61207
--- /dev/null
+++ b/app/views/admin/moderators/search.js.erb
@@ -0,0 +1 @@
+$("#search-result").html("<%= j render 'moderator', moderator: @moderator %>
");
diff --git a/app/views/admin/moderators/user_not_found.js.erb b/app/views/admin/moderators/user_not_found.js.erb
new file mode 100644
index 000000000..a3f86936c
--- /dev/null
+++ b/app/views/admin/moderators/user_not_found.js.erb
@@ -0,0 +1 @@
+$("#search-result").html("<%= j t('admin.moderators.search.user_not_found') %>
");
diff --git a/config/locales/admin.en.yml b/config/locales/admin.en.yml
index 7a7f8f342..2f1606719 100644
--- a/config/locales/admin.en.yml
+++ b/config/locales/admin.en.yml
@@ -16,6 +16,7 @@ en:
hidden_users: Hidden users
organizations: Organizations
officials: Officials
+ moderators: Moderators
stats: Statistics
organizations:
index:
@@ -95,3 +96,14 @@ en:
flash:
official_updated: 'Official position saved!'
official_destroyed: 'User is not an official anymore'
+ moderators:
+ index:
+ title: Moderators
+ search:
+ email_placeholder: 'Search user by email'
+ search: Search
+ user_not_found: 'User not found'
+ moderator:
+ delete: Delete
+ add: Add
+
diff --git a/config/locales/admin.es.yml b/config/locales/admin.es.yml
index 2e9dffe03..923b87925 100644
--- a/config/locales/admin.es.yml
+++ b/config/locales/admin.es.yml
@@ -16,6 +16,7 @@ es:
hidden_users: Usuarios ocultos
organizations: Organizaciones
officials: Cargos públicos
+ moderators: Moderadores
stats: Estadísticas
organizations:
index:
@@ -95,3 +96,13 @@ es:
flash:
official_updated: 'Datos del cargo público guardados'
official_destroyed: 'Datos guardados: el usuario ya no es cargo público'
+ moderators:
+ index:
+ title: Moderadores
+ search:
+ email_placeholder: 'Buscar usuario por email'
+ search: Buscar
+ user_not_found: 'Usuario no encontrado'
+ moderator:
+ delete: Borrar
+ add: Añadir
diff --git a/config/routes.rb b/config/routes.rb
index 2e6a23cb7..0cb6c8438 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -87,6 +87,9 @@ Rails.application.routes.draw do
end
resources :settings, only: [:index, :update]
+ resources :moderators, only: [:index, :create, :destroy] do
+ collection { get :search }
+ end
end
namespace :moderation do
diff --git a/spec/features/admin/moderators_spec.rb b/spec/features/admin/moderators_spec.rb
new file mode 100644
index 000000000..bdbd23b05
--- /dev/null
+++ b/spec/features/admin/moderators_spec.rb
@@ -0,0 +1,36 @@
+require 'rails_helper'
+
+feature 'Admin moderators' do
+ background do
+ @user = create(:user, username: 'Jose Luis Balbin')
+ @moderator = create(:moderator)
+ @admin = create(:administrator)
+ login_as(@admin.user)
+ end
+
+ scenario 'Index' do
+ visit admin_moderators_path
+ expect(page).to have_content @moderator.name
+ expect(page).to have_content @moderator.email
+ expect(page).to_not have_content @user.name
+ end
+
+ scenario 'Create Moderator', :js do
+ visit admin_moderators_path
+ fill_in 'email', with: @user.email
+ click_button 'Search'
+
+ expect(page).to have_content @user.name
+ click_link 'Add'
+
+ expect(page).to have_content @user.name
+ end
+
+ scenario 'Delete Moderator' do
+ visit admin_moderators_path
+ click_link 'Delete'
+
+ expect(page).to_not have_content @moderator.name
+ end
+end
+