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.
Files changed (122) hide show
  1. data/.gitignore +2 -1
  2. data/.travis.yml +7 -4
  3. data/README.md +1 -0
  4. data/alchemy_cms.gemspec +19 -1
  5. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js +5 -2
  6. data/app/assets/javascripts/alchemy/alchemy.link_overlay.js.coffee +1 -1
  7. data/app/assets/javascripts/alchemy/alchemy.preview_window.js +4 -21
  8. data/app/assets/javascripts/alchemy/alchemy.windows.js +0 -1
  9. data/app/assets/stylesheets/alchemy/base.scss +4 -0
  10. data/app/assets/stylesheets/alchemy/elements.scss +59 -60
  11. data/app/assets/stylesheets/alchemy/flash.scss +3 -3
  12. data/app/assets/stylesheets/alchemy/form_elements.scss +15 -2
  13. data/app/assets/stylesheets/alchemy/jquery-ui.scss +11 -3
  14. data/app/assets/stylesheets/alchemy/mixins.scss +9 -0
  15. data/app/assets/stylesheets/alchemy/tinymce_content.css.scss +1 -1
  16. data/app/assets/stylesheets/alchemy/tinymce_dialog.css.scss +4 -0
  17. data/app/assets/stylesheets/alchemy/variables.scss +5 -1
  18. data/app/controllers/alchemy/admin/base_controller.rb +18 -3
  19. data/app/controllers/alchemy/admin/elements_controller.rb +4 -7
  20. data/app/controllers/alchemy/admin/pages_controller.rb +3 -4
  21. data/app/controllers/alchemy/admin/resources_controller.rb +1 -18
  22. data/app/controllers/alchemy/admin/users_controller.rb +8 -5
  23. data/app/helpers/alchemy/admin/pages_helper.rb +6 -1
  24. data/app/models/alchemy/content.rb +26 -5
  25. data/app/models/alchemy/element.rb +1 -0
  26. data/app/models/alchemy/essence_richtext.rb +1 -1
  27. data/app/models/alchemy/page.rb +131 -88
  28. data/app/views/alchemy/admin/clipboard/insert.js.erb +1 -1
  29. data/app/views/alchemy/admin/elements/create.js.erb +6 -1
  30. data/app/views/alchemy/admin/elements/trash.js.erb +1 -3
  31. data/app/views/alchemy/admin/resources/_form.html.erb +13 -1
  32. data/app/views/alchemy/admin/trash/index.html.erb +1 -1
  33. data/app/views/alchemy/base/remote_errors.js.erb +5 -1
  34. data/app/views/alchemy/essences/_essence_link_view.html.erb +2 -0
  35. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +1 -1
  36. data/config/locales/alchemy.de.yml +11 -4
  37. data/lib/alchemy/capistrano.rb +59 -1
  38. data/lib/alchemy/essence.rb +1 -0
  39. data/lib/alchemy/seeder.rb +39 -49
  40. data/lib/alchemy/tinymce.rb +1 -1
  41. data/lib/alchemy/version.rb +1 -1
  42. data/lib/rails/generators/alchemy/deploy_script/deploy_script_generator.rb +1 -1
  43. data/lib/rails/generators/alchemy/deploy_script/templates/deploy.rb.tt +3 -0
  44. data/lib/rails/generators/alchemy/elements/templates/view.html.haml +2 -2
  45. data/lib/rails/generators/alchemy/elements/templates/view.html.slim +2 -2
  46. data/lib/tasks/database.rake +25 -0
  47. data/lib/tasks/install.rake +5 -14
  48. data/spec/factories.rb +10 -0
  49. data/spec/integration/admin/resources_integration_spec.rb +64 -23
  50. data/spec/integration/pages_controller_spec.rb +0 -2
  51. data/spec/libraries/resources_helper_spec.rb +6 -2
  52. data/spec/models/content_spec.rb +31 -0
  53. data/spec/models/element_spec.rb +7 -2
  54. data/spec/models/page_spec.rb +36 -0
  55. data/vendor/assets/javascripts/jquery_plugins/jquery.dialogextend.1_0_1.js +676 -0
  56. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.tabspaging.js +298 -238
  57. data/vendor/assets/javascripts/tiny_mce/langs/de.js +1 -1
  58. data/vendor/assets/javascripts/tiny_mce/langs/en.js +1 -1
  59. data/vendor/assets/javascripts/tiny_mce/license.txt +6 -6
  60. data/vendor/assets/javascripts/tiny_mce/plugins/fullscreen/editor_plugin.js +1 -1
  61. data/vendor/assets/javascripts/tiny_mce/plugins/fullscreen/fullscreen.htm +97 -97
  62. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/template.htm +376 -386
  63. data/vendor/assets/javascripts/tiny_mce/plugins/paste/editor_plugin.js +1 -1
  64. data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pastetext.js +30 -30
  65. data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pasteword.js +45 -45
  66. data/vendor/assets/javascripts/tiny_mce/plugins/paste/langs/de_dlg.js +1 -1
  67. data/vendor/assets/javascripts/tiny_mce/plugins/paste/pastetext.htm +17 -20
  68. data/vendor/assets/javascripts/tiny_mce/plugins/paste/pasteword.htm +12 -12
  69. data/vendor/assets/javascripts/tiny_mce/plugins/table/cell.htm +173 -183
  70. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/cell.css +4 -4
  71. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/row.css +7 -7
  72. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/table.css +3 -3
  73. data/vendor/assets/javascripts/tiny_mce/plugins/table/editor_plugin.js +1 -1
  74. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/cell.js +280 -282
  75. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/merge_cells.js +15 -15
  76. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/row.js +221 -204
  77. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/table.js +448 -435
  78. data/vendor/assets/javascripts/tiny_mce/plugins/table/langs/de_dlg.js +1 -1
  79. data/vendor/assets/javascripts/tiny_mce/plugins/table/merge_cells.htm +22 -24
  80. data/vendor/assets/javascripts/tiny_mce/plugins/table/row.htm +136 -144
  81. data/vendor/assets/javascripts/tiny_mce/plugins/table/table.htm +168 -184
  82. data/vendor/assets/javascripts/tiny_mce/themes/advanced/about.htm +46 -62
  83. data/vendor/assets/javascripts/tiny_mce/themes/advanced/anchor.htm +16 -17
  84. data/vendor/assets/javascripts/tiny_mce/themes/advanced/charmap.htm +47 -56
  85. data/vendor/assets/javascripts/tiny_mce/themes/advanced/color_picker.htm +52 -69
  86. data/vendor/assets/javascripts/tiny_mce/themes/advanced/editor_template.js +1 -852
  87. data/vendor/assets/javascripts/tiny_mce/themes/advanced/image.htm +69 -79
  88. data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/icons.gif +0 -0
  89. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/about.js +48 -48
  90. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/anchor.js +50 -37
  91. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/charmap.js +317 -317
  92. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/color_picker.js +345 -331
  93. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/image.js +248 -246
  94. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/link.js +152 -146
  95. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/source_editor.js +53 -31
  96. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/de.js +1 -1
  97. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/de_dlg.js +1 -1
  98. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en.js +1 -1
  99. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en_dlg.js +1 -1
  100. data/vendor/assets/javascripts/tiny_mce/themes/advanced/link.htm +46 -53
  101. data/vendor/assets/javascripts/tiny_mce/themes/advanced/shortcuts.htm +45 -57
  102. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/content.css +47 -182
  103. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/dialog.css +93 -399
  104. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/ui.css +191 -890
  105. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/content.css +24 -102
  106. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +79 -377
  107. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css +80 -451
  108. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/content.css +45 -167
  109. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css +93 -399
  110. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui.css +194 -889
  111. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +7 -33
  112. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +4 -15
  113. data/vendor/assets/javascripts/tiny_mce/themes/advanced/source_editor.htm +16 -19
  114. data/vendor/assets/javascripts/tiny_mce/tiny_mce.js +1 -1
  115. data/vendor/assets/javascripts/tiny_mce/tiny_mce_popup.js +1 -1
  116. data/vendor/assets/javascripts/tiny_mce/utils/editable_selects.js +46 -46
  117. data/vendor/assets/javascripts/tiny_mce/utils/form_utils.js +124 -124
  118. data/vendor/assets/javascripts/tiny_mce/utils/mctabs.js +112 -112
  119. data/vendor/assets/javascripts/tiny_mce/utils/validate.js +213 -213
  120. metadata +11 -6
  121. data/spec/dummy/public/404.html.bak +0 -26
  122. 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.sortable('refresh');
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
- <div id="errors"></div>
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
- jQuery('<%= @error_div_id %>').html('<%= escape_javascript(@errors) %>').show();
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();
@@ -0,0 +1,2 @@
1
+ <%- options[:text] ||= content.ingredient %>
2
+ <%= link_to options[:text], content.ingredient, html_options %>
@@ -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 style="position: relative">
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: "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'
@@ -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
- Capistrano::Configuration.instance(:must_exist).load do
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
@@ -27,6 +27,7 @@ module Alchemy #:nodoc:
27
27
 
