From d0e1eff53290930271a2999e7896eeb31a898222 Mon Sep 17 00:00:00 2001 From: lalo Date: Tue, 30 Apr 2019 17:39:27 +0200 Subject: [PATCH] Add description field to administrator users like evaluators description --- .../admin/administrators_controller.rb | 18 ++++++++ app/helpers/admin_helper.rb | 4 +- app/models/abilities/administrator.rb | 2 +- app/models/administrator.rb | 10 +++++ app/views/admin/administrators/edit.html.erb | 15 +++++++ app/views/admin/administrators/index.html.erb | 10 ++++- .../_select_investment.html.erb | 6 +-- .../admin/budget_investments/edit.html.erb | 2 +- config/locales/en/admin.yml | 4 ++ config/locales/es/activerecord.yml | 2 + config/locales/es/admin.yml | 4 ++ config/routes/admin.rb | 2 +- ...150724_add_description_to_administrator.rb | 5 +++ db/schema.rb | 1 + spec/features/admin/administrators_spec.rb | 18 +++++++- .../features/admin/budget_investments_spec.rb | 14 ++++-- spec/models/administrator_spec.rb | 45 +++++++++++++++++++ 17 files changed, 149 insertions(+), 13 deletions(-) create mode 100644 app/views/admin/administrators/edit.html.erb create mode 100644 db/migrate/20190314150724_add_description_to_administrator.rb create mode 100644 spec/models/administrator_spec.rb diff --git a/app/controllers/admin/administrators_controller.rb b/app/controllers/admin/administrators_controller.rb index 3467ee0c0..5e423be81 100644 --- a/app/controllers/admin/administrators_controller.rb +++ b/app/controllers/admin/administrators_controller.rb @@ -28,4 +28,22 @@ class Admin::AdministratorsController < Admin::BaseController redirect_to admin_administrators_path end + + def edit + end + + def update + if @administrator.update(update_administrator_params) + notice = t("admin.administrators.form.updated") + redirect_to admin_administrators_path, notice: notice + else + render :edit + end + end + + private + + def update_administrator_params + params.require(:administrator).permit(:description) + end end diff --git a/app/helpers/admin_helper.rb b/app/helpers/admin_helper.rb index e0dc3834f..bad9af389 100644 --- a/app/helpers/admin_helper.rb +++ b/app/helpers/admin_helper.rb @@ -77,7 +77,9 @@ module AdminHelper end def admin_select_options - Administrator.all.order("users.username asc").includes(:user).collect { |v| [ v.name, v.id ] } + Administrator.with_user + .collect { |v| [ v.description_or_name, v.id ] } + .sort_by { |a| a[0] } end def admin_submit_action(resource) diff --git a/app/models/abilities/administrator.rb b/app/models/abilities/administrator.rb index c37e06f65..c0e723fff 100644 --- a/app/models/abilities/administrator.rb +++ b/app/models/abilities/administrator.rb @@ -51,7 +51,7 @@ module Abilities can :comment_as_administrator, [Debate, Comment, Proposal, Poll::Question, Budget::Investment, Legislation::Question, Legislation::Proposal, Legislation::Annotation, Topic] - can [:search, :create, :index, :destroy], ::Administrator + can [:search, :create, :index, :destroy, :edit, :update], ::Administrator can [:search, :create, :index, :destroy], ::Moderator can [:search, :show, :edit, :update, :create, :index, :destroy, :summary], ::Valuator can [:search, :create, :index, :destroy], ::Manager diff --git a/app/models/administrator.rb b/app/models/administrator.rb index b8b6cc1c0..1c5cb027a 100644 --- a/app/models/administrator.rb +++ b/app/models/administrator.rb @@ -3,4 +3,14 @@ class Administrator < ApplicationRecord delegate :name, :email, :name_and_email, to: :user validates :user_id, presence: true, uniqueness: true + + scope :with_user, -> { includes(:user) } + + def description_or_name + description.presence || name + end + + def description_or_name_and_email + "#{description_or_name} (#{email})" + end end diff --git a/app/views/admin/administrators/edit.html.erb b/app/views/admin/administrators/edit.html.erb new file mode 100644 index 000000000..e9374ee78 --- /dev/null +++ b/app/views/admin/administrators/edit.html.erb @@ -0,0 +1,15 @@ +<%= back_link_to admin_administrators_path %> + +

<%= t("admin.administrators.form.edit_title") %>

