From ecb0041b7f0c54fd89fb7742fb796f13d5bea84e Mon Sep 17 00:00:00 2001 From: decabeza Date: Wed, 28 Mar 2018 01:39:55 +0200 Subject: [PATCH 01/21] Adds recommended index partial and styles --- app/assets/stylesheets/layout.scss | 54 ++++++++++++++++++-- app/views/shared/_recommended_index.html.erb | 29 +++++++++++ app/views/shared/_section_header.html.erb | 4 +- config/locales/en/general.yml | 4 ++ config/locales/es/general.yml | 4 ++ 5 files changed, 91 insertions(+), 4 deletions(-) create mode 100644 app/views/shared/_recommended_index.html.erb diff --git a/app/assets/stylesheets/layout.scss b/app/assets/stylesheets/layout.scss index e7e917be8..1a1ce6ddb 100644 --- a/app/assets/stylesheets/layout.scss +++ b/app/assets/stylesheets/layout.scss @@ -18,7 +18,7 @@ // 16. Flags // 17. Activity // 18. Banners -// 19. Recommended Section Home +// 19. Recommendations // 20. Documents // 21. Related content // 22. Images @@ -2261,8 +2261,8 @@ table { } } -// 19. Recommended Section Home -// ---------------------------- +// 19. Recommendations +// ------------------- .section-recommended { background: #fafafa; @@ -2404,6 +2404,54 @@ table { } } +.recommended-index { + background: #fafafa; + border-bottom: 1px solid #eee; + margin-bottom: $line-height; + margin-top: rem-calc(-25); + padding: $line-height 0; + + @include breakpoint(medium) { + padding-top: 0; + } + + h2 { + font-size: $small-font-size; + text-transform: uppercase; + } + + h3 { + font-size: $base-font-size; + margin-bottom: 0; + } + + a { + + &:hover { + text-decoration: none; + } + } + + .recommendation { + background: #fff; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.15); + display: block; + margin-bottom: $line-height / 4; + padding: $line-height / 2; + + &:hover { + box-shadow: 0 4px 6px 0 rgba(0, 0, 0, 0.15); + } + } +} + +.hide-recommendations { + color: $text-light; + position: absolute; + right: 12px; + top: rem-calc(-18); +} + // 20. Documents // ------------- diff --git a/app/views/shared/_recommended_index.html.erb b/app/views/shared/_recommended_index.html.erb new file mode 100644 index 000000000..17f6da2ca --- /dev/null +++ b/app/views/shared/_recommended_index.html.erb @@ -0,0 +1,29 @@ + diff --git a/app/views/shared/_section_header.html.erb b/app/views/shared/_section_header.html.erb index 9408b663e..6ae7580ce 100644 --- a/app/views/shared/_section_header.html.erb +++ b/app/views/shared/_section_header.html.erb @@ -3,7 +3,9 @@
<%= image_tag "help/help_icon_#{image}.png", alt: t("#{i18n_namespace}.icon_alt"), class: "align-top" %>

<%= t("#{i18n_namespace}.title") %>

- <%= link_to t("#{i18n_namespace}.help"), "#section_help", class: "float-right" %> +
+ <%= link_to t("#{i18n_namespace}.help"), "#section_help" %> +
diff --git a/config/locales/en/general.yml b/config/locales/en/general.yml index 406ca2dde..3916e2ba7 100644 --- a/config/locales/en/general.yml +++ b/config/locales/en/general.yml @@ -632,6 +632,10 @@ en: title: View mode cards: Cards list: List + recommended_index: + title: Recommendations + see_more: See more recommendations + hide: Hide recommendations social: blog: "%{org} Blog" facebook: "%{org} Facebook" diff --git a/config/locales/es/general.yml b/config/locales/es/general.yml index d01f67422..e9c83ac9e 100644 --- a/config/locales/es/general.yml +++ b/config/locales/es/general.yml @@ -631,6 +631,10 @@ es: title: Modo de vista cards: Tarjetas list: Lista + recommended_index: + title: Recomendaciones + see_more: Ver más recomendaciones + hide: Ocultar recomendaciones social: blog: "Blog de %{org}" facebook: "Facebook de %{org}" From 36a5ff39b8d443b186968ebb5a0442ef6c0d369b Mon Sep 17 00:00:00 2001 From: decabeza Date: Wed, 28 Mar 2018 01:40:29 +0200 Subject: [PATCH 02/21] Adds recommendations on debates index --- app/controllers/debates_controller.rb | 4 ++++ app/views/debates/index.html.erb | 4 ++++ config/locales/en/settings.yml | 1 + config/locales/es/settings.yml | 1 + db/seeds.rb | 1 + spec/features/debates_spec.rb | 17 +++++++++++++++++ 6 files changed, 28 insertions(+) diff --git a/app/controllers/debates_controller.rb b/app/controllers/debates_controller.rb index 09dfc940e..33817166b 100644 --- a/app/controllers/debates_controller.rb +++ b/app/controllers/debates_controller.rb @@ -6,6 +6,7 @@ class DebatesController < ApplicationController before_action :parse_tag_filter, only: :index before_action :authenticate_user!, except: [:index, :show, :map] before_action :set_view, only: :index + before_action :debates_recommendations, only: :index, if: :current_user feature_flag :debates @@ -57,4 +58,7 @@ class DebatesController < ApplicationController @view = (params[:view] == "minimal") ? "minimal" : "default" end + def debates_recommendations + @recommended_debates = Debate.recommendations(current_user).sort_by_random.limit(3) + end end diff --git a/app/views/debates/index.html.erb b/app/views/debates/index.html.erb index e5355b975..478103ed1 100644 --- a/app/views/debates/index.html.erb +++ b/app/views/debates/index.html.erb @@ -35,6 +35,10 @@ <%= render "shared/section_header", i18n_namespace: "debates.index.section_header", image: "debates" %> <% end %> + <% if feature?("user.recommendations_on_debates") && @recommended_debates.present? %> + <%= render "shared/recommended_index", recommended: @recommended_debates %> + <% end %> +
diff --git a/config/locales/en/settings.yml b/config/locales/en/settings.yml index 938717187..aea65f7f3 100644 --- a/config/locales/en/settings.yml +++ b/config/locales/en/settings.yml @@ -43,6 +43,7 @@ en: user: recommendations: Recommendations skip_verification: Skip user verification + recommendations_on_debates: Recommendeds on debates community: Community on proposals and investments map: Proposals and budget investments geolocation allow_images: Allow upload and show images diff --git a/config/locales/es/settings.yml b/config/locales/es/settings.yml index 57dfaae50..cc70f6aa3 100644 --- a/config/locales/es/settings.yml +++ b/config/locales/es/settings.yml @@ -43,6 +43,7 @@ es: user: recommendations: Recomendaciones skip_verification: Omitir verificación de usuarios + recommendations_on_debates: Recomendaciones en debates community: Comunidad en propuestas y proyectos de gasto map: Geolocalización de propuestas y proyectos de gasto allow_images: Permitir subir y mostrar imágenes diff --git a/db/seeds.rb b/db/seeds.rb index 868dec2ad..00f5cce2d 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -82,6 +82,7 @@ Setting['feature.budgets'] = true Setting['feature.signature_sheets'] = true Setting['feature.legislation'] = true Setting['feature.user.recommendations'] = true +Setting['feature.user.recommendations_on_debates'] = true Setting['feature.community'] = true Setting['feature.map'] = nil Setting['feature.allow_images'] = true diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb index c4018ce76..2f55dba85 100644 --- a/spec/features/debates_spec.rb +++ b/spec/features/debates_spec.rb @@ -403,10 +403,12 @@ feature 'Debates' do background do Setting['feature.user.recommendations'] = true + Setting['feature.user.recommendations_on_debates'] = true end after do Setting['feature.user.recommendations'] = nil + Setting['feature.user.recommendations_on_debates'] = nil end scenario 'Debates can not ordered by recommendations when there is not an user logged', :js do @@ -415,6 +417,21 @@ feature 'Debates' do expect(page).not_to have_selector('a', text: 'recommendations') end + scenario 'Show recommended debates on index header' do + proposal = create(:proposal, tag_list: "Sport") + user = create(:user) + create(:follow, followable: proposal, user: user) + login_as(user) + + visit debates_path + + expect(page).to have_css('.recommendation', count: 3) + expect(page).to have_link "Best" + expect(page).to have_link "Medium" + expect(page).to have_link "Worst" + expect(page).to have_link "See more recommendations" + end + scenario 'Should display text when there are not recommendeds results', :js do user = create(:user) proposal = create(:proposal, tag_list: "Distinct_to_sport") From bdb3f30e40552c12430c45f78dcce90d3617a929 Mon Sep 17 00:00:00 2001 From: decabeza Date: Wed, 28 Mar 2018 01:40:51 +0200 Subject: [PATCH 03/21] Adds recommendations on proposals index --- app/controllers/proposals_controller.rb | 5 +++++ app/views/proposals/index.html.erb | 4 ++++ config/locales/en/settings.yml | 1 + config/locales/es/settings.yml | 1 + db/seeds.rb | 1 + spec/features/proposals_spec.rb | 17 +++++++++++++++++ 6 files changed, 29 insertions(+) diff --git a/app/controllers/proposals_controller.rb b/app/controllers/proposals_controller.rb index f43bc8ad9..ee4b9f1d6 100644 --- a/app/controllers/proposals_controller.rb +++ b/app/controllers/proposals_controller.rb @@ -9,6 +9,7 @@ class ProposalsController < ApplicationController before_action :authenticate_user!, except: [:index, :show, :map, :summary] before_action :destroy_map_location_association, only: :update before_action :set_view, only: :index + before_action :proposals_recommendations, only: :index, if: :current_user feature_flag :proposals @@ -144,4 +145,8 @@ class ProposalsController < ApplicationController end end + def proposals_recommendations + @recommended_proposals = Proposal.recommendations(current_user).sort_by_random.limit(3) + end + end diff --git a/app/views/proposals/index.html.erb b/app/views/proposals/index.html.erb index 61d90a64c..95748bf80 100644 --- a/app/views/proposals/index.html.erb +++ b/app/views/proposals/index.html.erb @@ -37,6 +37,10 @@ <%= render "shared/section_header", i18n_namespace: "proposals.index.section_header", image: "proposals" %> <% end %> + <% if feature?("user.recommendations_on_proposals") && @recommended_proposals.present? %> + <%= render "shared/recommended_index", recommended: @recommended_proposals %> + <% end %> +
diff --git a/config/locales/en/settings.yml b/config/locales/en/settings.yml index aea65f7f3..af5b0dd4a 100644 --- a/config/locales/en/settings.yml +++ b/config/locales/en/settings.yml @@ -44,6 +44,7 @@ en: recommendations: Recommendations skip_verification: Skip user verification recommendations_on_debates: Recommendeds on debates + recommendations_on_proposals: Recommendeds on proposals community: Community on proposals and investments map: Proposals and budget investments geolocation allow_images: Allow upload and show images diff --git a/config/locales/es/settings.yml b/config/locales/es/settings.yml index cc70f6aa3..90f785580 100644 --- a/config/locales/es/settings.yml +++ b/config/locales/es/settings.yml @@ -44,6 +44,7 @@ es: recommendations: Recomendaciones skip_verification: Omitir verificación de usuarios recommendations_on_debates: Recomendaciones en debates + recommendations_on_proposals: Recomendaciones en propuestas community: Comunidad en propuestas y proyectos de gasto map: Geolocalización de propuestas y proyectos de gasto allow_images: Permitir subir y mostrar imágenes diff --git a/db/seeds.rb b/db/seeds.rb index 00f5cce2d..e453495f2 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -83,6 +83,7 @@ Setting['feature.signature_sheets'] = true Setting['feature.legislation'] = true Setting['feature.user.recommendations'] = true Setting['feature.user.recommendations_on_debates'] = true +Setting['feature.user.recommendations_on_proposals'] = true Setting['feature.community'] = true Setting['feature.map'] = nil Setting['feature.allow_images'] = true diff --git a/spec/features/proposals_spec.rb b/spec/features/proposals_spec.rb index ce5987532..95037ca23 100644 --- a/spec/features/proposals_spec.rb +++ b/spec/features/proposals_spec.rb @@ -727,10 +727,12 @@ feature 'Proposals' do before do Setting['feature.user.recommendations'] = true + Setting['feature.user.recommendations_on_proposals'] = true end after do Setting['feature.user.recommendations'] = nil + Setting['feature.user.recommendations_on_proposals'] = nil end scenario 'Proposals can not ordered by recommendations when there is not an user logged', :js do @@ -739,6 +741,21 @@ feature 'Proposals' do expect(page).not_to have_selector('a', text: 'recommendations') end + scenario 'Show recommended proposals on index header' do + proposal = create(:proposal, tag_list: "Sport") + user = create(:user) + create(:follow, followable: proposal, user: user) + login_as(user) + + visit proposals_path + + expect(page).to have_css('.recommendation', count: 3) + expect(page).to have_link "Best" + expect(page).to have_link "Medium" + expect(page).to have_link "Worst" + expect(page).to have_link "See more recommendations" + end + scenario 'Should display text when there are not recommendeds results', :js do user = create(:user) proposal = create(:proposal, tag_list: "Distinct_to_sport") From 522c206f6d2b55930d50b1b745b987f142ecde96 Mon Sep 17 00:00:00 2001 From: Angel Perez Date: Mon, 4 Jun 2018 10:42:25 -0400 Subject: [PATCH 04/21] Enable 'Recommended debates' setting for users --- app/controllers/account_controller.rb | 2 +- app/controllers/debates_controller.rb | 2 ++ app/models/debate.rb | 4 ++-- app/views/account/show.html.erb | 13 +++++++++++++ app/views/debates/index.html.erb | 2 +- config/locales/en/general.yml | 2 ++ config/locales/es/general.yml | 2 ++ ...4515_add_recommended_debates_setting_to_users.rb | 7 +++++++ db/schema.rb | 1 + 9 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 db/migrate/20180604124515_add_recommended_debates_setting_to_users.rb diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb index fad581dc6..671d0b3a4 100644 --- a/app/controllers/account_controller.rb +++ b/app/controllers/account_controller.rb @@ -28,7 +28,7 @@ class AccountController < ApplicationController else [:username, :public_activity, :public_interests, :email_on_comment, :email_on_comment_reply, :email_on_direct_message, :email_digest, :newsletter, - :official_position_badge] + :official_position_badge, :recommended_debates] end params.require(:account).permit(*attributes) end diff --git a/app/controllers/debates_controller.rb b/app/controllers/debates_controller.rb index 33817166b..1180b9b6c 100644 --- a/app/controllers/debates_controller.rb +++ b/app/controllers/debates_controller.rb @@ -59,6 +59,8 @@ class DebatesController < ApplicationController end def debates_recommendations + return unless current_user.recommended_debates @recommended_debates = Debate.recommendations(current_user).sort_by_random.limit(3) end + end diff --git a/app/models/debate.rb b/app/models/debate.rb index ec58b2e23..e44d45420 100644 --- a/app/models/debate.rb +++ b/app/models/debate.rb @@ -151,7 +151,7 @@ class Debate < ActiveRecord::Base def self.debates_orders(user) orders = %w{hot_score confidence_score created_at relevance} - orders << "recommendations" if user.present? - orders + orders << "recommendations" if user&.recommended_debates + return orders end end diff --git a/app/views/account/show.html.erb b/app/views/account/show.html.erb index 81b25e5e0..a982e3f2e 100644 --- a/app/views/account/show.html.erb +++ b/app/views/account/show.html.erb @@ -112,6 +112,19 @@
<% end %> + <% if feature?("user.recommendations") %> +

