alchemy_cms 2.1.rc2 → 2.1.rc3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. data/Gemfile +1 -0
  2. data/app/assets/javascripts/alchemy/alchemy.link_overlay.js +3 -3
  3. data/app/assets/stylesheets/alchemy/elements.css.scss +20 -9
  4. data/app/assets/stylesheets/alchemy/jquery-ui.alchemy.css.scss +1 -1
  5. data/app/assets/stylesheets/alchemy/jquery.Jcrop.css.scss +1 -1
  6. data/app/assets/stylesheets/alchemy/jquery.sb.css.scss +1 -1
  7. data/app/assets/stylesheets/alchemy/menubar.css.scss +3 -2
  8. data/app/assets/stylesheets/alchemy/tinymce_content.css.scss +1 -1
  9. data/app/assets/stylesheets/alchemy/tinymce_dialog.css.scss +1 -1
  10. data/app/controllers/alchemy/admin/base_controller.rb +1 -1
  11. data/app/helpers/alchemy/admin/base_helper.rb +1 -40
  12. data/app/helpers/alchemy/admin/contents_helper.rb +7 -1
  13. data/app/helpers/alchemy/admin/elements_helper.rb +1 -5
  14. data/app/helpers/alchemy/admin/essences_helper.rb +50 -6
  15. data/app/helpers/alchemy/elements_helper.rb +17 -11
  16. data/app/helpers/alchemy/pages_helper.rb +75 -56
  17. data/app/models/alchemy/content.rb +23 -14
  18. data/app/models/alchemy/element.rb +56 -46
  19. data/app/views/alchemy/admin/contents/_missing.html.erb +2 -1
  20. data/app/views/alchemy/admin/contents/create.js.erb +7 -6
  21. data/app/views/alchemy/admin/dashboard/index.html.erb +1 -1
  22. data/app/views/alchemy/essences/_essence_text_editor.html.erb +11 -9
  23. data/app/views/alchemy/navigation/_renderer.html.erb +1 -1
  24. data/config/locales/alchemy.de.yml +1 -1
  25. data/config/locales/alchemy.en.yml +21 -21
  26. data/lib/alchemy/capistrano.rb +57 -48
  27. data/lib/alchemy/page_layout.rb +6 -8
  28. data/lib/alchemy/version.rb +1 -1
  29. data/spec/helpers/pages_helper_spec.rb +76 -2
  30. data/spec/integration/pages_controller_spec.rb +1 -1
  31. data/spec/models/content_spec.rb +24 -0
  32. data/spec/models/element_spec.rb +23 -0
  33. metadata +32 -31
@@ -63,15 +63,24 @@ module Alchemy
63
63
  self.element.contents
64
64
  end
65
65
 
66
- # makes a copy of source and copies the polymorphic associated essence
66
+ # Makes a copy of source and also copies the associated essence.
67
+ #
68
+ # You can pass a differences hash to update the attributes of the copy.
69
+ #
70
+ # === Example
71
+ #
72
+ # @copy = Alchemy::Content.copy(@content, {:element_id => 3})
73
+ # @copy.element_id # => 3
74
+ #
67
75
  def self.copy(source, differences = {})
68
76
  differences[:position] = nil
69
77
  differences[:id] = nil
70
- attributes = source.attributes.merge(differences)
71
- content = self.create!(attributes.except("id"))
72
- new_essence = content.essence.clone
73
- new_essence.save
74
- content.essence_id = new_essence.id
78
+ attributes = source.attributes.except("id").merge(differences)
79
+ content = self.create!(attributes)
80
+ new_essence = content.essence.class.new(content.essence.attributes.except('id'))
81
+ new_essence.save!
82
+ raise "Essence not cloned" if new_essence.id == content.essence_id
83
+ content.update_attribute(:essence_id, new_essence.id)
75
84
  content
76
85
  end
77
86
 
@@ -120,17 +129,17 @@ module Alchemy
120
129
 
121
130
  # Returns a string to be passed to Rails form field tags to ensure we have same params layout everywhere.
122
131
  #
