alchemy_cms 2.5.0.b5 → 2.5.0.b9
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +1 -1
- data/alchemy_cms.gemspec +2 -2
- data/app/assets/javascripts/alchemy/alchemy.base.js +0 -24
- data/app/assets/javascripts/alchemy/alchemy.growler.js +2 -4
- data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +0 -1
- data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +1 -1
- data/app/assets/stylesheets/alchemy/base.scss +4 -20
- data/app/assets/stylesheets/alchemy/elements.scss +19 -31
- data/app/assets/stylesheets/alchemy/flash.scss +11 -0
- data/app/assets/stylesheets/alchemy/form_elements.scss +2 -14
- data/app/assets/stylesheets/alchemy/menubar.css.scss +1 -0
- data/app/assets/stylesheets/alchemy/mixins.scss +37 -2
- data/app/assets/stylesheets/alchemy/notices.scss +1 -0
- data/app/assets/stylesheets/alchemy/sitemap.scss +30 -0
- data/app/assets/stylesheets/alchemy/tables.scss +20 -27
- data/app/controllers/alchemy/admin/attachments_controller.rb +3 -3
- data/app/controllers/alchemy/admin/base_controller.rb +1 -1
- data/app/controllers/alchemy/admin/contents_controller.rb +2 -2
- data/app/controllers/alchemy/admin/elements_controller.rb +3 -3
- data/app/controllers/alchemy/admin/essence_pictures_controller.rb +2 -2
- data/app/controllers/alchemy/admin/pages_controller.rb +16 -9
- data/app/controllers/alchemy/admin/pictures_controller.rb +8 -8
- data/app/controllers/alchemy/admin/resources_controller.rb +1 -1
- data/app/controllers/alchemy/admin/tags_controller.rb +4 -4
- data/app/controllers/alchemy/admin/users_controller.rb +3 -3
- data/app/controllers/alchemy/base_controller.rb +10 -12
- data/app/controllers/alchemy/messages_controller.rb +2 -2
- data/app/controllers/alchemy/pages_controller.rb +4 -1
- data/app/controllers/alchemy/pictures_controller.rb +1 -4
- data/app/controllers/alchemy/user_sessions_controller.rb +5 -5
- data/app/helpers/alchemy/admin/attachments_helper.rb +1 -1
- data/app/helpers/alchemy/admin/base_helper.rb +13 -13
- data/app/helpers/alchemy/admin/contents_helper.rb +6 -6
- data/app/helpers/alchemy/admin/elements_helper.rb +2 -2
- data/app/helpers/alchemy/admin/essences_helper.rb +8 -8
- data/app/helpers/alchemy/admin/pages_helper.rb +13 -7
- data/app/helpers/alchemy/base_helper.rb +20 -5
- data/app/helpers/alchemy/elements_helper.rb +2 -2
- data/app/helpers/alchemy/essences_helper.rb +2 -2
- data/app/helpers/alchemy/pages_helper.rb +2 -3
- data/app/models/alchemy/cell.rb +11 -3
- data/app/models/alchemy/content.rb +17 -17
- data/app/models/alchemy/element.rb +49 -26
- data/app/models/alchemy/legacy_page_url.rb +6 -0
- data/app/models/alchemy/page.rb +24 -45
- data/app/models/alchemy/picture.rb +1 -2
- data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +3 -3
- data/app/views/alchemy/admin/attachments/_attachment.html.erb +6 -6
- data/app/views/alchemy/admin/attachments/_files_list.html.erb +2 -2
- data/app/views/alchemy/admin/attachments/edit.html.erb +5 -3
- data/app/views/alchemy/admin/attachments/index.html.erb +3 -3
- data/app/views/alchemy/admin/attachments/new.html.erb +2 -2
- data/app/views/alchemy/admin/clipboard/clear.js.erb +1 -1
- data/app/views/alchemy/admin/clipboard/index.html.erb +3 -3
- data/app/views/alchemy/admin/clipboard/insert.js.erb +2 -2
- data/app/views/alchemy/admin/clipboard/remove.js.erb +4 -4
- data/app/views/alchemy/admin/contents/_missing.html.erb +2 -2
- data/app/views/alchemy/admin/contents/create.js.erb +1 -1
- data/app/views/alchemy/admin/contents/new.html.erb +3 -3
- data/app/views/alchemy/admin/dashboard/index.html.erb +12 -12
- data/app/views/alchemy/admin/elements/_add_picture.html.erb +1 -1
- data/app/views/alchemy/admin/elements/_element.html.erb +1 -1
- data/app/views/alchemy/admin/elements/_element_foot.html.erb +5 -5
- data/app/views/alchemy/admin/elements/_element_head.html.erb +6 -6
- data/app/views/alchemy/admin/elements/_elements_select.html.erb +2 -2
- data/app/views/alchemy/admin/elements/_new_element_form.html.erb +4 -4
- data/app/views/alchemy/admin/elements/_picture_gallery_editor.html.erb +1 -1
- data/app/views/alchemy/admin/elements/create.js.erb +2 -2
- data/app/views/alchemy/admin/elements/index.html.erb +2 -2
- data/app/views/alchemy/admin/elements/list.js.erb +1 -1
- data/app/views/alchemy/admin/elements/new.html.erb +4 -4
- data/app/views/alchemy/admin/elements/order.js.erb +1 -1
- data/app/views/alchemy/admin/elements/trash.js.erb +1 -1
- data/app/views/alchemy/admin/elements/update.js.erb +1 -1
- data/app/views/alchemy/admin/essence_files/edit.html.erb +5 -5
- data/app/views/alchemy/admin/essence_pictures/crop.html.erb +4 -4
- data/app/views/alchemy/admin/essence_pictures/edit.html.erb +4 -4
- data/app/views/alchemy/admin/languages/_form.html.erb +6 -10
- data/app/views/alchemy/admin/languages/_language.html.erb +4 -4
- data/app/views/alchemy/admin/languages/_table.html.erb +1 -1
- data/app/views/alchemy/admin/languages/index.html.erb +1 -1
- data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +6 -6
- data/app/views/alchemy/admin/layoutpages/index.html.erb +8 -8
- data/app/views/alchemy/admin/pages/_contactform_links.html.erb +7 -7
- data/app/views/alchemy/admin/pages/_create_language_form.html.erb +10 -9
- data/app/views/alchemy/admin/pages/_external_link.html.erb +7 -7
- data/app/views/alchemy/admin/pages/_file_link.html.erb +6 -6
- data/app/views/alchemy/admin/pages/_internal_link.html.erb +5 -5
- data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -1
- data/app/views/alchemy/admin/pages/_page.html.erb +28 -28
- data/app/views/alchemy/admin/pages/_page_for_links.html.erb +5 -5
- data/app/views/alchemy/admin/pages/_page_infos.html.erb +3 -3
- data/app/views/alchemy/admin/pages/_page_status.html.erb +3 -3
- data/app/views/alchemy/admin/pages/_sitemap.html.erb +1 -1
- data/app/views/alchemy/admin/pages/configure.html.erb +11 -11
- data/app/views/alchemy/admin/pages/configure_external.html.erb +4 -4
- data/app/views/alchemy/admin/pages/destroy.js.erb +0 -1
- data/app/views/alchemy/admin/pages/edit.html.erb +35 -35
- data/app/views/alchemy/admin/pages/flush.js.erb +1 -1
- data/app/views/alchemy/admin/pages/fold.js.erb +0 -1
- data/app/views/alchemy/admin/pages/index.html.erb +14 -14
- data/app/views/alchemy/admin/pages/link.html.erb +4 -4
- data/app/views/alchemy/admin/pages/locked.html.erb +1 -1
- data/app/views/alchemy/admin/pages/new.html.erb +4 -4
- data/app/views/alchemy/admin/pages/update.js.erb +2 -2
- data/app/views/alchemy/admin/partials/_autocomplete_tag_list.html.erb +1 -1
- data/app/views/alchemy/admin/partials/_flash_notices.html.erb +3 -3
- data/app/views/alchemy/admin/partials/_flash_upload.html.erb +8 -8
- data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +1 -1
- data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +1 -1
- data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +2 -2
- data/app/views/alchemy/admin/partials/_search_form.html.erb +2 -2
- data/app/views/alchemy/admin/partials/_sub_navigation_tab.html.erb +1 -1
- data/app/views/alchemy/admin/partials/_upload_form.html.erb +11 -11
- data/app/views/alchemy/admin/pictures/_archive.html.erb +13 -13
- data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +7 -7
- data/app/views/alchemy/admin/pictures/_filter_bar.html.erb +4 -4
- data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +1 -1
- data/app/views/alchemy/admin/pictures/_picture.html.erb +7 -7
- data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -1
- data/app/views/alchemy/admin/pictures/_tag_list.html.erb +2 -2
- data/app/views/alchemy/admin/pictures/edit.html.erb +2 -2
- data/app/views/alchemy/admin/pictures/edit_multiple.html.erb +6 -6
- data/app/views/alchemy/admin/pictures/index.html.erb +10 -10
- data/app/views/alchemy/admin/pictures/info.html.erb +2 -2
- data/app/views/alchemy/admin/pictures/new.html.erb +2 -2
- data/app/views/alchemy/admin/resources/_boolean.html.erb +5 -0
- data/app/views/alchemy/admin/resources/_datetime.html.erb +2 -0
- data/app/views/alchemy/admin/resources/_form.html.erb +17 -28
- data/app/views/alchemy/admin/resources/_resource.html.erb +4 -4
- data/app/views/alchemy/admin/resources/_string.html.erb +5 -0
- data/app/views/alchemy/admin/resources/_table.html.erb +1 -1
- data/app/views/alchemy/admin/resources/_text.html.erb +5 -0
- data/app/views/alchemy/admin/resources/index.html.erb +1 -1
- data/app/views/alchemy/admin/tags/_tag.html.erb +4 -4
- data/app/views/alchemy/admin/tags/edit.html.erb +4 -4
- data/app/views/alchemy/admin/tags/index.html.erb +5 -5
- data/app/views/alchemy/admin/tags/new.html.erb +2 -2
- data/app/views/alchemy/admin/trash/clear.js.coffee +1 -1
- data/app/views/alchemy/admin/trash/index.html.erb +3 -3
- data/app/views/alchemy/admin/users/_table.html.erb +3 -3
- data/app/views/alchemy/admin/users/_user.html.erb +6 -6
- data/app/views/alchemy/admin/users/index.html.erb +4 -4
- data/app/views/alchemy/base/error_notice.html.erb +1 -4
- data/app/views/alchemy/elements/_editor_not_found.html.erb +2 -2
- data/app/views/alchemy/essences/_essence_boolean_view.html.erb +1 -1
- data/app/views/alchemy/essences/_essence_file_editor.html.erb +7 -7
- data/app/views/alchemy/essences/_essence_picture_editor.html.erb +5 -5
- data/app/views/alchemy/essences/_essence_picture_tools.html.erb +8 -8
- data/app/views/alchemy/essences/_linkable_essence_tools.html.erb +2 -2
- data/app/views/alchemy/search/_form.html.erb +2 -2
- data/app/views/alchemy/search/_result.html.erb +1 -1
- data/app/views/alchemy/search/_results.html.erb +3 -3
- data/app/views/alchemy/user_sessions/leave.html.erb +5 -5
- data/app/views/alchemy/user_sessions/login.html.erb +1 -1
- data/app/views/alchemy/user_sessions/signup.html.erb +2 -2
- data/app/views/kaminari/_gap.html.erb +1 -1
- data/app/views/kaminari/_next_page.html.erb +2 -2
- data/app/views/kaminari/_prev_page.html.erb +2 -2
- data/app/views/layouts/alchemy/admin.html.erb +7 -7
- data/bin/alchemy +1 -1
- data/config/authorization_rules.rb +1 -3
- data/config/locales/alchemy.de.yml +33 -23
- data/config/locales/alchemy.en.yml +31 -6
- data/db/migrate/{20121026100815_alchemy_two_point_three.rb → 20121118000000_alchemy_two_point_four.rb} +51 -28
- data/db/migrate/20130110212411_create_alchemy_legacy_page_urls.rb +11 -0
- data/lib/alchemy/capistrano.rb +22 -30
- data/lib/alchemy/errors.rb +45 -0
- data/lib/alchemy/i18n.rb +7 -5
- data/lib/alchemy/logger.rb +16 -0
- data/lib/alchemy/page_layout.rb +3 -3
- data/lib/alchemy/resource.rb +17 -1
- data/lib/alchemy/resources_helper.rb +8 -1
- data/lib/alchemy/upgrader.rb +9 -0
- data/lib/alchemy/version.rb +1 -1
- data/lib/alchemy_cms.rb +1 -6
- data/lib/rails/generators/alchemy/scaffold/files/elements.yml +41 -19
- data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +13 -0
- data/lib/tasks/alchemy/db.rake +5 -11
- data/lib/tasks/alchemy/install.rake +7 -7
- data/spec/controllers/admin/pages_controller_spec.rb +14 -2
- data/spec/controllers/pages_controller_spec.rb +50 -17
- data/spec/dummy/config/application.rb +1 -1
- data/spec/dummy/db/migrate/{20121026100815_alchemy_two_point_three.rb → 20121118000000_alchemy_two_point_four.rb} +51 -28
- data/spec/dummy/db/migrate/20130110212411_create_alchemy_legacy_page_urls.rb +11 -0
- data/spec/dummy/db/schema.rb +10 -1
- data/spec/factories.rb +1 -0
- data/spec/integration/admin/picture_library_integration_spec.rb +8 -2
- data/spec/integration/security_spec.rb +2 -2
- data/spec/integration/translation_integration_spec.rb +20 -4
- data/spec/libraries/resources_helper_spec.rb +1 -1
- data/spec/models/cell_spec.rb +45 -0
- data/spec/models/page_spec.rb +19 -2
- data/spec/models/picture_spec.rb +12 -0
- data/spec/routing_spec.rb +115 -115
- data/spec/spec_helper.rb +3 -0
- data/spec/support/alchemy/specs_helpers.rb +6 -2
- data/spec/support/image.png +0 -0
- data/spec/support/image2.PNG +0 -0
- data/spec/support/image3.jpeg +0 -0
- metadata +27 -23
- data/db/migrate/20121113115120_create_alchemy_essence_links.rb +0 -13
- data/db/migrate/20121115100736_add_cached_tag_list_to_elements_pages_and_users.rb +0 -7
- data/db/migrate/20121116140636_add_cached_tag_list_to_alchemy_attachments.rb +0 -5
- data/db/migrate/20121116141016_change_alchemy_pictures_tag_list_column.rb +0 -9
- data/spec/dummy/db/migrate/20121113115120_create_alchemy_essence_links.rb +0 -13
- data/spec/dummy/db/migrate/20121115100736_add_cached_tag_list_to_elements_pages_and_users.rb +0 -7
- data/spec/dummy/db/migrate/20121116140636_add_cached_tag_list_to_alchemy_attachments.rb +0 -5
- data/spec/dummy/db/migrate/20121116141016_change_alchemy_pictures_tag_list_column.rb +0 -9
@@ -2,7 +2,7 @@ module Alchemy
|
|
2
2
|
module ResourcesHelper
|
3
3
|
|
4
4
|
def resource_window_size
|
5
|
-
@resource_window_size ||= "
|
5
|
+
@resource_window_size ||= "420x#{100 + resource_handler.attributes.length * 40}"
|
6
6
|
end
|
7
7
|
|
8
8
|
def resource_instance_variable
|
@@ -60,5 +60,12 @@ module Alchemy
|
|
60
60
|
end
|
61
61
|
obj
|
62
62
|
end
|
63
|
+
|
64
|
+
def resource_help_text(attribute)
|
65
|
+
if help_text = resource_handler.help_text_for(attribute)
|
66
|
+
content_tag(:p, help_text, class: 'foot_note')
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
63
70
|
end
|
64
71
|
end
|
data/lib/alchemy/upgrader.rb
CHANGED
@@ -22,6 +22,7 @@ module Alchemy
|
|
22
22
|
convert_picture_storage
|
23
23
|
upgrade_to_sites
|
24
24
|
removed_standard_set_notice
|
25
|
+
renamed_t_method
|
25
26
|
|
26
27
|
display_todos
|
27
28
|
end
|
@@ -256,6 +257,14 @@ WARN
|
|
256
257
|
warn = <<-WARN
|
257
258
|
We removed the standard set from Alchemy core!
|
258
259
|
In order to get the standard set back, install the `alchemy-demo_kit` gem.
|
260
|
+
WARN
|
261
|
+
todo warn
|
262
|
+
end
|
263
|
+
|
264
|
+
def renamed_t_method
|
265
|
+
warn = <<-WARN
|
266
|
+
We renamed alchemy's `t` method override into `_t` to avoid conflicts with Rails own t method!
|
267
|
+
If you use the `t` method to translate alchemy scoped keys, then you have to use the `_t` method from now on.
|
259
268
|
WARN
|
260
269
|
todo warn
|
261
270
|
end
|
data/lib/alchemy/version.rb
CHANGED
data/lib/alchemy_cms.rb
CHANGED
@@ -26,15 +26,10 @@ if Rails::VERSION::MAJOR == 3 && Rails::VERSION::MINOR == 2
|
|
26
26
|
require 'alchemy/auth_engine'
|
27
27
|
require 'alchemy/engine'
|
28
28
|
require 'alchemy/picture_attributes'
|
29
|
-
%w(config essence page_layout modules tinymce i18n scoped_pagination_url_helper resource resources_helper ferret_search).each do |class_name|
|
29
|
+
%w(config logger errors essence page_layout modules tinymce i18n scoped_pagination_url_helper resource resources_helper ferret_search).each do |class_name|
|
30
30
|
require File.join(File.dirname(__FILE__), "alchemy", class_name)
|
31
31
|
end
|
32
32
|
require File.join(File.dirname(__FILE__), "alchemy", "seeder")
|
33
33
|
else
|
34
34
|
raise "Alchemy 2.5 needs Rails 3.2 or higher. You are currently using Rails #{Rails::VERSION::STRING}"
|
35
35
|
end
|
36
|
-
|
37
|
-
module Alchemy
|
38
|
-
class EssenceError < StandardError;
|
39
|
-
end
|
40
|
-
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# == In this configuration you setup Alchemy´s element layouts.
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# Use rails generate alchemy:scaffold to generate this file for your app.
|
4
|
-
#
|
4
|
+
#
|
5
5
|
# Elements containing all necessary basic tools for displaying and editing content inside Alchemy.
|
6
6
|
# They consists of composed contents (different essence-types) as shown in the illustration of an elements-sheme below.
|
7
7
|
#
|
8
8
|
# == Schema of an element
|
9
|
-
#
|
9
|
+
#
|
10
10
|
# =================================
|
11
11
|
# # Content 1 (EssenceText) #
|
12
12
|
# # #
|
@@ -16,7 +16,7 @@
|
|
16
16
|
# =================================
|
17
17
|
#
|
18
18
|
# == Example of a basic element layout
|
19
|
-
#
|
19
|
+
#
|
20
20
|
# - name: a_unique_name (Used for the partial name in +app/views/elements+ and translated as Element.display_name)
|
21
21
|
# unique: Bool //pass true if this element only can be displayed once on page
|
22
22
|
# contents:
|
@@ -36,34 +36,34 @@
|
|
36
36
|
# * EssenceFlash (Used to store attachment ids from attachments assigned through the library. The view renders an embeded object.)
|
37
37
|
# * EssenceDate (Used to store a DateTime object. The view output is passed through Rails I18n Library, so it will be fully localized.)
|
38
38
|
# * EssenceHtml (Used to store a String (max. 255 Chars.). The view output renders the raw, not sanitized or unescaped String. So be carefull!)
|
39
|
-
#
|
39
|
+
#
|
40
40
|
# After finishing the setup of your element layouts, you need to generate the files for the elements before using them in Alchemy.
|
41
41
|
# For creating these files, use the following command in your terminal:
|
42
|
-
#
|
43
|
-
# rails generate elements
|
44
|
-
#
|
42
|
+
#
|
43
|
+
# rails generate alchemy:elements
|
44
|
+
#
|
45
45
|
# All new elements will be created as two different partials in Rails.root/app/views/elements.
|
46
46
|
# For each element there is an editor-view wich will be rendered when editing them in Alchemy and another view for the website´s frontend.
|
47
|
-
#
|
47
|
+
#
|
48
48
|
# app/views/elements/_elements_name_editor.html.erb
|
49
49
|
# app/views/elements/_elements_name_view.html.erb
|
50
|
-
#
|
51
|
-
# For most contents
|
50
|
+
#
|
51
|
+
# For most contents of an element you can specify additional options, so they get rendered in a specific way.
|
52
52
|
# These options can be defined as symbols, but its too much to list them up here.
|
53
53
|
# You can find these options described in the application_helper.rb, most of them at the render_essence method.
|
54
54
|
#
|
55
55
|
# == Setting a content as preview-text for the element
|
56
|
-
#
|
56
|
+
#
|
57
57
|
# You can set a content-essence as preview-text for its element like this
|
58
58
|
# take_me_for_preview: true
|
59
59
|
#
|
60
60
|
#
|
61
61
|
# == Adding contents dynamically in the frontend
|
62
|
-
#
|
62
|
+
#
|
63
63
|
# You are able to add content-essences dynamically to the element from the Alchemy frontend.
|
64
64
|
# You just have to make contents available for adding them.
|
65
65
|
# This example enables this feature
|
66
|
-
#
|
66
|
+
#
|
67
67
|
# - name: headline
|
68
68
|
# unique: false
|
69
69
|
# contents:
|
@@ -77,15 +77,37 @@
|
|
77
77
|
#
|
78
78
|
# Now an Alchemy user can add the content 'big_text' from the element as much as desired.
|
79
79
|
#
|
80
|
-
#
|
81
|
-
#
|
82
|
-
#
|
83
|
-
#
|
80
|
+
#
|
81
|
+
# == Deactivate indexing (Ferret search) for certain contents
|
82
|
+
#
|
83
|
+
# Contents of type EssenceText and EssenceRichtext can be excluded from being indexed by the Ferret search engine.
|
84
|
+
#
|
84
85
|
# Example:
|
85
|
-
#
|
86
|
+
#
|
87
|
+
# - name: contactform
|
88
|
+
# unique: true
|
89
|
+
# contents:
|
90
|
+
# - name: mail_to
|
91
|
+
# type: EssenceText
|
92
|
+
# do_not_index: true
|
93
|
+
#
|
94
|
+
#
|
95
|
+
# == Validate contents before updating the element
|
96
|
+
#
|
97
|
+
# More informations in [Content#essence_validations]
|
98
|
+
#
|
99
|
+
#
|
100
|
+
# == Translate element and content names
|
101
|
+
#
|
102
|
+
# Element and content names are passed through the I18n library. So you can translate them in your config/locales language yml file.
|
103
|
+
#
|
104
|
+
# Example:
|
105
|
+
#
|
86
106
|
# de:
|
87
107
|
# alchemy:
|
88
108
|
# element_names:
|
89
109
|
# contact: Kontakt
|
90
110
|
# search: Suche
|
111
|
+
# content_names:
|
112
|
+
# headline: Überschrift
|
91
113
|
|
@@ -4,6 +4,7 @@ module Alchemy
|
|
4
4
|
module Generators
|
5
5
|
class ScaffoldGenerator < ::Rails::Generators::Base
|
6
6
|
desc "This generator generates the Alchemy scaffold."
|
7
|
+
class_option :copy_views, :default => false, :type => :boolean, :desc => "Copy all Alchemy views into your app.", :aliases => '-v'
|
7
8
|
source_root File.expand_path('templates', File.dirname(__FILE__))
|
8
9
|
|
9
10
|
def create_config_dir
|
@@ -15,6 +16,10 @@ module Alchemy
|
|
15
16
|
empty_directory Rails.root.join("app/views/alchemy/page_layouts")
|
16
17
|
end
|
17
18
|
|
19
|
+
def copy_view_dirs
|
20
|
+
copy_alchemy_views if @options['copy_views']
|
21
|
+
end
|
22
|
+
|
18
23
|
def copy_config
|
19
24
|
copy_file "#{config_path}/config.yml", "#{Rails.root}/config/alchemy/config.yml"
|
20
25
|
end
|
@@ -31,6 +36,14 @@ module Alchemy
|
|
31
36
|
@config_path ||= File.expand_path('../../../../../config/alchemy', File.dirname(__FILE__))
|
32
37
|
end
|
33
38
|
|
39
|
+
def copy_alchemy_views
|
40
|
+
%w(messages navigation notifications search).each do |dir|
|
41
|
+
src = File.expand_path("../../../../../app/views/alchemy/#{dir}", File.dirname(__FILE__))
|
42
|
+
dest = Rails.root.join('app/views/alchemy', dir)
|
43
|
+
directory src, dest
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
34
47
|
end
|
35
48
|
end
|
36
49
|
end
|
data/lib/tasks/alchemy/db.rake
CHANGED
@@ -6,19 +6,13 @@ namespace :alchemy do
|
|
6
6
|
Alchemy::Seeder.seed!
|
7
7
|
end
|
8
8
|
|
9
|
-
desc "Dumps the database into
|
9
|
+
desc "Dumps the database to STDOUT (Pass DUMP_FILENAME to store the dump into a file). NOTE: This only works with MySQL yet."
|
10
10
|
task :dump => :environment do
|
11
11
|
db_conf = Rails.configuration.database_configuration.fetch(Rails.env)
|
12
|
-
raise "Alchemy only supports MySQL database dumping at the moment." unless db_conf['adapter'] =~ /mysql/
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
def dump_name
|
18
|
-
return ENV['DUMP_FILENAME'] if ENV['DUMP_FILENAME'].present?
|
19
|
-
app_name = Rails.application.class.name.underscore.split('/').first
|
20
|
-
timestamp = Time.now.strftime('%Y-%m-%d-%H-%M')
|
21
|
-
dump_name = "#{app_name}-#{timestamp}.sql"
|
12
|
+
raise "Sorry, but Alchemy only supports MySQL database dumping at the moment." unless db_conf['adapter'] =~ /mysql/
|
13
|
+
dump_store = ENV['DUMP_FILENAME'] ? " > #{Rails.root.join('db/dumps', dump_name)}" : ""
|
14
|
+
cmd = "mysqldump --user='#{db_conf['username']}'#{db_conf['password'].present? ? " --password='#{db_conf['password']}'" : nil} #{db_conf['database']}#{dump_store}"
|
15
|
+
system cmd
|
22
16
|
end
|
23
17
|
|
24
18
|
end
|
@@ -3,16 +3,16 @@ require 'thor'
|
|
3
3
|
class Alchemy::RoutesInjector < Thor
|
4
4
|
include Thor::Actions
|
5
5
|
|
6
|
-
def initialize; super; end
|
7
|
-
|
8
6
|
no_tasks do
|
9
7
|
def inject
|
10
|
-
|
11
|
-
|
8
|
+
mountpoint = ask "\nWhere do you want to mount Alchemy CMS? (/)"
|
9
|
+
mountpoint = "/" if mountpoint.empty?
|
12
10
|
sentinel = /\.routes\.draw do(?:\s*\|map\|)?\s*$/
|
13
|
-
inject_into_file "./config/routes.rb", "\n mount Alchemy::Engine => '#{
|
11
|
+
inject_into_file "./config/routes.rb", "\n mount Alchemy::Engine => '#{mountpoint}'\n", { :after => sentinel, :verbose => true }
|
12
|
+
mountpoint
|
14
13
|
end
|
15
14
|
end
|
15
|
+
|
16
16
|
end
|
17
17
|
|
18
18
|
namespace :alchemy do
|
@@ -37,7 +37,7 @@ Now cd into your app folder and
|
|
37
37
|
|
38
38
|
2. Open your browser and enter the following URL:
|
39
39
|
|
40
|
-
http://localhost:3000/#{@mountpoint}
|
40
|
+
http://localhost:3000/#{@mountpoint.gsub(/^\//, '')}
|
41
41
|
|
42
42
|
3. Follow the instructions to complete the installation!
|
43
43
|
|
@@ -56,7 +56,7 @@ EOF
|
|
56
56
|
|
57
57
|
desc "Mounts Alchemy into your routes."
|
58
58
|
task :mount do
|
59
|
-
Alchemy::RoutesInjector.new.inject
|
59
|
+
@mountpoint = Alchemy::RoutesInjector.new.inject
|
60
60
|
end
|
61
61
|
|
62
62
|
end
|
@@ -39,13 +39,13 @@ module Alchemy
|
|
39
39
|
|
40
40
|
describe '#create' do
|
41
41
|
|
42
|
-
|
42
|
+
let(:parent) { FactoryGirl.create(:public_page) }
|
43
43
|
|
44
44
|
context "with paste_from_clipboard in parameters" do
|
45
|
+
render_views
|
45
46
|
|
46
47
|
let(:clipboard) { session[:clipboard] = Clipboard.new }
|
47
48
|
let(:page_in_clipboard) { FactoryGirl.create(:public_page) }
|
48
|
-
let(:parent) { FactoryGirl.create(:public_page) }
|
49
49
|
|
50
50
|
before(:each) do
|
51
51
|
clipboard[:pages] = [{:id => page_in_clipboard.id, :action => 'cut'}]
|
@@ -59,6 +59,18 @@ module Alchemy
|
|
59
59
|
|
60
60
|
end
|
61
61
|
|
62
|
+
context "with redirect_to in the parameters" do
|
63
|
+
|
64
|
+
let(:page_params) do
|
65
|
+
{:name => "Foobar", :page_layout => 'standard', :parent_id => parent.id}
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should redirect to given url" do
|
69
|
+
post :create, :page => page_params, :redirect_to => admin_users_path
|
70
|
+
response.should redirect_to(admin_users_path)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
62
74
|
end
|
63
75
|
|
64
76
|
describe '#copy_language_tree' do
|
@@ -2,26 +2,21 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Alchemy::PagesController do
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
before(:each) do
|
8
|
-
@default_language = Alchemy::Language.get_default
|
9
|
-
@default_language_root = FactoryGirl.create(:language_root_page, :language => @default_language, :name => 'Home', :public => true)
|
10
|
-
end
|
5
|
+
let(:default_language) { Alchemy::Language.get_default }
|
6
|
+
let(:default_language_root) { FactoryGirl.create(:language_root_page, :language => default_language, :name => 'Home', :public => true) }
|
11
7
|
|
12
8
|
context "requested for a page containing a feed" do
|
9
|
+
render_views
|
13
10
|
|
14
|
-
|
15
|
-
@page = FactoryGirl.create(:public_page, :parent_id => @default_language_root.id, :page_layout => 'news', :name => 'News', :language => @default_language, :do_not_autogenerate => false)
|
16
|
-
end
|
11
|
+
let(:page) { FactoryGirl.create(:public_page, :parent_id => default_language_root.id, :page_layout => 'news', :name => 'News', :language => default_language, :do_not_autogenerate => false) }
|
17
12
|
|
18
13
|
it "should render a rss feed" do
|
19
|
-
get :show, :urlname =>
|
14
|
+
get :show, :urlname => page.urlname, :format => :rss
|
20
15
|
response.content_type.should == 'application/rss+xml'
|
21
16
|
end
|
22
17
|
|
23
18
|
it "should include content" do
|
24
|
-
|
19
|
+
page.elements.first.content_by_name('news_headline').essence.update_attributes({:body => 'Peters Petshop'})
|
25
20
|
get :show, :urlname => 'news', :format => :rss
|
26
21
|
response.body.should match /Peters Petshop/
|
27
22
|
end
|
@@ -31,7 +26,7 @@ describe Alchemy::PagesController do
|
|
31
26
|
context "requested for a page that does not contain a feed" do
|
32
27
|
|
33
28
|
it "should render xml 404 error" do
|
34
|
-
get :show, :urlname =>
|
29
|
+
get :show, :urlname => default_language_root.urlname, :format => :rss
|
35
30
|
response.status.should == 404
|
36
31
|
end
|
37
32
|
|
@@ -59,11 +54,14 @@ describe Alchemy::PagesController do
|
|
59
54
|
|
60
55
|
context "with params layout set to not existing layout" do
|
61
56
|
it "should raise ActionView::MissingTemplate" do
|
62
|
-
expect {
|
57
|
+
expect {
|
58
|
+
get :show, :urlname => default_language_root.urlname, :layout => 'lkuiuk'
|
59
|
+
}.to raise_error(ActionView::MissingTemplate)
|
63
60
|
end
|
64
61
|
end
|
65
62
|
|
66
63
|
context "with param layout set to a custom layout" do
|
64
|
+
render_views
|
67
65
|
|
68
66
|
before do
|
69
67
|
@custom_layout = Rails.root.join('app/views/layouts', 'custom.html.erb')
|
@@ -73,7 +71,7 @@ describe Alchemy::PagesController do
|
|
73
71
|
end
|
74
72
|
|
75
73
|
it "should render the custom layout" do
|
76
|
-
get :show, :urlname =>
|
74
|
+
get :show, :urlname => default_language_root.urlname, :layout => 'custom'
|
77
75
|
response.body.should have_content('I am a custom layout')
|
78
76
|
end
|
79
77
|
|
@@ -85,11 +83,12 @@ describe Alchemy::PagesController do
|
|
85
83
|
end
|
86
84
|
|
87
85
|
describe "url nesting" do
|
86
|
+
render_views
|
88
87
|
|
89
88
|
before(:each) do
|
90
|
-
@catalog = FactoryGirl.create(:public_page, :name => "Catalog", :parent_id =>
|
91
|
-
@products = FactoryGirl.create(:public_page, :name => "Products", :parent_id => @catalog.id, :language =>
|
92
|
-
@product = FactoryGirl.create(:public_page, :name => "Screwdriver", :parent_id => @products.id, :language =>
|
89
|
+
@catalog = FactoryGirl.create(:public_page, :name => "Catalog", :parent_id => default_language_root.id, :language => default_language)
|
90
|
+
@products = FactoryGirl.create(:public_page, :name => "Products", :parent_id => @catalog.id, :language => default_language)
|
91
|
+
@product = FactoryGirl.create(:public_page, :name => "Screwdriver", :parent_id => @products.id, :language => default_language, :do_not_autogenerate => false)
|
93
92
|
@product.elements.find_by_name('article').contents.essence_texts.first.essence.update_column(:body, 'screwdriver')
|
94
93
|
controller.stub!(:configuration) { |arg| arg == :url_nesting ? true : false }
|
95
94
|
end
|
@@ -164,4 +163,38 @@ describe Alchemy::PagesController do
|
|
164
163
|
end
|
165
164
|
end
|
166
165
|
|
166
|
+
describe 'Redirecting to legacy page urls' do
|
167
|
+
context 'Request a page with legacy url' do
|
168
|
+
|
169
|
+
# otherwise we are redirected to signup
|
170
|
+
before { FactoryGirl.create(:admin_user) }
|
171
|
+
|
172
|
+
let(:page) { FactoryGirl.create(:public_page, :name => 'New page name') }
|
173
|
+
let(:second_page) { FactoryGirl.create(:public_page, :name => 'Second Page') }
|
174
|
+
let(:legacy_page) { FactoryGirl.create(:public_page, :name => 'Legacy Url') }
|
175
|
+
let(:legacy_url) { Alchemy::LegacyPageUrl.create(:urlname => 'legacy-url', :page => page) }
|
176
|
+
let(:legacy_url2) { Alchemy::LegacyPageUrl.create(:urlname => 'legacy-url', :page => second_page) }
|
177
|
+
|
178
|
+
it "should redirect permanently to page that belongs to legacy page url." do
|
179
|
+
get :show, :urlname => legacy_url.urlname
|
180
|
+
response.status.should == 301
|
181
|
+
response.should redirect_to('/alchemy/new-page-name')
|
182
|
+
end
|
183
|
+
|
184
|
+
it "should only redirect to legacy url if no page was found for urlname" do
|
185
|
+
legacy_url
|
186
|
+
get :show, :urlname => legacy_page.urlname
|
187
|
+
response.status.should == 200
|
188
|
+
response.should_not redirect_to('/alchemy/new-page-name')
|
189
|
+
end
|
190
|
+
|
191
|
+
it "should redirect to last page that has that legacy url" do
|
192
|
+
legacy_url
|
193
|
+
get :show, :urlname => legacy_url2.urlname
|
194
|
+
response.should redirect_to('/alchemy/second-page')
|
195
|
+
end
|
196
|
+
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
167
200
|
end
|
@@ -37,7 +37,7 @@ module Dummy
|
|
37
37
|
|
38
38
|
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
|
39
39
|
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
|
40
|
-
|
40
|
+
config.i18n.default_locale = :en
|
41
41
|
|
42
42
|
# Configure the default encoding used in templates for Ruby 1.9.
|
43
43
|
config.encoding = "utf-8"
|