Commit b588a1a6ba577d9b473183b48716186df33b7c74
1 parent
cc4ec8ba
Exists in
master
and in
29 other branches
ActionItem789: making themes available only in its environment
* Listing environment themes and approved themes for selection * Adding settings 'themes' for the environment * Adding method approved_themes to theme.rb
Showing
6 changed files
with
89 additions
and
28 deletions
Show diff stats
app/controllers/my_profile/themes_controller.rb
... | ... | @@ -9,7 +9,7 @@ class ThemesController < MyProfileController |
9 | 9 | end |
10 | 10 | |
11 | 11 | def index |
12 | - @themes = Theme.system_themes + Theme.public_themes | |
12 | + @themes = profile.environment.themes + Theme.approved_themes(profile) | |
13 | 13 | @current_theme = profile.theme |
14 | 14 | |
15 | 15 | @layout_templates = LayoutTemplate.all | ... | ... |
app/models/environment.rb
... | ... | @@ -315,6 +315,18 @@ class Environment < ActiveRecord::Base |
315 | 315 | self[:theme] || 'default' |
316 | 316 | end |
317 | 317 | |
318 | + def themes | |
319 | + if settings[:themes] | |
320 | + Theme.system_themes.select { |theme| settings[:themes].include?(theme.id) } | |
321 | + else | |
322 | + [] | |
323 | + end | |
324 | + end | |
325 | + | |
326 | + def themes=(values) | |
327 | + settings[:themes] = values.map(&:id) | |
328 | + end | |
329 | + | |
318 | 330 | def layout_template |
319 | 331 | settings[:layout_template] || 'default' |
320 | 332 | end | ... | ... |
app/models/theme.rb
... | ... | @@ -2,7 +2,7 @@ class Theme |
2 | 2 | |
3 | 3 | class << self |
4 | 4 | def system_themes |
5 | - Dir.glob(RAILS_ROOT + '/public/designs/themes/*').map do |item| | |
5 | + Dir.glob(File.join(system_themes_dir, '*')).map do |item| | |
6 | 6 | File.basename(item) |
7 | 7 | end.map do |item| |
8 | 8 | new(item) |
... | ... | @@ -13,6 +13,10 @@ class Theme |
13 | 13 | File.join(RAILS_ROOT, 'public', 'user_themes') |
14 | 14 | end |
15 | 15 | |
16 | + def system_themes_dir | |
17 | + File.join(RAILS_ROOT, 'public', 'designs', 'themes') | |
18 | + end | |
19 | + | |
16 | 20 | def create(id, attributes = {}) |
17 | 21 | if find(id) || system_themes.map(&:id).include?(id) |
18 | 22 | raise DuplicatedIdentifier |
... | ... | @@ -37,12 +41,12 @@ class Theme |
37 | 41 | end |
38 | 42 | end |
39 | 43 | |
40 | - def public_themes | |
41 | - Dir.glob(File.join(user_themes_dir, '*', 'theme.yml')).select do |desc| | |
42 | - config = YAML.load_file(desc) | |
43 | - config['public'] | |
44 | + def approved_themes(owner) | |
45 | + Dir.glob(File.join(system_themes_dir, '*')).select do |item| | |
46 | + config = YAML.load_file(File.join(item, 'theme.yml')) | |
47 | + (config['owner_type'] == owner.class.base_class.name) && (config['owner_id'] == owner.id) || config['public'] | |
44 | 48 | end.map do |desc| |
45 | - Theme.find(File.basename(File.dirname(desc))) | |
49 | + new(File.basename(desc)) | |
46 | 50 | end |
47 | 51 | end |
48 | 52 | |
... | ... | @@ -59,6 +63,7 @@ class Theme |
59 | 63 | attributes.each do |k,v| |
60 | 64 | self.send("#{k}=", v) |
61 | 65 | end |
66 | + config['id'] = id | |
62 | 67 | end |
63 | 68 | |
64 | 69 | def name | ... | ... |
test/functional/themes_controller_test.rb
... | ... | @@ -24,40 +24,46 @@ class ThemesControllerTest < Test::Unit::TestCase |
24 | 24 | |
25 | 25 | TMP_THEMES_DIR = RAILS_ROOT + '/test/tmp/themes_controller' |
26 | 26 | |
27 | - should 'display list of themes for selection' do | |
28 | - Theme.expects(:system_themes).returns([Theme.new('first'), Theme.new('second')]) | |
27 | + should 'display themes that can be applied' do | |
28 | + env = Environment.default | |
29 | + Theme.stubs(:approved_themes).with(@profile).returns([Theme.new('t1', :name => 't1')]) | |
30 | + t2 = Theme.create('t2') | |
31 | + t3 = Theme.create('t3') | |
32 | + env.themes = [t2] | |
33 | + env.save | |
34 | + | |
35 | + Theme.stubs(:system_themes).returns([t2, t3]) | |
29 | 36 | get :index, :profile => 'testinguser' |
30 | 37 | |
31 | - %w[ first second ].each do |item| | |
38 | + %w[ t1 t2 ].each do |item| | |
32 | 39 | assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/themes/set/#{item}" } |
33 | 40 | end |
34 | - end | |
35 | - | |
36 | - should 'not display themes for selection if it is not public' do | |
37 | - Theme.create('first', :owner => profile, :public => true) | |
38 | - Theme.create('second', :owner => profile, :public => false) | |
39 | - get :index, :profile => 'testinguser' | |
40 | 41 | |
41 | - assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/themes/set/first" } | |
42 | - assert_no_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/themes/set/second" } | |
42 | + assert_no_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/themes/set/t3" } | |
43 | 43 | end |
44 | 44 | |
45 | 45 | should 'highlight current theme' do |
46 | - profile.update_attributes(:theme => 'first') | |
47 | - Theme.expects(:system_themes).returns([Theme.new('first'), Theme.new('second')]) | |
46 | + env = Environment.default | |
47 | + t1 = Theme.create('one', :name => 'one') | |
48 | + t2 = Theme.create('two', :name => 'two') | |
49 | + env.themes = [t1, t2] | |
50 | + env.save | |
51 | + | |
52 | + Theme.stubs(:system_themes).returns([t1, t2]) | |
53 | + profile.update_attributes(:theme => 'one') | |
48 | 54 | get :index, :profile => 'testinguser' |
49 | 55 | |
50 | 56 | assert_tag :attributes => { :class => 'selected theme' }, :descendant => { :content => /(current)/ } |
51 | - assert_no_tag :attributes => { :class => 'selected theme' }, :descendant => { :tag => 'a', :attributes => { :href => "/myprofile/testinguser/themes/set/first" } } | |
57 | + assert_no_tag :attributes => { :class => 'selected theme' }, :descendant => { :tag => 'a', :attributes => { :href => "/myprofile/testinguser/themes/set/one" } } | |
52 | 58 | end |
53 | 59 | |
54 | 60 | should 'display list of my themes for edition' do |
55 | - Theme.create('first', :owner => profile) | |
56 | - Theme.create('second', :owner => profile) | |
61 | + Theme.create('three', :owner => profile) | |
62 | + Theme.create('four', :owner => profile) | |
57 | 63 | |
58 | 64 | get :index, :profile => 'testinguser' |
59 | 65 | |
60 | - %w[ first second ].each do |item| | |
66 | + %w[ three four ].each do |item| | |
61 | 67 | assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/themes/edit/#{item}" } |
62 | 68 | end |
63 | 69 | end | ... | ... |
test/unit/environment_test.rb
... | ... | @@ -397,6 +397,31 @@ class EnvironmentTest < Test::Unit::TestCase |
397 | 397 | assert_equal 'default', Environment.new.theme |
398 | 398 | end |
399 | 399 | |
400 | + should 'have a list of themes' do | |
401 | + env = Environment.default | |
402 | + t1 = mock | |
403 | + t2 = mock | |
404 | + | |
405 | + t1.stubs(:id).returns('theme_1') | |
406 | + t2.stubs(:id).returns('theme_2') | |
407 | + | |
408 | + Theme.expects(:system_themes).returns([t1, t2]) | |
409 | + env.themes = [t1, t2] | |
410 | + env.save! | |
411 | + assert_equal [t1, t2], Environment.default.themes | |
412 | + end | |
413 | + | |
414 | + should 'set themes to environment' do | |
415 | + env = Environment.default | |
416 | + t1 = mock | |
417 | + | |
418 | + t1.stubs(:id).returns('theme_1') | |
419 | + | |
420 | + env.themes = [t1] | |
421 | + env.save | |
422 | + assert_equal [t1.id], Environment.default.settings[:themes] | |
423 | + end | |
424 | + | |
400 | 425 | should 'create templates' do |
401 | 426 | e = Environment.create!(:name => 'test_env') |
402 | 427 | e.reload | ... | ... |
test/unit/theme_test.rb
... | ... | @@ -27,6 +27,12 @@ class ThemeTest < ActiveSupport::TestCase |
27 | 27 | assert_equal 'the-id', Theme.new('the-id').name |
28 | 28 | end |
29 | 29 | |
30 | + should 'save id on theme.yml' do | |
31 | + Theme.create('other_theme') | |
32 | + t = Theme.find('other_theme') | |
33 | + assert t.config['id'] | |
34 | + end | |
35 | + | |
30 | 36 | should 'create theme' do |
31 | 37 | t = Theme.create('mytheme') |
32 | 38 | assert_equal t, Theme.find('mytheme') |
... | ... | @@ -149,12 +155,19 @@ class ThemeTest < ActiveSupport::TestCase |
149 | 155 | assert_equivalent [ 'one.png', 'two.png' ], theme.image_files |
150 | 156 | end |
151 | 157 | |
152 | - should 'be able to find public themes' do | |
158 | + should 'be able to find approved themes' do | |
159 | + Theme.stubs(:system_themes_dir).returns(TMP_THEMES_DIR) | |
160 | + | |
153 | 161 | profile = create_user('testinguser').person |
154 | - t1 = Theme.create('mytheme', :owner => profile, :public => false) | |
155 | - t2 = Theme.create('mytheme2', :owner => profile, :public => true) | |
162 | + profile2 = create_user('testinguser2').person | |
163 | + t1 = Theme.new('mytheme1', :name => 'mytheme1', :owner => profile, :public => false); t1.save | |
164 | + t2 = Theme.new('mytheme2', :name => 'mytheme2', :owner => profile2, :public => true); t2.save | |
165 | + t3 = Theme.new('mytheme3', :name => 'mytheme3', :public => false); t3.save | |
156 | 166 | |
157 | - assert_equal [t2], Theme.public_themes | |
167 | + [Theme.find(t2.id), Theme.find(t1.id)].each do |theme| | |
168 | + assert Theme.approved_themes(profile).include?(theme) | |
169 | + end | |
170 | + assert ! Theme.approved_themes(profile).include?(Theme.find(t3.id)) | |
158 | 171 | end |
159 | 172 | |
160 | 173 | should 'set theme to public' do | ... | ... |