123
- # Example:
124
- # ========
125
- # <%= text_field_tag content.form_field_name, content.ingredient %>
132
+ # === Example:
133
+ #
134
+ # <%= text_field_tag content.form_field_name, content.ingredient %>
135
+ #
136
+ # === Options:
126
137
  #
127
- # Options:
128
- # ========
129
138
  # You can pass an Essence column_name. Default is self.essence.ingredient_column
130
139
  #
131
- # Example:
132
- # =======
133
- # <%= text_field_tag content.form_field_name(:link), content.ingredient %>
140
+ # ==== Example:
141
+ #
142
+ # <%= text_field_tag content.form_field_name(:link), content.ingredient %>
134
143
  #
135
144
  def form_field_name(essence_column = self.essence.ingredient_column)
136
145
  "contents[content_#{self.id}][#{essence_column}]"
@@ -166,6 +166,62 @@ module Alchemy
166
166
  element_definitions
167
167
  end
168
168
 
169
+ # List all elements for page_layout
170
+ def self.all_for_page(page)
171
+ raise TypeError if page.class.name != "Alchemy::Page"
172
+ # if page_layout has cells, collect elements from cells and group them by cellname
173
+ page_layout = Alchemy::PageLayout.get(page.page_layout)
174
+ if page_layout.blank?
175
+ logger.warn "\n++++++\nWARNING! Could not find page_layout description for page: #{page.name}\n++++++++\n"
176
+ return []
177
+ end
178
+ elements_for_layout = []
179
+ elements_for_layout += all_definitions_for(page_layout['elements'])
180
+ return [] if elements_for_layout.blank?
181
+ # all unique elements from this layout
182
+ unique_elements = elements_for_layout.select{ |m| m["unique"] == true }
183
+ elements_already_on_the_page = page.elements
184
+ # delete all elements from the elements that could be placed that are unique and already and the page
185
+ unique_elements.each do |unique_element|
186
+ elements_already_on_the_page.each do |already_placed_element|
187
+ if already_placed_element.name == unique_element["name"]
188
+ elements_for_layout.delete(unique_element)
189
+ end
190
+ end
191
+ end
192
+ return elements_for_layout
193
+ end
194
+
195
+ def self.all_definitions_for(element_names)
196
+ return [] if element_names.blank?
197
+ if element_names.to_s == "all"
198
+ return element_descriptions
199
+ else
200
+ return definitions.select { |e| element_names.include? e['name'] }
201
+ end
202
+ end
203
+
204
+ # This methods does a copy of source and all depending contents and all of their depending essences.
205
+ #
206
+ # == Options
207
+ #
208
+ # You can pass a differences Hash as second option to update attributes for the copy.
209
+ #
210
+ # == Example
211
+ #
212
+ # @copy = Alchemy::Element.copy(@element, {:public => false})
213
+ # @copy.public? # => false
214
+ #
215
+ def self.copy(source, differences = {})
216
+ attributes = source.attributes.except("id").merge(differences)
217
+ element = self.create!(attributes.merge(:create_contents_after_create => false, :id => nil, :position => nil))
218
+ source.contents.each do |content|
219
+ new_content = Content.copy(content, :element_id => element.id)
220
+ new_content.move_to_bottom
221
+ end
222
+ element
223
+ end
224
+
169
225
  def self.definitions
170
226
  self.descriptions
171
227
  end
@@ -417,52 +473,6 @@ module Alchemy
417
473
 
418
474
  private
419
475
 