<%= t("account.show.recommendations") %>

+ + <% if feature?("user.recommendations_on_debates") %> +
+ <%= f.check_box :recommended_debates, title: t("account.show.show_debates_recommendations"), label: false %> + + <%= t("account.show.show_debates_recommendations") %> + +
+ <% end %> + <% end %> + <%= f.submit t("account.show.save_changes_submit"), class: "button margin-top" %>
diff --git a/app/views/debates/index.html.erb b/app/views/debates/index.html.erb index 478103ed1..edf2a93d6 100644 --- a/app/views/debates/index.html.erb +++ b/app/views/debates/index.html.erb @@ -35,7 +35,7 @@ <%= render "shared/section_header", i18n_namespace: "debates.index.section_header", image: "debates" %> <% end %> - <% if feature?("user.recommendations_on_debates") && @recommended_debates.present? %> + <% if @recommended_debates.present? %> <%= render "shared/recommended_index", recommended: @recommended_debates %> <% end %> diff --git a/config/locales/en/general.yml b/config/locales/en/general.yml index 3916e2ba7..d76a777cc 100644 --- a/config/locales/en/general.yml +++ b/config/locales/en/general.yml @@ -20,6 +20,8 @@ en: email_on_direct_message_label: Receive emails about direct messages email_digest_label: Receive a summary of proposal notifications official_position_badge_label: Show official position badge + recommendations: Recommendations + show_debates_recommendations: Show debates recommendations title: My account user_permission_debates: Participate on debates user_permission_info: With your account you can... diff --git a/config/locales/es/general.yml b/config/locales/es/general.yml index e9c83ac9e..87dc0f285 100644 --- a/config/locales/es/general.yml +++ b/config/locales/es/general.yml @@ -20,6 +20,8 @@ es: email_on_direct_message_label: Recibir emails con mensajes privados email_digest_label: Recibir resumen de notificaciones sobre propuestas official_position_badge_label: Mostrar etiqueta de tipo de usuario + recommendations: Recomendaciones + show_debates_recommendations: Mostrar recomendaciones en el listado de debates title: Mi cuenta user_permission_debates: Participar en debates user_permission_info: Con tu cuenta ya puedes... diff --git a/db/migrate/20180604124515_add_recommended_debates_setting_to_users.rb b/db/migrate/20180604124515_add_recommended_debates_setting_to_users.rb new file mode 100644 index 000000000..500f1f4fc --- /dev/null +++ b/db/migrate/20180604124515_add_recommended_debates_setting_to_users.rb @@ -0,0 +1,7 @@ +class AddRecommendedDebatesSettingToUsers < ActiveRecord::Migration + def change + change_table :users do |t| + t.boolean :recommended_debates, default: false + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 54794367d..285e95c45 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1156,6 +1156,7 @@ ActiveRecord::Schema.define(version: 20180519132610) do t.integer "failed_email_digests_count", default: 0 t.text "former_users_data_log", default: "" t.boolean "public_interests", default: false + t.boolean "recommended_debates", default: false end add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree From a58f6a2662b6266558e373c0a3556aa49d6a2108 Mon Sep 17 00:00:00 2001 From: Angel Perez Date: Mon, 4 Jun 2018 11:29:02 -0400 Subject: [PATCH 05/21] Enable 'Recommended proposals' setting for users --- app/controllers/account_controller.rb | 2 +- app/controllers/proposals_controller.rb | 1 + app/models/proposal.rb | 4 ++-- app/views/account/show.html.erb | 9 +++++++++ app/views/proposals/index.html.erb | 2 +- config/locales/en/general.yml | 1 + config/locales/es/general.yml | 1 + ...4151014_add_recommended_proposals_setting_to_users.rb | 7 +++++++ db/schema.rb | 1 + 9 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 db/migrate/20180604151014_add_recommended_proposals_setting_to_users.rb diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb index 671d0b3a4..a82017f16 100644 --- a/app/controllers/account_controller.rb +++ b/app/controllers/account_controller.rb @@ -28,7 +28,7 @@ class AccountController < ApplicationController else [:username, :public_activity, :public_interests, :email_on_comment, :email_on_comment_reply, :email_on_direct_message, :email_digest, :newsletter, - :official_position_badge, :recommended_debates] + :official_position_badge, :recommended_debates, :recommended_proposals] end params.require(:account).permit(*attributes) end diff --git a/app/controllers/proposals_controller.rb b/app/controllers/proposals_controller.rb index ee4b9f1d6..c280f9962 100644 --- a/app/controllers/proposals_controller.rb +++ b/app/controllers/proposals_controller.rb @@ -146,6 +146,7 @@ class ProposalsController < ApplicationController end def proposals_recommendations + return unless current_user.recommended_proposals @recommended_proposals = Proposal.recommendations(current_user).sort_by_random.limit(3) end diff --git a/app/models/proposal.rb b/app/models/proposal.rb index 4393d0d51..fa80efeed 100644 --- a/app/models/proposal.rb +++ b/app/models/proposal.rb @@ -210,8 +210,8 @@ class Proposal < ActiveRecord::Base def self.proposals_orders(user) orders = %w{hot_score confidence_score created_at relevance archival_date} - orders << "recommendations" if user.present? - orders + orders << "recommendations" if user&.recommended_proposals + return orders end protected diff --git a/app/views/account/show.html.erb b/app/views/account/show.html.erb index a982e3f2e..64edd1ae5 100644 --- a/app/views/account/show.html.erb +++ b/app/views/account/show.html.erb @@ -123,6 +123,15 @@
<% end %> + + <% if feature?("user.recommendations_on_proposals") %> +
+ <%= f.check_box :recommended_proposals, title: t("account.show.show_proposals_recommendations"), label: false %> + + <%= t("account.show.show_proposals_recommendations") %> + +
+ <% end %> <% end %> <%= f.submit t("account.show.save_changes_submit"), class: "button margin-top" %> diff --git a/app/views/proposals/index.html.erb b/app/views/proposals/index.html.erb index 95748bf80..2d4121c30 100644 --- a/app/views/proposals/index.html.erb +++ b/app/views/proposals/index.html.erb @@ -37,7 +37,7 @@ <%= render "shared/section_header", i18n_namespace: "proposals.index.section_header", image: "proposals" %> <% end %> - <% if feature?("user.recommendations_on_proposals") && @recommended_proposals.present? %> + <% if @recommended_proposals.present? %> <%= render "shared/recommended_index", recommended: @recommended_proposals %> <% end %> diff --git a/config/locales/en/general.yml b/config/locales/en/general.yml index d76a777cc..b0afb62c7 100644 --- a/config/locales/en/general.yml +++ b/config/locales/en/general.yml @@ -22,6 +22,7 @@ en: official_position_badge_label: Show official position badge recommendations: Recommendations show_debates_recommendations: Show debates recommendations + show_proposals_recommendations: Show proposals recommendations title: My account user_permission_debates: Participate on debates user_permission_info: With your account you can... diff --git a/config/locales/es/general.yml b/config/locales/es/general.yml index 87dc0f285..2708e1903 100644 --- a/config/locales/es/general.yml +++ b/config/locales/es/general.yml @@ -22,6 +22,7 @@ es: official_position_badge_label: Mostrar etiqueta de tipo de usuario recommendations: Recomendaciones show_debates_recommendations: Mostrar recomendaciones en el listado de debates + show_proposals_recommendations: Mostrar recomendaciones en el listado de propuestas title: Mi cuenta user_permission_debates: Participar en debates user_permission_info: Con tu cuenta ya puedes... diff --git a/db/migrate/20180604151014_add_recommended_proposals_setting_to_users.rb b/db/migrate/20180604151014_add_recommended_proposals_setting_to_users.rb new file mode 100644 index 000000000..53a59e210 --- /dev/null +++ b/db/migrate/20180604151014_add_recommended_proposals_setting_to_users.rb @@ -0,0 +1,7 @@ +class AddRecommendedProposalsSettingToUsers < ActiveRecord::Migration + def change + change_table :users do |t| + t.boolean :recommended_proposals, default: false + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 285e95c45..d1d714c89 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1157,6 +1157,7 @@ ActiveRecord::Schema.define(version: 20180519132610) do t.text "former_users_data_log", default: "" t.boolean "public_interests", default: false t.boolean "recommended_debates", default: false + t.boolean "recommended_proposals", default: false end add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree From 4275069a1ed324604ad602edc6f14a0015aaa450 Mon Sep 17 00:00:00 2001 From: Angel Perez Date: Tue, 5 Jun 2018 12:21:03 -0400 Subject: [PATCH 06/21] Include tests for recommendations feature --- spec/features/account_spec.rb | 26 +++++++++++++ spec/features/debates_spec.rb | 64 +++++++++++++++++++++++-------- spec/features/proposals_spec.rb | 68 ++++++++++++++++++++++++++------- 3 files changed, 129 insertions(+), 29 deletions(-) diff --git a/spec/features/account_spec.rb b/spec/features/account_spec.rb index 2713815ae..0cbe6a4bd 100644 --- a/spec/features/account_spec.rb +++ b/spec/features/account_spec.rb @@ -174,4 +174,30 @@ feature 'Account' do expect(page).to have_content "Invalid login or password" end + + context 'Recommendations' do + + background do + Setting['feature.user.recommendations'] = true + Setting['feature.user.recommendations_on_debates'] = true + Setting['feature.user.recommendations_on_proposals'] = true + end + + after do + Setting['feature.user.recommendations'] = nil + Setting['feature.user.recommendations_on_debates'] = nil + Setting['feature.user.recommendations_on_proposals'] = nil + end + + scenario 'show checkboxes to enable/disable recommendations (disabled by default)' do + visit account_path + + expect(page).to have_content('Recommendations') + expect(page).to have_content('Show debates recommendations') + expect(page).to have_content('Show proposals recommendations') + expect(find("#account_recommended_debates")).not_to be_checked + expect(find("#account_recommended_proposals")).not_to be_checked + end + + end end diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb index 2f55dba85..ceb551765 100644 --- a/spec/features/debates_spec.rb +++ b/spec/features/debates_spec.rb @@ -397,9 +397,9 @@ feature 'Debates' do context 'Recommendations' do - let!(:best_debate) { create(:debate, title: 'Best', cached_votes_total: 10, tag_list: "Sport") } - let!(:medium_debate) { create(:debate, title: 'Medium', cached_votes_total: 5, tag_list: "Sport") } - let!(:worst_debate) { create(:debate, title: 'Worst', cached_votes_total: 1, tag_list: "Sport") } + let!(:best_debate) { create(:debate, title: 'Best', cached_votes_total: 10, tag_list: "Sport") } + let!(:medium_debate) { create(:debate, title: 'Medium', cached_votes_total: 5, tag_list: "Sport") } + let!(:worst_debate) { create(:debate, title: 'Worst', cached_votes_total: 1, tag_list: "Sport") } background do Setting['feature.user.recommendations'] = true @@ -411,17 +411,27 @@ feature 'Debates' do Setting['feature.user.recommendations_on_debates'] = nil end - scenario 'Debates can not ordered by recommendations when there is not an user logged', :js do + scenario 'Debates can not ordered by recommendations when there is not an user logged' do visit debates_path - expect(page).not_to have_selector('a', text: 'recommendations') end scenario 'Show recommended debates on index header' do + user = create(:user) proposal = create(:proposal, tag_list: "Sport") - user = create(:user) create(:follow, followable: proposal, user: user) + login_as(user) + visit account_path + + expect(page).to have_content('Recommendations') + expect(page).to have_content('Show debates recommendations') + expect(find("#account_recommended_debates")).not_to be_checked + + check 'account_recommended_debates' + click_button 'Save changes' + + expect(find("#account_recommended_debates")).to be_checked visit debates_path @@ -432,10 +442,11 @@ feature 'Debates' do expect(page).to have_link "See more recommendations" end - scenario 'Should display text when there are not recommendeds results', :js do - user = create(:user) + scenario 'Should display text when there are not recommended results' do + user = create(:user, recommended_debates: true) proposal = create(:proposal, tag_list: "Distinct_to_sport") create(:follow, followable: proposal, user: user) + login_as(user) visit debates_path @@ -444,8 +455,8 @@ feature 'Debates' do expect(page).to have_content "There are not debates related to your interests" end - scenario 'Should display text when user has not related interests', :js do - user = create(:user) + scenario 'Should display text when user has not related interests' do + user = create(:user, recommended_debates: true) login_as(user) visit debates_path @@ -454,12 +465,12 @@ feature 'Debates' do expect(page).to have_content "Follow proposals so we can give you recommendations" end - scenario 'Debates are ordered by recommendations when there is a user logged', :js do + scenario 'Debates are ordered by recommendations when there is a user logged' do + user = create(:user, recommended_debates: true) proposal = create(:proposal, tag_list: "Sport") - user = create(:user) create(:follow, followable: proposal, user: user) - login_as(user) + login_as(user) visit debates_path click_link 'recommendations' @@ -474,6 +485,24 @@ feature 'Debates' do expect(current_url).to include('order=recommendations') expect(current_url).to include('page=1') end + + scenario 'Recommendations are not shown if feature is disabled' do + user = create(:user) + proposal = create(:proposal, tag_list: "Sport") + create(:follow, followable: proposal, user: user) + + login_as(user) + visit account_path + + expect(page).to have_content('Recommendations') + expect(page).to have_content('Show debates recommendations') + expect(find("#account_recommended_debates")).not_to be_checked + + visit debates_path + + expect(page).not_to have_css('.recommendation', count: 3) + expect(page).not_to have_link('recommendations') + end end end @@ -883,10 +912,13 @@ feature 'Debates' do end end - scenario "Reorder by recommendations results maintaing search", :js do + scenario "Reorder by recommendations results maintaing search" do Setting['feature.user.recommendations'] = true - user = create(:user) + Setting['feature.user.recommendations_for_debates'] = true + + user = create(:user, recommended_debates: true) login_as(user) + debate1 = create(:debate, title: "Show you got", cached_votes_total: 10, tag_list: "Sport") debate2 = create(:debate, title: "Show what you got", cached_votes_total: 1, tag_list: "Sport") debate3 = create(:debate, title: "Do not display with same tag", cached_votes_total: 100, tag_list: "Sport") @@ -906,7 +938,9 @@ feature 'Debates' do expect(page).not_to have_content "Do not display with same tag" expect(page).not_to have_content "Do not display" end + Setting['feature.user.recommendations'] = nil + Setting['feature.user.recommendations_for_debates'] = nil end scenario 'After a search do not show featured debates' do diff --git a/spec/features/proposals_spec.rb b/spec/features/proposals_spec.rb index 95037ca23..4000eb504 100644 --- a/spec/features/proposals_spec.rb +++ b/spec/features/proposals_spec.rb @@ -721,9 +721,9 @@ feature 'Proposals' do context 'Recommendations' do - let!(:best_proposal) { create(:proposal, title: 'Best', cached_votes_up: 10, tag_list: "Sport") } - let!(:medium_proposal) { create(:proposal, title: 'Medium', cached_votes_up: 5, tag_list: "Sport") } - let!(:worst_proposal) { create(:proposal, title: 'Worst', cached_votes_up: 1, tag_list: "Sport") } + let!(:best_proposal) { create(:proposal, title: 'Best', cached_votes_up: 10, tag_list: "Sport") } + let!(:medium_proposal) { create(:proposal, title: 'Medium', cached_votes_up: 5, tag_list: "Sport") } + let!(:worst_proposal) { create(:proposal, title: 'Worst', cached_votes_up: 1, tag_list: "Sport") } before do Setting['feature.user.recommendations'] = true @@ -735,18 +735,29 @@ feature 'Proposals' do Setting['feature.user.recommendations_on_proposals'] = nil end - scenario 'Proposals can not ordered by recommendations when there is not an user logged', :js do + scenario 'Proposals can not ordered by recommendations when there is not an user logged' do visit proposals_path - expect(page).not_to have_selector('a', text: 'recommendations') end scenario 'Show recommended proposals on index header' do + user = create(:user) proposal = create(:proposal, tag_list: "Sport") - user = create(:user) create(:follow, followable: proposal, user: user) + login_as(user) + visit account_path + + expect(page).to have_content('Recommendations') + expect(page).to have_content('Show proposals recommendations') + expect(find("#account_recommended_proposals")).not_to be_checked + + check 'account_recommended_proposals' + click_button 'Save changes' + + expect(find("#account_recommended_proposals")).to be_checked + visit proposals_path expect(page).to have_css('.recommendation', count: 3) @@ -756,11 +767,13 @@ feature 'Proposals' do expect(page).to have_link "See more recommendations" end - scenario 'Should display text when there are not recommendeds results', :js do - user = create(:user) + scenario 'Should display text when there are not recommended results' do + user = create(:user, recommended_proposals: true) proposal = create(:proposal, tag_list: "Distinct_to_sport") create(:follow, followable: proposal, user: user) + login_as(user) + visit proposals_path click_link 'recommendations' @@ -768,9 +781,11 @@ feature 'Proposals' do expect(page).to have_content "There are not proposals related to your interests" end - scenario 'Should display text when user has not related interests', :js do - user = create(:user) + scenario 'Should display text when user has not related interests' do + user = create(:user, recommended_proposals: true) + login_as(user) + visit proposals_path click_link 'recommendations' @@ -778,10 +793,11 @@ feature 'Proposals' do expect(page).to have_content "Follow proposals so we can give you recommendations" end - scenario 'Proposals are ordered by recommendations when there is an user logged', :js do - user = create(:user) + scenario 'Proposals are ordered by recommendations when there is an user logged' do + user = create(:user, recommended_proposals: true) proposal = create(:proposal, tag_list: "Sport") create(:follow, followable: proposal, user: user) + login_as(user) visit proposals_path @@ -798,6 +814,25 @@ feature 'Proposals' do expect(current_url).to include('order=recommendations') expect(current_url).to include('page=1') end + + scenario 'Recommendations are not shown if feature is disabled' do + user = create(:user) + proposal = create(:proposal, tag_list: "Sport") + create(:follow, followable: proposal, user: user) + + login_as(user) + + visit account_path + + expect(page).to have_content('Recommendations') + expect(page).to have_content('Show proposals recommendations') + expect(find("#account_recommended_proposals")).not_to be_checked + + visit proposals_path + + expect(page).not_to have_css('.recommendation', count: 3) + expect(page).not_to have_link('recommendations') + end end end @@ -1334,10 +1369,13 @@ feature 'Proposals' do end end - scenario "Reorder by recommendations results maintaing search", :js do + scenario "Reorder by recommendations results maintaing search" do Setting['feature.user.recommendations'] = true - user = create(:user) + Setting['feature.user.recommendations_for_proposals'] = true + + user = create(:user, recommended_proposals: true) login_as(user) + proposal1 = create(:proposal, title: "Show you got", cached_votes_up: 10, tag_list: "Sport") proposal2 = create(:proposal, title: "Show what you got", cached_votes_up: 1, tag_list: "Sport") proposal3 = create(:proposal, title: "Do not display with same tag", cached_votes_up: 100, tag_list: "Sport") @@ -1357,7 +1395,9 @@ feature 'Proposals' do expect(page).not_to have_content "Do not display with same tag" expect(page).not_to have_content "Do not display" end + Setting['feature.user.recommendations'] = nil + Setting['feature.user.recommendations_for_proposals'] = nil end scenario 'After a search do not show featured proposals' do From fefa225f8a9028e6ca7456f6f9a77eae599a7e15 Mon Sep 17 00:00:00 2001 From: Angel Perez Date: Fri, 8 Jun 2018 08:03:22 -0400 Subject: [PATCH 07/21] Add new settings for dev seeds for Debates and Proposals recommendations --- db/dev_seeds/settings.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/db/dev_seeds/settings.rb b/db/dev_seeds/settings.rb index 6c5d8862d..783781346 100644 --- a/db/dev_seeds/settings.rb +++ b/db/dev_seeds/settings.rb @@ -40,6 +40,8 @@ section "Creating Settings" do Setting.create(key: 'feature.signature_sheets', value: "true") Setting.create(key: 'feature.legislation', value: "true") Setting.create(key: 'feature.user.recommendations', value: "true") + Setting.create(key: 'feature.user.recommendations_on_debates', value: "true") + Setting.create(key: 'feature.user.recommendations_on_proposals', value: "true") Setting.create(key: 'feature.community', value: "true") Setting.create(key: 'feature.map', value: "true") Setting.create(key: 'feature.allow_images', value: "true") From 251441e1098103f7febedcff88c391537819855c Mon Sep 17 00:00:00 2001 From: Angel Perez Date: Fri, 8 Jun 2018 18:40:41 -0400 Subject: [PATCH 08/21] Users can now hide recommendations --- app/views/shared/_recommended_index.html.erb | 39 +++++++++++--------- spec/features/debates_spec.rb | 24 ++++++++++++ spec/features/proposals_spec.rb | 24 ++++++++++++ 3 files changed, 69 insertions(+), 18 deletions(-) diff --git a/app/views/shared/_recommended_index.html.erb b/app/views/shared/_recommended_index.html.erb index 17f6da2ca..48f39cbf2 100644 --- a/app/views/shared/_recommended_index.html.erb +++ b/app/views/shared/_recommended_index.html.erb @@ -4,26 +4,29 @@

