alchemy_cms 2.3.2 → 2.4.beta2
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/.gitignore +1 -2
- data/.travis.yml +1 -5
- data/Gemfile +4 -4
- data/README.md +22 -15
- data/alchemy_cms.gemspec +38 -38
- data/app/assets/javascripts/alchemy/alchemy.base.js +2 -2
- data/app/assets/javascripts/alchemy/alchemy.buttons.js.coffee +31 -0
- data/app/assets/javascripts/alchemy/alchemy.dragndrop.js +1 -1
- data/app/assets/javascripts/alchemy/alchemy.elements_window.js +24 -15
- data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +9 -3
- data/app/assets/javascripts/alchemy/alchemy.jquery_loader.js +2 -2
- data/app/assets/javascripts/alchemy/alchemy.js +1 -0
- data/app/assets/javascripts/alchemy/alchemy.menubar.js +4 -12
- data/app/assets/javascripts/alchemy/alchemy.onload.js.coffee +32 -0
- data/app/assets/javascripts/alchemy/alchemy.windows.js +4 -4
- data/app/assets/stylesheets/alchemy/_defaults.scss +0 -1
- data/app/assets/stylesheets/alchemy/alchemy.css +2 -1
- data/app/assets/stylesheets/alchemy/base.css.scss +2 -54
- data/app/assets/stylesheets/alchemy/elements.css.scss +8 -5
- data/app/assets/stylesheets/alchemy/errors.css.scss +51 -0
- data/app/assets/stylesheets/alchemy/flash.css.scss +0 -2
- data/app/assets/stylesheets/alchemy/form_elements.css.scss +31 -75
- data/app/assets/stylesheets/alchemy/icons.css.scss +5 -5
- data/app/assets/stylesheets/alchemy/menubar.css.scss +0 -2
- data/app/assets/stylesheets/alchemy/sitemap.css.scss +0 -1
- data/app/assets/stylesheets/alchemy/tables.css.scss +3 -1
- data/app/controllers/alchemy/admin/base_controller.rb +19 -12
- data/app/controllers/alchemy/admin/elements_controller.rb +52 -24
- data/app/controllers/alchemy/admin/pages_controller.rb +11 -5
- data/app/controllers/alchemy/admin/resources_controller.rb +3 -4
- data/app/controllers/alchemy/admin/users_controller.rb +1 -0
- data/app/controllers/alchemy/base_controller.rb +34 -8
- data/app/controllers/alchemy/pictures_controller.rb +16 -1
- data/app/controllers/alchemy/user_sessions_controller.rb +6 -1
- data/app/helpers/alchemy/base_helper.rb +14 -0
- data/app/helpers/alchemy/elements_helper.rb +10 -5
- data/app/helpers/alchemy/pages_helper.rb +1 -2
- data/app/helpers/alchemy/url_helper.rb +43 -24
- data/app/models/alchemy/element.rb +23 -16
- data/app/models/alchemy/page.rb +25 -14
- data/app/models/alchemy/picture.rb +24 -0
- data/app/views/alchemy/admin/contents/create.js.erb +1 -1
- data/app/views/alchemy/admin/elements/_new_element_form.html.erb +1 -1
- data/app/views/alchemy/admin/elements/create.js.erb +11 -3
- data/app/views/alchemy/admin/elements/fold.js.erb +1 -1
- data/app/views/alchemy/admin/elements/new.html.erb +1 -1
- data/app/views/alchemy/admin/elements/update.js.erb +1 -1
- data/app/views/alchemy/admin/essence_pictures/crop.html.erb +1 -1
- data/app/views/alchemy/admin/languages/_form.html.erb +1 -1
- data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -1
- data/app/views/alchemy/admin/pages/_page.html.erb +1 -1
- data/app/views/alchemy/admin/pages/configure.html.erb +10 -6
- data/app/views/alchemy/admin/pages/configure_external.html.erb +1 -1
- data/app/views/alchemy/admin/pages/edit.html.erb +1 -2
- data/app/views/alchemy/admin/pages/new.html.erb +2 -2
- data/app/views/alchemy/admin/pages/update.js.erb +10 -2
- data/app/views/alchemy/admin/partials/_sub_navigation_tab.html.erb +5 -5
- data/app/views/alchemy/admin/pictures/_filter_bar.html.erb +2 -1
- data/app/views/alchemy/admin/pictures/_picture.html.erb +2 -2
- data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +2 -1
- data/app/views/alchemy/admin/pictures/show_in_window.html.erb +3 -2
- data/app/views/alchemy/admin/resources/_form.html.erb +1 -1
- data/app/views/alchemy/admin/users/_table.html.erb +4 -4
- data/app/views/alchemy/admin/users/edit.html.erb +1 -1
- data/app/views/alchemy/admin/users/new.html.erb +1 -1
- data/app/views/alchemy/base/error_notice.js.erb +1 -1
- data/app/views/alchemy/base/remote_errors.js.erb +2 -3
- data/app/views/alchemy/essences/_essence_picture_editor.html.erb +10 -7
- data/app/views/alchemy/essences/_essence_picture_view.html.erb +24 -21
- data/app/views/layouts/alchemy/admin.html.erb +9 -31
- data/bin/alchemy +20 -24
- data/config/alchemy/config.yml +6 -0
- data/config/alchemy/page_layouts.yml +2 -0
- data/config/authorization_rules.rb +1 -1
- data/config/locales/alchemy.de.yml +3 -0
- data/config/locales/alchemy.en.yml +4 -1
- data/db/migrate/20121026100815_alchemy_two_point_three.rb +312 -0
- data/lib/alchemy/mount_point.rb +9 -3
- data/lib/alchemy/page_layout.rb +89 -73
- data/lib/alchemy/version.rb +1 -1
- data/lib/rails/generators/alchemy/deploy_script/deploy_script_generator.rb +45 -12
- data/lib/rails/generators/alchemy/deploy_script/templates/deploy.rb.tt +3 -1
- data/lib/rails/generators/alchemy/essence/essence_generator.rb +51 -0
- data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +18 -0
- data/lib/rails/generators/alchemy/essence/templates/view.html.erb +2 -0
- data/lib/rails/templates/alchemy.rb +1 -1
- data/lib/tasks/install.rake +57 -2
- data/spec/controllers/admin/elements_controller_spec.rb +170 -22
- data/spec/controllers/admin/trash_controller_spec.rb +1 -1
- data/spec/controllers/admin/users_controller_spec.rb +36 -0
- data/spec/controllers/base_controller_spec.rb +12 -1
- data/spec/controllers/elements_controller_spec.rb +17 -13
- data/spec/controllers/pictures_controller_spec.rb +4 -4
- data/spec/dummy/config/application.rb +1 -1
- data/spec/dummy/db/migrate/20121026100815_alchemy_two_point_three.rb +312 -0
- data/spec/dummy/db/migrate/20121026104128_create_events.rb +19 -0
- data/spec/dummy/db/schema.rb +1 -1
- data/spec/factories.rb +0 -1
- data/spec/helpers/base_helper_spec.rb +48 -0
- data/spec/helpers/elements_helper_spec.rb +14 -3
- data/spec/helpers/url_helper_spec.rb +8 -3
- data/spec/integration/picture_security_spec.rb +35 -0
- data/spec/integration/translation_integration_spec.rb +6 -5
- data/spec/models/element_spec.rb +5 -5
- data/spec/models/page_layout_spec.rb +10 -16
- data/spec/models/page_spec.rb +25 -2
- data/spec/models/picture_spec.rb +24 -2
- data/spec/routing_spec.rb +115 -115
- data/spec/support/alchemy/specs_helpers.rb +4 -4
- data/{app/assets/images/alchemy → vendor/assets/images}/Jcrop.gif +0 -0
- data/vendor/assets/javascripts/jquery_plugins/jquery.Jcrop.min.js +19 -243
- data/vendor/assets/javascripts/jquery_plugins/jquery.selectboxit.min.js +1 -0
- data/vendor/assets/javascripts/jquery_plugins/jquery.ui.tabspaging.js +6 -6
- data/vendor/assets/stylesheets/jquery.Jcrop.min.css +28 -0
- metadata +48 -82
- data/app/assets/javascripts/alchemy/alchemy.buttons.js +0 -50
- data/app/assets/stylesheets/alchemy/jquery.Jcrop.css.scss +0 -54
- data/app/helpers/alchemy/pictures_helper.rb +0 -19
- data/db/migrate/20100607143125_create_pages.rb +0 -34
- data/db/migrate/20100607144254_create_elements.rb +0 -20
- data/db/migrate/20100607145256_create_contents.rb +0 -18
- data/db/migrate/20100607145719_create_users.rb +0 -32
- data/db/migrate/20100607150611_create_pictures.rb +0 -16
- data/db/migrate/20100607150812_create_attachments.rb +0 -16
- data/db/migrate/20100607153647_create_folded_pages.rb +0 -13
- data/db/migrate/20100607161345_create_essence_texts.rb +0 -19
- data/db/migrate/20100607162339_create_elements_pages.rb +0 -12
- data/db/migrate/20100607193638_create_essence_pictures.rb +0 -23
- data/db/migrate/20100607193646_create_essence_richtexts.rb +0 -16
- data/db/migrate/20100607193653_create_essence_htmls.rb +0 -13
- data/db/migrate/20100609111653_create_essence_dates.rb +0 -13
- data/db/migrate/20100609111809_create_essence_files.rb +0 -15
- data/db/migrate/20100609111821_create_essence_flashes.rb +0 -16
- data/db/migrate/20100609111837_create_essence_videos.rb +0 -18
- data/db/migrate/20100616150753_create_essence_audios.rb +0 -17
- data/db/migrate/20100812085225_add_crop_from_and_crop_size_to_essence_pictures.rb +0 -11
- data/db/migrate/20100909140701_change_essence_htmls_source_column_type.rb +0 -9
- data/db/migrate/20101109150312_alter_pages_visible_column_default.rb +0 -9
- data/db/migrate/20101109151812_create_languages.rb +0 -19
- data/db/migrate/20101216151419_add_language_id_to_pages.rb +0 -27
- data/db/migrate/20101216155216_add_index_to_languages.rb +0 -9
- data/db/migrate/20101216173323_add_default_to_languages.rb +0 -9
- data/db/migrate/20101218130049_add_urlname_index_to_pages.rb +0 -9
- data/db/migrate/20110115123343_remove_css_class_default_from_essence_pictures.rb +0 -11
- data/db/migrate/20110224105120_change_pages_visible_default.rb +0 -11
- data/db/migrate/20110228182659_remove_default_page_layout_from_pages.rb +0 -11
- data/db/migrate/20110414163140_remove_display_name_from_elements.rb +0 -11
- data/db/migrate/20110511100516_rename_essence_texts_title_to_link_title.rb +0 -9
- data/db/migrate/20110529130429_create_cells.rb +0 -14
- data/db/migrate/20110529130500_add_cell_id_to_elements.rb +0 -11
- data/db/migrate/20110530102804_change_pages_page_layout_column.rb +0 -11
- data/db/migrate/20110707190728_add_render_size_to_essence_pictures.rb +0 -9
- data/db/migrate/20110711142057_change_open_link_in_new_window_to_link_target.rb +0 -19
- data/db/migrate/20110919110451_add_default_role_to_users.rb +0 -9
- data/db/migrate/20111116125112_namespace_alchemy_models.rb +0 -23
- data/db/migrate/20120216135355_add_country_code_to_languages.rb +0 -9
- data/db/migrate/20120608085509_create_alchemy_essence_selects.rb +0 -11
- data/db/migrate/20120611221734_create_alchemy_essence_booleans.rb +0 -11
- data/db/migrate/20120704181529_add_upload_hash_to_alchemy_picture.rb +0 -5
- data/db/migrate/20120705214247_acts_as_taggable_on_migration.rb +0 -28
- data/db/migrate/20120728185830_add_cached_tag_list_to_alchemy_pictures.rb +0 -5
- data/db/migrate/20120831135441_set_alchemy_languages_country_code_default_to_empty_string.rb +0 -9
- data/spec/helpers/pictures_helper_spec.rb +0 -14
- data/vendor/assets/javascripts/jquery_plugins/jquery.selectBoxIt.js +0 -1909
data/config/alchemy/config.yml
CHANGED
|
@@ -9,6 +9,12 @@
|
|
|
9
9
|
#
|
|
10
10
|
# rake alchemy:app_structure:create:config
|
|
11
11
|
|
|
12
|
+
# === Require SSL for login form and all admin modules
|
|
13
|
+
#
|
|
14
|
+
# NOTE: You have to create a SSL certificate on your server to make this work
|
|
15
|
+
#
|
|
16
|
+
require_ssl: false
|
|
17
|
+
|
|
12
18
|
# === Auto Log Out Time
|
|
13
19
|
#
|
|
14
20
|
# The amount of time of inactivity in minutes after which the user is kicked out of his current session.
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
# unique: Bool # Pass true and the user can only choose this layout once inside a language tree.
|
|
8
8
|
# hide: Bool # Pass true to hide this layout from the user.
|
|
9
9
|
# elements: Array # A list of element names that can be placed on this layout i.e. [text, picture]. Elements are defined inside the elements.yml file.
|
|
10
|
+
# insert_elements_at: String # Pass top to insert elements at top of the list. Default: bottom
|
|
10
11
|
# autogenerate: Array # A list of element names that are autogenerated after creating the Page.
|
|
11
12
|
# searchresults: Bool # Pass true to enable rendering the searchresults of the fulltext-search.
|
|
12
13
|
# layoutpage: Bool # Layoutpages are outside the normal pagetree and can be used to place "global" language independent Elements.
|
|
@@ -46,6 +47,7 @@
|
|
|
46
47
|
- name: news
|
|
47
48
|
feed: true
|
|
48
49
|
unique: true
|
|
50
|
+
insert_elements_at: top
|
|
49
51
|
elements: [headline, news]
|
|
50
52
|
autogenerate: [news]
|
|
51
53
|
feed_elements: [news]
|
|
@@ -56,7 +56,7 @@ authorization do
|
|
|
56
56
|
|
|
57
57
|
role :admin do
|
|
58
58
|
includes :editor
|
|
59
|
-
has_permission_on :alchemy_admin_users, :to => [:manage]
|
|
59
|
+
has_permission_on :alchemy_admin_users, :to => [:manage, :update_role]
|
|
60
60
|
has_permission_on :alchemy_admin_languages, :to => [:manage]
|
|
61
61
|
has_permission_on :authorization_rules, :to => :read
|
|
62
62
|
end
|
|
@@ -278,6 +278,7 @@ de:
|
|
|
278
278
|
"Successfully added content": "%{content} wurde hinzugefügt"
|
|
279
279
|
"Successfully deleted content": "%{content} wurde gelöscht"
|
|
280
280
|
"Successfully saved content position": "Die Position wurde gespeichert."
|
|
281
|
+
"Successfully signup admin user": "Admin Benutzer wurde erfolgreich eingerichtet."
|
|
281
282
|
"Switch to Flash® Uploader": "Auf den Flash® Uploader wechseln"
|
|
282
283
|
sitemap_editor_info: "Die Sitemap wird automatisch generiert"
|
|
283
284
|
searchresults_editor_info: "Dieses Element stellt die Suchergebnisse dar. Es Bedarf keinerlei Anpassung."
|
|
@@ -462,6 +463,7 @@ de:
|
|
|
462
463
|
"Page created": "Seite '%{name}' wurde erstellt."
|
|
463
464
|
page_for_links:
|
|
464
465
|
choose_page: "%{name} wählen"
|
|
466
|
+
page_layout_changed_notice: "Der Seitentyp wurde verändert. Nicht mehr verwendbare Elemente wurden in den Papierkorb verschoben."
|
|
465
467
|
page_locked: "Die Seite ist gesperrt"
|
|
466
468
|
page_properties: "Seiteneigenschaften"
|
|
467
469
|
page_public: "öffentlich"
|
|
@@ -517,6 +519,7 @@ de:
|
|
|
517
519
|
show_eq: "EQ anzeigen"
|
|
518
520
|
show_navigation: "Navigation anzeigen"
|
|
519
521
|
show_page_in_sitemap: "Seite in der Sitemap zeigen"
|
|
522
|
+
signup_mail_delivery_error: "Einrichtungs-E-Mail konnte nicht verschickt werden. Bitte überprüfen Sie die Mail Einstellungen."
|
|
520
523
|
small_thumbnails: "kleine Miniaturbilder"
|
|
521
524
|
subject: "Betreff"
|
|
522
525
|
successfully_added_element: "Element wurde hinzugefügt."
|
|
@@ -296,7 +296,9 @@ en:
|
|
|
296
296
|
"No users found": "No users found."
|
|
297
297
|
"not a valid image": "This is not an valid image."
|
|
298
298
|
"Page created": "Page: '%{name}' created."
|
|
299
|
-
page_for_links
|
|
299
|
+
page_for_links:
|
|
300
|
+
choose_page: "Choose %{name}"
|
|
301
|
+
page_layout_changed_notice: "Page type was changed. Elements not usable anymore have been moved into the trash."
|
|
300
302
|
page_locked: "This page is locked by another user."
|
|
301
303
|
page_properties: "Page properties"
|
|
302
304
|
page_public: "published"
|
|
@@ -346,6 +348,7 @@ en:
|
|
|
346
348
|
show_eq: "Show EQ"
|
|
347
349
|
show_navigation: "Show in navigation"
|
|
348
350
|
show_page_in_sitemap: "Show page in sitemap."
|
|
351
|
+
signup_mail_delivery_error: 'Signup mail could not be delivered. Please check your mail settings.'
|
|
349
352
|
sitemap_editor_notice: "The sitemap is autogenerated."
|
|
350
353
|
searchresults_editor_info: "This element displays the search and the searchresults."
|
|
351
354
|
small_thumbnails: "Small thumbnails"
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
# This is a compressed migration for creating all Alchemy 2.3 tables at once.
|
|
2
|
+
#
|
|
3
|
+
# === Notice
|
|
4
|
+
#
|
|
5
|
+
# In order to upgrade from an old version of Alchemy, you have to run all migrations from
|
|
6
|
+
# each version you missed up to the version you want to upgrade to, before running this migration.
|
|
7
|
+
#
|
|
8
|
+
class AlchemyTwoPointThree < ActiveRecord::Migration
|
|
9
|
+
def up
|
|
10
|
+
# Do not run if Alchemy tables are already present
|
|
11
|
+
return if table_exists?(:alchemy_pages)
|
|
12
|
+
|
|
13
|
+
create_table "alchemy_attachments", :force => true do |t|
|
|
14
|
+
t.string "name"
|
|
15
|
+
t.string "filename"
|
|
16
|
+
t.string "content_type"
|
|
17
|
+
t.integer "size"
|
|
18
|
+
t.integer "creator_id"
|
|
19
|
+
t.integer "updater_id"
|
|
20
|
+
t.datetime "created_at", :null => false
|
|
21
|
+
t.datetime "updated_at", :null => false
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
create_table "alchemy_cells", :force => true do |t|
|
|
25
|
+
t.integer "page_id"
|
|
26
|
+
t.string "name"
|
|
27
|
+
t.datetime "created_at", :null => false
|
|
28
|
+
t.datetime "updated_at", :null => false
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
create_table "alchemy_contents", :force => true do |t|
|
|
32
|
+
t.string "name"
|
|
33
|
+
t.string "essence_type"
|
|
34
|
+
t.integer "essence_id"
|
|
35
|
+
t.integer "element_id"
|
|
36
|
+
t.integer "position"
|
|
37
|
+
t.datetime "created_at", :null => false
|
|
38
|
+
t.datetime "updated_at", :null => false
|
|
39
|
+
t.integer "creator_id"
|
|
40
|
+
t.integer "updater_id"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
add_index "alchemy_contents", ["element_id", "position"], :name => "index_contents_on_element_id_and_position"
|
|
44
|
+
|
|
45
|
+
create_table "alchemy_elements", :force => true do |t|
|
|
46
|
+
t.string "name"
|
|
47
|
+
t.integer "position"
|
|
48
|
+
t.integer "page_id"
|
|
49
|
+
t.boolean "public", :default => true
|
|
50
|
+
t.boolean "folded", :default => false
|
|
51
|
+
t.boolean "unique", :default => false
|
|
52
|
+
t.datetime "created_at", :null => false
|
|
53
|
+
t.datetime "updated_at", :null => false
|
|
54
|
+
t.integer "creator_id"
|
|
55
|
+
t.integer "updater_id"
|
|
56
|
+
t.integer "cell_id"
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
add_index "alchemy_elements", ["page_id", "position"], :name => "index_elements_on_page_id_and_position"
|
|
60
|
+
|
|
61
|
+
create_table "alchemy_elements_alchemy_pages", :id => false, :force => true do |t|
|
|
62
|
+
t.integer "element_id"
|
|
63
|
+
t.integer "page_id"
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
create_table "alchemy_essence_audios", :force => true do |t|
|
|
67
|
+
t.integer "attachment_id"
|
|
68
|
+
t.integer "width", :default => 400
|
|
69
|
+
t.integer "height", :default => 300
|
|
70
|
+
t.boolean "show_eq", :default => true
|
|
71
|
+
t.boolean "show_navigation", :default => true
|
|
72
|
+
t.integer "creator_id"
|
|
73
|
+
t.integer "updater_id"
|
|
74
|
+
t.datetime "created_at", :null => false
|
|
75
|
+
t.datetime "updated_at", :null => false
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
create_table "alchemy_essence_booleans", :force => true do |t|
|
|
79
|
+
t.boolean "value"
|
|
80
|
+
t.datetime "created_at", :null => false
|
|
81
|
+
t.datetime "updated_at", :null => false
|
|
82
|
+
t.integer "creator_id"
|
|
83
|
+
t.integer "updater_id"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
add_index "alchemy_essence_booleans", ["value"], :name => "index_alchemy_essence_booleans_on_value"
|
|
87
|
+
|
|
88
|
+
create_table "alchemy_essence_dates", :force => true do |t|
|
|
89
|
+
t.datetime "date"
|
|
90
|
+
t.integer "creator_id"
|
|
91
|
+
t.integer "updater_id"
|
|
92
|
+
t.datetime "created_at", :null => false
|
|
93
|
+
t.datetime "updated_at", :null => false
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
create_table "alchemy_essence_files", :force => true do |t|
|
|
97
|
+
t.integer "attachment_id"
|
|
98
|
+
t.string "title"
|
|
99
|
+
t.string "css_class"
|
|
100
|
+
t.integer "creator_id"
|
|
101
|
+
t.integer "updater_id"
|
|
102
|
+
t.datetime "created_at", :null => false
|
|
103
|
+
t.datetime "updated_at", :null => false
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
create_table "alchemy_essence_flashes", :force => true do |t|
|
|
107
|
+
t.integer "attachment_id"
|
|
108
|
+
t.integer "width", :default => 400
|
|
109
|
+
t.integer "height", :default => 300
|
|
110
|
+
t.string "player_version", :default => "9.0.28"
|
|
111
|
+
t.integer "creator_id"
|
|
112
|
+
t.integer "updater_id"
|
|
113
|
+
t.datetime "created_at", :null => false
|
|
114
|
+
t.datetime "updated_at", :null => false
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
create_table "alchemy_essence_htmls", :force => true do |t|
|
|
118
|
+
t.text "source"
|
|
119
|
+
t.integer "creator_id"
|
|
120
|
+
t.integer "updater_id"
|
|
121
|
+
t.datetime "created_at", :null => false
|
|
122
|
+
t.datetime "updated_at", :null => false
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
create_table "alchemy_essence_pictures", :force => true do |t|
|
|
126
|
+
t.integer "picture_id"
|
|
127
|
+
t.string "caption"
|
|
128
|
+
t.string "title"
|
|
129
|
+
t.string "alt_tag"
|
|
130
|
+
t.string "link"
|
|
131
|
+
t.string "link_class_name"
|
|
132
|
+
t.string "link_title"
|
|
133
|
+
t.string "css_class"
|
|
134
|
+
t.string "link_target"
|
|
135
|
+
t.integer "creator_id"
|
|
136
|
+
t.integer "updater_id"
|
|
137
|
+
t.datetime "created_at", :null => false
|
|
138
|
+
t.datetime "updated_at", :null => false
|
|
139
|
+
t.string "crop_from"
|
|
140
|
+
t.string "crop_size"
|
|
141
|
+
t.string "render_size"
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
create_table "alchemy_essence_richtexts", :force => true do |t|
|
|
145
|
+
t.text "body"
|
|
146
|
+
t.text "stripped_body"
|
|
147
|
+
t.boolean "do_not_index", :default => false
|
|
148
|
+
t.boolean "public"
|
|
149
|
+
t.integer "creator_id"
|
|
150
|
+
t.integer "updater_id"
|
|
151
|
+
t.datetime "created_at", :null => false
|
|
152
|
+
t.datetime "updated_at", :null => false
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
create_table "alchemy_essence_selects", :force => true do |t|
|
|
156
|
+
t.string "value"
|
|
157
|
+
t.datetime "created_at", :null => false
|
|
158
|
+
t.datetime "updated_at", :null => false
|
|
159
|
+
t.integer "creator_id"
|
|
160
|
+
t.integer "updater_id"
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
add_index "alchemy_essence_selects", ["value"], :name => "index_alchemy_essence_selects_on_value"
|
|
164
|
+
|
|
165
|
+
create_table "alchemy_essence_texts", :force => true do |t|
|
|
166
|
+
t.text "body"
|
|
167
|
+
t.string "link"
|
|
168
|
+
t.string "link_title"
|
|
169
|
+
t.string "link_class_name"
|
|
170
|
+
t.boolean "public", :default => false
|
|
171
|
+
t.boolean "do_not_index", :default => false
|
|
172
|
+
t.string "link_target"
|
|
173
|
+
t.integer "creator_id"
|
|
174
|
+
t.integer "updater_id"
|
|
175
|
+
t.datetime "created_at", :null => false
|
|
176
|
+
t.datetime "updated_at", :null => false
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
create_table "alchemy_essence_videos", :force => true do |t|
|
|
180
|
+
t.integer "attachment_id"
|
|
181
|
+
t.integer "width"
|
|
182
|
+
t.integer "height"
|
|
183
|
+
t.boolean "allow_fullscreen", :default => true
|
|
184
|
+
t.boolean "auto_play", :default => false
|
|
185
|
+
t.boolean "show_navigation", :default => true
|
|
186
|
+
t.integer "creator_id"
|
|
187
|
+
t.integer "updater_id"
|
|
188
|
+
t.datetime "created_at", :null => false
|
|
189
|
+
t.datetime "updated_at", :null => false
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
create_table "alchemy_folded_pages", :force => true do |t|
|
|
193
|
+
t.integer "page_id"
|
|
194
|
+
t.integer "user_id"
|
|
195
|
+
t.boolean "folded", :default => false
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
create_table "alchemy_languages", :force => true do |t|
|
|
199
|
+
t.string "name"
|
|
200
|
+
t.string "language_code"
|
|
201
|
+
t.string "frontpage_name"
|
|
202
|
+
t.string "page_layout", :default => "intro"
|
|
203
|
+
t.boolean "public", :default => false
|
|
204
|
+
t.datetime "created_at", :null => false
|
|
205
|
+
t.datetime "updated_at", :null => false
|
|
206
|
+
t.integer "creator_id"
|
|
207
|
+
t.integer "updater_id"
|
|
208
|
+
t.boolean "default", :default => false
|
|
209
|
+
t.string "country_code", :default => "", :null => false
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
add_index "alchemy_languages", ["language_code", "country_code"], :name => "index_alchemy_languages_on_language_code_and_country_code"
|
|
213
|
+
add_index "alchemy_languages", ["language_code"], :name => "index_alchemy_languages_on_language_code"
|
|
214
|
+
|
|
215
|
+
create_table "alchemy_pages", :force => true do |t|
|
|
216
|
+
t.string "name"
|
|
217
|
+
t.string "urlname"
|
|
218
|
+
t.string "title"
|
|
219
|
+
t.string "language_code"
|
|
220
|
+
t.boolean "language_root"
|
|
221
|
+
t.string "page_layout"
|
|
222
|
+
t.text "meta_keywords"
|
|
223
|
+
t.text "meta_description"
|
|
224
|
+
t.integer "lft"
|
|
225
|
+
t.integer "rgt"
|
|
226
|
+
t.integer "parent_id"
|
|
227
|
+
t.integer "depth"
|
|
228
|
+
t.boolean "visible", :default => false
|
|
229
|
+
t.boolean "public", :default => false
|
|
230
|
+
t.boolean "locked", :default => false
|
|
231
|
+
t.integer "locked_by"
|
|
232
|
+
t.boolean "restricted", :default => false
|
|
233
|
+
t.boolean "robot_index", :default => true
|
|
234
|
+
t.boolean "robot_follow", :default => true
|
|
235
|
+
t.boolean "sitemap", :default => true
|
|
236
|
+
t.boolean "layoutpage", :default => false
|
|
237
|
+
t.datetime "created_at", :null => false
|
|
238
|
+
t.datetime "updated_at", :null => false
|
|
239
|
+
t.integer "creator_id"
|
|
240
|
+
t.integer "updater_id"
|
|
241
|
+
t.integer "language_id"
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
add_index "alchemy_pages", ["language_id"], :name => "index_pages_on_language_id"
|
|
245
|
+
add_index "alchemy_pages", ["parent_id", "lft"], :name => "index_pages_on_parent_id_and_lft"
|
|
246
|
+
add_index "alchemy_pages", ["urlname"], :name => "index_pages_on_urlname"
|
|
247
|
+
|
|
248
|
+
create_table "alchemy_pictures", :force => true do |t|
|
|
249
|
+
t.string "name"
|
|
250
|
+
t.string "image_filename"
|
|
251
|
+
t.integer "image_width"
|
|
252
|
+
t.integer "image_height"
|
|
253
|
+
t.datetime "created_at", :null => false
|
|
254
|
+
t.datetime "updated_at", :null => false
|
|
255
|
+
t.integer "creator_id"
|
|
256
|
+
t.integer "updater_id"
|
|
257
|
+
t.string "upload_hash"
|
|
258
|
+
t.string "cached_tag_list"
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
create_table "alchemy_users", :force => true do |t|
|
|
262
|
+
t.string "firstname"
|
|
263
|
+
t.string "lastname"
|
|
264
|
+
t.string "login"
|
|
265
|
+
t.string "email"
|
|
266
|
+
t.string "gender"
|
|
267
|
+
t.string "role", :default => "registered"
|
|
268
|
+
t.string "language"
|
|
269
|
+
t.string "crypted_password", :limit => 128, :default => "", :null => false
|
|
270
|
+
t.string "password_salt", :limit => 128, :default => "", :null => false
|
|
271
|
+
t.integer "login_count", :default => 0, :null => false
|
|
272
|
+
t.integer "failed_login_count", :default => 0, :null => false
|
|
273
|
+
t.datetime "last_request_at"
|
|
274
|
+
t.datetime "current_login_at"
|
|
275
|
+
t.datetime "last_login_at"
|
|
276
|
+
t.string "current_login_ip"
|
|
277
|
+
t.string "last_login_ip"
|
|
278
|
+
t.string "persistence_token", :null => false
|
|
279
|
+
t.string "single_access_token", :null => false
|
|
280
|
+
t.string "perishable_token", :null => false
|
|
281
|
+
t.datetime "created_at", :null => false
|
|
282
|
+
t.datetime "updated_at", :null => false
|
|
283
|
+
t.integer "creator_id"
|
|
284
|
+
t.integer "updater_id"
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
add_index "alchemy_users", ["perishable_token"], :name => "index_users_on_perishable_token"
|
|
288
|
+
|
|
289
|
+
# Skip migrations for acts-as-taggable-on, if the tables are already present
|
|
290
|
+
unless table_exists?(:taggings)
|
|
291
|
+
create_table "taggings", :force => true do |t|
|
|
292
|
+
t.integer "tag_id"
|
|
293
|
+
t.integer "taggable_id"
|
|
294
|
+
t.string "taggable_type"
|
|
295
|
+
t.integer "tagger_id"
|
|
296
|
+
t.string "tagger_type"
|
|
297
|
+
t.string "context"
|
|
298
|
+
t.datetime "created_at"
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id"
|
|
302
|
+
add_index "taggings", ["taggable_id", "taggable_type", "context"], :name => "index_taggings_on_taggable_id_and_taggable_type_and_context"
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
unless table_exists?(:tags)
|
|
306
|
+
create_table "tags", :force => true do |t|
|
|
307
|
+
t.string "name"
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
end
|
|
312
|
+
end
|
data/lib/alchemy/mount_point.rb
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
module Alchemy
|
|
2
2
|
|
|
3
3
|
# Returns alchemys mount point in current rails app.
|
|
4
|
-
|
|
4
|
+
# Pass false to not return a leading slash on empty mount point.
|
|
5
|
+
def self.mount_point(remove_leading_slash_if_blank = true)
|
|
5
6
|
alchemy_routes = Rails.application.routes.named_routes[:alchemy]
|
|
6
7
|
raise "Alchemy not mounted! Please mount Alchemy::Engine in your config/routes.rb file." if alchemy_routes.nil?
|
|
7
|
-
alchemy_routes.path.spec.to_s
|
|
8
|
+
mount_point = alchemy_routes.path.spec.to_s
|
|
9
|
+
if remove_leading_slash_if_blank && mount_point == "/"
|
|
10
|
+
mount_point.gsub(/^\/$/, '')
|
|
11
|
+
else
|
|
12
|
+
mount_point
|
|
13
|
+
end
|
|
8
14
|
end
|
|
9
15
|
|
|
10
|
-
end
|
|
16
|
+
end
|
data/lib/alchemy/page_layout.rb
CHANGED
|
@@ -1,96 +1,112 @@
|
|
|
1
1
|
module Alchemy
|
|
2
2
|
class PageLayout
|
|
3
|
+
class << self
|
|
3
4
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
return []
|
|
13
|
-
else
|
|
14
|
-
layout_description["elements"]
|
|
5
|
+
def element_names_for(page_layout)
|
|
6
|
+
layout_description = get(page_layout)
|
|
7
|
+
if layout_description.blank?
|
|
8
|
+
puts "\n+++ Warning: No Layout Description for #{page_layout} found! in page_layouts.yml\n"
|
|
9
|
+
return []
|
|
10
|
+
else
|
|
11
|
+
layout_description["elements"]
|
|
12
|
+
end
|
|
15
13
|
end
|
|
16
|
-
end
|
|
17
14
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
15
|
+
# Returns all layouts defined in +config/alchemy/page_layout.yml+.
|
|
16
|
+
def all
|
|
17
|
+
@@definitions ||= read_layouts_file
|
|
18
|
+
end
|
|
22
19
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
20
|
+
# Add additional pagelayout definitions. I.E. from your module.
|
|
21
|
+
# Call +Alchemy::PageLayout.add(your_layout_definition)+ in your engine.rb file.
|
|
22
|
+
# You can pass a single layout definition as Hash, or a collection of pagelayouts as Array.
|
|
23
|
+
# Example Pagelayout definitions can be found in the +page_layouts.yml+ from the standard set.
|
|
24
|
+
def add(page_layout)
|
|
25
|
+
all
|
|
26
|
+
if page_layout.is_a?(Array)
|
|
27
|
+
@@definitions += page_layout
|
|
28
|
+
elsif page_layout.is_a?(Hash)
|
|
29
|
+
@@definitions << page_layout
|
|
30
|
+
else
|
|
31
|
+
raise TypeError
|
|
32
|
+
end
|
|
35
33
|
end
|
|
36
|
-
end
|
|
37
34
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
35
|
+
# Returns the page_layout description found by name in page_layouts.yml
|
|
36
|
+
def get(name)
|
|
37
|
+
return {} if name.blank?
|
|
38
|
+
all.detect { |a| a["name"].downcase == name.downcase }
|
|
39
|
+
end
|
|
43
40
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
41
|
+
def get_all_by_attributes(attributes)
|
|
42
|
+
return [] if attributes.blank?
|
|
43
|
+
if attributes.class.name == 'Hash'
|
|
44
|
+
layouts = []
|
|
45
|
+
attributes.stringify_keys.each do |key, value|
|
|
46
|
+
result = all.select { |a| a[key].to_s.downcase == value.to_s.downcase if a.has_key?(key) }
|
|
47
|
+
layouts += result unless result.empty?
|
|
48
|
+
end
|
|
49
|
+
return layouts
|
|
50
|
+
else
|
|
51
|
+
return []
|
|
51
52
|
end
|
|
52
|
-
return layouts
|
|
53
|
-
else
|
|
54
|
-
return []
|
|
55
53
|
end
|
|
56
|
-
end
|
|
57
54
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
selectable_layouts(language_id, layoutpage).each do |layout|
|
|
62
|
-
display_name = Alchemy::I18n.t("page_layout_names.#{layout['name']}", :default => layout['name'].camelize)
|
|
63
|
-
layouts_for_select << [display_name, layout["name"]]
|
|
55
|
+
# Returns page layouts ready for Rails' select form helper.
|
|
56
|
+
def layouts_for_select(language_id, layoutpage = false)
|
|
57
|
+
map_layouts(selectable_layouts(language_id, layoutpage), [[I18n.t("Please choose"), ""]])
|
|
64
58
|
end
|
|
65
|
-
layouts_for_select
|
|
66
|
-
end
|
|
67
59
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
if layoutpage
|
|
73
|
-
layout["layoutpage"] == true && !used
|
|
60
|
+
def layouts_with_own_for_select(own_layout, language_id, layoutpage)
|
|
61
|
+
layouts = selectable_layouts(language_id, layoutpage)
|
|
62
|
+
if layouts.detect { |l| l['name'] == own_layout } == nil
|
|
63
|
+
map_array = [[I18n.t(own_layout, :scope => 'page_layout_names'), own_layout]]
|
|
74
64
|
else
|
|
75
|
-
|
|
65
|
+
map_array = []
|
|
76
66
|
end
|
|
67
|
+
map_layouts(layouts, map_array)
|
|
77
68
|
end
|
|
78
|
-
end
|
|
79
69
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
70
|
+
# Maps given layouts for Rails select form helper.
|
|
71
|
+
def map_layouts(layouts, map_array = [])
|
|
72
|
+
layouts.each do |layout|
|
|
73
|
+
map_array << [
|
|
74
|
+
I18n.t(layout['name'], :scope => 'page_layout_names'),
|
|
75
|
+
layout["name"]
|
|
76
|
+
]
|
|
77
|
+
end
|
|
78
|
+
map_array
|
|
79
|
+
end
|
|
83
80
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
81
|
+
def selectable_layouts(language_id, layoutpage = false)
|
|
82
|
+
all.select do |layout|
|
|
83
|
+
next if layout["hide"]
|
|
84
|
+
used = layout["unique"] && has_a_page_this_layout?(layout["name"], language_id)
|
|
85
|
+
if layoutpage
|
|
86
|
+
layout["layoutpage"] == true && !used
|
|
87
|
+
else
|
|
88
|
+
layout["layoutpage"] != true && !used
|
|
89
|
+
end
|
|
90
|
+
end
|
|
90
91
|
end
|
|
91
|
-
# Since YAML returns false for an empty file, we have to normalize it here.
|
|
92
|
-
layouts || []
|
|
93
|
-
end
|
|
94
92
|
|
|
93
|
+
def has_a_page_this_layout?(layout, language_id)
|
|
94
|
+
Page.where({:page_layout => layout, :language_id => language_id}).any?
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
private
|
|
98
|
+
|
|
99
|
+
# Reads the layout definitions from +config/alchemy/page_layouts.yml+.
|
|
100
|
+
def read_layouts_file
|
|
101
|
+
if File.exists? "#{Rails.root}/config/alchemy/page_layouts.yml"
|
|
102
|
+
layouts = YAML.load_file "#{Rails.root}/config/alchemy/page_layouts.yml"
|
|
103
|
+
else
|
|
104
|
+
raise LoadError, "Could not find page_layouts.yml file! Please run: rails generate alchemy:scaffold"
|
|
105
|
+
end
|
|
106
|
+
# Since YAML returns false for an empty file, we have to normalize it here.
|
|
107
|
+
layouts || []
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
end
|
|
95
111
|
end
|
|
96
112
|
end
|