420
- # List all elements for page_layout
421
- def self.all_for_page(page)
422
- raise TypeError if page.class.name != "Alchemy::Page"
423
- # if page_layout has cells, collect elements from cells and group them by cellname
424
- page_layout = Alchemy::PageLayout.get(page.page_layout)
425
- if page_layout.blank?
426
- logger.warn "\n++++++\nWARNING! Could not find page_layout description for page: #{page.name}\n++++++++\n"
427
- return []
428
- end
429
- elements_for_layout = []
430
- elements_for_layout += all_definitions_for(page_layout['elements'])
431
- return [] if elements_for_layout.blank?
432
- # all unique elements from this layout
433
- unique_elements = elements_for_layout.select{ |m| m["unique"] == true }
434
- elements_already_on_the_page = page.elements
435
- # delete all elements from the elements that could be placed that are unique and already and the page
436
- unique_elements.each do |unique_element|
437
- elements_already_on_the_page.each do |already_placed_element|
438
- if already_placed_element.name == unique_element["name"]
439
- elements_for_layout.delete(unique_element)
440
- end
441
- end
442
- end
443
- return elements_for_layout
444
- end
445
-
446
- def self.all_definitions_for(element_names)
447
- return [] if element_names.blank?
448
- if element_names.to_s == "all"
449
- return element_descriptions
450
- else
451
- return definitions.select { |e| element_names.include? e['name'] }
452
- end
453
- end
454
-
455
- # makes a copy of source and makes copies of the contents from source
456
- def self.copy(source, differences = {})
457
- attributes = source.attributes.except("id").merge(differences)
458
- element = self.create!(attributes.merge(:create_contents_after_create => false, :id => nil, :position => nil))
459
- source.contents.each do |content|
460
- new_content = Content.copy(content, :element_id => element.id)
461
- new_content.move_to_bottom
462
- end
463
- element
464
- end
465
-
466
476
  # creates the contents for this element as described in the elements.yml
467
477
  def create_contents
468
478
  contents = []
@@ -10,7 +10,8 @@
10
10
  :element_id => element.id,
11
11
  :name => name
12
12
  },
13
- :was_missing => true
13
+ :was_missing => true,
14
+ :options => options
14
15
  ),
15
16
  :method => 'post',
16
17
  :remote => true,
@@ -7,7 +7,7 @@
7
7
  :partial => "alchemy/essences/essence_picture_editor",
8
8
  :locals => {
9
9
  :content => @content,
10
- :options => @options
10
+ :options => @options.symbolize_keys
11
11
  }
12
12
  )
13
13
  ) -%>');
@@ -28,7 +28,7 @@
28
28
 
29
29
  <%- locals = {
30
30
  :content => @content,
31
- :options => {:as => 'text_field'}.merge(@options.nil? ? {} : @options)
31
+ :options => {:as => 'text_field'}.merge(@options.nil? ? {} : @options.symbolize_keys)
32
32
  } -%>
33
33
 
34
34
  <%- if params[:was_missing] -%>
@@ -50,14 +50,16 @@
50
50
  ) -%>');
51
51
  Alchemy.reloadPreview();
52
52
  Alchemy.closeCurrentWindow();
53
-
53
+
54
54
  <%- end -%>
55
55
 
56
+ Alchemy.SelectBox("#element_<%= @element.id %> select");
57
+
56
58
  <%- elsif @content.essence_type == "Alchemy::EssenceRichtext" -%>
57
59
 
58
60
  <%- locals = {
59
61
  :content => @content,
60
- :options => (@options.nil? ? {} : @options)
62
+ :options => (@options.nil? ? {} : @options.symbolize_keys)
61
63
  } -%>
62
64
 
63
65
  <%- if params[:was_missing] -%>
@@ -90,7 +92,7 @@
90
92
  :partial => "alchemy/essences/#{@content.essence_type.underscore}_editor",
91
93
  :locals => {
92
94
  :content => @content,
93
- :options => (@options.nil? ? {} : @options)
95
+ :options => (@options.nil? ? {} : @options.symbolize_keys)
94
96
  }
95
97
  )
96
98
  ) -%>');
@@ -98,5 +100,4 @@
98
100
  <%- end -%>
99
101
 
100
102
  Alchemy.growl('<%= t("Successfully added content", :content => @content.name) -%>');
101
-
102
103
  })(jQuery);
@@ -1,6 +1,6 @@
1
1
  <div id="dashboard">
2
2
  <h1><%= t('Welcome back, %{name}', :name => current_user.firstname.blank? ? current_user.login : current_user.firstname) %></h1>
3
- <h2><%= t('You were last time online at %{time}', :time => l(current_user.last_login_at)) unless current_user.last_login_at.blank? %></h2>
3
+ <h2><%= t('Your last login was on %{time}', :time => l(current_user.last_login_at)) unless current_user.last_login_at.blank? %></h2>
4
4
 
5
5
  <div class="widget">
