alchemy_cms 2.1.9 → 2.1.9.1
Sign up to get free protection for your applications and to get access to all the features.
- data/app/controllers/alchemy/admin/pages_controller.rb +1 -2
- data/app/controllers/alchemy/pages_controller.rb +3 -3
- data/app/models/alchemy/page.rb +9 -5
- data/lib/alchemy/version.rb +1 -1
- data/spec/controllers/admin/pages_controller_spec.rb +31 -0
- data/spec/integration/pages_controller_spec.rb +13 -0
- data/spec/models/page_spec.rb +70 -0
- metadata +34 -34
@@ -181,8 +181,7 @@ module Alchemy
|
|
181
181
|
new_language_root = Page.copy(
|
182
182
|
original_language_root,
|
183
183
|
:language_id => params[:languages][:new_lang_id],
|
184
|
-
:language_code => session[:language_code]
|
185
|
-
:layoutpage => params[:layoutpage]
|
184
|
+
:language_code => session[:language_code]
|
186
185
|
)
|
187
186
|
new_language_root.move_to_child_of Page.root
|
188
187
|
original_language_root.copy_children_to(new_language_root)
|
@@ -17,7 +17,7 @@ module Alchemy
|
|
17
17
|
:cache_path => proc { show_page_url(:urlname => params[:urlname], :lang => multi_language? ? params[:lang] : nil) },
|
18
18
|
:if => proc {
|
19
19
|
if Alchemy::Config.get(:cache_pages)
|
20
|
-
page = Page.find_by_urlname_and_language_id_and_public(
|
20
|
+
page = Page.contentpages.find_by_urlname_and_language_id_and_public(
|
21
21
|
params[:urlname],
|
22
22
|
session[:language_id],
|
23
23
|
true,
|
@@ -70,10 +70,10 @@ module Alchemy
|
|
70
70
|
if params[:urlname].blank?
|
71
71
|
@page = Page.language_root_for(Language.get_default.id)
|
72
72
|
else
|
73
|
-
@page = Page.find_by_urlname_and_language_id(params[:urlname], session[:language_id])
|
73
|
+
@page = Page.contentpages.find_by_urlname_and_language_id(params[:urlname], session[:language_id])
|
74
74
|
# try to find the page in another language
|
75
75
|
if @page.nil?
|
76
|
-
@page = Page.find_by_urlname(params[:urlname])
|
76
|
+
@page = Page.contentpages.find_by_urlname(params[:urlname])
|
77
77
|
else
|
78
78
|
return @page
|
79
79
|
end
|
data/app/models/alchemy/page.rb
CHANGED
@@ -24,11 +24,11 @@ module Alchemy
|
|
24
24
|
attr_accessor :do_not_sweep
|
25
25
|
attr_accessor :do_not_validate_language
|
26
26
|
|
27
|
-
before_validation :set_url_name, :
|
28
|
-
before_save :set_title, :unless => proc { |page|
|
27
|
+
before_validation :set_url_name, :if => :contentpage?
|
28
|
+
before_save :set_title, :if => :contentpage?, :unless => proc { |page| !page.title.blank? }
|
29
29
|
before_save :set_language_code, :unless => :systempage?
|
30
|
-
before_save :set_restrictions_to_child_pages, :if => proc { |page|
|
31
|
-
before_save :inherit_restricted_status, :if => proc { |page|
|
30
|
+
before_save :set_restrictions_to_child_pages, :if => proc { |page| page.contentpage? && page.restricted_changed? }
|
31
|
+
before_save :inherit_restricted_status, :if => proc { |page| page.contentpage? && page.parent && page.parent.restricted? }
|
32
32
|
after_create :autogenerate_elements, :unless => proc { |page| page.systempage? || page.do_not_autogenerate }
|
33
33
|
after_create :create_cells, :unless => :systempage?
|
34
34
|
|
@@ -48,9 +48,9 @@ module Alchemy
|
|
48
48
|
scope :all_last_edited_from, lambda { |user| where(:updater_id => user.id).order('`alchemy_pages`.`updated_at` DESC').limit(5) }
|
49
49
|
# Returns all pages that have the given language_id
|
50
50
|
scope :with_language, lambda { |language_id| where(:language_id => language_id) }
|
51
|
+
scope :contentpages, where(:layoutpage => [false, nil]).where("`alchemy_pages`.`parent_id` IS NOT NULL")
|
51
52
|
# Returns all pages that are not locked and public.
|
52
53
|
# Used for flushing all page caches at once.
|
53
|
-
scope :contentpages, where("`alchemy_pages`.`layoutpage` = 0 AND `alchemy_pages`.`parent_id` IS NOT NULL")
|
54
54
|
scope :flushables, not_locked.published.contentpages
|
55
55
|
scope :searchables, not_restricted.published.contentpages
|
56
56
|
|
@@ -496,6 +496,10 @@ module Alchemy
|
|
496
496
|
rootpage? || (self.parent_id == Page.root.id && !self.language_root?)
|
497
497
|
end
|
498
498
|
|
499
|
+
def contentpage?
|
500
|
+
!systempage? && !redirects_to_external? && !layoutpage?
|
501
|
+
end
|
502
|
+
|
499
503
|
def self.rootpage
|
500
504
|
self.root
|
501
505
|
end
|
data/lib/alchemy/version.rb
CHANGED
@@ -16,4 +16,35 @@ describe Alchemy::Admin::PagesController do
|
|
16
16
|
|
17
17
|
end
|
18
18
|
|
19
|
+
describe '#copy_language_tree' do
|
20
|
+
|
21
|
+
before(:each) do
|
22
|
+
@language = Alchemy::Language.get_default
|
23
|
+
@language_root = Factory(:language_root_page, :language => @language, :name => 'Intro')
|
24
|
+
@level_1 = Factory(:public_page, :language => @language, :parent_id => @language_root.id, :visible => true, :name => 'Level 1')
|
25
|
+
@level_2 = Factory(:public_page, :language => @language, :parent_id => @level_1.id, :visible => true, :name => 'Level 2')
|
26
|
+
@level_3 = Factory(:public_page, :language => @language, :parent_id => @level_2.id, :visible => true, :name => 'Level 3')
|
27
|
+
@level_4 = Factory(:public_page, :language => @language, :parent_id => @level_3.id, :visible => true, :name => 'Level 4')
|
28
|
+
@new_language = Factory(:language)
|
29
|
+
session[:language_code] = @new_language.code
|
30
|
+
session[:language_id] = @new_language.id
|
31
|
+
post :copy_language_tree, {:languages => {:new_lang_id => @new_language.id, :old_lang_id => @language.id}}
|
32
|
+
@new_lang_root = Alchemy::Page.language_root_for(@new_language.id)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should copy all pages" do
|
36
|
+
@new_lang_root.descendants.count.should == 4
|
37
|
+
@new_lang_root.descendants.collect(&:name).should == ["Level 1 (Copy)", "Level 2 (Copy)", "Level 3 (Copy)", "Level 4 (Copy)"]
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should not set layoutpage attribute to nil" do
|
41
|
+
@new_lang_root.layoutpage.should_not be_nil
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should not set layoutpage attribute to true" do
|
45
|
+
@new_lang_root.layoutpage.should_not be_true
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
19
50
|
end
|
@@ -26,6 +26,19 @@ describe Alchemy::PagesController do
|
|
26
26
|
within('div#navigation ul') { page.should have_selector('li a[href="/alchemy/page-1"], li a[href="/alchemy/page-2"]') }
|
27
27
|
end
|
28
28
|
|
29
|
+
context "when a global page with the same urlname as the requested page exists in the language tree" do
|
30
|
+
|
31
|
+
it "should render the content page, not the global page" do
|
32
|
+
globalpage = Factory(:public_page, :layoutpage => true, :language => @default_language, :name => "samename", :urlname => "samename", :parent_id => @default_language_root.id)
|
33
|
+
contentpage = Factory(:public_page, :layoutpage => false, :language => @default_language, :name => "samename", :urlname => "samename", :parent_id => @default_language_root.id)
|
34
|
+
article = contentpage.elements.find_by_name('article')
|
35
|
+
article.content_by_name('intro').essence.update_attributes(:body => 'rendered on contentpage', :public => true)
|
36
|
+
visit("/alchemy/samename")
|
37
|
+
within('div#content div.article div.intro') { page.should have_content('rendered on contentpage') }
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
29
42
|
end
|
30
43
|
|
31
44
|
describe "fulltext search" do
|
data/spec/models/page_spec.rb
CHANGED
@@ -105,6 +105,38 @@ describe Alchemy::Page do
|
|
105
105
|
|
106
106
|
end
|
107
107
|
|
108
|
+
describe "#contentpage" do
|
109
|
+
|
110
|
+
it "should return false if its a systempage" do
|
111
|
+
@page = Factory(:page, :language => @language, :parent_id => @language_root.id)
|
112
|
+
@page.stub!(:systempage?).and_return(true)
|
113
|
+
@page.stub!(:redirects_to_external?).and_return(false)
|
114
|
+
@page.contentpage?.should be_false
|
115
|
+
end
|
116
|
+
|
117
|
+
it "should return false if it redirects to an external website" do
|
118
|
+
@page = Factory(:page, :layoutpage => false, :language => @language, :parent_id => @language_root.id)
|
119
|
+
@page.stub!(:systempage?).and_return(false)
|
120
|
+
@page.stub!(:redirects_to_external?).and_return(true)
|
121
|
+
@page.contentpage?.should be_false
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should return false if its a layoutpage" do
|
125
|
+
@page = Factory(:page, :layoutpage => true, :language => @language, :parent_id => @language_root.id)
|
126
|
+
@page.stub!(:systempage?).and_return(false)
|
127
|
+
@page.stub!(:redirects_to_external?).and_return(false)
|
128
|
+
@page.contentpage?.should be_false
|
129
|
+
end
|
130
|
+
|
131
|
+
it "should return true if its not a layoutpage, does not redirect to an external website and its not a systempage" do
|
132
|
+
@page = Factory(:page, :language => @language, :parent_id => @language_root.id)
|
133
|
+
@page.stub!(:systempage?).and_return(false)
|
134
|
+
@page.stub!(:redirects_to_external?).and_return(false)
|
135
|
+
@page.contentpage?.should be_true
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
139
|
+
|
108
140
|
describe '#create' do
|
109
141
|
|
110
142
|
context "before/after filter" do
|
@@ -134,6 +166,20 @@ describe Alchemy::Page do
|
|
134
166
|
page.urlname.should == '--a'
|
135
167
|
end
|
136
168
|
|
169
|
+
context "with attribute :layoutpage set to true (global page)" do
|
170
|
+
|
171
|
+
it "should not set the title from its name if its a global page" do
|
172
|
+
page = Factory(:page, :layoutpage => true, :name => 'Page with no title', :language => @language, :parent_id => @language_root.id)
|
173
|
+
page.title.should be_blank
|
174
|
+
end
|
175
|
+
|
176
|
+
it "should not set an urlname" do
|
177
|
+
page = Factory(:page, :layoutpage => true, :name => 'Page with no urlname', :language => @language, :parent_id => @language_root.id)
|
178
|
+
page.urlname.should be_blank
|
179
|
+
end
|
180
|
+
|
181
|
+
end
|
182
|
+
|
137
183
|
end
|
138
184
|
|
139
185
|
end
|
@@ -180,6 +226,30 @@ describe Alchemy::Page do
|
|
180
226
|
|
181
227
|
end
|
182
228
|
|
229
|
+
context ".contentpages" do
|
230
|
+
|
231
|
+
before(:each) do
|
232
|
+
@klingonian = Factory(:language)
|
233
|
+
@layoutroot = Alchemy::Page.find_or_create_layout_root_for(@klingonian.id)
|
234
|
+
@layoutpage = Factory(:public_page, :name => 'layoutpage', :layoutpage => true, :parent_id => @layoutroot.id, :language => @klingonian)
|
235
|
+
@klingonian_lang_root = Factory(:language_root_page, :name => 'klingonian_lang_root', :layoutpage => nil, :language => @klingonian)
|
236
|
+
@contentpage = Factory(:public_page, :name => 'contentpage', :parent_id => @language_root.id, :language => @language)
|
237
|
+
end
|
238
|
+
|
239
|
+
it "should return a collection of contentpages" do
|
240
|
+
Alchemy::Page.contentpages.to_a.should == [@language_root, @klingonian_lang_root, @contentpage]
|
241
|
+
end
|
242
|
+
|
243
|
+
it "should not contain pages with attribute :layoutpage set to true" do
|
244
|
+
Alchemy::Page.contentpages.to_a.select { |p| p.layoutpage == true }.should be_empty
|
245
|
+
end
|
246
|
+
|
247
|
+
it "should contain pages with attribute :layoutpage set to nil" do
|
248
|
+
Alchemy::Page.contentpages.to_a.select { |p| p.layoutpage == nil }.should == [@klingonian_lang_root]
|
249
|
+
end
|
250
|
+
|
251
|
+
end
|
252
|
+
|
183
253
|
context ".public" do
|
184
254
|
|
185
255
|
it "should return pages that are public" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: alchemy_cms
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.9
|
4
|
+
version: 2.1.9.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,11 +11,11 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2012-04-
|
14
|
+
date: 2012-04-17 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: rails
|
18
|
-
requirement: &
|
18
|
+
requirement: &70284747089940 !ruby/object:Gem::Requirement
|
19
19
|
none: false
|
20
20
|
requirements:
|
21
21
|
- - ~>
|
@@ -23,10 +23,10 @@ dependencies:
|
|
23
23
|
version: 3.1.4
|
24
24
|
type: :runtime
|
25
25
|
prerelease: false
|
26
|
-
version_requirements: *
|
26
|
+
version_requirements: *70284747089940
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: authlogic
|
29
|
-
requirement: &
|
29
|
+
requirement: &70284747092840 !ruby/object:Gem::Requirement
|
30
30
|
none: false
|
31
31
|
requirements:
|
32
32
|
- - ! '>='
|
@@ -34,10 +34,10 @@ dependencies:
|
|
34
34
|
version: '0'
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
|
-
version_requirements: *
|
37
|
+
version_requirements: *70284747092840
|
38
38
|
- !ruby/object:Gem::Dependency
|
39
39
|
name: awesome_nested_set
|
40
|
-
requirement: &
|
40
|
+
requirement: &70284747084300 !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
43
43
|
- - ~>
|
@@ -45,10 +45,10 @@ dependencies:
|
|
45
45
|
version: '2.0'
|
46
46
|
type: :runtime
|
47
47
|
prerelease: false
|
48
|
-
version_requirements: *
|
48
|
+
version_requirements: *70284747084300
|
49
49
|
- !ruby/object:Gem::Dependency
|
50
50
|
name: declarative_authorization
|
51
|
-
requirement: &
|
51
|
+
requirement: &70284746634060 !ruby/object:Gem::Requirement
|
52
52
|
none: false
|
53
53
|
requirements:
|
54
54
|
- - ~>
|
@@ -56,10 +56,10 @@ dependencies:
|
|
56
56
|
version: 0.5.4
|
57
57
|
type: :runtime
|
58
58
|
prerelease: false
|
59
|
-
version_requirements: *
|
59
|
+
version_requirements: *70284746634060
|
60
60
|
- !ruby/object:Gem::Dependency
|
61
61
|
name: tvdeyen-fleximage
|
62
|
-
requirement: &
|
62
|
+
requirement: &70284746630840 !ruby/object:Gem::Requirement
|
63
63
|
none: false
|
64
64
|
requirements:
|
65
65
|
- - ~>
|
@@ -67,10 +67,10 @@ dependencies:
|
|
67
67
|
version: 1.2.0
|
68
68
|
type: :runtime
|
69
69
|
prerelease: false
|
70
|
-
version_requirements: *
|
70
|
+
version_requirements: *70284746630840
|
71
71
|
- !ruby/object:Gem::Dependency
|
72
72
|
name: kaminari
|
73
|
-
requirement: &
|
73
|
+
requirement: &70284740758960 !ruby/object:Gem::Requirement
|
74
74
|
none: false
|
75
75
|
requirements:
|
76
76
|
- - ~>
|
@@ -78,10 +78,10 @@ dependencies:
|
|
78
78
|
version: 0.13.0
|
79
79
|
type: :runtime
|
80
80
|
prerelease: false
|
81
|
-
version_requirements: *
|
81
|
+
version_requirements: *70284740758960
|
82
82
|
- !ruby/object:Gem::Dependency
|
83
83
|
name: acts_as_ferret
|
84
|
-
requirement: &
|
84
|
+
requirement: &70284740785920 !ruby/object:Gem::Requirement
|
85
85
|
none: false
|
86
86
|
requirements:
|
87
87
|
- - ~>
|
@@ -89,10 +89,10 @@ dependencies:
|
|
89
89
|
version: '0.5'
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
|
-
version_requirements: *
|
92
|
+
version_requirements: *70284740785920
|
93
93
|
- !ruby/object:Gem::Dependency
|
94
94
|
name: acts_as_list
|
95
|
-
requirement: &
|
95
|
+
requirement: &70284740784760 !ruby/object:Gem::Requirement
|
96
96
|
none: false
|
97
97
|
requirements:
|
98
98
|
- - ~>
|
@@ -100,10 +100,10 @@ dependencies:
|
|
100
100
|
version: '0.1'
|
101
101
|
type: :runtime
|
102
102
|
prerelease: false
|
103
|
-
version_requirements: *
|
103
|
+
version_requirements: *70284740784760
|
104
104
|
- !ruby/object:Gem::Dependency
|
105
105
|
name: magiclabs-userstamp
|
106
|
-
requirement: &
|
106
|
+
requirement: &70284740782660 !ruby/object:Gem::Requirement
|
107
107
|
none: false
|
108
108
|
requirements:
|
109
109
|
- - ~>
|
@@ -111,10 +111,10 @@ dependencies:
|
|
111
111
|
version: 2.0.2
|
112
112
|
type: :runtime
|
113
113
|
prerelease: false
|
114
|
-
version_requirements: *
|
114
|
+
version_requirements: *70284740782660
|
115
115
|
- !ruby/object:Gem::Dependency
|
116
116
|
name: dynamic_form
|
117
|
-
requirement: &
|
117
|
+
requirement: &70284740797300 !ruby/object:Gem::Requirement
|
118
118
|
none: false
|
119
119
|
requirements:
|
120
120
|
- - ~>
|
@@ -122,10 +122,10 @@ dependencies:
|
|
122
122
|
version: '1.1'
|
123
123
|
type: :runtime
|
124
124
|
prerelease: false
|
125
|
-
version_requirements: *
|
125
|
+
version_requirements: *70284740797300
|
126
126
|
- !ruby/object:Gem::Dependency
|
127
127
|
name: jquery-rails
|
128
|
-
requirement: &
|
128
|
+
requirement: &70284740796020 !ruby/object:Gem::Requirement
|
129
129
|
none: false
|
130
130
|
requirements:
|
131
131
|
- - ~>
|
@@ -133,10 +133,10 @@ dependencies:
|
|
133
133
|
version: 1.0.16
|
134
134
|
type: :runtime
|
135
135
|
prerelease: false
|
136
|
-
version_requirements: *
|
136
|
+
version_requirements: *70284740796020
|
137
137
|
- !ruby/object:Gem::Dependency
|
138
138
|
name: attachment_magic
|
139
|
-
requirement: &
|
139
|
+
requirement: &70284740792180 !ruby/object:Gem::Requirement
|
140
140
|
none: false
|
141
141
|
requirements:
|
142
142
|
- - ~>
|
@@ -144,10 +144,10 @@ dependencies:
|
|
144
144
|
version: 0.2.1
|
145
145
|
type: :runtime
|
146
146
|
prerelease: false
|
147
|
-
version_requirements: *
|
147
|
+
version_requirements: *70284740792180
|
148
148
|
- !ruby/object:Gem::Dependency
|
149
149
|
name: sass-rails
|
150
|
-
requirement: &
|
150
|
+
requirement: &70284740791220 !ruby/object:Gem::Requirement
|
151
151
|
none: false
|
152
152
|
requirements:
|
153
153
|
- - ~>
|
@@ -155,10 +155,10 @@ dependencies:
|
|
155
155
|
version: 3.1.4
|
156
156
|
type: :runtime
|
157
157
|
prerelease: false
|
158
|
-
version_requirements: *
|
158
|
+
version_requirements: *70284740791220
|
159
159
|
- !ruby/object:Gem::Dependency
|
160
160
|
name: rspec-rails
|
161
|
-
requirement: &
|
161
|
+
requirement: &70284740804680 !ruby/object:Gem::Requirement
|
162
162
|
none: false
|
163
163
|
requirements:
|
164
164
|
- - ~>
|
@@ -166,10 +166,10 @@ dependencies:
|
|
166
166
|
version: '2.8'
|
167
167
|
type: :development
|
168
168
|
prerelease: false
|
169
|
-
version_requirements: *
|
169
|
+
version_requirements: *70284740804680
|
170
170
|
- !ruby/object:Gem::Dependency
|
171
171
|
name: sqlite3
|
172
|
-
requirement: &
|
172
|
+
requirement: &70284740803480 !ruby/object:Gem::Requirement
|
173
173
|
none: false
|
174
174
|
requirements:
|
175
175
|
- - ! '>='
|
@@ -177,7 +177,7 @@ dependencies:
|
|
177
177
|
version: '0'
|
178
178
|
type: :development
|
179
179
|
prerelease: false
|
180
|
-
version_requirements: *
|
180
|
+
version_requirements: *70284740803480
|
181
181
|
description: Alchemy is a Rails 3 CMS with a flexible content storing architecture.
|
182
182
|
email:
|
183
183
|
- alchemy@magiclabs.de
|
@@ -816,7 +816,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
816
816
|
version: '0'
|
817
817
|
segments:
|
818
818
|
- 0
|
819
|
-
hash:
|
819
|
+
hash: 219358527196005840
|
820
820
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
821
821
|
none: false
|
822
822
|
requirements:
|
@@ -825,7 +825,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
825
825
|
version: '0'
|
826
826
|
segments:
|
827
827
|
- 0
|
828
|
-
hash:
|
828
|
+
hash: 219358527196005840
|
829
829
|
requirements:
|
830
830
|
- ImageMagick (libmagick), v6.6 or greater.
|
831
831
|
rubyforge_project:
|