alchemy_cms 2.5.0.b5 → 2.5.0.b9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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"
|