6
6
  <h2><%= t('Your last updated pages') %>:</h2>
@@ -16,7 +16,8 @@
16
16
  <%- elsif content.settings[:display_as] == "select" -%>
17
17
 
18
18
  <label><%= render_content_name(content) %></label>
19
- <%- if options[:select_values].blank? -%>
19
+
20
+ <%- if options[:select_values].nil? -%>
20
21
  <%= warning('options[:select_values] is nil', "No select values given. Please provide :select_values as argument to render_essence_editor_by_name() helper inside this element editor view.") %>
21
22
  <%- else -%>
22
23
  <%- if options[:select_values].is_a?(Hash)
@@ -36,7 +37,7 @@
36
37
  content.form_field_name,
37
38
  options_method,
38
39
  {
39
- :class => "essence_editor_select full_width"
40
+ :class => "essence_editor_select"
40
41
  }
41
42
  ) %>
42
43
  <%- end -%>
@@ -66,13 +67,14 @@
66
67
  <%= hidden_field_tag content.form_field_name(:link_class_name), content.essence.link_class_name %>
67
68
  <%= hidden_field_tag content.form_field_name(:link_target), content.essence.link_target %>
68
69
 
69
- <a href="#" onclick="Alchemy.LinkOverlay.open(this, 420); return false;" title="<%= t('place_link') -%>" class="icon_button <%= content.linked? ? ' linked' : '' -%>" name="essence_text_<%= content.id -%>" id="edit_link_<%= content.id -%>">
70
- <span class="icon link"></span>
71
- </a>
72
-
73
- <a href="#" onclick="Alchemy.LinkOverlay.removeLink(this, <%= content.id -%>); return false;" title="<%= t('unlink') %>" class="icon_button unlink<%= content.linked? ? ' linked' : ' disabled' -%>" name="essence_text_<%= content.id -%>">
74
- <span class="icon unlink"></span>
75
- </a>
70
+ <span class="linkable_text_essence_tools">
71
+ <a href="#" onclick="Alchemy.LinkOverlay.open(this, 420); return false;" title="<%= t('place_link') -%>" class="icon_button <%= content.linked? ? ' linked' : '' -%>" name="essence_text_<%= content.id -%>" id="edit_link_<%= content.id -%>">
72
+ <span class="icon link"></span>
73
+ </a>
74
+ <a href="#" onclick="Alchemy.LinkOverlay.removeLink(this, <%= content.id -%>); return false;" title="<%= t('unlink') %>" class="icon_button unlink<%= content.linked? ? ' linked' : ' disabled' -%>" name="essence_text_<%= content.id -%>">
75
+ <span class="icon unlink"></span>
76
+ </a>
77
+ </span>
76
78
 
77
79
  <%- end -%>
78
80
 
@@ -16,7 +16,7 @@
16
16
  <%- end -%>
17
17
  </li>
18
18
  <%- unless options[:spacer].empty? -%>
19
- <%= "<li class=\"navigation_spacer\">#{options[:spacer]}</li>" unless page == pages.to_a.last -%>
19
+ <%= raw "<li class=\"navigation_spacer\">#{options[:spacer]}</li>" unless page == pages.to_a.last -%>
20
20
  <%- end -%>
21
21
  <%- end -%>
22
22
  </ul>
@@ -304,7 +304,7 @@ de:
304
304
  "You have unsaved elements. Do you really want to close the elements window?": "Sie haben ungesicherte Elemente. Möchten Sie das Elemente Fenster wirklich schließen?"
305
305
  "You may upload files with following extensions": "Sie können %{file_types_description} mit folgenden Endungen hochladen: %{file_types}"
306
306
  "You may upload any file": "Sie können jede Art von Datei hochladen."
307
- "You were last time online at %{time}": "Sie waren zuletzt angemeldet am %{time}."
307
+ "Your last login was on %{time}": "Sie waren zuletzt angemeldet am %{time}."
308
308
  "Your Alchemy Login": "Ihre Alchemy Zugangsdaten"
309
309
  "Your credentials are": "Ihre Zugangsdaten lauten"
310
310
  "Your last updated pages": "Ihre zuletzt bearbeiteten Seiten"
