Commit 577d405e3bb4f42dc51724aa7a2e51bd3ed77210

Authored by Leandro Santos
1 parent 02848296

create the possibility to change theme by url parameter

app/controllers/application_controller.rb
@@ -13,6 +13,13 @@ class ApplicationController < ActionController::Base @@ -13,6 +13,13 @@ class ApplicationController < ActionController::Base
13 before_filter :verify_members_whitelist, :if => [:private_environment?, :user] 13 before_filter :verify_members_whitelist, :if => [:private_environment?, :user]
14 before_filter :redirect_to_current_user 14 before_filter :redirect_to_current_user
15 15
  16 + before_filter :set_session_theme
  17 + def set_session_theme
  18 + if params[:theme]
  19 + session[:theme] = environment.theme_ids.include?(params[:theme]) ? params[:theme] : nil
  20 + end
  21 + end
  22 +
16 def require_login_for_environment 23 def require_login_for_environment
17 login_required 24 login_required
18 end 25 end
app/controllers/my_profile/profile_themes_controller.rb
@@ -63,12 +63,12 @@ class ProfileThemesController < ThemesController @@ -63,12 +63,12 @@ class ProfileThemesController < ThemesController
63 end 63 end
64 64
65 def start_test 65 def start_test
66 - session[:theme] = params[:id] 66 + session[:user_theme] = params[:id]
67 redirect_to :controller => 'content_viewer', :profile => profile.identifier, :action => 'view_page' 67 redirect_to :controller => 'content_viewer', :profile => profile.identifier, :action => 'view_page'
68 end 68 end
69 69
70 def stop_test 70 def stop_test
71 - session[:theme] = nil 71 + session[:user_theme] = nil
72 redirect_to :action => 'index' 72 redirect_to :action => 'index'
73 end 73 end
74 74
app/helpers/application_helper.rb
@@ -344,7 +344,7 @@ module ApplicationHelper @@ -344,7 +344,7 @@ module ApplicationHelper
344 end 344 end
345 345
346 def is_testing_theme 346 def is_testing_theme
347 - !controller.session[:theme].nil? 347 + !controller.session[:user_theme].nil?
348 end 348 end
349 349
350 def theme_owner 350 def theme_owner
app/helpers/theme_loader_helper.rb
@@ -2,8 +2,8 @@ module ThemeLoaderHelper @@ -2,8 +2,8 @@ module ThemeLoaderHelper
2 def current_theme 2 def current_theme
3 @current_theme ||= 3 @current_theme ||=
4 begin 4 begin
5 - if session[:theme]  
6 - session[:theme] 5 + if session[:user_theme]
  6 + session[:user_theme]
7 else 7 else
8 # utility for developers: set the theme to 'random' in development mode and 8 # utility for developers: set the theme to 'random' in development mode and
9 # you will get a different theme every request. This is interesting for 9 # you will get a different theme every request. This is interesting for
@@ -11,8 +11,8 @@ module ThemeLoaderHelper @@ -11,8 +11,8 @@ module ThemeLoaderHelper
11 if Rails.env.development? && environment.theme == 'random' 11 if Rails.env.development? && environment.theme == 'random'
12 @random_theme ||= Dir.glob('public/designs/themes/*').map { |f| File.basename(f) }.rand 12 @random_theme ||= Dir.glob('public/designs/themes/*').map { |f| File.basename(f) }.rand
13 @random_theme 13 @random_theme
14 - elsif Rails.env.development? && respond_to?(:params) && params[:theme] && File.exists?(Rails.root.join('public/designs/themes', params[:theme]))  
15 - params[:theme] 14 + elsif Rails.env.development? && respond_to?(:params) && params[:user_theme] && File.exists?(Rails.root.join('public/designs/themes', params[:user_theme]))
  15 + params[:user_theme]
16 else 16 else
17 if profile && !profile.theme.nil? 17 if profile && !profile.theme.nil?
18 profile.theme 18 profile.theme
@@ -34,8 +34,10 @@ module ThemeLoaderHelper @@ -34,8 +34,10 @@ module ThemeLoaderHelper
34 end 34 end
35 35
36 def theme_path 36 def theme_path
37 - if session[:theme] 37 + if session[:user_theme]
38 '/user_themes/' + current_theme 38 '/user_themes/' + current_theme
  39 + elsif session[:theme]
  40 + '/designs/themes/' + session[:theme]
39 else 41 else
40 '/designs/themes/' + current_theme 42 '/designs/themes/' + current_theme
41 end 43 end
app/models/environment.rb
@@ -750,6 +750,10 @@ class Environment < ApplicationRecord @@ -750,6 +750,10 @@ class Environment < ApplicationRecord
750 end 750 end
751 end 751 end
752 752
  753 + def theme_ids
  754 + settings[:themes] || []
  755 + end
  756 +
