browsercms 3.0.2 → 3.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/app/controllers/cms/content_block_controller.rb +25 -2
- data/app/controllers/cms/content_controller.rb +31 -2
- data/app/controllers/cms/dashboard_controller.rb +2 -1
- data/app/controllers/cms/error_handling.rb +9 -2
- data/app/controllers/cms/links_controller.rb +2 -0
- data/app/controllers/cms/pages_controller.rb +22 -18
- data/app/controllers/cms/section_nodes_controller.rb +1 -1
- data/app/controllers/cms/sections_controller.rb +12 -7
- data/app/controllers/cms/sessions_controller.rb +17 -10
- data/app/controllers/cms/users_controller.rb +8 -6
- data/app/helpers/cms/application_helper.rb +2 -6
- data/app/helpers/cms/menu_helper.rb +118 -146
- data/app/helpers/cms/page_helper.rb +2 -2
- data/app/models/attachment.rb +2 -2
- data/app/models/group.rb +13 -2
- data/app/models/guest_user.rb +9 -3
- data/app/models/link.rb +2 -2
- data/app/models/page.rb +1 -1
- data/app/models/section.rb +7 -2
- data/app/models/user.rb +35 -17
- data/app/views/cms/blocks/_toolbar_for_member.html.erb +3 -3
- data/app/views/cms/blocks/index.html.erb +11 -6
- data/app/views/cms/content/show.html.erb +3 -3
- data/app/views/cms/menus/_menu.html.erb +9 -0
- data/app/views/cms/menus/_menu_item.html.erb +11 -0
- data/app/views/cms/pages/_edit_connector.html.erb +1 -1
- data/app/views/cms/pages/_edit_container.html.erb +1 -1
- data/app/views/cms/section_nodes/_node.html.erb +1 -1
- data/app/views/cms/sections/_form.html.erb +36 -34
- data/app/views/cms/shared/access_denied.html.erb +3 -0
- data/app/views/cms/users/change_password.html.erb +8 -6
- data/app/views/cms/users/index.html.erb +1 -1
- data/app/views/cms/users/show.html.erb +50 -0
- data/app/views/layouts/_cms_toolbar.html.erb +1 -1
- data/app/views/layouts/_page_toolbar.html.erb +7 -7
- data/app/views/layouts/cms/administration.html.erb +24 -7
- data/browsercms.gemspec +13 -7
- data/lib/acts_as_list.rb +8 -4
- data/lib/cms/acts/content_block.rb +1 -1
- data/lib/cms/authentication/controller.rb +26 -7
- data/lib/cms/behaviors/attaching.rb +3 -3
- data/lib/cms/behaviors/publishing.rb +12 -1
- data/lib/cms/behaviors/rendering.rb +17 -4
- data/lib/cms/behaviors/versioning.rb +2 -2
- data/lib/cms/routes.rb +4 -0
- data/lib/tasks/cms.rake +0 -18
- data/public/javascripts/cms/content_library.js +36 -0
- data/public/javascripts/cms/sitemap.js +21 -9
- data/public/stylesheets/cms/form_layout.css +16 -2
- data/public/stylesheets/cms/nav.css +4 -3
- data/test/functional/cms/content_block_controller_test.rb +120 -0
- data/test/functional/cms/content_controller_test.rb +135 -80
- data/test/functional/cms/links_controller_test.rb +89 -1
- data/test/functional/cms/pages_controller_test.rb +138 -0
- data/test/functional/cms/section_nodes_controller_test.rb +45 -5
- data/test/functional/cms/sections_controller_test.rb +148 -1
- data/test/functional/cms/sessions_controller_test.rb +26 -2
- data/test/functional/cms/users_controller_test.rb +49 -2
- data/test/test_helper.rb +3 -1
- data/test/unit/behaviors/attaching_test.rb +26 -0
- data/test/unit/helpers/menu_helper_test.rb +118 -278
- data/test/unit/models/group_test.rb +6 -0
- data/test/unit/models/user_test.rb +127 -29
- metadata +12 -4
@@ -1,4 +1,4 @@
|
|
1
|
-
<div class="cms_edit_connectable" style="display: block; height: auto;
|
1
|
+
<div class="cms_edit_connectable" style="display: block; height: auto; position: relative; border: 1px solid #999; margin: 1px -6px 0 -6px; padding: 25px 5px 0 5px; background: url(/images/cms/containers/beta.png) repeat-x 0 0;">
|
2
2
|
<div style="display: block; width: 100%; position: absolute; top: 5px; left: 5px; height: 30px;">
|
3
3
|
<%= link_to image_tag("cms/pages/show_connectable.gif", :style => "text-decoration: none; padding: 0; background: none; margin: 0; float: none; border: none;"), cms_connectable_path(connectable), :title => "View this content (#{connectable.name})" , :style => "text-decoration: none; padding: 0 2px 0 0; background: none; margin: 0; float: none; border: none;"%>
|
4
4
|
<%= link_to image_tag("cms/pages/edit_connectable.gif", :style => "text-decoration: none; padding: 0; background: none; margin: 0; float: none; border: none;"), edit_cms_connectable_path(connectable, :_redirect_to => @page.path), :title => "Edit this content (#{connectable.name})" , :style => "text-decoration: none; padding: 0 2px 0 0; background: none; margin: 0; float: none; border: none;"%>
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<div class="cms_edit_container" style="height: auto;
|
1
|
+
<div class="cms_edit_container" style="height: auto; background: url(/images/cms/containers/alpha.png) repeat-x 0 0; border: 1px solid #999; margin: -8px 0 0 -8px; padding: 24px 7px 1px 7px; position: relative;">
|
2
2
|
<div style="display: block; width: 100%; position: absolute; top: 5px; left: 5px; height: 30px;">
|
3
3
|
<%= link_to image_tag("cms/pages/add_connectable.gif", :style => "text-decoration: none; padding: 0; background: none; margin: 0; float: none; border: none;"), cms_content_types_path(:connect_to_page_id => @page, :connect_to_container => name), :title => "Add new content to this container (#{name})" , :style => "text-decoration: none; padding: 0 2px 0 0; background: none; margin: 0; float: none; border: none;"%>
|
4
4
|
<%= link_to image_tag("cms/pages/connect_connectable.gif", :style => "text-decoration: none; padding: 0; background: none; margin: 0; float: none; border: none;"), new_cms_connector_path(:page_id => @page, :container => name), :title => "Insert existing content into this container (#{name})" , :style => "text-decoration: none; padding: 0 2px 0 0; background: none; margin: 0; float: none; border: none;"%>
|
@@ -8,7 +8,7 @@
|
|
8
8
|
<table class="section_node <%= node_type %> <%= "movable" if current_user.able_to?(:publish_content) %>" width="100%" cellspacing="0" cellpadding="0">
|
9
9
|
<tr><td colspan="4" class="drop-before"></td></tr>
|
10
10
|
<tr<%= ' class="doubled"' if access_icon && hidden %>>
|
11
|
-
<td id="<%= node_type %>_<%= node.id %>" class="<%= node_type == "section" && node.root? ? 'root' : '' %> <%= node_type %> node">
|
11
|
+
<td id="<%= node_type %>_<%= node.id %>" class="<%= node_type == "section" && node.root? ? 'root' : '' %> <%= node_type %> node <%= 'non-editable' unless current_user.able_to_edit?(node) %>">
|
12
12
|
<%= icon %>
|
13
13
|
<div><%= h(node.name) %></div>
|
14
14
|
</td>
|
@@ -11,46 +11,48 @@
|
|
11
11
|
</div>
|
12
12
|
</div>
|
13
13
|
|
14
|
-
|
15
|
-
<
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
14
|
+
<% able_to?(:administrate) do %>
|
15
|
+
<div class="checkbox_group fields" style="float: left; width: 100%">
|
16
|
+
<label>Public Permissions</label>
|
17
|
+
<%= hidden_field_tag "section[group_ids][]", "", :id => nil %>
|
18
|
+
<div class="checkboxes">
|
19
|
+
<% for group in public_groups %>
|
20
|
+
<div class="checkbox_fields">
|
21
|
+
<%= check_box_tag "section[group_ids][]", group.id,
|
22
|
+
@section.groups.include?(group), :class => "public_group_ids", :id => "public_group_ids_#{group.id}", :tabindex => next_tabindex %>
|
23
|
+
<label for="public_group_ids_<%= group.id %>"><%= group.name %></label>
|
24
|
+
</div>
|
25
|
+
<% end %>
|
26
|
+
<div class="instructions">Which “Public” groups can view pages in this section?</div>
|
27
|
+
<div class="check_uncheck">
|
28
|
+
<%= link_to_check_all 'input.public_group_ids' %>,
|
29
|
+
<%= link_to_uncheck_all 'input.public_group_ids' %>
|
30
|
+
</div>
|
29
31
|
</div>
|
30
32
|
</div>
|
31
|
-
</div>
|
32
33
|
|
33
|
-
<br clear="all" />
|
34
|
+
<br clear="all" />
|
34
35
|
|
35
|
-
<div class="checkbox_group fields" style="float: left; width: 100%">
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
36
|
+
<div class="checkbox_group fields" style="float: left; width: 100%">
|
37
|
+
<label>CMS Permissions</label>
|
38
|
+
<%= hidden_field_tag "section[group_ids][]", "", :id => nil %>
|
39
|
+
<div class="checkboxes">
|
40
|
+
<% for group in cms_groups %>
|
41
|
+
<div class="checkbox_fields">
|
42
|
+
<%= check_box_tag "section[group_ids][]", group.id,
|
43
|
+
@section.groups.include?(group), :class => "cms_group_ids", :id => "cms_group_ids_#{group.id}", :tabindex => next_tabindex %>
|
44
|
+
<label for="cms_group_ids_<%= group.id %>"><%= group.name %></label>
|
45
|
+
</div>
|
46
|
+
<% end %>
|
47
|
+
<div class="instructions">Which “CMS” groups can edit pages and content in this section?</div>
|
48
|
+
<div class="check_uncheck">
|
49
|
+
<%= link_to_check_all 'input.cms_group_ids' %>,
|
50
|
+
<%= link_to_uncheck_all 'input.cms_group_ids' %>
|
51
|
+
</div>
|
50
52
|
</div>
|
51
53
|
</div>
|
52
|
-
|
53
|
-
|
54
|
+
<br clear="all" />
|
55
|
+
<% end %>
|
54
56
|
|
55
57
|
<div class="buttons">
|
56
58
|
<%= lt_button_wrapper(f.submit("Save", :class => "submit", :tabindex => next_tabindex)) %>
|
@@ -1,10 +1,12 @@
|
|
1
1
|
<% @page_title = @toolbar_title = "Set New Password" %>
|
2
|
-
<%
|
3
|
-
|
4
|
-
|
5
|
-
|
2
|
+
<% able_to? :administrate do %>
|
3
|
+
<% content_for :toolbar_links do %>
|
4
|
+
<%= link_to(span_tag("List All"), url_for(:controller => "users", :action => "index"), :id => "list_all_button", :class => "button") %>
|
5
|
+
<%= link_to(span_tag("Edit User"), url_for(:controller => "users", :action => "edit", :id => @user.id), :id => "edit_user_button", :class => "button") %>
|
6
|
+
<% end %>
|
6
7
|
|
7
|
-
<%= content_for :functions, render(:partial => "toolbar") %>
|
8
|
+
<%= content_for :functions, render(:partial => "toolbar") %>
|
9
|
+
<% end %>
|
8
10
|
|
9
11
|
<% content_for :html_head do %>
|
10
12
|
<%= stylesheet_link_tag('cms/form_layout') %>
|
@@ -16,4 +18,4 @@
|
|
16
18
|
<div class="buttons">
|
17
19
|
<%= lt_button_wrapper(f.submit("Save", :class => "submit")) %>
|
18
20
|
</div>
|
19
|
-
<% end %>
|
21
|
+
<% end %>
|
@@ -26,7 +26,7 @@
|
|
26
26
|
<% @users.each do |user|%>
|
27
27
|
<tr>
|
28
28
|
<td class="first"></td>
|
29
|
-
<td><div class="dividers"><%= link_to "#{user.first_name} #{user.last_name}",
|
29
|
+
<td><div class="dividers"><%= link_to "#{user.first_name} #{user.last_name}", edit_cms_user_path(user) %></div></td>
|
30
30
|
<td><div class="dividers"><%= link_to user.email, "mailto:#{user.email}" %></div></td>
|
31
31
|
<td>
|
32
32
|
<div class="dividers">
|
@@ -0,0 +1,50 @@
|
|
1
|
+
<% @page_title = @toolbar_title = h(@user.login) %>
|
2
|
+
|
3
|
+
<% content_for :toolbar_links do %>
|
4
|
+
<%= link_to(span_tag("List All"), cms_users_path,
|
5
|
+
:id => "list_all_button",
|
6
|
+
:class => "button") if current_user.able_to?(:administrate) %>
|
7
|
+
<%= link_to(span_tag("Change Password"), [:change_password, :cms, @user],
|
8
|
+
:id => "change_password_button",
|
9
|
+
:class => "button") %>
|
10
|
+
<% end %>
|
11
|
+
|
12
|
+
<% content_for :functions do %>
|
13
|
+
<%= render(:partial => "toolbar") %>
|
14
|
+
<% end %>
|
15
|
+
|
16
|
+
<% content_for :html_head do %>
|
17
|
+
<%= stylesheet_link_tag('cms/form_layout') %>
|
18
|
+
<% end %>
|
19
|
+
|
20
|
+
<div class="faux_form">
|
21
|
+
<div class="fields">
|
22
|
+
<span class="label">Username</span>
|
23
|
+
<%=h @user.login %>
|
24
|
+
</div>
|
25
|
+
|
26
|
+
<div class="fields">
|
27
|
+
<span class="label">Email</span>
|
28
|
+
<%=h @user.email %>
|
29
|
+
</div>
|
30
|
+
|
31
|
+
<div class="fields">
|
32
|
+
<span class="label">First name</span>
|
33
|
+
<%=h @user.first_name %>
|
34
|
+
</div>
|
35
|
+
|
36
|
+
<div class="fields">
|
37
|
+
<span class="label">Last name</span>
|
38
|
+
<%=h @user.last_name %>
|
39
|
+
</div>
|
40
|
+
|
41
|
+
<div class="fields">
|
42
|
+
<span class="label">Groups</span>
|
43
|
+
|
44
|
+
<ul>
|
45
|
+
<% @user.groups.each do |group| -%>
|
46
|
+
<li><%= group.name %></li>
|
47
|
+
<% end -%>
|
48
|
+
</ul>
|
49
|
+
</div>
|
50
|
+
</div>
|
@@ -8,7 +8,7 @@
|
|
8
8
|
<% able_to?(:administrate) do %><li><%= link_to image_tag("/images/cms/nav_admin#{'_on' if tab == :administration}.gif", :id => 'nav_admin_img'), cms_administration_path, :target => "_top" %></li><% end %>
|
9
9
|
</ul>
|
10
10
|
<ul id="userlinks">
|
11
|
-
<li id="user_info"><%= image_tag "cms/icons/user.png"
|
11
|
+
<li id="user_info"><a href="<%= current_user.able_to?(:administrate) ? edit_cms_user_path(current_user) : cms_user_path(current_user) %>" target="_top"><%= image_tag "cms/icons/user.png" %> <%= current_user.full_name %></a></li>
|
12
12
|
<li><%= link_to "Logout", cms_logout_path, :class => "http_delete", :target => "_top" %></li>
|
13
13
|
</ul>
|
14
14
|
<% flash_class, flash_message = flash.to_a.first %>
|
@@ -50,30 +50,30 @@
|
|
50
50
|
<%= link_to "<span>Publish</span>",
|
51
51
|
@page.live? ? '#' : publish_cms_page_path(@page),
|
52
52
|
:id => "publish_button",
|
53
|
-
:class => "http_put button#{' disabled' if !current_user.able_to?(:publish_content) || @page.version != @page.draft.version || @page.live?} left",
|
53
|
+
:class => "http_put button#{' disabled' if !current_user.able_to?(:publish_content) || !current_user.able_to_edit?(@page) || @page.version != @page.draft.version || @page.live?} left",
|
54
54
|
:target => "_top" %>
|
55
55
|
|
56
56
|
<%= link_to "<span>Assign</span>",
|
57
57
|
new_cms_page_task_path(@page),
|
58
58
|
:id => "assign_button",
|
59
|
-
:class => "button#{ ' disabled' if @page.assigned_to == current_user} middle",
|
59
|
+
:class => "button#{ ' disabled' if @page.assigned_to == current_user || !current_user.able_to_edit?(@page) } middle",
|
60
60
|
:target => "_top" %>
|
61
61
|
|
62
62
|
<%= link_to "<span>Complete Task</span>",
|
63
63
|
@page.current_task ? complete_cms_task_path(@page.current_task) : '#',
|
64
64
|
:id => "complete_task_button",
|
65
|
-
:class => "http_put button#{ ' disabled'
|
65
|
+
:class => "http_put button#{ ' disabled' if @page.assigned_to != current_user || !current_user.able_to_edit?(@page) } right",
|
66
66
|
:target => "_top" %>
|
67
67
|
|
68
68
|
<%= link_to "<span>Edit Properties</span>",
|
69
69
|
[:edit, :cms, @page],
|
70
70
|
:id => "edit_properties_button",
|
71
|
-
:class => "spacer button",
|
71
|
+
:class => "spacer button#{ ' disabled' unless current_user.able_to_edit?(@page) }",
|
72
72
|
:target => "_top" %>
|
73
73
|
|
74
74
|
<%= link_to "<span>List Versions</span>",
|
75
75
|
versions_cms_page_path(@page),
|
76
|
-
:class => "spacer button",
|
76
|
+
:class => "spacer button#{ ' disabled' unless current_user.able_to_edit?(@page) }",
|
77
77
|
:target => "_top" %>
|
78
78
|
|
79
79
|
<% able_to? :publish_content do %>
|
@@ -83,7 +83,7 @@
|
|
83
83
|
:id => "delete_button",
|
84
84
|
:title => "Are you sure you want to delete '#{@page.name}'?",
|
85
85
|
:target => "_top",
|
86
|
-
:class => "spacer button confirm_with_title http_delete" %>
|
86
|
+
:class => "spacer button confirm_with_title http_delete#{ ' disabled' unless current_user.able_to_publish?(@page) }" %>
|
87
87
|
<% else %>
|
88
88
|
<%= link_to "<span>Revert to this Version</span>",
|
89
89
|
revert_to_cms_page_path(@page, @page.version),
|
@@ -98,7 +98,7 @@
|
|
98
98
|
<div class="visual_editor_label">Visual Editor:</div>
|
99
99
|
<div class="visual_editor_value_container">
|
100
100
|
<% if @mode == "edit" %>
|
101
|
-
<div><span id="visual_editor_state"
|
101
|
+
<div><span id="visual_editor_state"<%= ' title="You don\'t have permission to edit this page"' unless current_user.able_to_edit?(@page) %>>ON<%= '*' unless current_user.able_to_edit?(@page) %></span></div>
|
102
102
|
<% else %>
|
103
103
|
<div><span id="visual_editor_state">OFF</span></div>
|
104
104
|
<% end %>
|
@@ -7,18 +7,29 @@
|
|
7
7
|
<div id="wrapper">
|
8
8
|
<%= render_cms_toolbar(:administration) %>
|
9
9
|
<div id="main">
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
|
11
|
+
<% if current_user.able_to?(:administrate) %>
|
12
|
+
<div class="top_cap_menu"></div>
|
13
|
+
<div id="menu">
|
14
|
+
<%= render :partial => 'cms/shared/admin_sidebar' %>
|
15
|
+
</div>
|
16
|
+
<div id="contentwrap">
|
17
|
+
<% else %>
|
18
|
+
<div class="top_cap"></div>
|
19
|
+
<div id="contentwrapbig">
|
20
|
+
<% end %>
|
21
|
+
|
15
22
|
<div id="functions">
|
16
23
|
<h1><%= @toolbar_title %></h1>
|
17
24
|
<%= yield :functions %>
|
18
25
|
|
19
26
|
</div>
|
20
27
|
<br clear="all" />
|
21
|
-
|
28
|
+
|
29
|
+
<% able_to?(:administrate) do %>
|
30
|
+
<div class="top_cap_content"></div>
|
31
|
+
<% end %>
|
32
|
+
|
22
33
|
<div id="content">
|
23
34
|
<div class="pad">
|
24
35
|
<%= yield %>
|
@@ -26,7 +37,13 @@
|
|
26
37
|
</div>
|
27
38
|
</div>
|
28
39
|
<br clear="all" />
|
29
|
-
|
40
|
+
|
41
|
+
<% if current_user.able_to?(:administrate) %>
|
42
|
+
<div class="bottom_cap_content"></div>
|
43
|
+
<% else %>
|
44
|
+
<div class="bottom_cap"></div>
|
45
|
+
<% end %>
|
46
|
+
|
30
47
|
<%= render :partial => 'layouts/cms/footer' %>
|
31
48
|
</div>
|
32
49
|
</div>
|
data/browsercms.gemspec
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{browsercms}
|
8
|
-
s.version = "3.0.
|
8
|
+
s.version = "3.0.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["BrowserMedia"]
|
12
|
-
s.date = %q{2009-
|
12
|
+
s.date = %q{2009-11-06}
|
13
13
|
s.email = %q{github@browsermedia.com}
|
14
14
|
s.extra_rdoc_files = [
|
15
15
|
"LICENSE.txt",
|
@@ -155,6 +155,8 @@ Gem::Specification.new do |s|
|
|
155
155
|
"app/views/cms/links/destroy.js.rjs",
|
156
156
|
"app/views/cms/links/edit.html.erb",
|
157
157
|
"app/views/cms/links/new.html.erb",
|
158
|
+
"app/views/cms/menus/_menu.html.erb",
|
159
|
+
"app/views/cms/menus/_menu_item.html.erb",
|
158
160
|
"app/views/cms/page_routes/_form.html.erb",
|
159
161
|
"app/views/cms/page_routes/edit.html.erb",
|
160
162
|
"app/views/cms/page_routes/index.html.erb",
|
@@ -191,6 +193,7 @@ Gem::Specification.new do |s|
|
|
191
193
|
"app/views/cms/shared/_pagination.html.erb",
|
192
194
|
"app/views/cms/shared/_version_conflict_diff.html.erb",
|
193
195
|
"app/views/cms/shared/_version_conflict_error.html.erb",
|
196
|
+
"app/views/cms/shared/access_denied.html.erb",
|
194
197
|
"app/views/cms/shared/error.html.erb",
|
195
198
|
"app/views/cms/tags/_form.html.erb",
|
196
199
|
"app/views/cms/tags/render.html.erb",
|
@@ -205,6 +208,7 @@ Gem::Specification.new do |s|
|
|
205
208
|
"app/views/cms/users/edit.html.erb",
|
206
209
|
"app/views/cms/users/index.html.erb",
|
207
210
|
"app/views/cms/users/new.html.erb",
|
211
|
+
"app/views/cms/users/show.html.erb",
|
208
212
|
"app/views/layouts/_cms_toolbar.html.erb",
|
209
213
|
"app/views/layouts/_page_toolbar.html.erb",
|
210
214
|
"app/views/layouts/application.html.erb",
|
@@ -1168,6 +1172,7 @@ Gem::Specification.new do |s|
|
|
1168
1172
|
"public/images/cms/usercontrols_bg.png",
|
1169
1173
|
"public/images/cms/usercontrols_bg_cap.png",
|
1170
1174
|
"public/javascripts/cms/application.js",
|
1175
|
+
"public/javascripts/cms/content_library.js",
|
1171
1176
|
"public/javascripts/cms/editor.js",
|
1172
1177
|
"public/javascripts/cms/sitemap.js",
|
1173
1178
|
"public/javascripts/jquery-ui.js",
|
@@ -1228,12 +1233,11 @@ Gem::Specification.new do |s|
|
|
1228
1233
|
"templates/demo.rb",
|
1229
1234
|
"templates/module.rb"
|
1230
1235
|
]
|
1231
|
-
s.has_rdoc = true
|
1232
1236
|
s.homepage = %q{http://www.browsercms.org}
|
1233
1237
|
s.rdoc_options = ["--charset=UTF-8"]
|
1234
1238
|
s.require_paths = ["lib"]
|
1235
1239
|
s.rubyforge_project = %q{browsercms}
|
1236
|
-
s.rubygems_version = %q{1.3.
|
1240
|
+
s.rubygems_version = %q{1.3.5}
|
1237
1241
|
s.summary = %q{BrowserCMS is a general purpose, open source Web Content Management System (CMS), written in Ruby on Rails.}
|
1238
1242
|
s.test_files = [
|
1239
1243
|
"test/functional/cms/file_blocks_controller_test.rb",
|
@@ -1248,6 +1252,7 @@ Gem::Specification.new do |s|
|
|
1248
1252
|
"test/functional/cms/links_controller_test.rb",
|
1249
1253
|
"test/functional/cms/dynamic_views_controller_test.rb",
|
1250
1254
|
"test/functional/cms/categories_controller_test.rb",
|
1255
|
+
"test/functional/cms/content_block_controller_test.rb",
|
1251
1256
|
"test/functional/cms/pages_controller_test.rb",
|
1252
1257
|
"test/functional/cms/connectors_controller_test.rb",
|
1253
1258
|
"test/functional/cms/home_controller_test.rb",
|
@@ -1303,7 +1308,7 @@ Gem::Specification.new do |s|
|
|
1303
1308
|
|
1304
1309
|
if s.respond_to? :specification_version then
|
1305
1310
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
1306
|
-
s.specification_version =
|
1311
|
+
s.specification_version = 3
|
1307
1312
|
|
1308
1313
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
1309
1314
|
else
|
@@ -1311,3 +1316,4 @@ Gem::Specification.new do |s|
|
|
1311
1316
|
else
|
1312
1317
|
end
|
1313
1318
|
end
|
1319
|
+
|
data/lib/acts_as_list.rb
CHANGED
@@ -61,7 +61,7 @@ module ActsAsList
|
|
61
61
|
|
62
62
|
#{scope_condition_method}
|
63
63
|
|
64
|
-
before_destroy :
|
64
|
+
before_destroy :remove_from_list_without_saving
|
65
65
|
before_create :add_to_list_bottom
|
66
66
|
EOV
|
67
67
|
end
|
@@ -118,13 +118,17 @@ module ActsAsList
|
|
118
118
|
end
|
119
119
|
|
120
120
|
# Removes the item from the list.
|
121
|
-
def remove_from_list
|
121
|
+
def remove_from_list(save = true)
|
122
122
|
if in_list?
|
123
123
|
decrement_positions_on_lower_items
|
124
|
-
update_attribute
|
124
|
+
update_attribute(position_column, nil) if save
|
125
125
|
end
|
126
126
|
end
|
127
127
|
|
128
|
+
def remove_from_list_without_saving
|
129
|
+
self.remove_from_list(false)
|
130
|
+
end
|
131
|
+
|
128
132
|
# Increase the position of this item without adjusting the rest of the list.
|
129
133
|
def increment_position
|
130
134
|
return unless in_list?
|
@@ -249,4 +253,4 @@ module ActsAsList
|
|
249
253
|
self.update_attribute(position_column, position)
|
250
254
|
end
|
251
255
|
end
|
252
|
-
end
|
256
|
+
end
|
@@ -1,3 +1,27 @@
|
|
1
|
+
#
|
2
|
+
# Defines the authentication behavior for controllers in BrowserCMS. It can be added to any controller that needs to
|
3
|
+
# hook into the BrowserCMS Authentication behavior like so:
|
4
|
+
#
|
5
|
+
# class MySuperSecureController < ApplicationController
|
6
|
+
# include Cms::Authentication::Controller
|
7
|
+
#
|
8
|
+
# It is based off Restful_Authentication, and adds in behavior to deal with several concepts specific to BrowserCMS.
|
9
|
+
#
|
10
|
+
# (Note: 10/8/09 - I was comparing this to a very old version of the generated code from Restful_Authentication,
|
11
|
+
# so some of the following items may be 'stock' to that. (Especially #2)
|
12
|
+
#
|
13
|
+
# 1. Guests - These represents users that are not logged in. What guests can see and do can be modified via the CMS UI. Guests
|
14
|
+
# are not considered to be 'logged in'.
|
15
|
+
# 2. 'Current' User - The currently logged in user is stored in a thread local, and can be accessed anywhere via 'User.current'.
|
16
|
+
# This allows model code to easily record which user is making changes to records, for versioning, etc.
|
17
|
+
#
|
18
|
+
# 3. 'Admin' Access Denied Page - If users try to access a protected controller, they are redirected to the CMS administration Login page
|
19
|
+
# which may be different than the 'front end' user login page. (Cms::Controller handles that differently)
|
20
|
+
#
|
21
|
+
#
|
22
|
+
# To Dos: It appears as though we are storing the 'current' user in two places, @current_user and User.current. This is probably not DRY, but
|
23
|
+
# more testing would be needed.
|
24
|
+
#
|
1
25
|
module Cms
|
2
26
|
module Authentication
|
3
27
|
module Controller
|
@@ -12,6 +36,7 @@ module Cms
|
|
12
36
|
# If the user is not logged in, this will be set to the guest user, which represents a public
|
13
37
|
# user, who will likely have more limited permissions
|
14
38
|
def current_user
|
39
|
+
# Note: We have disabled basic_http_auth
|
15
40
|
@current_user ||= begin
|
16
41
|
User.current = (login_from_session || login_from_cookie || User.guest)
|
17
42
|
end
|
@@ -61,7 +86,7 @@ module Cms
|
|
61
86
|
|
62
87
|
# Redirect as appropriate when an access request fails.
|
63
88
|
#
|
64
|
-
# The default action is to redirect to the login screen.
|
89
|
+
# The default action is to redirect to the BrowserCMS admin login screen.
|
65
90
|
#
|
66
91
|
# Override this method in your controllers if you want to have special
|
67
92
|
# behavior in case the user is not authorized
|
@@ -73,11 +98,6 @@ module Cms
|
|
73
98
|
store_location
|
74
99
|
redirect_to cms_login_path
|
75
100
|
end
|
76
|
-
# format.any doesn't work in rails version < http://dev.rubyonrails.org/changeset/8987
|
77
|
-
# you may want to change format.any to e.g. format.any(:js, :xml)
|
78
|
-
# format.any do
|
79
|
-
# request_http_basic_authentication 'Web Password'
|
80
|
-
# end
|
81
101
|
end
|
82
102
|
end
|
83
103
|
|
@@ -162,7 +182,6 @@ module Cms
|
|
162
182
|
|
163
183
|
# Cookies shouldn't be allowed to persist past their freshness date,
|
164
184
|
# and they should be changed at each login
|
165
|
-
|
166
185
|
def valid_remember_cookie?
|
167
186
|
return nil unless User.current
|
168
187
|
(User.current.remember_token?) &&
|
@@ -118,14 +118,14 @@ module Cms
|
|
118
118
|
|
119
119
|
# Override this method if you would like to override the way the section is set
|
120
120
|
def set_attachment_section
|
121
|
-
if
|
121
|
+
if !attachment_file.blank?
|
122
122
|
attachment.section = Section.root.first
|
123
123
|
end
|
124
124
|
end
|
125
125
|
|
126
126
|
# Override this method if you would like to override the way file_path is set
|
127
127
|
def set_attachment_file_path
|
128
|
-
if
|
128
|
+
if !attachment_file.blank?
|
129
129
|
attachment.file_path = "/attachments/#{File.basename(attachment_file.original_filename).to_s.downcase}"
|
130
130
|
end
|
131
131
|
end
|
@@ -181,4 +181,4 @@ module Cms
|
|
181
181
|
end
|
182
182
|
end
|
183
183
|
end
|
184
|
-
end
|
184
|
+
end
|
@@ -23,7 +23,18 @@ module Cms
|
|
23
23
|
after_save :publish_for_non_versioned
|
24
24
|
|
25
25
|
named_scope :published, :conditions => {:published => true}
|
26
|
-
named_scope :unpublished,
|
26
|
+
named_scope :unpublished, lambda {
|
27
|
+
if versioned?
|
28
|
+
{ :joins => :versions,
|
29
|
+
:conditions =>
|
30
|
+
"#{connection.quote_table_name(version_table_name)}.#{connection.quote_column_name('version')} > " +
|
31
|
+
"#{connection.quote_table_name(table_name)}.#{connection.quote_column_name('version')}",
|
32
|
+
:select => "distinct #{connection.quote_table_name(table_name)}.*" }
|
33
|
+
else
|
34
|
+
{ :conditions => { :published => false } }
|
35
|
+
end
|
36
|
+
}
|
37
|
+
|
27
38
|
end
|
28
39
|
end
|
29
40
|
module ClassMethods
|
@@ -82,7 +82,7 @@ module Cms
|
|
82
82
|
|
83
83
|
end
|
84
84
|
module InstanceMethods
|
85
|
-
def
|
85
|
+
def prepare_to_render(controller)
|
86
86
|
# Give this renderable a reference to the controller
|
87
87
|
@controller = controller
|
88
88
|
|
@@ -90,12 +90,21 @@ module Cms
|
|
90
90
|
|
91
91
|
# This gives the view a reference to this object
|
92
92
|
instance_variable_set(self.class.instance_variable_name_for_view, self)
|
93
|
-
|
93
|
+
|
94
94
|
# This is like a controller action
|
95
95
|
# We will call it if you have defined a render method
|
96
96
|
# but if you haven't we won't
|
97
97
|
render if respond_to?(:render)
|
98
|
+
end
|
98
99
|
|
100
|
+
def perform_render(controller)
|
101
|
+
return "Exception: #{@render_exception}" if @render_exception
|
102
|
+
unless @controller
|
103
|
+
# We haven't prepared to render. This should only happen when logged in, as we don't want
|
104
|
+
# errors to bubble up and prevent the page being edited in that case.
|
105
|
+
prepare_to_render(controller)
|
106
|
+
end
|
107
|
+
|
99
108
|
# Create, Instantiate and Initialize the view
|
100
109
|
view_class = Class.new(ActionView::Base)
|
101
110
|
action_view = view_class.new(@controller.view_paths, {}, @controller)
|
@@ -108,7 +117,7 @@ module Cms
|
|
108
117
|
|
109
118
|
# We want content_for to be called on the controller's view, not this inner view
|
110
119
|
def action_view.content_for(name, content=nil, &block)
|
111
|
-
controller.instance_variable_get("@template").content_for(name, content, &block)
|
120
|
+
@controller.instance_variable_get("@template").content_for(name, content, &block)
|
112
121
|
end
|
113
122
|
|
114
123
|
# Copy instance variables from this renderable object to it's view
|
@@ -122,6 +131,10 @@ module Cms
|
|
122
131
|
end
|
123
132
|
end
|
124
133
|
|
134
|
+
def render_exception=(exception)
|
135
|
+
@render_exception = exception
|
136
|
+
end
|
137
|
+
|
125
138
|
protected
|
126
139
|
def copy_instance_variables_from_controller!
|
127
140
|
if @controller.respond_to?(:instance_variables_for_rendering)
|
@@ -141,4 +154,4 @@ module Cms
|
|
141
154
|
|
142
155
|
end
|
143
156
|
end
|
144
|
-
end
|
157
|
+
end
|
@@ -110,7 +110,7 @@ module Cms
|
|
110
110
|
def save(perform_validations=true)
|
111
111
|
transaction do
|
112
112
|
#logger.info "..... Calling valid?"
|
113
|
-
return false unless valid?
|
113
|
+
return false unless !perform_validations || valid?
|
114
114
|
|
115
115
|
if changed?
|
116
116
|
#logger.info "..... Changes => #{changes.inspect}"
|
@@ -172,7 +172,7 @@ module Cms
|
|
172
172
|
end
|
173
173
|
|
174
174
|
def save!(perform_validations=true)
|
175
|
-
save || raise(ActiveRecord::RecordNotSaved.new(errors.full_messages))
|
175
|
+
save(perform_validations) || raise(ActiveRecord::RecordNotSaved.new(errors.full_messages))
|
176
176
|
end
|
177
177
|
|
178
178
|
def draft
|
data/lib/cms/routes.rb
CHANGED
@@ -119,6 +119,10 @@ module Cms::Routes
|
|
119
119
|
:enable => :put
|
120
120
|
}
|
121
121
|
|
122
|
+
if RAILS_ENV == "test" && File.expand_path(RAILS_ROOT) == File.expand_path(File.dirname(__FILE__) + "/../..")
|
123
|
+
cms.content_blocks :content_block
|
124
|
+
end
|
125
|
+
|
122
126
|
end
|
123
127
|
|
124
128
|
if PageRoute.table_exists?
|