@@ -162,7 +162,7 @@ en:
162
162
  overlay: Overlay
163
163
 
164
164
  create_tree_as_new_language: "Create %{language} as a new language tree"
165
- "Delete image": "Remove this image."
165
+ "Delete image": "Remove this image"
166
166
  "Image size": "Imagesize"
167
167
  "Image deleted successfully": "Image deleted successfully."
168
168
  "Mandatory": "Mandatory fields"
@@ -176,10 +176,10 @@ en:
176
176
  "User created": "User created"
177
177
  "User deleted": "User deleted"
178
178
  "User updated": "User updated"
179
- add_image_to_element: "Add an image."
179
+ add_image_to_element: "Add an image"
180
180
  align_in_text: "Alignment in text"
181
181
  allow_fullscreen: "Allow fullscreen"
182
- assign_file: "Assign a file."
182
+ assign_file: "Assign a file"
183
183
  assign_file_from_archive: "assign a file from your archive"
184
184
  assign_image: "Assign an image"
185
185
  auto_play: "Play movie after load"
@@ -195,19 +195,19 @@ en:
195
195
  contactform_body: "Message Template"
196
196
  content_essence_not_found: "Content essence not found"
197
197
  content_not_found: "Field for content not present."
198
- copy_element: "Copy this element."
198
+ copy_element: "Copy this element"
199
199
  copy_page: "Copy page"
200
200
  "Create language": "Create a new language"
201
- create_page: "Create a new subpage."
202
- create_user: "Create a new user."
201
+ create_page: "Create a new subpage"
202
+ create_user: "Create a new user"
203
203
  created_at: "Created at"
204
204
  currently_edited_by: "This page is currently locked by"
205
205
  cut_element: "Cut this element."
206
206
  delete_file: "Delete this file from server."
207
- delete_image: "Remove this image."
208
- delete_language: "Delete this language."
209
- delete_page: "Delete this page."
210
- delete_user: "Delete this user."
207
+ delete_image: "Remove this image"
208
+ delete_language: "Delete this language"
209
+ delete_page: "Delete this page"
210
+ delete_user: "Delete this user"
211
211
  document: "File"
212
212
  documents: "Files"
213
213
  download_file: "Download file '%{filename}'"
@@ -217,8 +217,8 @@ en:
217
217
  edit_image_properties: "Edit image properties."
218
218
  edit_language: "Edit language"
219
219
  edit_page: "Edit this page"
220
- edit_page_properties: "Edit the page properties."
221
- edit_user: "Edit this users properties."
220
+ edit_page_properties: "Edit the page´s properties."
221
+ edit_user: "Edit the user´s properties."
222
222
  element_editor_not_found: "Error within this Element"
223
223
  element_of_type: "Element"
224
224
  element_saved: "Saved element."
@@ -256,7 +256,7 @@ en:
256
256
  file: "File"
257
257
  internal: "Internal"
258
258
  link_title: "Linktitle"
259
- logged_out: "You logged out successfully."
259
+ logged_out: "You´re logged out successfully."
260
260
  mail_to: "Recipient"
261
261
  male: "Male"
262
262
  medium_thumbnails: "Medium thumbnails"
@@ -289,7 +289,7 @@ en:
289
289
  page_locked: "This page is locked by another user."
290
290
  page_properties: "page properties"
291
291
  page_public: "published"
292
- page_published: "Published page."
292
+ page_published: "Published page"
293
293
  page_restricted: "restricted"
294
294
  page_status: "Status"
295
295
  page_status_invisible_public: "Page is invisible in navigation but public."
@@ -329,7 +329,7 @@ en:
329
329
  small_thumbnails: "Small thumbnails"
330
330
  successfully_added_element: "Succesfully added new element."
331
331
  successfully_saved_element_position: "Element position updated succesfully."
332
- swap_image: "Change image."
332
+ swap_image: "Change image"
333
333
  swfupload:
334
334
  cancel_uploads: "Cancel uploads"
335
335
  title: "Title"
@@ -339,8 +339,8 @@ en:
339
339
  unlock_page: "Leave page"
340
340
  unlocked_page: "Unlocked page %{name}."
341
341
  updated_at: "Updated at"