753 def themes=(values) 757 def themes=(values)
754 settings[:themes] = values 758 settings[:themes] = values
755 end 759 end
app/models/person_notifier.rb
@@ -82,7 +82,7 @@ class PersonNotifier @@ -82,7 +82,7 @@ class PersonNotifier
82 helper ActionTrackerHelper 82 helper ActionTrackerHelper
83 83
84 def session 84 def session
85 - {:theme => nil} 85 + {:user_theme => nil}
86 end 86 end
87 87
88 def content_summary(person, notifications, tasks) 88 def content_summary(person, notifications, tasks)
test/functional/application_controller_test.rb
@@ -224,7 +224,7 @@ class ApplicationControllerTest < ActionController::TestCase @@ -224,7 +224,7 @@ class ApplicationControllerTest < ActionController::TestCase
224 end 224 end
225 225
226 should 'display theme test panel when testing theme' do 226 should 'display theme test panel when testing theme' do
227 - @request.session[:theme] = 'my-test-theme' 227 + @request.session[:user_theme] = 'my-test-theme'
228 theme = mock 228 theme = mock
229 profile = mock 229 profile = mock
230 theme.expects(:owner).returns(profile).at_least_once 230 theme.expects(:owner).returns(profile).at_least_once
@@ -576,4 +576,36 @@ class ApplicationControllerTest < ActionController::TestCase @@ -576,4 +576,36 @@ class ApplicationControllerTest < ActionController::TestCase
576 assert_redirected_to :controller => 'test', :action => 'index', :profile => profile.identifier 576 assert_redirected_to :controller => 'test', :action => 'index', :profile => profile.identifier
577 end 577 end
578 578
  579 + should 'set session theme if a params theme is passed as parameter' do
  580 + current_theme = 'my-test-theme'
  581 + environment = Environment.default
  582 + Theme.stubs(:system_themes).returns([Theme.new(current_theme)])
  583 + environment.themes = [current_theme]
  584 + environment.save!
  585 + assert_nil @request.session[:theme]
  586 + get :index, :theme => current_theme
  587 + assert_equal current_theme, @request.session[:theme]
  588 + end
  589 +
  590 + should 'set session theme only in environment available themes' do
  591 + environment = Environment.default
  592 + assert_nil @request.session[:theme]
  593 + environment.stubs(:theme_ids).returns(['another_theme'])
  594 + get :index, :theme => 'my-test-theme'
  595 + assert_nil @request.session[:theme]
  596 + end
  597 +
  598 + should 'unset session theme if not environment available themes is defined' do
  599 + environment = Environment.default
  600 + current_theme = 'my-test-theme'
  601 + Theme.stubs(:system_themes).returns([Theme.new(current_theme)])
  602 + environment.themes = [current_theme]
  603 + environment.save!
  604 + get :index, :theme => current_theme
  605 + assert_equal current_theme, @request.session[:theme]
  606 +
  607 + get :index, :theme => 'another_theme'
  608 + assert_nil @request.session[:theme]
  609 + end
  610 +
