Commit bba3d1e252263fe60fbb47232671153366e57394

Authored by Daniela Feitosa
1 parent 3e7e1a28

Allowing users to configure the page after login

Added field redirection_after_login on profiles and environments
New db/schema
Added a select to choose option to redirect on admin panel and on profile
control panel

(ActionItem2369)
app/controllers/public/account_controller.rb
... ... @@ -313,10 +313,27 @@ class AccountController < ApplicationController
313 313 end
314 314  
315 315 def go_to_initial_page
316   - if environment == current_user.environment
317   - redirect_back_or_default(user.admin_url)
  316 + if environment.enabled?('allow_change_of_redirection_after_login')
  317 + case user.preferred_login_redirection
  318 + when 'keep_on_same_page'
  319 + redirect_back_or_default(user.admin_url)
  320 + when 'site_homepage'
  321 + redirect_to :controller => :home
  322 + when 'user_profile_page'
  323 + redirect_to user.public_profile_url
  324 + when 'user_homepage'
  325 + redirect_to user.url
  326 + when 'user_control_panel'
  327 + redirect_to user.admin_url
  328 + else
  329 + redirect_back_or_default(user.admin_url)
  330 + end
318 331 else
319   - redirect_back_or_default(:controller => 'home')
  332 + if environment == current_user.environment
  333 + redirect_back_or_default(user.admin_url)
  334 + else
  335 + redirect_back_or_default(:controller => 'home')
  336 + end
320 337 end
321 338 end
322 339  
... ...
app/models/environment.rb
... ... @@ -123,10 +123,22 @@ class Environment < ActiveRecord::Base
123 123 'xmpp_chat' => _('XMPP/Jabber based chat'),
124 124 'show_zoom_button_on_article_images' => _('Show a zoom link on all article images'),
125 125 'captcha_for_logged_users' => _('Ask captcha when a logged user comments too'),
126   - 'skip_new_user_email_confirmation' => _('Skip e-mail confirmation for new users')
  126 + 'skip_new_user_email_confirmation' => _('Skip e-mail confirmation for new users'),
  127 + 'allow_change_of_redirection_after_login' => _('Allow users to set the page to redirect after login')
127 128 }
128 129 end
129 130  
  131 + def self.login_redirection_options
  132 + {
  133 + 'keep_on_same_page' => _('Stays on the same page the user was before login.'),
  134 + 'site_homepage' => _('Redirects the user to the environment homepage.'),
  135 + 'user_profile_page' => _('Redirects the user to his profile page.'),
  136 + 'user_homepage' => _('Redirects the user to his homepage.'),
  137 + 'user_control_panel' => _('Redirects the user to his control panel.')
  138 + }
  139 + end
  140 + validates_inclusion_of :redirection_after_login, :in => Environment.login_redirection_options.keys, :allow_nil => true
  141 +
130 142 # #################################################
131 143 # Relationships and applied behaviour
132 144 # #################################################
... ...
app/models/profile.rb
... ... @@ -972,4 +972,8 @@ private :generate_url, :url_options
972 972 end
973 973 end
974 974  
  975 + validates_inclusion_of :redirection_after_login, :in => Environment.login_redirection_options.keys, :allow_nil => true
  976 + def preferred_login_redirection
  977 + redirection_after_login.blank? ? environment.redirection_after_login : redirection_after_login
  978 + end
975 979 end
... ...
app/views/features/index.rhtml
... ... @@ -26,17 +26,12 @@ Check all the features you want to enable for your environment, uncheck all the
26 26  
27 27 <h2><%= _('Configure features') %></h2>
28 28  
29   -<table>
30   - <tr>
31   - <th><%= _('Option') %></th>
32   - <th><%= _('Choice') %></th>
33   - </tr>
34   - <tr>
35   - <td><%= _('Organization Approval Method') %></td>
36   - <td><%= select_organization_approval_method('environment', 'organization_approval_method') %></td>
37   - </tr>
38   -</table>
39   -
  29 +<h3><%= _('Page to redirect after login') %></h3>
  30 + <%= select 'environment', 'redirection_after_login', Environment.login_redirection_options.map{|key,value|[value,key]} %>
  31 +<hr/>
  32 +<h3><%= _('Organization Approval Method') %></h3>
  33 + <%= select_organization_approval_method('environment', 'organization_approval_method') %>
  34 +<hr/>