<%= t("shared.recommended_index.title") %>

- <%= link_to "#", title: t("shared.recommended_index.hide"), - class: "float-right-medium small hide-recommendations" do %> - - <%= t("shared.recommended_index.hide") %> - <% end %> +
+ <%= link_to "#", title: t("shared.recommended_index.hide"), + class: "float-right-medium small hide-recommendations", + data: { toggle: "recommendations" } do %> + + <%= t("shared.recommended_index.hide") %> + <% end %> - <% recommended.each_with_index do |recommended, index| %> -
- <%= link_to recommended_path(recommended) do %> -
-

<%= recommended.title %>

-
- <% end %> + <% recommended.each_with_index do |recommended, index| %> +
+ <%= link_to recommended_path(recommended) do %> +
+

<%= recommended.title %>

+
+ <% end %> +
+ <% end %> + +
+ <%= link_to t("shared.recommended_index.see_more"), + current_path_with_query_params(order: "recommendations"), + class: "float-right-medium small" %>
- <% end %> - -
- <%= link_to t("shared.recommended_index.see_more"), - current_path_with_query_params(order: "recommendations"), - class: "float-right-medium small" %>
diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb index ceb551765..2a40f9d9b 100644 --- a/spec/features/debates_spec.rb +++ b/spec/features/debates_spec.rb @@ -503,6 +503,30 @@ feature 'Debates' do expect(page).not_to have_css('.recommendation', count: 3) expect(page).not_to have_link('recommendations') end + + scenario 'Recommendations shown in index are dismissable', :js do + user = create(:user, recommended_debates: true) + proposal = create(:proposal, tag_list: "Sport") + create(:follow, followable: proposal, user: user) + + login_as(user) + + visit debates_path + + within("#recommendations") do + expect(page).to have_content('Best') + expect(page).to have_content('Worst') + expect(page).to have_content('Medium') + expect(page).to have_css('.recommendation', count: 3) + + find('.icon-x').click + + expect(page).not_to have_content('Best') + expect(page).not_to have_content('Worst') + expect(page).not_to have_content('Medium') + expect(page).not_to have_css('.recommendation', count: 3) + end + end end end diff --git a/spec/features/proposals_spec.rb b/spec/features/proposals_spec.rb index 4000eb504..569becce9 100644 --- a/spec/features/proposals_spec.rb +++ b/spec/features/proposals_spec.rb @@ -833,6 +833,30 @@ feature 'Proposals' do expect(page).not_to have_css('.recommendation', count: 3) expect(page).not_to have_link('recommendations') end + + scenario 'Recommendations shown in index are dismissable', :js do + user = create(:user, recommended_proposals: true) + proposal = create(:proposal, tag_list: "Sport") + create(:follow, followable: proposal, user: user) + + login_as(user) + + visit proposals_path + + within("#recommendations") do + expect(page).to have_content('Best') + expect(page).to have_content('Worst') + expect(page).to have_content('Medium') + expect(page).to have_css('.recommendation', count: 3) + + find('.icon-x').click + + expect(page).not_to have_content('Best') + expect(page).not_to have_content('Worst') + expect(page).not_to have_content('Medium') + expect(page).not_to have_css('.recommendation', count: 3) + end + end end end From 0ac6033ff68da37bad37b8afbbb2c523dfd24b49 Mon Sep 17 00:00:00 2001 From: Angel Perez Date: Mon, 25 Jun 2018 14:51:51 -0400 Subject: [PATCH 09/21] Refactor recommendations specs to improve DRYness --- spec/features/account_spec.rb | 25 +++++++++++++- spec/features/debates_spec.rb | 57 +++++++++++------------------- spec/features/proposals_spec.rb | 61 ++++++++++----------------------- 3 files changed, 63 insertions(+), 80 deletions(-) diff --git a/spec/features/account_spec.rb b/spec/features/account_spec.rb index 0cbe6a4bd..c98c1c19a 100644 --- a/spec/features/account_spec.rb +++ b/spec/features/account_spec.rb @@ -189,7 +189,7 @@ feature 'Account' do Setting['feature.user.recommendations_on_proposals'] = nil end - scenario 'show checkboxes to enable/disable recommendations (disabled by default)' do + scenario 'are disabled by default' do visit account_path expect(page).to have_content('Recommendations') @@ -199,5 +199,28 @@ feature 'Account' do expect(find("#account_recommended_proposals")).not_to be_checked end + scenario "can be enabled through 'My account' page" do + visit account_path + + expect(page).to have_content('Recommendations') + expect(page).to have_content('Show debates recommendations') + expect(page).to have_content('Show proposals recommendations') + expect(find("#account_recommended_debates")).not_to be_checked + expect(find("#account_recommended_proposals")).not_to be_checked + + check 'account_recommended_debates' + check 'account_recommended_proposals' + + click_button 'Save changes' + + expect(find("#account_recommended_debates")).to be_checked + expect(find("#account_recommended_proposals")).to be_checked + + @user.reload + + expect(@user.recommended_debates).to be(true) + expect(@user.recommended_proposals).to be(true) + end + end end diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb index 2a40f9d9b..9ae117349 100644 --- a/spec/features/debates_spec.rb +++ b/spec/features/debates_spec.rb @@ -397,9 +397,9 @@ feature 'Debates' do context 'Recommendations' do - let!(:best_debate) { create(:debate, title: 'Best', cached_votes_total: 10, tag_list: "Sport") } - let!(:medium_debate) { create(:debate, title: 'Medium', cached_votes_total: 5, tag_list: "Sport") } - let!(:worst_debate) { create(:debate, title: 'Worst', cached_votes_total: 1, tag_list: "Sport") } + let!(:best_debate) { create(:debate, title: 'Best', cached_votes_total: 10, tag_list: 'Sport') } + let!(:medium_debate) { create(:debate, title: 'Medium', cached_votes_total: 5, tag_list: 'Sport') } + let!(:worst_debate) { create(:debate, title: 'Worst', cached_votes_total: 1, tag_list: 'Sport') } background do Setting['feature.user.recommendations'] = true @@ -411,40 +411,29 @@ feature 'Debates' do Setting['feature.user.recommendations_on_debates'] = nil end - scenario 'Debates can not ordered by recommendations when there is not an user logged' do + scenario "Debates can't be ordered by recommendations if there's no logged user" do visit debates_path expect(page).not_to have_selector('a', text: 'recommendations') end - scenario 'Show recommended debates on index header' do - user = create(:user) - proposal = create(:proposal, tag_list: "Sport") + scenario 'Show recommended debates on index header when user has recommendations enabled' do + user = create(:user, recommended_debates: true) + proposal = create(:proposal, tag_list: 'Sport') create(:follow, followable: proposal, user: user) login_as(user) - visit account_path - - expect(page).to have_content('Recommendations') - expect(page).to have_content('Show debates recommendations') - expect(find("#account_recommended_debates")).not_to be_checked - - check 'account_recommended_debates' - click_button 'Save changes' - - expect(find("#account_recommended_debates")).to be_checked - visit debates_path expect(page).to have_css('.recommendation', count: 3) - expect(page).to have_link "Best" - expect(page).to have_link "Medium" - expect(page).to have_link "Worst" - expect(page).to have_link "See more recommendations" + expect(page).to have_link 'Best' + expect(page).to have_link 'Medium' + expect(page).to have_link 'Worst' + expect(page).to have_link 'See more recommendations' end scenario 'Should display text when there are not recommended results' do user = create(:user, recommended_debates: true) - proposal = create(:proposal, tag_list: "Distinct_to_sport") + proposal = create(:proposal, tag_list: 'Distinct_to_sport') create(:follow, followable: proposal, user: user) login_as(user) @@ -452,22 +441,23 @@ feature 'Debates' do click_link 'recommendations' - expect(page).to have_content "There are not debates related to your interests" + expect(page).to have_content 'There are not debates related to your interests' end scenario 'Should display text when user has not related interests' do user = create(:user, recommended_debates: true) + login_as(user) visit debates_path click_link 'recommendations' - expect(page).to have_content "Follow proposals so we can give you recommendations" + expect(page).to have_content 'Follow proposals so we can give you recommendations' end - scenario 'Debates are ordered by recommendations when there is a user logged' do + scenario "Debates are ordered by recommendations when there's an user logged" do user = create(:user, recommended_debates: true) - proposal = create(:proposal, tag_list: "Sport") + proposal = create(:proposal, tag_list: 'Sport') create(:follow, followable: proposal, user: user) login_as(user) @@ -486,18 +476,12 @@ feature 'Debates' do expect(current_url).to include('page=1') end - scenario 'Recommendations are not shown if feature is disabled' do + scenario 'are not shown if user does not have recommendations enabled' do user = create(:user) - proposal = create(:proposal, tag_list: "Sport") + proposal = create(:proposal, tag_list: 'Sport') create(:follow, followable: proposal, user: user) login_as(user) - visit account_path - - expect(page).to have_content('Recommendations') - expect(page).to have_content('Show debates recommendations') - expect(find("#account_recommended_debates")).not_to be_checked - visit debates_path expect(page).not_to have_css('.recommendation', count: 3) @@ -506,11 +490,10 @@ feature 'Debates' do scenario 'Recommendations shown in index are dismissable', :js do user = create(:user, recommended_debates: true) - proposal = create(:proposal, tag_list: "Sport") + proposal = create(:proposal, tag_list: 'Sport') create(:follow, followable: proposal, user: user) login_as(user) - visit debates_path within("#recommendations") do diff --git a/spec/features/proposals_spec.rb b/spec/features/proposals_spec.rb index 569becce9..def5ef4d8 100644 --- a/spec/features/proposals_spec.rb +++ b/spec/features/proposals_spec.rb @@ -721,9 +721,9 @@ feature 'Proposals' do context 'Recommendations' do - let!(:best_proposal) { create(:proposal, title: 'Best', cached_votes_up: 10, tag_list: "Sport") } - let!(:medium_proposal) { create(:proposal, title: 'Medium', cached_votes_up: 5, tag_list: "Sport") } - let!(:worst_proposal) { create(:proposal, title: 'Worst', cached_votes_up: 1, tag_list: "Sport") } + let!(:best_proposal) { create(:proposal, title: 'Best', cached_votes_up: 10, tag_list: 'Sport') } + let!(:medium_proposal) { create(:proposal, title: 'Medium', cached_votes_up: 5, tag_list: 'Sport') } + let!(:worst_proposal) { create(:proposal, title: 'Worst', cached_votes_up: 1, tag_list: 'Sport') } before do Setting['feature.user.recommendations'] = true @@ -735,71 +735,56 @@ feature 'Proposals' do Setting['feature.user.recommendations_on_proposals'] = nil end - scenario 'Proposals can not ordered by recommendations when there is not an user logged' do + scenario "Proposals can't be ordered by recommendations if there's no logged user" do visit proposals_path expect(page).not_to have_selector('a', text: 'recommendations') end - scenario 'Show recommended proposals on index header' do - user = create(:user) - proposal = create(:proposal, tag_list: "Sport") + scenario 'Show recommended proposals on index header when user has recommendations enabled' do + user = create(:user, recommended_proposals: true) + proposal = create(:proposal, tag_list: 'Sport') create(:follow, followable: proposal, user: user) login_as(user) - - visit account_path - - expect(page).to have_content('Recommendations') - expect(page).to have_content('Show proposals recommendations') - expect(find("#account_recommended_proposals")).not_to be_checked - - check 'account_recommended_proposals' - click_button 'Save changes' - - expect(find("#account_recommended_proposals")).to be_checked - visit proposals_path expect(page).to have_css('.recommendation', count: 3) - expect(page).to have_link "Best" - expect(page).to have_link "Medium" - expect(page).to have_link "Worst" - expect(page).to have_link "See more recommendations" + expect(page).to have_link 'Best' + expect(page).to have_link 'Medium' + expect(page).to have_link 'Worst' + expect(page).to have_link 'See more recommendations' end scenario 'Should display text when there are not recommended results' do user = create(:user, recommended_proposals: true) - proposal = create(:proposal, tag_list: "Distinct_to_sport") + proposal = create(:proposal, tag_list: 'Distinct_to_sport') create(:follow, followable: proposal, user: user) login_as(user) - visit proposals_path click_link 'recommendations' - expect(page).to have_content "There are not proposals related to your interests" + expect(page).to have_content 'There are not proposals related to your interests' end scenario 'Should display text when user has not related interests' do user = create(:user, recommended_proposals: true) login_as(user) - visit proposals_path click_link 'recommendations' - expect(page).to have_content "Follow proposals so we can give you recommendations" + expect(page).to have_content 'Follow proposals so we can give you recommendations' end - scenario 'Proposals are ordered by recommendations when there is an user logged' do + scenario "Proposals are ordered by recommendations when there's an user logged" do user = create(:user, recommended_proposals: true) - proposal = create(:proposal, tag_list: "Sport") + proposal = create(:proposal, tag_list: 'Sport') create(:follow, followable: proposal, user: user) login_as(user) - visit proposals_path click_link 'recommendations' @@ -815,19 +800,12 @@ feature 'Proposals' do expect(current_url).to include('page=1') end - scenario 'Recommendations are not shown if feature is disabled' do + scenario 'are not shown if user does not have recommendations enabled' do user = create(:user) - proposal = create(:proposal, tag_list: "Sport") + proposal = create(:proposal, tag_list: 'Sport') create(:follow, followable: proposal, user: user) login_as(user) - - visit account_path - - expect(page).to have_content('Recommendations') - expect(page).to have_content('Show proposals recommendations') - expect(find("#account_recommended_proposals")).not_to be_checked - visit proposals_path expect(page).not_to have_css('.recommendation', count: 3) @@ -836,11 +814,10 @@ feature 'Proposals' do scenario 'Recommendations shown in index are dismissable', :js do user = create(:user, recommended_proposals: true) - proposal = create(:proposal, tag_list: "Sport") + proposal = create(:proposal, tag_list: 'Sport') create(:follow, followable: proposal, user: user) login_as(user) - visit proposals_path within("#recommendations") do From 054bc1397bc9413cd5f0e2ee467a686cf68d3e18 Mon Sep 17 00:00:00 2001 From: Angel Perez Date: Mon, 25 Jun 2018 16:09:05 -0400 Subject: [PATCH 10/21] Wrap recommendations settings checkboxes with label helper to improve A11y --- app/views/account/show.html.erb | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/app/views/account/show.html.erb b/app/views/account/show.html.erb index 64edd1ae5..a0a782f2b 100644 --- a/app/views/account/show.html.erb +++ b/app/views/account/show.html.erb @@ -117,19 +117,23 @@ <% if feature?("user.recommendations_on_debates") %>
- <%= f.check_box :recommended_debates, title: t("account.show.show_debates_recommendations"), label: false %> - - <%= t("account.show.show_debates_recommendations") %> - + <%= f.label :recommended_debates do %> + <%= f.check_box :recommended_debates, title: t("account.show.show_debates_recommendations"), label: false %> + + <%= t("account.show.show_debates_recommendations") %> + + <% end %>
<% end %> <% if feature?("user.recommendations_on_proposals") %>
- <%= f.check_box :recommended_proposals, title: t("account.show.show_proposals_recommendations"), label: false %> - - <%= t("account.show.show_proposals_recommendations") %> - + <%= f.label :recommended_proposals do %> + <%= f.check_box :recommended_proposals, title: t("account.show.show_proposals_recommendations"), label: false %> + + <%= t("account.show.show_proposals_recommendations") %> + + <% end %>
<% end %> <% end %> From e32387ed5bedb1c28ed16d5ae5239f72a081a9a0 Mon Sep 17 00:00:00 2001 From: Angel Perez Date: Tue, 26 Jun 2018 12:55:48 -0400 Subject: [PATCH 11/21] Improve CSS styles for recommendations partial --- app/assets/stylesheets/layout.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/layout.scss b/app/assets/stylesheets/layout.scss index 1a1ce6ddb..b7788706f 100644 --- a/app/assets/stylesheets/layout.scss +++ b/app/assets/stylesheets/layout.scss @@ -2408,7 +2408,7 @@ table { background: #fafafa; border-bottom: 1px solid #eee; margin-bottom: $line-height; - margin-top: rem-calc(-25); + margin-top: rem-calc(-$line-height); padding: $line-height 0; @include breakpoint(medium) { @@ -2449,7 +2449,7 @@ table { color: $text-light; position: absolute; right: 12px; - top: rem-calc(-18); + top: -18px; } // 20. Documents From 8cbc709601094ef92e4702427386256d971565b9 Mon Sep 17 00:00:00 2001 From: decabeza Date: Wed, 11 Jul 2018 14:04:29 +0200 Subject: [PATCH 12/21] Fixes margin top on recommended index --- app/assets/stylesheets/layout.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/layout.scss b/app/assets/stylesheets/layout.scss index b7788706f..787889957 100644 --- a/app/assets/stylesheets/layout.scss +++ b/app/assets/stylesheets/layout.scss @@ -2408,7 +2408,7 @@ table { background: #fafafa; border-bottom: 1px solid #eee; margin-bottom: $line-height; - margin-top: rem-calc(-$line-height); + margin-top: rem-calc(-25); padding: $line-height 0; @include breakpoint(medium) { From 137078054e10c12c3b4f80603b9068c1916c9f9d Mon Sep 17 00:00:00 2001 From: decabeza Date: Wed, 11 Jul 2018 17:07:15 +0200 Subject: [PATCH 13/21] Fixes padding bottom on recommended index --- app/assets/stylesheets/layout.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/layout.scss b/app/assets/stylesheets/layout.scss index 787889957..1ad457b87 100644 --- a/app/assets/stylesheets/layout.scss +++ b/app/assets/stylesheets/layout.scss @@ -2409,7 +2409,7 @@ table { border-bottom: 1px solid #eee; margin-bottom: $line-height; margin-top: rem-calc(-25); - padding: $line-height 0; + padding: $line-height 0 $line-height / 2; @include breakpoint(medium) { padding-top: 0; From 0b7967440f3fcd69e04ba35232d34de6d69622b0 Mon Sep 17 00:00:00 2001 From: Angel Perez Date: Wed, 11 Jul 2018 19:01:12 -0400 Subject: [PATCH 14/21] Recommendations for users are enabled by default --- ...24810_enable_recommendations_by_default.rb | 6 ++++ db/schema.rb | 6 ++-- spec/features/account_spec.rb | 28 +++++++++---------- spec/features/debates_spec.rb | 26 ++++++++--------- spec/features/proposals_spec.rb | 26 ++++++++--------- 5 files changed, 49 insertions(+), 43 deletions(-) create mode 100644 db/migrate/20180711224810_enable_recommendations_by_default.rb diff --git a/db/migrate/20180711224810_enable_recommendations_by_default.rb b/db/migrate/20180711224810_enable_recommendations_by_default.rb new file mode 100644 index 000000000..ece94e1b8 --- /dev/null +++ b/db/migrate/20180711224810_enable_recommendations_by_default.rb @@ -0,0 +1,6 @@ +class EnableRecommendationsByDefault < ActiveRecord::Migration + def change + change_column_default :users, :recommended_debates, true + change_column_default :users, :recommended_proposals, true + end +end diff --git a/db/schema.rb b/db/schema.rb index d1d714c89..5e9247806 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20180519132610) do +ActiveRecord::Schema.define(version: 20180711224810) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -1156,8 +1156,8 @@ ActiveRecord::Schema.define(version: 20180519132610) do t.integer "failed_email_digests_count", default: 0 t.text "former_users_data_log", default: "" t.boolean "public_interests", default: false - t.boolean "recommended_debates", default: false - t.boolean "recommended_proposals", default: false + t.boolean "recommended_debates", default: true + t.boolean "recommended_proposals", default: true end add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree diff --git a/spec/features/account_spec.rb b/spec/features/account_spec.rb index c98c1c19a..a82f32495 100644 --- a/spec/features/account_spec.rb +++ b/spec/features/account_spec.rb @@ -189,37 +189,37 @@ feature 'Account' do Setting['feature.user.recommendations_on_proposals'] = nil end - scenario 'are disabled by default' do + scenario 'are enabled by default' do visit account_path expect(page).to have_content('Recommendations') expect(page).to have_content('Show debates recommendations') expect(page).to have_content('Show proposals recommendations') - expect(find("#account_recommended_debates")).not_to be_checked - expect(find("#account_recommended_proposals")).not_to be_checked + expect(find("#account_recommended_debates")).to be_checked + expect(find("#account_recommended_proposals")).to be_checked end - scenario "can be enabled through 'My account' page" do + scenario "can be disabled through 'My account' page" do visit account_path expect(page).to have_content('Recommendations') expect(page).to have_content('Show debates recommendations') expect(page).to have_content('Show proposals recommendations') - expect(find("#account_recommended_debates")).not_to be_checked - expect(find("#account_recommended_proposals")).not_to be_checked - - check 'account_recommended_debates' - check 'account_recommended_proposals' - - click_button 'Save changes' - expect(find("#account_recommended_debates")).to be_checked expect(find("#account_recommended_proposals")).to be_checked + uncheck 'account_recommended_debates' + uncheck 'account_recommended_proposals' + + click_button 'Save changes' + + expect(find("#account_recommended_debates")).not_to be_checked + expect(find("#account_recommended_proposals")).not_to be_checked + @user.reload - expect(@user.recommended_debates).to be(true) - expect(@user.recommended_proposals).to be(true) + expect(@user.recommended_debates).to be(false) + expect(@user.recommended_proposals).to be(false) end end diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb index 9ae117349..af4c719ae 100644 --- a/spec/features/debates_spec.rb +++ b/spec/features/debates_spec.rb @@ -411,13 +411,13 @@ feature 'Debates' do Setting['feature.user.recommendations_on_debates'] = nil end - scenario "Debates can't be ordered by recommendations if there's no logged user" do + scenario "can't be sorted if there's no logged user" do visit debates_path expect(page).not_to have_selector('a', text: 'recommendations') end - scenario 'Show recommended debates on index header when user has recommendations enabled' do - user = create(:user, recommended_debates: true) + scenario 'are shown on index header when account setting is enabled' do + user = create(:user) proposal = create(:proposal, tag_list: 'Sport') create(:follow, followable: proposal, user: user) @@ -431,8 +431,8 @@ feature 'Debates' do expect(page).to have_link 'See more recommendations' end - scenario 'Should display text when there are not recommended results' do - user = create(:user, recommended_debates: true) + scenario 'should display text when there are no results' do + user = create(:user) proposal = create(:proposal, tag_list: 'Distinct_to_sport') create(:follow, followable: proposal, user: user) @@ -444,8 +444,8 @@ feature 'Debates' do expect(page).to have_content 'There are not debates related to your interests' end - scenario 'Should display text when user has not related interests' do - user = create(:user, recommended_debates: true) + scenario 'should display text when user has no related interests' do + user = create(:user) login_as(user) visit debates_path @@ -455,8 +455,8 @@ feature 'Debates' do expect(page).to have_content 'Follow proposals so we can give you recommendations' end - scenario "Debates are ordered by recommendations when there's an user logged" do - user = create(:user, recommended_debates: true) + scenario "can be sorted when there's a logged user" do + user = create(:user) proposal = create(:proposal, tag_list: 'Sport') create(:follow, followable: proposal, user: user) @@ -476,8 +476,8 @@ feature 'Debates' do expect(current_url).to include('page=1') end - scenario 'are not shown if user does not have recommendations enabled' do - user = create(:user) + scenario 'are not shown if account setting is disabled' do + user = create(:user, recommended_debates: false) proposal = create(:proposal, tag_list: 'Sport') create(:follow, followable: proposal, user: user) @@ -488,8 +488,8 @@ feature 'Debates' do expect(page).not_to have_link('recommendations') end - scenario 'Recommendations shown in index are dismissable', :js do - user = create(:user, recommended_debates: true) + scenario 'shown on index header are dismissable', :js do + user = create(:user) proposal = create(:proposal, tag_list: 'Sport') create(:follow, followable: proposal, user: user) diff --git a/spec/features/proposals_spec.rb b/spec/features/proposals_spec.rb index def5ef4d8..c8a7c47cd 100644 --- a/spec/features/proposals_spec.rb +++ b/spec/features/proposals_spec.rb @@ -735,13 +735,13 @@ feature 'Proposals' do Setting['feature.user.recommendations_on_proposals'] = nil end - scenario "Proposals can't be ordered by recommendations if there's no logged user" do + scenario "can't be sorted if there's no logged user" do visit proposals_path expect(page).not_to have_selector('a', text: 'recommendations') end - scenario 'Show recommended proposals on index header when user has recommendations enabled' do - user = create(:user, recommended_proposals: true) + scenario 'are shown on index header when account setting is enabled' do + user = create(:user) proposal = create(:proposal, tag_list: 'Sport') create(:follow, followable: proposal, user: user) @@ -755,8 +755,8 @@ feature 'Proposals' do expect(page).to have_link 'See more recommendations' end - scenario 'Should display text when there are not recommended results' do - user = create(:user, recommended_proposals: true) + scenario 'should display text when there are no results' do + user = create(:user) proposal = create(:proposal, tag_list: 'Distinct_to_sport') create(:follow, followable: proposal, user: user) @@ -768,8 +768,8 @@ feature 'Proposals' do expect(page).to have_content 'There are not proposals related to your interests' end - scenario 'Should display text when user has not related interests' do - user = create(:user, recommended_proposals: true) + scenario 'should display text when user has no related interests' do + user = create(:user) login_as(user) visit proposals_path @@ -779,8 +779,8 @@ feature 'Proposals' do expect(page).to have_content 'Follow proposals so we can give you recommendations' end - scenario "Proposals are ordered by recommendations when there's an user logged" do - user = create(:user, recommended_proposals: true) + scenario "can be sorted when there's a logged user" do + user = create(:user) proposal = create(:proposal, tag_list: 'Sport') create(:follow, followable: proposal, user: user) @@ -800,8 +800,8 @@ feature 'Proposals' do expect(current_url).to include('page=1') end - scenario 'are not shown if user does not have recommendations enabled' do - user = create(:user) + scenario 'are not shown if account setting is disabled' do + user = create(:user, recommended_proposals: false) proposal = create(:proposal, tag_list: 'Sport') create(:follow, followable: proposal, user: user) @@ -812,8 +812,8 @@ feature 'Proposals' do expect(page).not_to have_link('recommendations') end - scenario 'Recommendations shown in index are dismissable', :js do - user = create(:user, recommended_proposals: true) + scenario 'shown on index header are dismissable', :js do + user = create(:user) proposal = create(:proposal, tag_list: 'Sport') create(:follow, followable: proposal, user: user) From 463c7538805d3e4af493c82fb8cc6e1ce807a371 Mon Sep 17 00:00:00 2001 From: Angel Perez Date: Wed, 11 Jul 2018 21:45:28 -0400 Subject: [PATCH 15/21] Recommendations are automatically disabled if dismissed by user --- app/controllers/debates_controller.rb | 8 ++++++++ app/controllers/proposals_controller.rb | 8 ++++++++ app/models/abilities/everyone.rb | 1 + app/views/debates/index.html.erb | 4 +++- app/views/proposals/index.html.erb | 4 +++- app/views/shared/_recommended_index.html.erb | 10 +++++++--- config/locales/en/general.yml | 8 ++++++++ config/locales/es/general.yml | 8 ++++++++ config/routes/debate.rb | 1 + config/routes/proposal.rb | 1 + spec/features/debates_spec.rb | 20 +++++++++++++------- spec/features/proposals_spec.rb | 20 +++++++++++++------- 12 files changed, 74 insertions(+), 19 deletions(-) diff --git a/app/controllers/debates_controller.rb b/app/controllers/debates_controller.rb index 1180b9b6c..c94558ab2 100644 --- a/app/controllers/debates_controller.rb +++ b/app/controllers/debates_controller.rb @@ -44,6 +44,14 @@ class DebatesController < ApplicationController redirect_to request.query_parameters.merge(action: :index) end + def disable_recommendations + if current_user.update(recommended_debates: false) + redirect_to debates_path, notice: t('debates.index.recommendations.actions.success') + else + redirect_to debates_path, error: t('debates.index.recommendations.actions.error') + end + end + private def debate_params diff --git a/app/controllers/proposals_controller.rb b/app/controllers/proposals_controller.rb index c280f9962..01e8043b1 100644 --- a/app/controllers/proposals_controller.rb +++ b/app/controllers/proposals_controller.rb @@ -80,6 +80,14 @@ class ProposalsController < ApplicationController @tag_cloud = tag_cloud end + def disable_recommendations + if current_user.update(recommended_proposals: false) + redirect_to proposals_path, notice: t('proposals.index.recommendations.actions.success') + else + redirect_to proposals_path, error: t('proposals.index.recommendations.actions.error') + end + end + private def proposal_params diff --git a/app/models/abilities/everyone.rb b/app/models/abilities/everyone.rb index 23cfdc971..afc1eeeb3 100644 --- a/app/models/abilities/everyone.rb +++ b/app/models/abilities/everyone.rb @@ -29,6 +29,7 @@ module Abilities can [:read], Legislation::Question can [:read, :map, :share], Legislation::Proposal can [:search, :comments, :read, :create, :new_comment], Legislation::Annotation + can :disable_recommendations, [Debate, Proposal] end end end diff --git a/app/views/debates/index.html.erb b/app/views/debates/index.html.erb index edf2a93d6..41c6fc42a 100644 --- a/app/views/debates/index.html.erb +++ b/app/views/debates/index.html.erb @@ -36,7 +36,9 @@ <% end %> <% if @recommended_debates.present? %> - <%= render "shared/recommended_index", recommended: @recommended_debates %> + <%= render "shared/recommended_index", recommended: @recommended_debates, + disable_recommendations_path: recommendations_disable_debates_path, + namespace: "debates" %> <% end %>
diff --git a/app/views/proposals/index.html.erb b/app/views/proposals/index.html.erb index 2d4121c30..45896130a 100644 --- a/app/views/proposals/index.html.erb +++ b/app/views/proposals/index.html.erb @@ -38,7 +38,9 @@ <% end %> <% if @recommended_proposals.present? %> - <%= render "shared/recommended_index", recommended: @recommended_proposals %> + <%= render "shared/recommended_index", recommended: @recommended_proposals, + disable_recommendations_path: recommendations_disable_proposals_path, + namespace: "proposals" %> <% end %>
diff --git a/app/views/shared/_recommended_index.html.erb b/app/views/shared/_recommended_index.html.erb index 48f39cbf2..e7c7d3835 100644 --- a/app/views/shared/_recommended_index.html.erb +++ b/app/views/shared/_recommended_index.html.erb @@ -5,9 +5,13 @@
- <%= link_to "#", title: t("shared.recommended_index.hide"), - class: "float-right-medium small hide-recommendations", - data: { toggle: "recommendations" } do %> + <%= link_to disable_recommendations_path, title: t("shared.recommended_index.hide"), + class: "float-right-medium small hide-recommendations", + data: { + toggle: "recommendations", + confirm: t("#{namespace}.index.recommendations.disable") + }, + method: :put do %> <%= t("shared.recommended_index.hide") %> <% end %> diff --git a/config/locales/en/general.yml b/config/locales/en/general.yml index b0afb62c7..7d4182e45 100644 --- a/config/locales/en/general.yml +++ b/config/locales/en/general.yml @@ -113,6 +113,10 @@ en: recommendations: without_results: There are not debates related to your interests without_interests: Follow proposals so we can give you recommendations + disable: "If you dismiss debates recommendations, the setting will be automatically disabled. Do you wish to continue?" + actions: + success: "Recommendations for debates are now disabled for this account" + error: "An error has occured. Please go to 'Your account' page to manually disable recommendations for debates" search_form: button: Search placeholder: Search debates... @@ -364,6 +368,10 @@ en: recommendations: without_results: There are not proposals related to your interests without_interests: Follow proposals so we can give you recommendations + disable: "If you dismiss proposals recommendations, the setting will be automatically disabled. Do you wish to continue?" + actions: + success: "Recommendations for proposals are now disabled for this account" + error: "An error has occured. Please go to 'Your account' page to manually disable recommendations for proposals" retired_proposals: Retired proposals retired_proposals_link: "Proposals retired by the author" retired_links: diff --git a/config/locales/es/general.yml b/config/locales/es/general.yml index 2708e1903..001ce2aa5 100644 --- a/config/locales/es/general.yml +++ b/config/locales/es/general.yml @@ -113,6 +113,10 @@ es: recommendations: without_results: No existen debates relacionados con tus intereses without_interests: Sigue propuestas para que podamos darte recomendaciones + disable: "Si ocultas las recomendaciones para debates, se desactivará automáticamente el ajuste. ¿Deseas continuar?" + actions: + success: "Las recomendaciones de debates han sido desactivadas" + error: "Ha ocurrido un error. Por favor dirígete al apartado 'Mi cuenta' para desactivar las recomendaciones manualmente" search_form: button: Buscar placeholder: Buscar debates... @@ -364,6 +368,10 @@ es: recommendations: without_results: No existen propuestas relacionadas con tus intereses without_interests: Sigue propuestas para que podamos darte recomendaciones + disable: "Si ocultas las recomendaciones para propuestas, se desactivará automáticamente el ajuste. ¿Deseas continuar?" + actions: + success: "Las recomendaciones de propuestas han sido desactivadas" + error: "Ha ocurrido un error. Por favor dirígete al apartado 'Mi cuenta' para desactivar las recomendaciones manualmente" retired_proposals: Propuestas retiradas retired_proposals_link: "Propuestas retiradas por sus autores" retired_links: diff --git a/config/routes/debate.rb b/config/routes/debate.rb index 2345d150f..4167ed68c 100644 --- a/config/routes/debate.rb +++ b/config/routes/debate.rb @@ -10,5 +10,6 @@ resources :debates do collection do get :map get :suggest + put 'recommendations/disable', only: :index, controller: 'debates', action: :disable_recommendations end end diff --git a/config/routes/proposal.rb b/config/routes/proposal.rb index d3408ed29..b0736ec0e 100644 --- a/config/routes/proposal.rb +++ b/config/routes/proposal.rb @@ -13,5 +13,6 @@ resources :proposals do get :map get :suggest get :summary + put 'recommendations/disable', only: :index, controller: 'proposals', action: :disable_recommendations end end diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb index af4c719ae..447e47ca6 100644 --- a/spec/features/debates_spec.rb +++ b/spec/features/debates_spec.rb @@ -488,7 +488,7 @@ feature 'Debates' do expect(page).not_to have_link('recommendations') end - scenario 'shown on index header are dismissable', :js do + scenario 'are automatically disabled when dismissed from index', :js do user = create(:user) proposal = create(:proposal, tag_list: 'Sport') create(:follow, followable: proposal, user: user) @@ -502,13 +502,19 @@ feature 'Debates' do expect(page).to have_content('Medium') expect(page).to have_css('.recommendation', count: 3) - find('.icon-x').click - - expect(page).not_to have_content('Best') - expect(page).not_to have_content('Worst') - expect(page).not_to have_content('Medium') - expect(page).not_to have_css('.recommendation', count: 3) + accept_confirm { click_link 'Hide recommendations' } end + + expect(page).not_to have_link('recommendations') + expect(page).not_to have_css('.recommendation', count: 3) + expect(page).to have_content('Recommendations for debates are now disabled for this account') + + user.reload + + visit account_path + + expect(find("#account_recommended_debates")).not_to be_checked + expect(user.recommended_debates).to be(false) end end end diff --git a/spec/features/proposals_spec.rb b/spec/features/proposals_spec.rb index c8a7c47cd..d3d51a96b 100644 --- a/spec/features/proposals_spec.rb +++ b/spec/features/proposals_spec.rb @@ -812,7 +812,7 @@ feature 'Proposals' do expect(page).not_to have_link('recommendations') end - scenario 'shown on index header are dismissable', :js do + scenario 'are automatically disabled when dismissed from index', :js do user = create(:user) proposal = create(:proposal, tag_list: 'Sport') create(:follow, followable: proposal, user: user) @@ -826,13 +826,19 @@ feature 'Proposals' do expect(page).to have_content('Medium') expect(page).to have_css('.recommendation', count: 3) - find('.icon-x').click - - expect(page).not_to have_content('Best') - expect(page).not_to have_content('Worst') - expect(page).not_to have_content('Medium') - expect(page).not_to have_css('.recommendation', count: 3) + accept_confirm { click_link 'Hide recommendations' } end + + expect(page).not_to have_link('recommendations') + expect(page).not_to have_css('.recommendation', count: 3) + expect(page).to have_content('Recommendations for proposals are now disabled for this account') + + user.reload + + visit account_path + + expect(find("#account_recommended_proposals")).not_to be_checked + expect(user.recommended_proposals).to be(false) end end end From a143fa447b2b13365bfe02eb59517241191d3aa5 Mon Sep 17 00:00:00 2001 From: Angel Perez Date: Thu, 12 Jul 2018 09:39:25 -0400 Subject: [PATCH 16/21] Ensure recommendations are only shown when enabled --- app/controllers/debates_controller.rb | 5 +++-- app/controllers/proposals_controller.rb | 5 +++-- app/models/debate.rb | 2 +- app/models/proposal.rb | 2 +- app/views/debates/index.html.erb | 2 +- app/views/proposals/index.html.erb | 2 +- 6 files changed, 10 insertions(+), 8 deletions(-) diff --git a/app/controllers/debates_controller.rb b/app/controllers/debates_controller.rb index c94558ab2..abcf79559 100644 --- a/app/controllers/debates_controller.rb +++ b/app/controllers/debates_controller.rb @@ -67,8 +67,9 @@ class DebatesController < ApplicationController end def debates_recommendations - return unless current_user.recommended_debates - @recommended_debates = Debate.recommendations(current_user).sort_by_random.limit(3) + if Setting['feature.user.recommendations_on_debates'] && current_user.recommended_debates + @recommended_debates = Debate.recommendations(current_user).sort_by_random.limit(3) + end end end diff --git a/app/controllers/proposals_controller.rb b/app/controllers/proposals_controller.rb index 01e8043b1..798aeebf2 100644 --- a/app/controllers/proposals_controller.rb +++ b/app/controllers/proposals_controller.rb @@ -154,8 +154,9 @@ class ProposalsController < ApplicationController end def proposals_recommendations - return unless current_user.recommended_proposals - @recommended_proposals = Proposal.recommendations(current_user).sort_by_random.limit(3) + if Setting['feature.user.recommendations_on_proposals'] && current_user.recommended_proposals + @recommended_proposals = Proposal.recommendations(current_user).sort_by_random.limit(3) + end end end diff --git a/app/models/debate.rb b/app/models/debate.rb index e44d45420..93ca5420f 100644 --- a/app/models/debate.rb +++ b/app/models/debate.rb @@ -151,7 +151,7 @@ class Debate < ActiveRecord::Base def self.debates_orders(user) orders = %w{hot_score confidence_score created_at relevance} - orders << "recommendations" if user&.recommended_debates + orders << "recommendations" if Setting['feature.user.recommendations_on_debates'] && user&.recommended_debates return orders end end diff --git a/app/models/proposal.rb b/app/models/proposal.rb index fa80efeed..f47584456 100644 --- a/app/models/proposal.rb +++ b/app/models/proposal.rb @@ -210,7 +210,7 @@ class Proposal < ActiveRecord::Base def self.proposals_orders(user) orders = %w{hot_score confidence_score created_at relevance archival_date} - orders << "recommendations" if user&.recommended_proposals + orders << "recommendations" if Setting['feature.user.recommendations_on_proposals'] && user&.recommended_proposals return orders end diff --git a/app/views/debates/index.html.erb b/app/views/debates/index.html.erb index 41c6fc42a..967864f04 100644 --- a/app/views/debates/index.html.erb +++ b/app/views/debates/index.html.erb @@ -35,7 +35,7 @@ <%= render "shared/section_header", i18n_namespace: "debates.index.section_header", image: "debates" %> <% end %> - <% if @recommended_debates.present? %> + <% if feature?('user.recommendations') && @recommended_debates.present? %> <%= render "shared/recommended_index", recommended: @recommended_debates, disable_recommendations_path: recommendations_disable_debates_path, namespace: "debates" %> diff --git a/app/views/proposals/index.html.erb b/app/views/proposals/index.html.erb index 45896130a..25c294654 100644 --- a/app/views/proposals/index.html.erb +++ b/app/views/proposals/index.html.erb @@ -37,7 +37,7 @@ <%= render "shared/section_header", i18n_namespace: "proposals.index.section_header", image: "proposals" %> <% end %> - <% if @recommended_proposals.present? %> + <% if feature?('user.recommendations') && @recommended_proposals.present? %> <%= render "shared/recommended_index", recommended: @recommended_proposals, disable_recommendations_path: recommendations_disable_proposals_path, namespace: "proposals" %> From 54853745f01fa00d57e36a2bbc6aebac220d768e Mon Sep 17 00:00:00 2001 From: Angel Perez Date: Thu, 12 Jul 2018 09:41:11 -0400 Subject: [PATCH 17/21] Fix typos for Settings locales (English) --- config/locales/en/settings.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/locales/en/settings.yml b/config/locales/en/settings.yml index af5b0dd4a..1d2bb819a 100644 --- a/config/locales/en/settings.yml +++ b/config/locales/en/settings.yml @@ -43,8 +43,8 @@ en: user: recommendations: Recommendations skip_verification: Skip user verification - recommendations_on_debates: Recommendeds on debates - recommendations_on_proposals: Recommendeds on proposals + recommendations_on_debates: Recommendations on debates + recommendations_on_proposals: Recommendations on proposals community: Community on proposals and investments map: Proposals and budget investments geolocation allow_images: Allow upload and show images From 31c16406c03ba79b41392e4724aa7e6a169728d3 Mon Sep 17 00:00:00 2001 From: Angel Perez Date: Fri, 13 Jul 2018 08:18:58 -0400 Subject: [PATCH 18/21] Move disable recommendations permissions to Abilities::Common model --- app/models/abilities/common.rb | 2 ++ app/models/abilities/everyone.rb | 1 - spec/models/abilities/common_spec.rb | 6 ++++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/models/abilities/common.rb b/app/models/abilities/common.rb index 8f289f986..d8d716ec2 100644 --- a/app/models/abilities/common.rb +++ b/app/models/abilities/common.rb @@ -94,6 +94,8 @@ module Abilities can [:create], Topic can [:update, :destroy], Topic, author_id: user.id + + can :disable_recommendations, [Debate, Proposal] end end end diff --git a/app/models/abilities/everyone.rb b/app/models/abilities/everyone.rb index afc1eeeb3..23cfdc971 100644 --- a/app/models/abilities/everyone.rb +++ b/app/models/abilities/everyone.rb @@ -29,7 +29,6 @@ module Abilities can [:read], Legislation::Question can [:read, :map, :share], Legislation::Proposal can [:search, :comments, :read, :create, :new_comment], Legislation::Annotation - can :disable_recommendations, [Debate, Proposal] end end end diff --git a/spec/models/abilities/common_spec.rb b/spec/models/abilities/common_spec.rb index f559eba99..93ffa9a48 100644 --- a/spec/models/abilities/common_spec.rb +++ b/spec/models/abilities/common_spec.rb @@ -299,4 +299,10 @@ describe Abilities::Common do it { should_not be_able_to(:answer, incoming_poll_question_from_other_geozone) } end end + + describe "#disable_recommendations" do + it { should be_able_to(:disable_recommendations, Debate) } + it { should be_able_to(:disable_recommendations, Proposal) } + end + end From e194240a0af2828153ec5d71efa2f7a5ea675628 Mon Sep 17 00:00:00 2001 From: Angel Perez Date: Fri, 13 Jul 2018 09:13:17 -0400 Subject: [PATCH 19/21] Add rake task to enable recommendations for existing users --- lib/tasks/users.rake | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 lib/tasks/users.rake diff --git a/lib/tasks/users.rake b/lib/tasks/users.rake new file mode 100644 index 000000000..d447e727c --- /dev/null +++ b/lib/tasks/users.rake @@ -0,0 +1,10 @@ +namespace :users do + + desc "Enable recommendations for existing users" + task enable_recommendations: :environment do + User.find_each do |user| + user.update(recommended_debates: true, recommended_proposals: true) + end + end + +end From 10efcb20298d50804e72c1de529fd73ea85fac42 Mon Sep 17 00:00:00 2001 From: Angel Perez Date: Fri, 13 Jul 2018 11:41:41 -0400 Subject: [PATCH 20/21] Change I18n strings for warning when dismissing recommendations --- config/locales/en/general.yml | 4 ++-- config/locales/es/general.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/config/locales/en/general.yml b/config/locales/en/general.yml index 7d4182e45..a3a451c2a 100644 --- a/config/locales/en/general.yml +++ b/config/locales/en/general.yml @@ -113,7 +113,7 @@ en: recommendations: without_results: There are not debates related to your interests without_interests: Follow proposals so we can give you recommendations - disable: "If you dismiss debates recommendations, the setting will be automatically disabled. Do you wish to continue?" + disable: "Debates recommendations will stop showing if you dismiss them. You can enable them again in 'My account' page" actions: success: "Recommendations for debates are now disabled for this account" error: "An error has occured. Please go to 'Your account' page to manually disable recommendations for debates" @@ -368,7 +368,7 @@ en: recommendations: without_results: There are not proposals related to your interests without_interests: Follow proposals so we can give you recommendations - disable: "If you dismiss proposals recommendations, the setting will be automatically disabled. Do you wish to continue?" + disable: "Proposals recommendations will stop showing if you dismiss them. You can enable them again in 'My account' page" actions: success: "Recommendations for proposals are now disabled for this account" error: "An error has occured. Please go to 'Your account' page to manually disable recommendations for proposals" diff --git a/config/locales/es/general.yml b/config/locales/es/general.yml index 001ce2aa5..69f49c18a 100644 --- a/config/locales/es/general.yml +++ b/config/locales/es/general.yml @@ -113,7 +113,7 @@ es: recommendations: without_results: No existen debates relacionados con tus intereses without_interests: Sigue propuestas para que podamos darte recomendaciones - disable: "Si ocultas las recomendaciones para debates, se desactivará automáticamente el ajuste. ¿Deseas continuar?" + disable: "Si ocultas las recomendaciones para debates, no se volverán a mostrar. Puedes volver a activarlas en 'Mi cuenta'" actions: success: "Las recomendaciones de debates han sido desactivadas" error: "Ha ocurrido un error. Por favor dirígete al apartado 'Mi cuenta' para desactivar las recomendaciones manualmente" @@ -368,7 +368,7 @@ es: recommendations: without_results: No existen propuestas relacionadas con tus intereses without_interests: Sigue propuestas para que podamos darte recomendaciones - disable: "Si ocultas las recomendaciones para propuestas, se desactivará automáticamente el ajuste. ¿Deseas continuar?" + disable: "Si ocultas las recomendaciones para propuestas, no se volverán a mostrar. Puedes volver a activarlas en 'Mi cuenta'" actions: success: "Las recomendaciones de propuestas han sido desactivadas" error: "Ha ocurrido un error. Por favor dirígete al apartado 'Mi cuenta' para desactivar las recomendaciones manualmente" From 1884841ffc61beebd73ace3858c9ed44dcdd880c Mon Sep 17 00:00:00 2001 From: Angel Perez Date: Fri, 13 Jul 2018 14:16:59 -0400 Subject: [PATCH 21/21] Add Rake task to enable recommendations settings --- lib/tasks/settings.rake | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/tasks/settings.rake b/lib/tasks/settings.rake index d09d32527..17ddd9aa0 100644 --- a/lib/tasks/settings.rake +++ b/lib/tasks/settings.rake @@ -13,4 +13,11 @@ namespace :settings do Setting['feature.allow_attached_documents'] = true end + desc "Enable recommendations settings" + task enable_recommendations: :environment do + Setting['feature.user.recommendations'] = true + Setting['feature.user.recommendations_on_debates'] = true + Setting['feature.user.recommendations_on_proposals'] = true + end + end