342
- upload_file: "Upload file(s)."
343
- upload_image: "Upload image(s)."
342
+ upload_file: "Upload file(s)"
343
+ upload_image: "Upload image(s)"
344
344
  url_name: "URL-Name"
345
345
  urlname_to_short: "The pages urlname is too short (minimum of 3 characters)"
346
346
  username: "Username"
@@ -350,9 +350,9 @@ en:
350
350
  width: "Width"
351
351
  "You are already logged in": "You are already logged in."
352
352
  "You may upload files with following extensions": "You may upload %{file_types_description} with following extensions: %{file_types}"
353
- zoom_image: "Zoom this image."
354
- "Nothing found": "Nothing found."
355
- "Validation failed": "Validation failed."
353
+ zoom_image: "Zoom this image"
354
+ "Nothing found": "Nothing found"
355
+ "Validation failed": "Validation failed"
356
356
 
357
357
  # END of Alchemy translation
358
358
 
@@ -504,7 +504,7 @@ en:
504
504
  frontpage_name: "Name of frontpage"
505
505
  name: "Name"
506
506
  page_layout: "Pagetype of frontpage"
507
- public: "public"
507
+ public: "Public"
508
508
 
509
509
  alchemy/page:
510
510
  created_at: "Created at"
@@ -5,47 +5,47 @@ require "alchemy/mount_point"
5
5
 
6
6
  Capistrano::Configuration.instance(:must_exist).load do
7
7
 
8
- after "deploy:setup", "alchemy:shared_folders:create"
9
- after "deploy:symlink", "alchemy:shared_folders:symlink"
10
- before "deploy:start", "alchemy:seed"
8
+ after "deploy:setup", "alchemy:shared_folders:create"
9
+ after "deploy:symlink", "alchemy:shared_folders:symlink"
10
+ before "deploy:start", "alchemy:db:seed"
11
11
 
12
- namespace :alchemy do
13
-
14
- namespace :shared_folders do
15
-
16
- # This task creates the shared folders for uploads, picture cache and ferret index while setting up your server.
17
- # Call after deploy:setup like +after "deploy:setup", "alchemy:create_shared_folders"+ in your +deploy.rb+.
18
- desc "Creates the uploads and picture cache directory in the shared folder. Call after deploy:setup"
19
- task :create, :roles => :app do
20
- run "mkdir -p #{shared_path}/index"
21
- run "mkdir -p #{shared_path}/uploads/pictures"
22
- run "mkdir -p #{shared_path}/uploads/attachments"
23
- run "mkdir -p #{File.join(shared_path, 'cache', Capistrano::CLI.ui.ask("Where is Alchemy CMS mounted at? (/)"), 'pictures')}"
24
- end
25
-
26
- # This task sets the symlinks for uploads, picture cache and ferret index folder.
27
- # Call after deploy:symlink like +after "deploy:symlink", "alchemy:symlink_folders"+ in your +deploy.rb+.
28
- desc "Sets the symlinks for uploads, picture cache and ferret index folder. Call after deploy:symlink"
29
- task :symlink, :roles => :app do
30
- run "rm -rf #{current_path}/uploads"
31
- run "ln -nfs #{shared_path}/uploads #{current_path}/"
12
+ namespace :alchemy do
13
+
14
+ namespace :shared_folders do
15
+
16
+ # This task creates the shared folders for uploads, picture cache and ferret index while setting up your server.
17
+ # Call after deploy:setup like +after "deploy:setup", "alchemy:create_shared_folders"+ in your +deploy.rb+.
18
+ desc "Creates the uploads and picture cache directory in the shared folder. Call after deploy:setup"
19
+ task :create, :roles => :app do
20
+ run "mkdir -p #{shared_path}/index"
21
+ run "mkdir -p #{shared_path}/uploads/pictures"
22
+ run "mkdir -p #{shared_path}/uploads/attachments"
23
+ run "mkdir -p #{File.join(shared_path, 'cache', Capistrano::CLI.ui.ask("Where is Alchemy CMS mounted at? (/)"), 'pictures')}"
24
+ end
25
+
26
+ # This task sets the symlinks for uploads, picture cache and ferret index folder.
27
+ # Call after deploy:symlink like +after "deploy:symlink", "alchemy:symlink_folders"+ in your +deploy.rb+.
28
+ desc "Sets the symlinks for uploads, picture cache and ferret index folder. Call after deploy:symlink"
29
+ task :symlink, :roles => :app do
30
+ run "rm -rf #{current_path}/uploads"
31
+ run "ln -nfs #{shared_path}/uploads #{current_path}/"
32
32
  run "ln -nfs #{shared_path}/cache/* #{current_path}/public/"