579 end 611 end
test/functional/profile_themes_controller_test.rb
@@ -231,7 +231,7 @@ class ProfileThemesControllerTest < ActionController::TestCase @@ -231,7 +231,7 @@ class ProfileThemesControllerTest < ActionController::TestCase
231 theme = Theme.create('theme-under-test', :owner => profile) 231 theme = Theme.create('theme-under-test', :owner => profile)
232 post :start_test, :profile => 'testinguser', :id => 'theme-under-test' 232 post :start_test, :profile => 'testinguser', :id => 'theme-under-test'
233 233
234 - assert_equal 'theme-under-test', session[:theme] 234 + assert_equal 'theme-under-test', session[:user_theme]
235 assert_redirected_to :controller => 'content_viewer', :profile => 'testinguser', :action => 'view_page' 235 assert_redirected_to :controller => 'content_viewer', :profile => 'testinguser', :action => 'view_page'
236 end 236 end
237 237
@@ -239,7 +239,7 @@ class ProfileThemesControllerTest < ActionController::TestCase @@ -239,7 +239,7 @@ class ProfileThemesControllerTest < ActionController::TestCase
239 theme = Theme.create('theme-under-test', :owner => profile) 239 theme = Theme.create('theme-under-test', :owner => profile)
240 post :stop_test, :profile => 'testinguser', :id => 'theme-under-test' 240 post :stop_test, :profile => 'testinguser', :id => 'theme-under-test'
241 241
242 - assert_nil session[:theme] 242 + assert_nil session[:user_theme]
243 assert_redirected_to :action => 'index' 243 assert_redirected_to :action => 'index'
244 end 244 end
245 245
test/unit/application_helper_test.rb
@@ -466,7 +466,7 @@ class ApplicationHelperTest < ActionView::TestCase @@ -466,7 +466,7 @@ class ApplicationHelperTest < ActionView::TestCase
466 should 'use theme passed via param when in development mode' do 466 should 'use theme passed via param when in development mode' do
467 stubs(:environment).returns(build(Environment, :theme => 'environment-theme')) 467 stubs(:environment).returns(build(Environment, :theme => 'environment-theme'))
468 Rails.env.stubs(:development?).returns(true) 468 Rails.env.stubs(:development?).returns(true)
469 - self.stubs(:params).returns({:theme => 'skyblue'}) 469 + self.stubs(:params).returns({:user_theme => 'skyblue'})
470 assert_equal 'skyblue', current_theme 470 assert_equal 'skyblue', current_theme
471 end 471 end
472 472
test/unit/content_viewer_helper_test.rb
@@ -101,14 +101,14 @@ class ContentViewerHelperTest < ActionView::TestCase @@ -101,14 +101,14 @@ class ContentViewerHelperTest < ActionView::TestCase
101 end 101 end
102 102
103 should 'theme provides addthis custom icon' do 103 should 'theme provides addthis custom icon' do
104 - stubs(:session).returns({:theme => 'base'}) 104 + stubs(:session).returns({:user_theme => 'base'})
105 File.expects(:exists?).with(anything).returns(true) 105 File.expects(:exists?).with(anything).returns(true)
106 Environment.any_instance.stubs(:default_hostname).returns('noosfero.org') 106 Environment.any_instance.stubs(:default_hostname).returns('noosfero.org')
107 assert_match 'addthis.gif', addthis_image_tag 107 assert_match 'addthis.gif', addthis_image_tag
108 end 108 end
109 109
110 should 'use default addthis icon if theme has no addthis.gif image' do 110 should 'use default addthis icon if theme has no addthis.gif image' do
111 - stubs(:session).returns({:theme => 'base'}) 111 + stubs(:session).returns({:user_theme => 'base'})
112 File.expects(:exists?).with(anything).returns(false) 112 File.expects(:exists?).with(anything).returns(false)
113 Environment.any_instance.stubs(:default_hostname).returns('noosfero.org') 113 Environment.any_instance.stubs(:default_hostname).returns('noosfero.org')
114 assert_match 'bt-bookmark.gif', addthis_image_tag 114 assert_match 'bt-bookmark.gif', addthis_image_tag
test/unit/environment_test.rb
@@ -457,6 +457,22 @@ class EnvironmentTest < ActiveSupport::TestCase @@ -457,6 +457,22 @@ class EnvironmentTest < ActiveSupport::TestCase
457 assert_equal ['new-theme', 'other-theme'], Environment.default.themes.map(&:id) 457 assert_equal ['new-theme', 'other-theme'], Environment.default.themes.map(&:id)
458 end 458 end
459 459
  460 + should 'return the theme ids' do
  461 + env = Environment.default
  462 + t1 = 'theme_1'
  463 + t2 = 'theme_2'
  464 + Theme.stubs(:system_themes).returns([Theme.new(t1), Theme.new(t2)])
  465 + env.themes = [t1, t2]
  466 + env.save!
  467 + assert_equivalent [t1, t2], Environment.default.theme_ids
  468 + end
  469 + should 'theme_ids be an empty array if there is no settings themes defined' do
  470 + env = Environment.default
  471 + env.settings[:themes] = nil
  472 + env.save!
  473 + assert Environment.default.theme_ids.empty?
  474 + end
  475 +
460 should 'create templates' do 476 should 'create templates' do
461 e = create(Environment, :name => 'test_env') 477 e = create(Environment, :name => 'test_env')
462 e.reload 478 e.reload
test/unit/theme_loader_helper_test.rb
@@ -20,7 +20,7 @@ class ThemeLoaderHelperTest < ActionView::TestCase @@ -20,7 +20,7 @@ class ThemeLoaderHelperTest < ActionView::TestCase
20 end 20 end
21 21
22 should 'override theme with testing theme from session' do 22 should 'override theme with testing theme from session' do
23 - stubs(:session).returns(:theme => 'theme-under-test') 23 + stubs(:session).returns(:user_theme => 'theme-under-test')
24 assert_equal 'theme-under-test', current_theme 24 assert_equal 'theme-under-test', current_theme
25 end 25 end
26 26
@@ -30,7 +30,17 @@ class ThemeLoaderHelperTest < ActionView::TestCase @@ -30,7 +30,17 @@ class ThemeLoaderHelperTest < ActionView::TestCase
30 end 30 end
31 31
32 should 'point to user theme path when testing theme' do 32 should 'point to user theme path when testing theme' do
33 - stubs(:session).returns({:theme => 'theme-under-test'}) 33 + stubs(:session).returns({:user_theme => 'theme-under-test'})
34 assert_equal '/user_themes/theme-under-test', theme_path 34 assert_equal '/user_themes/theme-under-test', theme_path
35 end 35 end
36 -end  
37 \ No newline at end of file 36 \ No newline at end of file
  37 +
  38 + should 'point to session theme is defined' do
  39 + session = mock
  40 + stubs(:session).returns(session)
  41 + my_session_theme = 'session_theme'
  42 + session.stubs(:[]).with(:user_theme).returns(nil)
  43 + session.stubs(:[]).with(:theme).returns(my_session_theme)
  44 + assert_equal '/designs/themes/' + my_session_theme, theme_path
  45 + end
  46 +
  47 +end