alchemy_cms 2.4.rc2 → 2.4.rc4
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -1
- data/.travis.yml +7 -4
- data/README.md +1 -0
- data/alchemy_cms.gemspec +19 -1
- data/app/assets/javascripts/alchemy/alchemy.dragndrop.js +5 -2
- data/app/assets/javascripts/alchemy/alchemy.link_overlay.js.coffee +1 -1
- data/app/assets/javascripts/alchemy/alchemy.preview_window.js +4 -21
- data/app/assets/javascripts/alchemy/alchemy.windows.js +0 -1
- data/app/assets/stylesheets/alchemy/base.scss +4 -0
- data/app/assets/stylesheets/alchemy/elements.scss +59 -60
- data/app/assets/stylesheets/alchemy/flash.scss +3 -3
- data/app/assets/stylesheets/alchemy/form_elements.scss +15 -2
- data/app/assets/stylesheets/alchemy/jquery-ui.scss +11 -3
- data/app/assets/stylesheets/alchemy/mixins.scss +9 -0
- data/app/assets/stylesheets/alchemy/tinymce_content.css.scss +1 -1
- data/app/assets/stylesheets/alchemy/tinymce_dialog.css.scss +4 -0
- data/app/assets/stylesheets/alchemy/variables.scss +5 -1
- data/app/controllers/alchemy/admin/base_controller.rb +18 -3
- data/app/controllers/alchemy/admin/elements_controller.rb +4 -7
- data/app/controllers/alchemy/admin/pages_controller.rb +3 -4
- data/app/controllers/alchemy/admin/resources_controller.rb +1 -18
- data/app/controllers/alchemy/admin/users_controller.rb +8 -5
- data/app/helpers/alchemy/admin/pages_helper.rb +6 -1
- data/app/models/alchemy/content.rb +26 -5
- data/app/models/alchemy/element.rb +1 -0
- data/app/models/alchemy/essence_richtext.rb +1 -1
- data/app/models/alchemy/page.rb +131 -88
- data/app/views/alchemy/admin/clipboard/insert.js.erb +1 -1
- data/app/views/alchemy/admin/elements/create.js.erb +6 -1
- data/app/views/alchemy/admin/elements/trash.js.erb +1 -3
- data/app/views/alchemy/admin/resources/_form.html.erb +13 -1
- data/app/views/alchemy/admin/trash/index.html.erb +1 -1
- data/app/views/alchemy/base/remote_errors.js.erb +5 -1
- data/app/views/alchemy/essences/_essence_link_view.html.erb +2 -0
- data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +1 -1
- data/config/locales/alchemy.de.yml +11 -4
- data/lib/alchemy/capistrano.rb +59 -1
- data/lib/alchemy/essence.rb +1 -0
- data/lib/alchemy/seeder.rb +39 -49
- data/lib/alchemy/tinymce.rb +1 -1
- data/lib/alchemy/version.rb +1 -1
- data/lib/rails/generators/alchemy/deploy_script/deploy_script_generator.rb +1 -1
- data/lib/rails/generators/alchemy/deploy_script/templates/deploy.rb.tt +3 -0
- data/lib/rails/generators/alchemy/elements/templates/view.html.haml +2 -2
- data/lib/rails/generators/alchemy/elements/templates/view.html.slim +2 -2
- data/lib/tasks/database.rake +25 -0
- data/lib/tasks/install.rake +5 -14
- data/spec/factories.rb +10 -0
- data/spec/integration/admin/resources_integration_spec.rb +64 -23
- data/spec/integration/pages_controller_spec.rb +0 -2
- data/spec/libraries/resources_helper_spec.rb +6 -2
- data/spec/models/content_spec.rb +31 -0
- data/spec/models/element_spec.rb +7 -2
- data/spec/models/page_spec.rb +36 -0
- data/vendor/assets/javascripts/jquery_plugins/jquery.dialogextend.1_0_1.js +676 -0
- data/vendor/assets/javascripts/jquery_plugins/jquery.ui.tabspaging.js +298 -238
- data/vendor/assets/javascripts/tiny_mce/langs/de.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/langs/en.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/license.txt +6 -6
- data/vendor/assets/javascripts/tiny_mce/plugins/fullscreen/editor_plugin.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/plugins/fullscreen/fullscreen.htm +97 -97
- data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/template.htm +376 -386
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/editor_plugin.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pastetext.js +30 -30
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pasteword.js +45 -45
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/langs/de_dlg.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/pastetext.htm +17 -20
- data/vendor/assets/javascripts/tiny_mce/plugins/paste/pasteword.htm +12 -12
- data/vendor/assets/javascripts/tiny_mce/plugins/table/cell.htm +173 -183
- data/vendor/assets/javascripts/tiny_mce/plugins/table/css/cell.css +4 -4
- data/vendor/assets/javascripts/tiny_mce/plugins/table/css/row.css +7 -7
- data/vendor/assets/javascripts/tiny_mce/plugins/table/css/table.css +3 -3
- data/vendor/assets/javascripts/tiny_mce/plugins/table/editor_plugin.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/plugins/table/js/cell.js +280 -282
- data/vendor/assets/javascripts/tiny_mce/plugins/table/js/merge_cells.js +15 -15
- data/vendor/assets/javascripts/tiny_mce/plugins/table/js/row.js +221 -204
- data/vendor/assets/javascripts/tiny_mce/plugins/table/js/table.js +448 -435
- data/vendor/assets/javascripts/tiny_mce/plugins/table/langs/de_dlg.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/plugins/table/merge_cells.htm +22 -24
- data/vendor/assets/javascripts/tiny_mce/plugins/table/row.htm +136 -144
- data/vendor/assets/javascripts/tiny_mce/plugins/table/table.htm +168 -184
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/about.htm +46 -62
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/anchor.htm +16 -17
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/charmap.htm +47 -56
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/color_picker.htm +52 -69
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/editor_template.js +1 -852
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/image.htm +69 -79
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/icons.gif +0 -0
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/about.js +48 -48
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/anchor.js +50 -37
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/charmap.js +317 -317
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/color_picker.js +345 -331
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/image.js +248 -246
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/link.js +152 -146
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/source_editor.js +53 -31
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/de.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/de_dlg.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en_dlg.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/link.htm +46 -53
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/shortcuts.htm +45 -57
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/content.css +47 -182
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/dialog.css +93 -399
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/ui.css +191 -890
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/content.css +24 -102
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +79 -377
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css +80 -451
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/content.css +45 -167
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css +93 -399
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui.css +194 -889
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +7 -33
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +4 -15
- data/vendor/assets/javascripts/tiny_mce/themes/advanced/source_editor.htm +16 -19
- data/vendor/assets/javascripts/tiny_mce/tiny_mce.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/tiny_mce_popup.js +1 -1
- data/vendor/assets/javascripts/tiny_mce/utils/editable_selects.js +46 -46
- data/vendor/assets/javascripts/tiny_mce/utils/form_utils.js +124 -124
- data/vendor/assets/javascripts/tiny_mce/utils/mctabs.js +112 -112
- data/vendor/assets/javascripts/tiny_mce/utils/validate.js +213 -213
- metadata +11 -6
- data/spec/dummy/public/404.html.bak +0 -26
- data/vendor/assets/javascripts/jquery_plugins/jquery.dialogextend.min.js +0 -8
@@ -3,7 +3,7 @@
|
|
3
3
|
<%- if params[:remove] -%>
|
4
4
|
$(".element_editor[data-element-id='<%= @item.id -%>']").remove();
|
5
5
|
<%- if @item.class.to_s == 'Element' -%>
|
6
|
-
$('#element_area').sortable('refresh');
|
6
|
+
$('#element_area .sortable_cell').sortable('refresh');
|
7
7
|
<%- end -%>
|
8
8
|
Alchemy.growl('<%= escape_javascript t("item moved to clipboard", :name => @item.class.to_s == "Alchemy::Element" ? @item.display_name_with_preview_text : @item.name) -%>');
|
9
9
|
<%- else -%>
|
@@ -18,7 +18,12 @@ $element_area.prepend(element_html);
|
|
18
18
|
$element_area.append(element_html);
|
19
19
|
<% end %>
|
20
20
|
|
21
|
-
$element_area.
|
21
|
+
if ($element_area.find('.element_editor').length > 0) {
|
22
|
+
Alchemy.SortableElements(<%= @page.id %>, '<%= form_authenticity_token %>', $element_area);
|
23
|
+
} else {
|
24
|
+
$element_area.sortable('refresh');
|
25
|
+
}
|
26
|
+
|
22
27
|
Alchemy.growl('<%= t("successfully_added_element") -%>');
|
23
28
|
Alchemy.closeCurrentWindow();
|
24
29
|
|
@@ -1,14 +1,12 @@
|
|
1
1
|
$('#element_<%= @element.id %>').hide(200, function() {
|
2
2
|
$(this).remove();
|
3
3
|
Alchemy.growl('<%= escape_javascript(t("Element trashed")) %>');
|
4
|
-
$('#element_area').sortable('refresh');
|
4
|
+
$('#element_area .sortable_cell').sortable('refresh');
|
5
5
|
Alchemy.refreshTrashWindow(<%= @page.id %>);
|
6
6
|
$('#element_trash_button .icon').addClass('full');
|
7
7
|
Alchemy.PreviewWindow.refresh();
|
8
|
-
|
9
8
|
<% @element.contents.essence_richtexts.each do |content| %>
|
10
9
|
tinymce.get('contents_content_<%= content.id %>_body').remove();
|
11
10
|
<% end %>
|
12
|
-
|
13
11
|
<%=raw update_elements_with_essence_selects(@page, @element) %>
|
14
12
|
});
|
@@ -1,5 +1,13 @@
|
|
1
1
|
<%= form_for resource_instance_variable, :url => resource_path(resource_instance_variable), :remote => true do |f| %>
|
2
|
-
|
2
|
+
<% if resource_instance_variable.errors.any? %>
|
3
|
+
<div id="errors">
|
4
|
+
<ul>
|
5
|
+
<% resource_instance_variable.errors.full_messages.each do |error| %>
|
6
|
+
<li><%= error %></li>
|
7
|
+
<% end %>
|
8
|
+
</ul>
|
9
|
+
</div>
|
10
|
+
<% end %>
|
3
11
|
<table>
|
4
12
|
<%- resource_handler.attributes.each do |attribute| -%>
|
5
13
|
<tr>
|
@@ -10,7 +18,11 @@
|
|
10
18
|
<%= f.send :label, attribute[:name] %>
|
11
19
|
</td>
|
12
20
|
<%- elsif attribute[:type] == :text -%>
|
21
|
+
<td class="label"><%= f.send :label, attribute[:name] %></td>
|
13
22
|
<td class="input"><%= f.send :text_area, attribute[:name] -%></td>
|
23
|
+
<%- elsif attribute[:type] == :datetime -%>
|
24
|
+
<td class="label"><%= f.send :label, attribute[:name] %></td>
|
25
|
+
<td class="input"><%= f.send :text_field, attribute[:name], :type => :date -%></td>
|
14
26
|
<%- else -%>
|
15
27
|
<td class="label"><%= f.send :label, attribute[:name] %></td>
|
16
28
|
|
@@ -11,7 +11,7 @@
|
|
11
11
|
</div>
|
12
12
|
<div id="trash_items">
|
13
13
|
<%- @elements.each do |element| -%>
|
14
|
-
<%= render :partial => 'alchemy/admin/elements/element', :object => element, :locals => {:draggable => !@allowed_elements.detect { |e| e['name'] == element.name }.nil? } %>
|
14
|
+
<%= render :partial => 'alchemy/admin/elements/element', :object => element, :locals => {:draggable => !@allowed_elements.detect { |e| e['name'] == element.name }.nil? } rescue "" %>
|
15
15
|
<%- end -%>
|
16
16
|
</div>
|
17
17
|
<p>
|
@@ -1,2 +1,6 @@
|
|
1
|
-
|
1
|
+
$('<%= @error_div_id %>').html('<%= escape_javascript(@errors) %>').show();
|
2
|
+
$('label, input, select').removeClass('with_error');
|
3
|
+
<% @error_fields.each do |field| %>
|
4
|
+
$('label[for="<%= field %>"], input#<%= field %>, #<%= field %>SelectBoxIt').addClass('with_error');
|
5
|
+
<% end %>
|
2
6
|
Alchemy.Buttons.enable();
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<% cache(content) do -%>
|
2
2
|
<div class="content_editor content_rtf_editor" id="<%= content_dom_id(content) %>">
|
3
3
|
<%= label_and_remove_link(content) %>
|
4
|
-
<div
|
4
|
+
<div class="tinymce_container">
|
5
5
|
<% if content.has_custom_tinymce_config? && content.settings[:tinymce] -%>
|
6
6
|
<div class="essence_richtext_loader">
|
7
7
|
<%= image_tag('alchemy/ajax_loader.gif') %>
|
@@ -84,6 +84,10 @@ de:
|
|
84
84
|
blank: '%{field} darf nicht leer sein.'
|
85
85
|
wrong_format: '%{field} hat das falsche Format.'
|
86
86
|
|
87
|
+
default_content_texts:
|
88
|
+
lorem: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
|
89
|
+
corporate_lorem: "Appropriately enable sustainable growth strategies vis-a-vis holistic materials. Energistically orchestrate open-source e-tailers vis-a-vis plug-and-play best practices. Uniquely plagiarize client-centric opportunities whereas plug-and-play ideas. Distinctively reconceptualize backward-compatible partnerships vis-a-vis reliable total linkage. Interactively fabricate highly efficient networks for clicks-and-mortar content. Collaboratively reconceptualize holistic markets via 2.0 architectures."
|
90
|
+
|
87
91
|
essence_pictures:
|
88
92
|
css_classes:
|
89
93
|
left: 'Links vom Text'
|
@@ -751,6 +755,12 @@ de:
|
|
751
755
|
too_short: "^Der URL-Name der Seite ist zu kurz (min. 3 Zeichen)"
|
752
756
|
taken: "^Der URL-Name ist bereits vergeben."
|
753
757
|
exclusion: "^Der URL-Name der Seite kann nicht benutzt werden."
|
758
|
+
alchemy/user:
|
759
|
+
attributes:
|
760
|
+
login:
|
761
|
+
invalid: "darf nur aus Buchstaben, Zahlen, Leerzeichen und .-_@ bestehen."
|
762
|
+
email:
|
763
|
+
invalid: "entspricht nicht dem Format einer E-Mail-Adresse."
|
754
764
|
|
755
765
|
activemodel:
|
756
766
|
|
@@ -881,7 +891,7 @@ de:
|
|
881
891
|
tag_list: Schlagworte
|
882
892
|
|
883
893
|
alchemy/user:
|
884
|
-
email: "
|
894
|
+
email: "E-Mail"
|
885
895
|
firstname: "Vorname"
|
886
896
|
gender: "Anrede"
|
887
897
|
language: "Sprache"
|
@@ -905,15 +915,12 @@ de:
|
|
905
915
|
login_not_found: "^Dieser Benutzername existiert nicht."
|
906
916
|
general_credentials_error: "Die Kombination aus Benutzername und Passwort ist nicht gültig."
|
907
917
|
consecutive_failed_logins_limit_exceeded: "Zu viele Fehlversuche! Dieser Account ist aus Sicherheitsgründen gesperrt worden. Bitte wenden Sie sich an den Administrator."
|
908
|
-
email_invalid: "Die Email-Adresse entspricht nicht dem Format einer Email-Adresse."
|
909
918
|
password_blank: "^Bitte ein Passwort angegeben."
|
910
919
|
password_invalid: "^Das Passwort ist nicht richtig."
|
911
920
|
not_active: "Dieser Account wurde noch nicht aktiviert."
|
912
921
|
not_confirmed: "Dieser Account wurde noch nicht bestätigt."
|
913
922
|
not_approved: "Dieser Account wurde noch nicht freigeschaltet."
|
914
923
|
no_authentication_details: 'Sie haben keinen Benutzernamen und/oder Passwort eingegeben.'
|
915
|
-
login_not_valid: "^Der Benutzername darf nur aus Buchstaben, Zahlen, Leerzeichen und .-_@ bestehen."
|
916
|
-
login_too_short: "^Der Benutzername ist zu kurz. Bitte mindestens 3 Zeichen verwenden."
|
917
924
|
|
918
925
|
models:
|
919
926
|
alchemy/user_session: 'Sitzung'
|
data/lib/alchemy/capistrano.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# This recipe contains Capistrano recipes for handling the uploads, ferret index and picture cache files while deploying your application.
|
2
2
|
# It also contains a ferret:rebuild_index task to rebuild the index after deploying your application.
|
3
|
-
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
::Capistrano::Configuration.instance(:must_exist).load do
|
4
6
|
|
5
7
|
after "deploy:setup", "alchemy:shared_folders:create"
|
6
8
|
after "deploy:finalize_update", "alchemy:shared_folders:symlink"
|
@@ -81,6 +83,62 @@ EOF
|
|
81
83
|
|
82
84
|
end
|
83
85
|
|
86
|
+
namespace :import do
|
87
|
+
|
88
|
+
desc "Imports all data (Pictures, attachments and the database) into your local development machine."
|
89
|
+
task :all, :roles => [:app, :db] do
|
90
|
+
pictures
|
91
|
+
attachments
|
92
|
+
database
|
93
|
+
end
|
94
|
+
|
95
|
+
desc "Imports the database into your local development machine."
|
96
|
+
task :database, :roles => [:db] do
|
97
|
+
filename = "#{fetch(:application, 'dump')}-#{timestamp}.sql"
|
98
|
+
run "cd #{current_path} && RAILS_ENV=#{fetch(:rails_env, 'production')} DUMP_FILENAME=#{filename} #{rake} alchemy:db:dump"
|
99
|
+
FileUtils.mkdir_p "./db/dumps"
|
100
|
+
download "#{current_path}/db/dumps/#{filename}", "db/dumps/#{filename}"
|
101
|
+
run_locally "mysql -u#{database_config['username']}#{database_config['password'] ? ' -p"' + database_config['password'] + '"' : nil} #{database_config['database']} < ./db/dumps/#{filename}"
|
102
|
+
end
|
103
|
+
|
104
|
+
desc "Imports attachments into your local machine."
|
105
|
+
task :attachments, :roles => [:app] do
|
106
|
+
filename = zip_files('attachments')
|
107
|
+
FileUtils.mkdir_p "./uploads"
|
108
|
+
download "#{shared_path}/uploads/#{filename}", "./uploads/#{filename}"
|
109
|
+
unzip_files('attachments', filename)
|
110
|
+
end
|
111
|
+
|
112
|
+
desc "Imports pictures into your local machine."
|
113
|
+
task :pictures, :roles => [:app] do
|
114
|
+
filename = zip_files('pictures')
|
115
|
+
FileUtils.mkdir_p "./uploads"
|
116
|
+
download "#{shared_path}/uploads/#{filename}", "./uploads/#{filename}"
|
117
|
+
unzip_files('pictures', filename)
|
118
|
+
end
|
119
|
+
|
120
|
+
def zip_files(type)
|
121
|
+
filename = "#{type}-#{timestamp}.tar.gz"
|
122
|
+
run "cd #{shared_path}/uploads && tar cvfz #{filename} #{type}/"
|
123
|
+
filename
|
124
|
+
end
|
125
|
+
|
126
|
+
def timestamp
|
127
|
+
timestamp ||= Time.now.strftime('%Y-%m-%d-%H-%M')
|
128
|
+
end
|
129
|
+
|
130
|
+
def unzip_files(type, filename)
|
131
|
+
FileUtils.rm_rf "./uploads/#{type}"
|
132
|
+
run_locally "cd ./uploads && tar xvzf #{filename}"
|
133
|
+
end
|
134
|
+
|
135
|
+
def database_config
|
136
|
+
raise "database.yml not found!" if !File.exists?("./config/database.yml")
|
137
|
+
YAML.load_file("./config/database.yml")['development']
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|
141
|
+
|
84
142
|
end
|
85
143
|
|
86
144
|
namespace :ferret do
|
data/lib/alchemy/essence.rb
CHANGED
data/lib/alchemy/seeder.rb
CHANGED
@@ -8,55 +8,8 @@ module Alchemy
|
|
8
8
|
# This seed builds the necessary page structure for alchemy in your database.
|
9
9
|
# Run the alchemy:db:seed rake task to seed your database.
|
10
10
|
def seed!
|
11
|
-
|
12
|
-
|
13
|
-
notices = []
|
14
|
-
|
15
|
-
default_language = Alchemy::Config.get(:default_language)
|
16
|
-
|
17
|
-
lang = Alchemy::Language.find_or_initialize_by_language_code(
|
18
|
-
:name => default_language['name'],
|
19
|
-
:language_code => default_language['code'],
|
20
|
-
:frontpage_name => default_language['frontpage_name'],
|
21
|
-
:page_layout => default_language['page_layout'],
|
22
|
-
:public => true,
|
23
|
-
:default => true
|
24
|
-
)
|
25
|
-
if lang.new_record?
|
26
|
-
if lang.save
|
27
|
-
log "Created language #{lang.name}."
|
28
|
-
else
|
29
|
-
errors << "Errors while creating language #{lang.name}: #{lang.errors.full_messages}"
|
30
|
-
end
|
31
|
-
else
|
32
|
-
notices << "Language #{lang.name} was already present."
|
33
|
-
end
|
34
|
-
|
35
|
-
root = Alchemy::Page.find_or_initialize_by_name(
|
36
|
-
:name => 'Root',
|
37
|
-
:do_not_sweep => true
|
38
|
-
)
|
39
|
-
if root.new_record?
|
40
|
-
if root.save
|
41
|
-
log "Created page #{root.name}."
|
42
|
-
else
|
43
|
-
errors << "Errors while creating page #{root.name}: #{root.errors.full_messages}"
|
44
|
-
end
|
45
|
-
else
|
46
|
-
notices << "Page #{root.name} was already present."
|
47
|
-
end
|
48
|
-
|
49
|
-
if errors.blank?
|
50
|
-
log "Successfully seeded your database!\n" if notices.blank?
|
51
|
-
notices.each do |note|
|
52
|
-
log(note, :skip)
|
53
|
-
end
|
54
|
-
else
|
55
|
-
log("Some pages could not be created:", :error)
|
56
|
-
errors.each do |error|
|
57
|
-
log(error, :error)
|
58
|
-
end
|
59
|
-
end
|
11
|
+
create_default_language
|
12
|
+
create_root_page
|
60
13
|
end
|
61
14
|
|
62
15
|
private
|
@@ -119,6 +72,43 @@ module Alchemy
|
|
119
72
|
end
|
120
73
|
end
|
121
74
|
|
75
|
+
protected
|
76
|
+
|
77
|
+
def create_default_language
|
78
|
+
desc "Creating default language"
|
79
|
+
default_language = Alchemy::Config.get(:default_language)
|
80
|
+
lang = Alchemy::Language.find_or_initialize_by_language_code(
|
81
|
+
:name => default_language['name'],
|
82
|
+
:language_code => default_language['code'],
|
83
|
+
:frontpage_name => default_language['frontpage_name'],
|
84
|
+
:page_layout => default_language['page_layout'],
|
85
|
+
:public => true,
|
86
|
+
:default => true
|
87
|
+
)
|
88
|
+
if lang.new_record?
|
89
|
+
if lang.save!
|
90
|
+
log "Created language #{lang.name}."
|
91
|
+
end
|
92
|
+
else
|
93
|
+
log "Language #{lang.name} was already present.", :skip
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def create_root_page
|
98
|
+
desc "Creating root page"
|
99
|
+
root = Alchemy::Page.find_or_initialize_by_name(
|
100
|
+
:name => 'Root',
|
101
|
+
:do_not_sweep => true
|
102
|
+
)
|
103
|
+
if root.new_record?
|
104
|
+
if root.save!
|
105
|
+
log "Created page #{root.name}."
|
106
|
+
end
|
107
|
+
else
|
108
|
+
log "Page #{root.name} was already present.", :skip
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
122
112
|
end
|
123
113
|
|
124
114
|
end
|
data/lib/alchemy/tinymce.rb
CHANGED
data/lib/alchemy/version.rb
CHANGED
@@ -12,7 +12,7 @@ module Alchemy
|
|
12
12
|
def copy_script
|
13
13
|
@scm = options[:scm]
|
14
14
|
@database_type = options[:db]
|
15
|
-
|
15
|
+
@app_name = ask('Please enter a name for your application:')
|
16
16
|
@server = ask('Please enter server ip or domain:')
|
17
17
|
if @store_credentials = yes?('Do want to store the ssh credentials? (PLEASE DO NOT STORE THEM IF THE REPOSITORY IS PUBLIC) (y/N)')
|
18
18
|
ask_for_credentials
|
@@ -2,6 +2,9 @@ require 'bundler/capistrano'
|
|
2
2
|
require 'alchemy/capistrano'
|
3
3
|
load 'deploy/assets'
|
4
4
|
|
5
|
+
# application name
|
6
|
+
set :application, "<%= @app_name %>"
|
7
|
+
|
5
8
|
# ssh settings
|
6
9
|
<%- if @ssh_user.blank? || !@store_credentials -%>
|
7
10
|
set(:user) { Capistrano::CLI.ui.ask('Enter your ssh username: ') }
|
@@ -2,8 +2,8 @@
|
|
2
2
|
<%- if @element["picture_gallery"] -%>
|
3
3
|
.<%= @element_name %>_images
|
4
4
|
- element.contents.gallery_pictures.each do |image|
|
5
|
-
|
6
|
-
|
5
|
+
.<%= @element_name %>_image{class: image.essence.css_class}
|
6
|
+
= render_essence_view(image, :image_size => "160x120")
|
7
7
|
<%- end -%>
|
8
8
|
<%- @contents.each do |content| -%>
|
9
9
|
<%- if @contents.length > 1 -%>
|
@@ -2,8 +2,8 @@
|
|
2
2
|
<%- if @element["picture_gallery"] -%>
|
3
3
|
.<%= @element_name %>_images
|
4
4
|
- element.contents.gallery_pictures.each do |image|
|
5
|
-
|
6
|
-
|
5
|
+
.<%= @element_name %>_image class=image.essence.css_class
|
6
|
+
= render_essence_view(image, :image_size => "160x120")
|
7
7
|
<%- end -%>
|
8
8
|
<%- @contents.each do |content| -%>
|
9
9
|
<%- if @contents.length > 1 -%>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
namespace :alchemy do
|
2
|
+
namespace :db do
|
3
|
+
|
4
|
+
desc "Seeds your database with essential data for Alchemy CMS."
|
5
|
+
task :seed => :environment do
|
6
|
+
Alchemy::Seeder.seed!
|
7
|
+
end
|
8
|
+
|
9
|
+
desc "Dumps the database into 'db/dumps'"
|
10
|
+
task :dump => :environment do
|
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
|
+
FileUtils.mkdir_p(Rails.root.join('db/dumps'))
|
14
|
+
`mysqldump -u#{db_conf['username']}#{db_conf['password'].present? ? " -p'#{db_conf['password']}'" : nil} #{db_conf['database']} > #{Rails.root.join('db/dumps', dump_name)}`
|
15
|
+
end
|
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"
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
data/lib/tasks/install.rake
CHANGED
@@ -7,10 +7,10 @@ class Alchemy::RoutesInjector < Thor
|
|
7
7
|
|
8
8
|
no_tasks do
|
9
9
|
def inject
|
10
|
-
mountpoint = ask "\nWhere do you want to mount Alchemy CMS? (/)"
|
11
|
-
mountpoint = "/" if mountpoint.empty?
|
10
|
+
@mountpoint = ask "\nWhere do you want to mount Alchemy CMS? (/)"
|
11
|
+
@mountpoint = "/" if @mountpoint.empty?
|
12
12
|
sentinel = /\.routes\.draw do(?:\s*\|map\|)?\s*$/
|
13
|
-
inject_into_file "./config/routes.rb", "\n mount Alchemy::Engine => '#{mountpoint}'\n", { :after => sentinel, :verbose => true }
|
13
|
+
inject_into_file "./config/routes.rb", "\n mount Alchemy::Engine => '#{@mountpoint}'\n", { :after => sentinel, :verbose => true }
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -36,13 +36,13 @@ Now:
|
|
36
36
|
|
37
37
|
2. Open your browser and enter the following URL:
|
38
38
|
|
39
|
-
http://localhost:3000/admin/signup
|
39
|
+
http://localhost:3000/#{@mountpoint == '/' ? '' : @mountpoint}/admin/signup
|
40
40
|
|
41
41
|
3. Follow the instructions to complete the installation!
|
42
42
|
|
43
43
|
Thank you for using Alchemy CMS!
|
44
44
|
|
45
|
-
http://alchemy-cms.com
|
45
|
+
http://alchemy-cms.com/
|
46
46
|
|
47
47
|
EOF
|
48
48
|
end
|
@@ -52,15 +52,6 @@ EOF
|
|
52
52
|
Alchemy::RoutesInjector.new.inject
|
53
53
|
end
|
54
54
|
|
55
|
-
namespace :db do
|
56
|
-
|
57
|
-
desc "Seeds your database with essential data for Alchemy CMS."
|
58
|
-
task :seed => :environment do
|
59
|
-
Alchemy::Seeder.seed!
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
63
|
-
|
64
55
|
namespace :standard_set do
|
65
56
|
|
66
57
|
desc "Install Alchemy CMS's standard set."
|