28
28
  class_eval <<-EOV
29
29
  attr_accessor :validation_errors
30
+ attr_accessible :ingredient
30
31
  include Alchemy::Essence::InstanceMethods
31
32
  stampable(:stamper_class_name => 'Alchemy::User')
32
33
  validate :essence_validations, :on => :update
@@ -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
- desc "Seeding your database"
12
- errors = []
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
@@ -5,7 +5,7 @@ module Alchemy
5
5
 
6
6
  @@setup = nil
7
7
 
8
- @@plugins = %w(autoresize paste fullscreen inlinepopups alchemy_link)
8
+ @@plugins = %w(alchemy_link autoresize fullscreen inlinepopups paste table)
9
9
 
10
10
  @@languages = ['en', 'de']
11
11
 
@@ -1,6 +1,6 @@
1
1
  module Alchemy
2
2
 
3
- VERSION = "2.4.rc2"
3
+ VERSION = "2.4.rc4"
4
4
 
5
5
  def self.version
6
6
  VERSION
@@ -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
- .<%= @element_name %>_image<%= image.essence.css_class ? ".#{image.essence.css_class}" : '' %>
6
- = render_essence_view(image, :image_size => "160x120")
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
- .<%= @element_name %>_image<%= image.essence.css_class ? ".#{image.essence.css_class}" : '' %>
6
- = render_essence_view(image, :image_size => "160x120")
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
@@ -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."