+ +
+ <%= @administrator.name %>
+ <%= @administrator.email %> +
+ +
+ <%= form_for [:admin, @administrator] do |f| %> + <%= f.text_field :description %> + <%= f.submit class: "button success" %> + <% end %> +
diff --git a/app/views/admin/administrators/index.html.erb b/app/views/admin/administrators/index.html.erb index c727114bf..469905279 100644 --- a/app/views/admin/administrators/index.html.erb +++ b/app/views/admin/administrators/index.html.erb @@ -11,6 +11,7 @@ <%= t("admin.administrators.index.id") %> <%= t("admin.administrators.index.name") %> <%= t("admin.administrators.index.email") %> + <%= t("admin.administrators.index.description") %> <%= t("admin.shared.actions") %> <% @administrators.each do |administrator| %> @@ -24,13 +25,18 @@ <%= administrator.email %> + + <%= administrator.description %> + <% if administrator.persisted? %> + <%= link_to t("admin.actions.edit"), + edit_admin_administrator_path(administrator), + class: "button hollow" %> <%= link_to t("admin.administrators.administrator.delete"), admin_administrator_path(administrator), method: :delete, - class: "button hollow alert expanded" - %> + class: "button hollow alert" %> <% else %> <%= link_to t("admin.administrators.administrator.add"), { controller: "admin/administrators", action: :create, diff --git a/app/views/admin/budget_investments/_select_investment.html.erb b/app/views/admin/budget_investments/_select_investment.html.erb index 788d9824b..2da7a3817 100644 --- a/app/views/admin/budget_investments/_select_investment.html.erb +++ b/app/views/admin/budget_investments/_select_investment.html.erb @@ -13,9 +13,9 @@ <% if investment.administrator.present? %> - "> - <%= investment.administrator.name %> - + "> + <%= investment.administrator.description_or_name %> + <% else %> <%= t("admin.budget_investments.index.no_admin_assigned") %> <% end %> diff --git a/app/views/admin/budget_investments/edit.html.erb b/app/views/admin/budget_investments/edit.html.erb index 20e3c5e56..8d2ff842f 100644 --- a/app/views/admin/budget_investments/edit.html.erb +++ b/app/views/admin/budget_investments/edit.html.erb @@ -46,7 +46,7 @@
<%= f.select(:administrator_id, - @admins.collect{ |a| [a.name_and_email, a.id ] }, + @admins.collect{ |a| [a.description_or_name_and_email, a.id ] }, { include_blank: t("admin.budget_investments.edit.undefined") }) %>
diff --git a/config/locales/en/admin.yml b/config/locales/en/admin.yml index e3c5c597b..0ad7312e9 100644 --- a/config/locales/en/admin.yml +++ b/config/locales/en/admin.yml @@ -728,6 +728,7 @@ en: title: Administrators name: Name email: Email + description: Description id: Administrator ID no_administrators: There are no administrators. administrator: @@ -736,6 +737,9 @@ en: restricted_removal: "Sorry, you can't remove yourself from the administrators" search: title: "Administrators: User search" + form: + edit_title: "Edit administrator" + updated: "Administrator updated successfully" moderators: index: title: Moderators diff --git a/config/locales/es/activerecord.yml b/config/locales/es/activerecord.yml index e3bd118f7..4e5b8acd8 100644 --- a/config/locales/es/activerecord.yml +++ b/config/locales/es/activerecord.yml @@ -126,6 +126,8 @@ es: one: Enlace other: Enlaces attributes: + administrator: + description: Descripción budget: name: "Nombre" description_accepting: "Descripción durante la fase de presentación de proyectos" diff --git a/config/locales/es/admin.yml b/config/locales/es/admin.yml index 34fc7510b..291051a9d 100644 --- a/config/locales/es/admin.yml +++ b/config/locales/es/admin.yml @@ -727,6 +727,7 @@ es: title: Administradores name: Nombre email: Email + description: Descripción id: ID de Administrador no_administrators: No hay administradores. administrator: @@ -735,6 +736,9 @@ es: restricted_removal: "Lo sentimos, no puedes eliminarte a ti mismo de la lista" search: title: "Administradores: Búsqueda de usuarios" + form: + edit_title: "Editar administrador" + updated: "Administrador actualizado correctamente" moderators: index: title: Moderadores diff --git a/config/routes/admin.rb b/config/routes/admin.rb index 39ed9b44b..148138d61 100644 --- a/config/routes/admin.rb +++ b/config/routes/admin.rb @@ -106,7 +106,7 @@ namespace :admin do get :search, on: :collection end - resources :administrators, only: [:index, :create, :destroy] do + resources :administrators, only: [:index, :create, :destroy, :edit, :update] do get :search, on: :collection end diff --git a/db/migrate/20190314150724_add_description_to_administrator.rb b/db/migrate/20190314150724_add_description_to_administrator.rb new file mode 100644 index 000000000..d2058bb7f --- /dev/null +++ b/db/migrate/20190314150724_add_description_to_administrator.rb @@ -0,0 +1,5 @@ +class AddDescriptionToAdministrator < ActiveRecord::Migration + def change + add_column :administrators, :description, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 5178cec3c..8f83dfffb 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -67,6 +67,7 @@ ActiveRecord::Schema.define(version: 20190429125842) do create_table "administrators", force: :cascade do |t| t.integer "user_id" + t.string "description" t.index ["user_id"], name: "index_administrators_on_user_id", using: :btree end diff --git a/spec/features/admin/administrators_spec.rb b/spec/features/admin/administrators_spec.rb index a782e39d3..3ba76eaac 100644 --- a/spec/features/admin/administrators_spec.rb +++ b/spec/features/admin/administrators_spec.rb @@ -3,7 +3,7 @@ require "rails_helper" describe "Admin administrators" do let!(:admin) { create(:administrator) } let!(:user) { create(:user, username: "Jose Luis Balbin") } - let!(:user_administrator) { create(:administrator) } + let!(:user_administrator) { create(:administrator, description: "admin_alias") } before do login_as(admin.user) @@ -14,6 +14,7 @@ describe "Admin administrators" do expect(page).to have_content user_administrator.id expect(page).to have_content user_administrator.name expect(page).to have_content user_administrator.email + expect(page).to have_content user_administrator.description expect(page).not_to have_content user.name end @@ -100,4 +101,19 @@ describe "Admin administrators" do end end + context "Edit" do + let!(:administrator1) { create(:administrator, user: create(:user, + username: "Bernard Sumner", + email: "bernard@sumner.com")) } + + scenario "admin can edit administrator1" do + visit(edit_admin_administrator_path(administrator1)) + fill_in "administrator_description", with: "Admin Alias" + click_button "Update Administrator" + + expect(page).to have_content("Administrator updated successfully") + expect(page).to have_content("Admin Alias") + end + end + end diff --git a/spec/features/admin/budget_investments_spec.rb b/spec/features/admin/budget_investments_spec.rb index 8dd9743d3..ed96e7140 100644 --- a/spec/features/admin/budget_investments_spec.rb +++ b/spec/features/admin/budget_investments_spec.rb @@ -149,8 +149,9 @@ describe "Admin budget investments" do scenario "Filtering by admin", :js do user = create(:user, username: "Admin 1") + user2 = create(:user, username: "Admin 2") administrator = create(:administrator, user: user) - + create(:administrator, user: user2, description: "Alias") create(:budget_investment, title: "Realocate visitors", budget: budget, administrator: administrator) create(:budget_investment, title: "Destroy the city", budget: budget) @@ -166,6 +167,13 @@ describe "Admin budget investments" do expect(page).not_to have_link("Destroy the city") expect(page).to have_link("Realocate visitors") + select "Alias", from: "administrator_id" + click_button "Filter" + + expect(page).to have_content("There are no investment projects") + expect(page).not_to have_link("Destroy the city") + expect(page).not_to have_link("Realocate visitors") + select "All administrators", from: "administrator_id" click_button "Filter" @@ -1066,12 +1074,12 @@ describe "Admin budget investments" do scenario "Add administrator" do budget_investment = create(:budget_investment) user = create(:user, username: "Marta", email: "marta@admins.org") - create(:administrator, user: user) + create(:administrator, user: user, description: "Marta desc") visit admin_budget_budget_investment_path(budget_investment.budget, budget_investment) click_link "Edit classification" - select "Marta (marta@admins.org)", from: "budget_investment[administrator_id]" + select "Marta desc (marta@admins.org)", from: "budget_investment[administrator_id]" click_button "Update" expect(page).to have_content "Investment project updated succesfully." diff --git a/spec/models/administrator_spec.rb b/spec/models/administrator_spec.rb new file mode 100644 index 000000000..39b740980 --- /dev/null +++ b/spec/models/administrator_spec.rb @@ -0,0 +1,45 @@ +require "rails_helper" + +describe Administrator do + + describe "#description_or_name" do + let!(:user) { create(:user, username: "Billy Wilder" )} + + it "returns description if present" do + administrator = create(:administrator, user: user, description: "John Doe") + + expect(administrator.description_or_name).to eq("John Doe") + end + + it "returns name if description is nil" do + administrator = create(:administrator, user: user) + + expect(administrator.description_or_name).to eq("Billy Wilder") + end + + it "returns name if description is blank" do + administrator = create(:administrator, description: "") + + expect(administrator.description_or_name).to eq(administrator.name) + end + end + + describe "#description_or_name_and_email" do + let!(:user) { create(:user, username: "Billy Wilder", email: "test@test.com")} + + it "returns description and email if decription present" do + administrator = create(:administrator, + description: "John Doe", + user: user) + + expect(administrator.description_or_name_and_email).to eq("John Doe (test@test.com)") + end + + it "returns name and email if description is not present" do + administrator = create(:administrator, user: user) + + expect(administrator.description_or_name_and_email).to eq("Billy Wilder (test@test.com)") + end + end + +end