From f15f8aad1eb088f2553e096b584778f56d9778f6 Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Sat, 17 May 2025 14:49:23 +0300 Subject: [PATCH] Move basic preferences controller to preferences module --- app/abilities/ability.rb | 2 +- .../basic_preferences_controller.rb | 46 ++++++++ app/controllers/preferences_controller.rb | 44 ------- .../_update_success_flash.html.erb | 1 - .../_update_success_flash.html.erb | 5 + .../{ => basic_preferences}/show.html.erb | 0 config/locales/en.yml | 35 +++--- config/routes.rb | 4 +- .../basic_preferences_controller_test.rb | 108 ++++++++++++++++++ .../preferences_controller_test.rb | 106 ----------------- 10 files changed, 181 insertions(+), 170 deletions(-) create mode 100644 app/controllers/preferences/basic_preferences_controller.rb delete mode 100644 app/controllers/preferences_controller.rb delete mode 100644 app/views/preferences/_update_success_flash.html.erb create mode 100644 app/views/preferences/basic_preferences/_update_success_flash.html.erb rename app/views/preferences/{ => basic_preferences}/show.html.erb (100%) create mode 100644 test/controllers/preferences/basic_preferences_controller_test.rb delete mode 100644 test/controllers/preferences_controller_test.rb diff --git a/app/abilities/ability.rb b/app/abilities/ability.rb index 7d61ff373..162308287 100644 --- a/app/abilities/ability.rb +++ b/app/abilities/ability.rb @@ -40,7 +40,7 @@ class Ability can :update, :account_terms can :create, :account_pd_declaration can :read, :dashboard - can [:read, :update], [:preference, :profile] + can [:read, :update], [:preferences, :profile] can [:create, :subscribe, :unsubscribe], DiaryEntry can :update, DiaryEntry, :user => user can [:create], DiaryComment diff --git a/app/controllers/preferences/basic_preferences_controller.rb b/app/controllers/preferences/basic_preferences_controller.rb new file mode 100644 index 000000000..3b0344d21 --- /dev/null +++ b/app/controllers/preferences/basic_preferences_controller.rb @@ -0,0 +1,46 @@ +module Preferences + class BasicPreferencesController < ApplicationController + layout "site" + + before_action :authorize_web + before_action :set_locale + + authorize_resource :class => :preferences + + before_action :check_database_readable + before_action :check_database_writable, :only => [:update] + + def show; end + + def update + current_user.languages = params[:user][:languages].split(",") + + current_user.preferred_editor = if params[:user][:preferred_editor] == "default" + nil + else + params[:user][:preferred_editor] + end + + success = current_user.save + + if params[:site_color_scheme] + site_color_scheme_preference = current_user.preferences.find_or_create_by(:k => "site.color_scheme") + success &= site_color_scheme_preference.update(:v => params[:site_color_scheme]) + end + + if params[:map_color_scheme] + map_color_scheme_preference = current_user.preferences.find_or_create_by(:k => "map.color_scheme") + success &= map_color_scheme_preference.update(:v => params[:map_color_scheme]) + end + + if success + # Use a partial so that it is rendered during the next page load in the correct language. + flash[:notice] = { :partial => "update_success_flash" } + redirect_to basic_preferences_path + else + flash.now[:error] = t ".failure" + render :show + end + end + end +end diff --git a/app/controllers/preferences_controller.rb b/app/controllers/preferences_controller.rb deleted file mode 100644 index ac00f8d66..000000000 --- a/app/controllers/preferences_controller.rb +++ /dev/null @@ -1,44 +0,0 @@ -class PreferencesController < ApplicationController - layout "site" - - before_action :authorize_web - before_action :set_locale - - authorize_resource :class => false - - before_action :check_database_readable - before_action :check_database_writable, :only => [:update] - - def show; end - - def update - current_user.languages = params[:user][:languages].split(",") - - current_user.preferred_editor = if params[:user][:preferred_editor] == "default" - nil - else - params[:user][:preferred_editor] - end - - success = current_user.save - - if params[:site_color_scheme] - site_color_scheme_preference = current_user.preferences.find_or_create_by(:k => "site.color_scheme") - success &= site_color_scheme_preference.update(:v => params[:site_color_scheme]) - end - - if params[:map_color_scheme] - map_color_scheme_preference = current_user.preferences.find_or_create_by(:k => "map.color_scheme") - success &= map_color_scheme_preference.update(:v => params[:map_color_scheme]) - end - - if success - # Use a partial so that it is rendered during the next page load in the correct language. - flash[:notice] = { :partial => "preferences/update_success_flash" } - redirect_to basic_preferences_path - else - flash.now[:error] = t ".failure" - render :show - end - end -end diff --git a/app/views/preferences/_update_success_flash.html.erb b/app/views/preferences/_update_success_flash.html.erb deleted file mode 100644 index 8fd1095ac..000000000 --- a/app/views/preferences/_update_success_flash.html.erb +++ /dev/null @@ -1 +0,0 @@ -<%= t ".message" %> diff --git a/app/views/preferences/basic_preferences/_update_success_flash.html.erb b/app/views/preferences/basic_preferences/_update_success_flash.html.erb new file mode 100644 index 000000000..8df04154b --- /dev/null +++ b/app/views/preferences/basic_preferences/_update_success_flash.html.erb @@ -0,0 +1,5 @@ +<%= if I18n.exists? "preferences.update_success_flash.message" + t "preferences.update_success_flash.message" + else + t ".message" + end %> diff --git a/app/views/preferences/show.html.erb b/app/views/preferences/basic_preferences/show.html.erb similarity index 100% rename from app/views/preferences/show.html.erb rename to app/views/preferences/basic_preferences/show.html.erb diff --git a/config/locales/en.yml b/config/locales/en.yml index 917be540d..30444bd84 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1949,23 +1949,24 @@ en: flash changed: "Your password has been changed." flash token bad: "Did not find that token, check the URL maybe?" preferences: - show: - title: My Preferences - preferred_site_color_scheme: Preferred Website Color Scheme - site_color_schemes: - auto: Auto - light: Light - dark: Dark - preferred_map_color_scheme: Preferred Map Color Scheme - map_color_schemes: - auto: Auto - light: Light - dark: Dark - save: Update Preferences - update: - failure: Couldn't update preferences. - update_success_flash: - message: Preferences updated. + basic_preferences: + show: + title: My Preferences + preferred_site_color_scheme: Preferred Website Color Scheme + site_color_schemes: + auto: Auto + light: Light + dark: Dark + preferred_map_color_scheme: Preferred Map Color Scheme + map_color_schemes: + auto: Auto + light: Light + dark: Dark + save: Update Preferences + update: + failure: Couldn't update preferences. + update_success_flash: + message: Preferences updated. profiles: show: title: Edit Profile diff --git a/config/routes.rb b/config/routes.rb index 6e6da7586..01bc5711a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -318,7 +318,9 @@ OpenStreetMap::Application.routes.draw do resource :profile, :only => [:show, :update] get "/profile/edit", :to => redirect(:path => "/profile"), :as => nil - resource :basic_preferences, :controller => :preferences, :path => "preferences/basic", :only => [:show, :update] + scope :preferences, :module => :preferences do + resource :basic_preferences, :path => "basic", :only => [:show, :update] + end get "/preferences", :to => redirect(:path => "/preferences/basic"), :as => nil get "/preferences/edit", :to => redirect(:path => "/preferences/basic"), :as => nil diff --git a/test/controllers/preferences/basic_preferences_controller_test.rb b/test/controllers/preferences/basic_preferences_controller_test.rb new file mode 100644 index 000000000..924f5ae84 --- /dev/null +++ b/test/controllers/preferences/basic_preferences_controller_test.rb @@ -0,0 +1,108 @@ +require "test_helper" + +module Preferences + class BasicPreferencesControllerTest < ActionDispatch::IntegrationTest + ## + # test all routes which lead to this controller + def test_routes + assert_routing( + { :path => "/preferences/basic", :method => :get }, + { :controller => "preferences/basic_preferences", :action => "show" } + ) + assert_routing( + { :path => "/preferences/basic", :method => :put }, + { :controller => "preferences/basic_preferences", :action => "update" } + ) + + get "/preferences" + assert_redirected_to "/preferences/basic" + + get "/preferences/edit" + assert_redirected_to "/preferences/basic" + end + + def test_update_preferred_editor + user = create(:user, :languages => []) + user.preferences.create(:k => "site.color_scheme", :v => "light") + user.preferences.create(:k => "map.color_scheme", :v => "light") + session_for(user) + + # Changing to a invalid editor should fail + put basic_preferences_path, :params => { :user => { :preferred_editor => "unknown", :languages => [] } } + assert_response :success + assert_template :show + assert_select ".alert-success", false + assert_select ".alert-danger", true + user.reload + assert_nil user.preferred_editor + assert_equal "light", user.preferences.find_by(:k => "site.color_scheme")&.v + assert_equal "light", user.preferences.find_by(:k => "map.color_scheme")&.v + + # Changing to a valid editor should work + put basic_preferences_path, :params => { :user => { :preferred_editor => "id", :languages => [] } } + assert_redirected_to basic_preferences_path + follow_redirect! + assert_template :show + assert_select ".alert-success", /^Preferences updated/ + user.reload + assert_equal "id", user.preferred_editor + assert_equal "light", user.preferences.find_by(:k => "site.color_scheme")&.v + assert_equal "light", user.preferences.find_by(:k => "map.color_scheme")&.v + + # Changing to the default editor should work + put basic_preferences_path, :params => { :user => { :preferred_editor => "default", :languages => [] } } + assert_redirected_to basic_preferences_path + follow_redirect! + assert_template :show + assert_select ".alert-success", /^Preferences updated/ + user.reload + assert_nil user.preferred_editor + assert_equal "light", user.preferences.find_by(:k => "site.color_scheme")&.v + assert_equal "light", user.preferences.find_by(:k => "map.color_scheme")&.v + end + + def test_update_preferred_site_color_scheme + user = create(:user, :languages => []) + session_for(user) + assert_nil user.preferences.find_by(:k => "site.color_scheme") + + # Changing when previously not defined + put basic_preferences_path, :params => { :user => user.attributes, :site_color_scheme => "light" } + assert_redirected_to basic_preferences_path + follow_redirect! + assert_template :show + assert_select ".alert-success", /^Preferences updated/ + assert_equal "light", user.preferences.find_by(:k => "site.color_scheme")&.v + + # Changing when previously defined + put basic_preferences_path, :params => { :user => user.attributes, :site_color_scheme => "auto" } + assert_redirected_to basic_preferences_path + follow_redirect! + assert_template :show + assert_select ".alert-success", /^Preferences updated/ + assert_equal "auto", user.preferences.find_by(:k => "site.color_scheme")&.v + end + + def test_update_preferred_map_color_scheme + user = create(:user, :languages => []) + session_for(user) + assert_nil user.preferences.find_by(:k => "map.color_scheme") + + # Changing when previously not defined + put basic_preferences_path, :params => { :user => user.attributes, :map_color_scheme => "light" } + assert_redirected_to basic_preferences_path + follow_redirect! + assert_template :show + assert_select ".alert-success", /^Preferences updated/ + assert_equal "light", user.preferences.find_by(:k => "map.color_scheme")&.v + + # Changing when previously defined + put basic_preferences_path, :params => { :user => user.attributes, :map_color_scheme => "auto" } + assert_redirected_to basic_preferences_path + follow_redirect! + assert_template :show + assert_select ".alert-success", /^Preferences updated/ + assert_equal "auto", user.preferences.find_by(:k => "map.color_scheme")&.v + end + end +end diff --git a/test/controllers/preferences_controller_test.rb b/test/controllers/preferences_controller_test.rb deleted file mode 100644 index 33563b129..000000000 --- a/test/controllers/preferences_controller_test.rb +++ /dev/null @@ -1,106 +0,0 @@ -require "test_helper" - -class PreferencesControllerTest < ActionDispatch::IntegrationTest - ## - # test all routes which lead to this controller - def test_routes - assert_routing( - { :path => "/preferences/basic", :method => :get }, - { :controller => "preferences", :action => "show" } - ) - assert_routing( - { :path => "/preferences/basic", :method => :put }, - { :controller => "preferences", :action => "update" } - ) - - get "/preferences" - assert_redirected_to "/preferences/basic" - - get "/preferences/edit" - assert_redirected_to "/preferences/basic" - end - - def test_update_preferred_editor - user = create(:user, :languages => []) - user.preferences.create(:k => "site.color_scheme", :v => "light") - user.preferences.create(:k => "map.color_scheme", :v => "light") - session_for(user) - - # Changing to a invalid editor should fail - put basic_preferences_path, :params => { :user => { :preferred_editor => "unknown", :languages => [] } } - assert_response :success - assert_template :show - assert_select ".alert-success", false - assert_select ".alert-danger", true - user.reload - assert_nil user.preferred_editor - assert_equal "light", user.preferences.find_by(:k => "site.color_scheme")&.v - assert_equal "light", user.preferences.find_by(:k => "map.color_scheme")&.v - - # Changing to a valid editor should work - put basic_preferences_path, :params => { :user => { :preferred_editor => "id", :languages => [] } } - assert_redirected_to basic_preferences_path - follow_redirect! - assert_template :show - assert_select ".alert-success", /^Preferences updated/ - user.reload - assert_equal "id", user.preferred_editor - assert_equal "light", user.preferences.find_by(:k => "site.color_scheme")&.v - assert_equal "light", user.preferences.find_by(:k => "map.color_scheme")&.v - - # Changing to the default editor should work - put basic_preferences_path, :params => { :user => { :preferred_editor => "default", :languages => [] } } - assert_redirected_to basic_preferences_path - follow_redirect! - assert_template :show - assert_select ".alert-success", /^Preferences updated/ - user.reload - assert_nil user.preferred_editor - assert_equal "light", user.preferences.find_by(:k => "site.color_scheme")&.v - assert_equal "light", user.preferences.find_by(:k => "map.color_scheme")&.v - end - - def test_update_preferred_site_color_scheme - user = create(:user, :languages => []) - session_for(user) - assert_nil user.preferences.find_by(:k => "site.color_scheme") - - # Changing when previously not defined - put basic_preferences_path, :params => { :user => user.attributes, :site_color_scheme => "light" } - assert_redirected_to basic_preferences_path - follow_redirect! - assert_template :show - assert_select ".alert-success", /^Preferences updated/ - assert_equal "light", user.preferences.find_by(:k => "site.color_scheme")&.v - - # Changing when previously defined - put basic_preferences_path, :params => { :user => user.attributes, :site_color_scheme => "auto" } - assert_redirected_to basic_preferences_path - follow_redirect! - assert_template :show - assert_select ".alert-success", /^Preferences updated/ - assert_equal "auto", user.preferences.find_by(:k => "site.color_scheme")&.v - end - - def test_update_preferred_map_color_scheme - user = create(:user, :languages => []) - session_for(user) - assert_nil user.preferences.find_by(:k => "map.color_scheme") - - # Changing when previously not defined - put basic_preferences_path, :params => { :user => user.attributes, :map_color_scheme => "light" } - assert_redirected_to basic_preferences_path - follow_redirect! - assert_template :show - assert_select ".alert-success", /^Preferences updated/ - assert_equal "light", user.preferences.find_by(:k => "map.color_scheme")&.v - - # Changing when previously defined - put basic_preferences_path, :params => { :user => user.attributes, :map_color_scheme => "auto" } - assert_redirected_to basic_preferences_path - follow_redirect! - assert_template :show - assert_select ".alert-success", /^Preferences updated/ - assert_equal "auto", user.preferences.find_by(:k => "map.color_scheme")&.v - end -end -- 2.39.5