40 35  
41 36 <div>
42 37 <% button_bar do %>
... ...
app/views/profile_editor/edit.rhtml
... ... @@ -39,6 +39,11 @@
39 39 </div>
40 40 <% end %>
41 41  
  42 + <% if environment.enabled?('allow_change_of_redirection_after_login') %>
  43 + <h2><%= _('Page to redirect after login') %></h2>
  44 + <%= select 'profile_data', 'redirection_after_login', Environment.login_redirection_options.map{|key,value|[value,key]}, { :selected => @profile.preferred_login_redirection} %>
  45 + <% end %>
  46 +
42 47 <h2><%= _('Translations') %></h2>
43 48 <%= labelled_check_box(
44 49 _('Automaticaly redirect the visitor to the article translated to his/her language'),
... ...
db/migrate/20120824183534_add_redirection_after_login_to_environment.rb 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +class AddRedirectionAfterLoginToEnvironment < ActiveRecord::Migration
  2 + def self.up
  3 + add_column :environments, :redirection_after_login, :string, :default => 'keep_on_same_page'
  4 + end
  5 +
  6 + def self.down
  7 + remove_column :environments, :redirection_after_login
  8 + end
  9 +end
... ...
db/migrate/20120824184046_add_redirection_after_login_to_profiles.rb 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +class AddRedirectionAfterLoginToProfiles < ActiveRecord::Migration
  2 + def self.up
  3 + add_column :profiles, :redirection_after_login, :string
  4 + end
  5 +
  6 + def self.down
  7 + remove_column :profiles, :redirection_after_login
  8 + end
  9 +end
... ...
db/schema.rb
... ... @@ -261,6 +261,7 @@ ActiveRecord::Schema.define(:version =&gt; 20120825185219) do
261 261 t.datetime "created_at"
262 262 t.datetime "updated_at"
263 263 t.integer "reports_lower_bound", :default => 0, :null => false
  264 + t.string "redirection_after_login" :default => "keep_on_same_page"
264 265 end
265 266  
266 267 create_table "external_feeds", :force => true do |t|
... ... @@ -438,6 +439,7 @@ ActiveRecord::Schema.define(:version =&gt; 20120825185219) do
438 439 t.string "national_region_code"
439 440 t.boolean "is_template", :default => false
440 441 t.integer "template_id"
  442 + t.string "redirection_after_login"
441 443 end
442 444  
443 445 add_index "profiles", ["environment_id"], :name => "index_profiles_on_environment_id"
... ...
features/login.feature
... ... @@ -9,7 +9,8 @@ Feature: login
9 9 | joaosilva | Joao Silva |
10 10  
11 11 Scenario: login from portal homepage
12   - Given I am not logged in
  12 + Given feature "allow_change_of_redirection_after_login" is disabled on environment
  13 + And I am not logged in
13 14 And I go to the homepage
14 15 And I fill in the following:
15 16 | Username | joaosilva |
... ... @@ -19,7 +20,8 @@ Feature: login
19 20 And I should be logged in as "joaosilva"
20 21  
21 22 Scenario: login from some profile page
22   - Given I am not logged in
  23 + Given feature "allow_change_of_redirection_after_login" is disabled on environment
  24 + And I am not logged in
23 25 And the following users
24 26 | login | name |
25 27 | mariasilva | Maria Silva |
... ... @@ -35,7 +37,8 @@ Feature: login
35 37 Then I should be on Maria Silva's homepage
36 38  
37 39 Scenario: view my control panel
38   - Given I am not logged in
  40 + Given feature "allow_change_of_redirection_after_login" is disabled on environment
  41 + And I am not logged in
39 42 And I go to Joao Silva's control panel
40 43 And I should be on login page
41 44 And I fill in the following:
... ... @@ -48,3 +51,146 @@ Feature: login
48 51 Given I am logged in as "joaosilva"
49 52 And I go to login page
50 53 Then I should be on Joao Silva's control panel
  54 +
  55 + Scenario: stay on the same page after login if this is the environment default
  56 + Given feature "allow_change_of_redirection_after_login" is enabled on environment
  57 + And I am not logged in
  58 + And the environment is configured to stay on the same page after login
  59 + And the following users
  60 + | login | name |
  61 + | mariasilva | Maria Silva |
  62 + And the following articles
  63 + | owner | name | homepage |
  64 + | mariasilva | my home page | true |
  65 + And I go to Maria Silva's homepage
  66 + And I follow "Login"
  67 + And I fill in the following:
  68 + | Username | joaosilva |
  69 + | Password | 123456 |
  70 + When I press "Log in"
  71 + Then I should be on Maria Silva's homepage
  72 +
  73 + Scenario: go to site homepage if this is the environment default
  74 + Given feature "allow_change_of_redirection_after_login" is enabled on environment
  75 + And I am not logged in
  76 + And the environment is configured to redirect to site homepage after login
  77 + And I go to Joao Silva's homepage
  78 + And I follow "Login"
  79 + And I fill in the following:
  80 + | Username | joaosilva |
  81 + | Password | 123456 |
  82 + When I press "Log in"
  83 + Then I should be on the homepage
  84 +
  85 + Scenario: go to user profile after login if this is the environment default
  86 + Given feature "allow_change_of_redirection_after_login" is enabled on environment
  87 + And I am not logged in
  88 + And the environment is configured to redirect to user profile page after login
  89 + And I go to the homepage
  90 + And I follow "Login"
  91 + And I fill in the following:
  92 + | Username | joaosilva |
  93 + | Password | 123456 |
  94 + When I press "Log in"
  95 + Then I should be on Joao Silva's profile
  96 +
  97 + Scenario: go to profile homepage after login if this is the environment default
  98 + Given the following articles
  99 + | owner | name | body | homepage |
  100 + | joaosilva | Sample Article | This is an article | true |
  101 + And feature "allow_change_of_redirection_after_login" is enabled on environment
  102 + And I am not logged in
  103 + And the environment is configured to redirect to profile homepage after login
  104 + And I go to the homepage
  105 + And I follow "Login"
  106 + And I fill in the following:
  107 + | Username | joaosilva |
  108 + | Password | 123456 |
  109 + When I press "Log in"
  110 + Then I should be on Joao Silva's homepage
  111 +
  112 + Scenario: go to profile control panel after login if this is the environment default
  113 + Given feature "allow_change_of_redirection_after_login" is enabled on environment
  114 + And I am not logged in
  115 + And the environment is configured to redirect to profile control panel after login
  116 + And I go to the homepage
  117 + And I follow "Login"
  118 + And I fill in the following:
  119 + | Username | joaosilva |
  120 + | Password | 123456 |
  121 + When I press "Log in"
  122 + Then I should be on Joao Silva's control panel
  123 +
  124 + Scenario: stay on the same page after login if this is the profile default
  125 + Given feature "allow_change_of_redirection_after_login" is enabled on environment
  126 + And I am not logged in
  127 + And the environment is configured to redirect to site homepage after login
  128 + And the profile joaosilva is configured to stay on the same page after login
  129 + And the following users
  130 + | login | name |
  131 + | mariasilva | Maria Silva |
  132 + And the following articles
  133 + | owner | name | homepage |
  134 + | mariasilva | my home page | true |
  135 + And I go to Maria Silva's homepage
  136 + And I follow "Login"
  137 + And I fill in the following:
  138 + | Username | joaosilva |
  139 + | Password | 123456 |
  140 + When I press "Log in"
  141 + Then I should be on Maria Silva's homepage
  142 +
  143 + Scenario: go to site homepage if this is the profile default
  144 + Given feature "allow_change_of_redirection_after_login" is enabled on environment
  145 + And I am not logged in
  146 + And the environment is configured to stay on the same page after login
  147 + And the profile joaosilva is configured to redirect to site homepage after login
  148 + And I go to Joao Silva's homepage
  149 + And I follow "Login"
  150 + And I fill in the following:
  151 + | Username | joaosilva |
  152 + | Password | 123456 |
  153 + When I press "Log in"
  154 + Then I should be on the homepage
  155 +
  156 + Scenario: go to user profile after login if this is the profile default
  157 + Given feature "allow_change_of_redirection_after_login" is enabled on environment
  158 + And I am not logged in
  159 + And the environment is configured to stay on the same page after login
  160 + And the profile joaosilva is configured to redirect to user profile page after login
  161 + And I go to the homepage
  162 + And I follow "Login"
  163 + And I fill in the following:
  164 + | Username | joaosilva |
  165 + | Password | 123456 |
  166 + When I press "Log in"
  167 + Then I should be on Joao Silva's profile
  168 +
  169 + Scenario: go to profile homepage after login if this is the profile default
  170 + Given the following articles
  171 + | owner | name | body | homepage |
  172 + | joaosilva | Sample Article | This is an article | true |
  173 + And feature "allow_change_of_redirection_after_login" is enabled on environment
  174 + And I am not logged in
  175 + And the environment is configured to stay on the same page after login
  176 + And the profile joaosilva is configured to redirect to profile homepage after login
  177 + And I go to the homepage
  178 + And I follow "Login"
  179 + And I fill in the following:
  180 + | Username | joaosilva |
  181 + | Password | 123456 |
  182 + When I press "Log in"
  183 + Then I should be on Joao Silva's homepage
  184 +
  185 + Scenario: go to profile control panel after login if this is the profile default
  186 + Given feature "allow_change_of_redirection_after_login" is enabled on environment
  187 + And I am not logged in
  188 + And the environment is configured to stay on the same page after login
  189 + And the profile joaosilva is configured to redirect to profile control panel after login
  190 + And I go to the homepage
  191 + And I follow "Login"
  192 + And I fill in the following:
  193 + | Username | joaosilva |
  194 + | Password | 123456 |
  195 + When I press "Log in"
  196 + Then I should be on Joao Silva's control panel
... ...
features/step_definitions/noosfero_steps.rb
... ... @@ -712,3 +712,39 @@ When /^I make a AJAX request to (.*)$/ do |page|
712 712 header 'X-Requested-With', 'XMLHttpRequest'
713 713 visit(path_to(page))
714 714 end
  715 +
  716 +Given /^the environment is configured to (.*) after login$/ do |option|
  717 + redirection = case option
  718 + when 'stay on the same page'
  719 + 'keep_on_same_page'
  720 + when 'redirect to site homepage'
  721 + 'site_homepage'
  722 + when 'redirect to user profile page'
  723 + 'user_profile_page'
  724 + when 'redirect to profile homepage'
  725 + 'user_homepage'
  726 + when 'redirect to profile control panel'
  727 + 'user_control_panel'
  728 + end
  729 + environment = Environment.default
  730 + environment.redirection_after_login = redirection
  731 + environment.save
  732 +end
  733 +
  734 +Given /^the profile (.*) is configured to (.*) after login$/ do |profile, option|
  735 + redirection = case option
  736 + when 'stay on the same page'
  737 + 'keep_on_same_page'
  738 + when 'redirect to site homepage'
  739 + 'site_homepage'
  740 + when 'redirect to user profile page'
  741 + 'user_profile_page'
  742 + when 'redirect to profile homepage'
  743 + 'user_homepage'
  744 + when 'redirect to profile control panel'
  745 + 'user_control_panel'
  746 + end
  747 + profile = Profile.find_by_identifier(profile)
  748 + profile.redirection_after_login = redirection
  749 + profile.save
  750 +end
... ...
test/functional/profile_editor_controller_test.rb
... ... @@ -962,4 +962,21 @@ class ProfileEditorControllerTest &lt; ActionController::TestCase
962 962 assert_no_tag :tag => 'input', :attributes => {:name => 'profile_data[is_template]'}
963 963 end
964 964  
  965 + should 'display select to change redirection after login if enabled' do
  966 + e = Environment.default
  967 + e.enable('allow_change_of_redirection_after_login')
  968 + e.save
  969 +
  970 + get :edit, :profile => profile.identifier
  971 + assert_tag :tag => 'select', :attributes => {:id => 'profile_data_redirection_after_login'}
  972 + end
  973 +
  974 + should 'not display select to change redirection after login if not enabled' do
  975 + e = Environment.default
  976 + e.disable('allow_change_of_redirection_after_login')
  977 + e.save
  978 +
  979 + get :edit, :profile => profile.identifier
  980 + assert_no_tag :tag => 'select', :attributes => {:id => 'profile_data_redirection_after_login'}
  981 + end
965 982 end
... ...
test/unit/environment_test.rb
... ... @@ -1220,4 +1220,26 @@ class EnvironmentTest &lt; ActiveSupport::TestCase
1220 1220 assert_includes environment.licenses, l2
1221 1221 assert_not_includes environment.licenses, l3
1222 1222 end
  1223 +
  1224 + should 'return a Hash on login redirection options' do
  1225 + assert_kind_of Hash, Environment.login_redirection_options
  1226 + end
  1227 +
  1228 + should 'respond to redirection after login' do
  1229 + assert_respond_to Environment.new, :redirection_after_login
  1230 + end
  1231 +
  1232 + should 'allow only environment login redirection options' do
  1233 + environment = fast_create(Environment)
  1234 + environment.redirection_after_login = 'invalid_option'
  1235 + environment.save
  1236 + assert environment.errors.invalid?(:redirection_after_login)
  1237 +
  1238 + Environment.login_redirection_options.keys.each do |redirection|
  1239 + environment.redirection_after_login = redirection
  1240 + environment.save
  1241 + assert !environment.errors.invalid?(:redirection_after_login)
  1242 + end
  1243 + end
  1244 +
1223 1245 end
... ...
test/unit/profile_test.rb
... ... @@ -1916,4 +1916,33 @@ class ProfileTest &lt; ActiveSupport::TestCase
1916 1916 profile.save!
1917 1917 end
1918 1918  
  1919 + should 'respond to redirection_after_login' do
  1920 + assert_respond_to Profile.new, :redirection_after_login
  1921 + end
  1922 +
  1923 + should 'return profile preference of redirection unless it is blank' do
  1924 + environment = fast_create(Environment, :redirection_after_login => 'site_homepage')
  1925 + profile = fast_create(Profile, :redirection_after_login => 'keep_on_same_page', :environment_id => environment.id)
  1926 + assert_equal 'keep_on_same_page', profile.preferred_login_redirection
  1927 + end
  1928 +
  1929 + should 'return environment preference of redirection when profile preference is blank' do
  1930 + environment = fast_create(Environment, :redirection_after_login => 'site_homepage')
  1931 + profile = fast_create(Profile, :environment_id => environment.id)
  1932 + assert_equal 'site_homepage', profile.preferred_login_redirection
  1933 + end
  1934 +
  1935 + should 'allow only environment login redirection options' do
  1936 + profile = fast_create(Profile)
  1937 + profile.redirection_after_login = 'invalid_option'
  1938 + profile.save
  1939 + assert profile.errors.invalid?(:redirection_after_login)
  1940 +
  1941 + Environment.login_redirection_options.keys.each do |redirection|
  1942 + profile.redirection_after_login = redirection
  1943 + profile.save
  1944 + assert !profile.errors.invalid?(:redirection_after_login)
  1945 + end
  1946 + end
  1947 +
1919 1948 end
... ...