33
- run "rm -rf #{current_path}/index"
34
- run "ln -nfs #{shared_path}/index #{current_path}/"
35
- end
33
+ run "rm -rf #{current_path}/index"
34
+ run "ln -nfs #{shared_path}/index #{current_path}/"
35
+ end
36
36
 
37
- end
37
+ end
38
38
 
39
39
  desc "Upgrades production database to current Alchemy CMS version"
40
40
  task :upgrade do
41
41
  run "cd #{current_path} && RAILS_ENV=production #{rake} alchemy:upgrade"
42
42
  end
43
43
 
44
- namespace :database_yml do
44
+ namespace :database_yml do
45
45
 
46
- desc "Creates the database.yml file"
47
- task :create do
48
- db_config = ERB.new <<-EOF
46
+ desc "Creates the database.yml file"
47
+ task :create do
48
+ db_config = ERB.new <<-EOF
49
49
  production:
50
50
  adapter: mysql
51
51
  encoding: utf8
@@ -57,29 +57,38 @@ Capistrano::Configuration.instance(:must_exist).load do
57
57
  socket: #{ Capistrano::CLI.ui.ask("Database socket: ") }
58
58
  host: #{ Capistrano::CLI.ui.ask("Database host: ") }
59
59
  EOF
60
- run "mkdir -p #{shared_path}/config"
61
- put db_config.result, "#{shared_path}/config/database.yml"
62
- end
60
+ run "mkdir -p #{shared_path}/config"
61
+ put db_config.result, "#{shared_path}/config/database.yml"
62
+ end
63
63
 
64
- desc "Symlinks the database.yml file from shared folder into config folder"
65
- task :symlink, :except => { :no_release => true } do
66
- run "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml"
67
- end
64
+ desc "Symlinks the database.yml file from shared folder into config folder"
65
+ task :symlink, :except => { :no_release => true } do
66
+ run "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml"
67
+ end
68
68
 
69
- end
69
+ end
70
70
 
71
71
  end
72
72
 
73
- namespace :ferret do
73
+ namespace :db do
74
74
 
75
- # This task rebuilds the ferret index for the EssenceText and EssenceRichtext Models.
76
- # Call it before deploy:restart like +before "deploy:restart", "alchemy:rebuild_index"+ in your +deploy.rb+.
77
- # It uses the +alchemy:rebuild_index+ rake task found in +vendor/plugins/alchemy/lib/tasks+.
78
- desc "Rebuild the ferret index. Call before deploy:restart"
79
- task :rebuild_index, :roles => :app do
80
- run "cd #{current_path} && RAILS_ENV=production #{rake} ferret:rebuild_index"
81
- end
75
+ desc "Seeds the database with essential data."
76
+ task :seed, :roles => :app do
77
+ run "cd #{current_path} && RAILS_ENV=production #{rake} alchemy:db:seed"
78
+ end
82
79
 
83
- end
80
+ end
81
+
82
+ namespace :ferret do
83
+
84
+ # This task rebuilds the ferret index for the EssenceText and EssenceRichtext Models.
85
+ # Call it before deploy:restart like +before "deploy:restart", "alchemy:rebuild_index"+ in your +deploy.rb+.
86
+ # It uses the +alchemy:rebuild_index+ rake task found in +vendor/plugins/alchemy/lib/tasks+.
87
+ desc "Rebuild the ferret index. Call before deploy:restart"
88
+ task :rebuild_index, :roles => :app do
89
+ run "cd #{current_path} && RAILS_ENV=production #{rake} ferret:rebuild_index"
90
+ end
91
+
92
+ end
84
93
 
85
94
  end