alchemy_cms 3.4.2 → 3.5.0.rc1

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.
Files changed (247) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +9 -3
  3. data/.teatro.yml +1 -0
  4. data/.travis.yml +14 -17
  5. data/CHANGELOG.md +44 -6
  6. data/Gemfile +7 -4
  7. data/README.md +60 -10
  8. data/Rakefile +1 -1
  9. data/alchemy_cms.gemspec +5 -8
  10. data/app/assets/javascripts/alchemy/admin.js +2 -0
  11. data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +1 -0
  12. data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +1 -0
  13. data/app/assets/javascripts/alchemy/alchemy.hotkeys.js.coffee +1 -1
  14. data/app/assets/javascripts/alchemy/alchemy.initializer.js.coffee +9 -7
  15. data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +1 -0
  16. data/app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee +11 -7
  17. data/app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee +1 -1
  18. data/app/assets/javascripts/alchemy/alchemy.tinymce.js.coffee +8 -3
  19. data/app/assets/javascripts/alchemy/alchemy.tooltips.coffee +10 -0
  20. data/app/assets/javascripts/alchemy/alchemy.uploader.js.coffee +104 -73
  21. data/app/assets/stylesheets/alchemy/_defaults.scss +1 -4
  22. data/app/assets/stylesheets/alchemy/_extends.scss +13 -35
  23. data/app/assets/stylesheets/alchemy/_mixins.scss +82 -18
  24. data/app/assets/stylesheets/alchemy/_variables.scss +21 -8
  25. data/app/assets/stylesheets/alchemy/admin.scss +4 -0
  26. data/app/assets/stylesheets/alchemy/archive.scss +8 -12
  27. data/app/assets/stylesheets/alchemy/attachments.scss +39 -0
  28. data/app/assets/stylesheets/alchemy/base.scss +26 -15
  29. data/app/assets/stylesheets/alchemy/buttons.scss +59 -31
  30. data/app/assets/stylesheets/alchemy/dashboard.scss +3 -3
  31. data/app/assets/stylesheets/alchemy/dialogs.scss +10 -8
  32. data/app/assets/stylesheets/alchemy/elements.scss +65 -41
  33. data/app/assets/stylesheets/alchemy/errors.scss +7 -0
  34. data/app/assets/stylesheets/alchemy/flash.scss +1 -1
  35. data/app/assets/stylesheets/alchemy/form_fields.scss +0 -37
  36. data/app/assets/stylesheets/alchemy/forms.scss +18 -27
  37. data/app/assets/stylesheets/alchemy/frame.scss +104 -204
  38. data/app/assets/stylesheets/alchemy/hints.scss +62 -0
  39. data/app/assets/stylesheets/alchemy/icon-font.scss +2 -1
  40. data/app/assets/stylesheets/alchemy/icons.scss +9 -4
  41. data/app/assets/stylesheets/alchemy/image_library.scss +6 -6
  42. data/app/assets/stylesheets/alchemy/jquery-ui.scss +6 -4
  43. data/app/assets/stylesheets/alchemy/lists.scss +0 -1
  44. data/app/assets/stylesheets/alchemy/menubar.scss +3 -4
  45. data/app/assets/stylesheets/alchemy/modules.scss +0 -6
  46. data/app/assets/stylesheets/alchemy/navigation.scss +242 -0
  47. data/app/assets/stylesheets/alchemy/pagination.scss +3 -3
  48. data/app/assets/stylesheets/alchemy/print.scss +1 -0
  49. data/app/assets/stylesheets/alchemy/resource_info.scss +45 -0
  50. data/app/assets/stylesheets/alchemy/search.scss +72 -1
  51. data/app/assets/stylesheets/alchemy/selects.scss +38 -44
  52. data/app/assets/stylesheets/alchemy/sitemap.scss +89 -79
  53. data/app/assets/stylesheets/alchemy/tables.scss +6 -10
  54. data/app/assets/stylesheets/alchemy/toolbar.scss +7 -36
  55. data/app/assets/stylesheets/alchemy/upload.scss +12 -3
  56. data/app/assets/stylesheets/tinymce/skins/alchemy/content.min.css.scss +6 -3
  57. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce-small.svg +58 -170
  58. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce-small.ttf +0 -0
  59. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce-small.woff +0 -0
  60. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce.svg +124 -148
  61. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce.ttf +0 -0
  62. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce.woff +0 -0
  63. data/app/assets/stylesheets/tinymce/skins/alchemy/skin.min.css.scss +426 -144
  64. data/app/controllers/alchemy/admin/attachments_controller.rb +24 -16
  65. data/app/controllers/alchemy/admin/clipboard_controller.rb +1 -1
  66. data/app/controllers/alchemy/admin/essence_files_controller.rb +1 -1
  67. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +9 -8
  68. data/app/controllers/alchemy/admin/layoutpages_controller.rb +1 -0
  69. data/app/controllers/alchemy/admin/pages_controller.rb +2 -2
  70. data/app/controllers/alchemy/admin/resources_controller.rb +2 -2
  71. data/app/controllers/alchemy/admin/tags_controller.rb +1 -1
  72. data/app/controllers/alchemy/api/pages_controller.rb +16 -0
  73. data/app/controllers/alchemy/messages_controller.rb +1 -1
  74. data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +2 -2
  75. data/app/helpers/alchemy/admin/attachments_helper.rb +11 -0
  76. data/app/helpers/alchemy/admin/base_helper.rb +37 -4
  77. data/app/helpers/alchemy/admin/contents_helper.rb +11 -4
  78. data/app/helpers/alchemy/admin/elements_helper.rb +0 -19
  79. data/app/helpers/alchemy/admin/essences_helper.rb +7 -30
  80. data/app/helpers/alchemy/admin/navigation_helper.rb +13 -51
  81. data/app/helpers/alchemy/admin/pages_helper.rb +21 -16
  82. data/app/helpers/alchemy/admin/pictures_helper.rb +9 -0
  83. data/app/helpers/alchemy/deprecated_pages_helper.rb +54 -0
  84. data/app/helpers/alchemy/essences_helper.rb +1 -1
  85. data/app/helpers/alchemy/pages_helper.rb +8 -109
  86. data/app/helpers/alchemy/url_helper.rb +8 -13
  87. data/app/models/alchemy/attachment.rb +7 -4
  88. data/app/models/alchemy/cell.rb +2 -2
  89. data/app/models/alchemy/content.rb +2 -2
  90. data/app/models/alchemy/content/factory.rb +12 -9
  91. data/app/models/alchemy/element.rb +6 -3
  92. data/app/models/alchemy/essence_file.rb +1 -1
  93. data/app/models/alchemy/essence_picture.rb +37 -47
  94. data/app/models/alchemy/essence_picture_view.rb +8 -1
  95. data/app/models/alchemy/folded_page.rb +3 -2
  96. data/app/models/alchemy/legacy_page_url.rb +3 -3
  97. data/app/models/alchemy/page.rb +50 -5
  98. data/app/models/alchemy/page/fixed_attributes.rb +63 -0
  99. data/app/models/alchemy/page/page_elements.rb +10 -7
  100. data/app/models/alchemy/page/page_natures.rb +19 -0
  101. data/app/models/alchemy/picture.rb +1 -0
  102. data/app/models/alchemy/picture/transformations.rb +1 -1
  103. data/app/models/alchemy/picture/url.rb +82 -0
  104. data/app/serializers/alchemy/page_tree_serializer.rb +29 -8
  105. data/app/views/alchemy/_edit_mode.html.erb +2 -0
  106. data/app/views/alchemy/_menubar.html.erb +1 -1
  107. data/app/views/alchemy/_preview_mode_code.html.erb +6 -0
  108. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +1 -1
  109. data/app/views/alchemy/admin/attachments/_attachment.html.erb +25 -5
  110. data/app/views/alchemy/admin/attachments/_replace_button.html.erb +26 -0
  111. data/app/views/alchemy/admin/attachments/index.html.erb +1 -1
  112. data/app/views/alchemy/admin/attachments/show.html.erb +52 -0
  113. data/app/views/alchemy/admin/elements/_element_header.html.erb +6 -3
  114. data/app/views/alchemy/admin/elements/create.js.erb +0 -2
  115. data/app/views/alchemy/admin/elements/trash.js.erb +0 -1
  116. data/app/views/alchemy/admin/elements/update.js.erb +0 -2
  117. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +1 -4
  118. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +1 -1
  119. data/app/views/alchemy/admin/languages/index.html.erb +1 -0
  120. data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +26 -27
  121. data/app/views/alchemy/admin/layoutpages/edit.html.erb +1 -1
  122. data/app/views/alchemy/admin/pages/_form.html.erb +13 -40
  123. data/app/views/alchemy/admin/pages/_locked_page.html.erb +1 -1
  124. data/app/views/alchemy/admin/pages/_page.html.erb +119 -61
  125. data/app/views/alchemy/admin/pages/_page_for_links.html.erb +4 -2
  126. data/app/views/alchemy/admin/pages/_page_infos.html.erb +12 -12
  127. data/app/views/alchemy/admin/pages/_page_status.html.erb +1 -1
  128. data/app/views/alchemy/admin/pages/_publication_fields.html.erb +35 -0
  129. data/app/views/alchemy/admin/pages/edit.html.erb +13 -2
  130. data/app/views/alchemy/admin/pages/index.html.erb +3 -8
  131. data/app/views/alchemy/admin/pages/info.html.erb +15 -2
  132. data/app/views/alchemy/admin/pages/sort.js.erb +1 -1
  133. data/app/views/alchemy/admin/pages/update.js.erb +1 -14
  134. data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +12 -8
  135. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +4 -4
  136. data/app/views/alchemy/admin/partials/_search_form.html.erb +1 -1
  137. data/app/views/alchemy/admin/partials/_sub_navigation.html.erb +9 -6
  138. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +1 -1
  139. data/app/views/alchemy/admin/pictures/_picture.html.erb +1 -6
  140. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -6
  141. data/app/views/alchemy/admin/pictures/index.html.erb +1 -1
  142. data/app/views/alchemy/admin/pictures/show.html.erb +1 -6
  143. data/app/views/alchemy/admin/uploader/_button.html.erb +4 -4
  144. data/app/views/alchemy/base/500.html.erb +15 -1
  145. data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +13 -15
  146. data/app/views/alchemy/essences/_essence_boolean_view.html.erb +1 -3
  147. data/app/views/alchemy/essences/_essence_date_editor.html.erb +0 -2
  148. data/app/views/alchemy/essences/_essence_date_view.html.erb +0 -2
  149. data/app/views/alchemy/essences/_essence_file_editor.html.erb +2 -7
  150. data/app/views/alchemy/essences/_essence_file_view.html.erb +1 -3
  151. data/app/views/alchemy/essences/_essence_html_editor.html.erb +0 -2
  152. data/app/views/alchemy/essences/_essence_html_view.html.erb +1 -3
  153. data/app/views/alchemy/essences/_essence_link_editor.html.erb +0 -2
  154. data/app/views/alchemy/essences/_essence_link_view.html.erb +0 -2
  155. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +47 -49
  156. data/app/views/alchemy/essences/_essence_picture_view.html.erb +1 -3
  157. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +0 -2
  158. data/app/views/alchemy/essences/_essence_richtext_view.html.erb +1 -3
  159. data/app/views/alchemy/essences/_essence_select_editor.html.erb +27 -29
  160. data/app/views/alchemy/essences/_essence_select_view.html.erb +1 -3
  161. data/app/views/alchemy/essences/_essence_text_editor.html.erb +17 -19
  162. data/app/views/alchemy/essences/_essence_text_view.html.erb +0 -2
  163. data/app/views/alchemy/pages/_meta_data.html.erb +9 -0
  164. data/app/views/layouts/alchemy/admin.html.erb +9 -11
  165. data/bin/alchemy +1 -2
  166. data/config/alchemy/config.yml +1 -1
  167. data/config/alchemy/modules.yml +0 -16
  168. data/config/initializers/dragonfly.rb +0 -18
  169. data/config/initializers/mini_profiler.rb +6 -0
  170. data/config/locales/alchemy.de.yml +9 -1
  171. data/config/locales/alchemy.en.yml +7 -1
  172. data/config/locales/alchemy.es.yml +6 -0
  173. data/config/locales/alchemy.fr.yml +2 -0
  174. data/config/locales/alchemy.it.yml +3 -1
  175. data/config/locales/alchemy.nl.yml +2 -0
  176. data/config/locales/alchemy.ru.yml +2 -0
  177. data/config/routes.rb +3 -8
  178. data/db/migrate/20160912223112_add_index_to_alchemy_pages_rgt.rb +9 -0
  179. data/db/migrate/20160927205604_add_foreign_key_indices_and_null_constraints.rb +20 -0
  180. data/db/migrate/20160928080104_add_foreign_keys.rb +27 -0
  181. data/lib/alchemy/admin/locale.rb +4 -3
  182. data/lib/alchemy/engine.rb +2 -4
  183. data/lib/alchemy/errors.rb +9 -2
  184. data/lib/alchemy/forms/builder.rb +8 -0
  185. data/lib/alchemy/modules.rb +20 -19
  186. data/lib/alchemy/permissions.rb +15 -4
  187. data/lib/alchemy/resources_helper.rb +4 -2
  188. data/lib/alchemy/sass_support.rb +9 -0
  189. data/lib/alchemy/seeder.rb +89 -1
  190. data/lib/alchemy/test_support/essence_shared_examples.rb +2 -0
  191. data/lib/alchemy/test_support/factories/attachment_factory.rb +1 -1
  192. data/lib/alchemy/test_support/factories/content_factory.rb +1 -0
  193. data/lib/alchemy/test_support/factories/element_factory.rb +1 -0
  194. data/lib/alchemy/test_support/factories/picture_factory.rb +1 -1
  195. data/lib/alchemy/test_support/fixtures/image.png +0 -0
  196. data/lib/alchemy/tinymce.rb +2 -6
  197. data/lib/alchemy/upgrader.rb +4 -55
  198. data/lib/alchemy/upgrader/tasks/install_dragonfly_config.rb +14 -0
  199. data/lib/alchemy/upgrader/three_point_five.rb +32 -0
  200. data/lib/alchemy/upgrader/three_point_four.rb +2 -8
  201. data/lib/alchemy/upgrader/three_point_one.rb +30 -30
  202. data/lib/alchemy/upgrader/three_point_three.rb +31 -31
  203. data/lib/alchemy/upgrader/three_point_two.rb +25 -25
  204. data/lib/alchemy/upgrader/three_point_zero.rb +59 -59
  205. data/lib/alchemy/version.rb +1 -1
  206. data/lib/rails/generators/alchemy/elements/templates/view.html.erb +1 -1
  207. data/lib/rails/generators/alchemy/elements/templates/view.html.haml +1 -1
  208. data/lib/rails/generators/alchemy/elements/templates/view.html.slim +1 -1
  209. data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +1 -3
  210. data/lib/rails/generators/alchemy/install/files/_article_view.html.erb +1 -1
  211. data/lib/rails/generators/alchemy/install/files/application.html.erb +3 -4
  212. data/lib/rails/generators/alchemy/install/install_generator.rb +4 -0
  213. data/lib/rails/generators/alchemy/install/templates/dragonfly.rb.tt +35 -0
  214. data/lib/rails/generators/alchemy/module/module_generator.rb +1 -1
  215. data/lib/tasks/alchemy/db.rake +6 -0
  216. data/lib/tasks/alchemy/tidy.rake +85 -0
  217. data/lib/tasks/alchemy/upgrade.rake +165 -16
  218. data/vendor/assets/javascripts/clipboard.min.js +7 -0
  219. data/vendor/assets/javascripts/fileupload/jquery.fileupload-process.js +4 -4
  220. data/vendor/assets/javascripts/fileupload/jquery.fileupload-validate.js +2 -2
  221. data/vendor/assets/javascripts/fileupload/jquery.fileupload.js +29 -14
  222. data/vendor/assets/javascripts/fileupload/jquery.iframe-transport.js +2 -2
  223. data/vendor/assets/javascripts/tinymce/langs/es.js +2 -2
  224. data/vendor/assets/javascripts/tinymce/langs/fr.js +1 -1
  225. data/vendor/assets/javascripts/tinymce/langs/it.js +1 -1
  226. data/vendor/assets/javascripts/tinymce/langs/nl.js +3 -3
  227. data/vendor/assets/javascripts/tinymce/tinymce.min.js +15 -12
  228. metadata +44 -88
  229. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/readme.md +0 -1
  230. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce-small.eot +0 -0
  231. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce.eot +0 -0
  232. data/app/assets/stylesheets/tinymce/skins/alchemy/img/wline.gif +0 -0
  233. data/app/assets/stylesheets/tinymce/skins/alchemy/skin.ie7.min.css +0 -1
  234. data/app/controllers/alchemy/pictures_controller.rb +0 -97
  235. data/app/views/alchemy/admin/elements/_refresh_editor.js.erb +0 -8
  236. data/vendor/assets/javascripts/tinymce/plugins/anchor/plugin.min.js +0 -1
  237. data/vendor/assets/javascripts/tinymce/plugins/autoresize/plugin.min.js +0 -1
  238. data/vendor/assets/javascripts/tinymce/plugins/charmap/plugin.min.js +0 -1
  239. data/vendor/assets/javascripts/tinymce/plugins/code/plugin.min.js +0 -1
  240. data/vendor/assets/javascripts/tinymce/plugins/directionality/plugin.min.js +0 -1
  241. data/vendor/assets/javascripts/tinymce/plugins/fullscreen/plugin.min.js +0 -1
  242. data/vendor/assets/javascripts/tinymce/plugins/hr/plugin.min.js +0 -1
  243. data/vendor/assets/javascripts/tinymce/plugins/link/plugin.min.js +0 -1
  244. data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.min.js +0 -1
  245. data/vendor/assets/javascripts/tinymce/plugins/tabfocus/plugin.min.js +0 -1
  246. data/vendor/assets/javascripts/tinymce/plugins/table/plugin.min.js +0 -1
  247. data/vendor/assets/javascripts/tinymce/themes/modern/theme.min.js +0 -1
@@ -1,5 +1,5 @@
1
1
  module Alchemy
2
- VERSION = "3.4.2"
2
+ VERSION = "3.5.0.rc1"
3
3
 
4
4
  def self.version
5
5
  VERSION
@@ -4,7 +4,7 @@
4
4
  <div class="<%= @element_name %>_images">
5
5
  <%%- element.contents.gallery_pictures.each do |image| -%>
6
6
  <div class="<%= @element_name %>_image <%%= image.essence.css_class %>">
7
- <%%= render_essence_view(image, image_size: '160x120') %>
7
+ <%%= render_essence_view(image, size: '160x120') %>
8
8
  </div>
9
9
  <%%- end -%>
10
10
  </div>
@@ -4,7 +4,7 @@
4
4
  .<%= @element_name %>_images
5
5
  - element.contents.gallery_pictures.each do |image|
6
6
  .<%= @element_name %>_image{class: image.essence.css_class}
7
- = render_essence_view(image, image_size: "160x120")
7
+ = render_essence_view(image, size: "160x120")
8
8
  <%- end -%>
9
9
  <%- @contents.each do |content| -%>
10
10
  <%- if @contents.length > 1 -%>
@@ -4,7 +4,7 @@
4
4
  .<%= @element_name %>_images
5
5
  - element.contents.gallery_pictures.each do |image|
6
6
  .<%= @element_name %>_image class=image.essence.css_class
7
- = render_essence_view(image, image_size: "160x120")
7
+ = render_essence_view(image, size: "160x120")
8
8
  <%- end -%>
9
9
  <%- @contents.each do |content| -%>
10
10
  <%- if @contents.length > 1 -%>
@@ -5,13 +5,11 @@
5
5
 
6
6
  Please consult Alchemy::Content.rb docs for further methods on the content object
7
7
  %>
8
- <%% cache(content) do %>
9
8
  <div class="content_editor <%= @essence_name.classify.demodulize.underscore %>" id="<%%= content.dom_id %>" data-content-id="<%%= content.id %>">
10
9
  <%%= content_label(content) %>
11
10
  <%%= text_field_tag(
12
11
  content.form_field_name,
13
12
  content.ingredient,
14
- :id => content.form_field_id
13
+ id: content.form_field_id
15
14
  ) %>
16
15
  </div>
17
- <%% end %>
@@ -1,7 +1,7 @@
1
1
  <%- cache(element) do -%>
2
2
  <%= element_view_for(element, tag: 'article') do |el| -%>
3
3
  <h2><%= el.render :headline %></h2>
4
- <%= el.render :picture, image_size: '1200x600' %>
4
+ <%= el.render :picture, size: '1200x600' %>
5
5
  <%= el.render :text %>
6
6
  <%- end -%>
7
7
  <%- end -%>
@@ -1,14 +1,13 @@
1
1
  <!DOCTYPE html>
2
- <html>
2
+ <html lang="<%= @page.language_code %>">
3
3
  <head>
4
- <%= render_meta_data %>
4
+ <%= render "alchemy/pages/meta_data" %>
5
5
  <%= stylesheet_link_tag 'application', media: 'all' %>
6
6
  <%= javascript_include_tag 'application' %>
7
7
  <%= csrf_meta_tags %>
8
8
  </head>
9
9
  <body>
10
10
  <%= yield %>
11
- <%= alchemy_preview_mode_code %>
12
- <%= render "alchemy/menubar" %>
11
+ <%= render "alchemy/edit_mode" %>
13
12
  </body>
14
13
  </html>
@@ -55,6 +55,10 @@ module Alchemy
55
55
  end
56
56
  end
57
57
 
58
+ def copy_dragonfly_config
59
+ template "#{current_path}/templates/dragonfly.rb.tt", "config/initializers/dragonfly.rb"
60
+ end
61
+
58
62
  private
59
63
 
60
64
  def config_path
@@ -0,0 +1,35 @@
1
+ # AlchemyCMS Dragonfly configuration.
2
+ #
3
+ # Consider using some kind of caching solution for image processing.
4
+ # For small projects, we have good experience with Rack::Cache.
5
+ #
6
+ # Larger installations should consider using a CDN, start reading
7
+ # http://markevans.github.io/dragonfly/cache/
8
+ #
9
+ # A complete reference can be found at
10
+ # http://markevans.github.io/dragonfly/configuration/
11
+ #
12
+ # Pictures
13
+ #
14
+ Dragonfly.app(:alchemy_pictures).configure do
15
+ dragonfly_url nil
16
+ plugin :imagemagick
17
+ plugin :svg
18
+ secret '<%= SecureRandom.hex(32) %>'
19
+ url_format '/pictures/:job/:name.:ext'
20
+
21
+ datastore :file,
22
+ root_path: Rails.root.join('uploads/pictures').to_s,
23
+ server_root: Rails.root.join('public'),
24
+ store_meta: false
25
+ end
26
+
27
+ # Mount as middleware
28
+ Rails.application.middleware.use Dragonfly::Middleware, :alchemy_pictures
29
+
30
+ # Attachments
31
+ Dragonfly.app(:alchemy_attachments).configure do
32
+ datastore :file,
33
+ root_path: Rails.root.join('uploads/attachments').to_s,
34
+ store_meta: false
35
+ end
@@ -20,7 +20,7 @@ module Alchemy
20
20
 
21
21
  def copy_templates
22
22
  template "controller.rb.tt", "app/controllers/admin/#{@controller_name}_controller.rb"
23
- template "ability.rb.tt", "app/models/#{@module_name}_ability.rb"
23
+ template "ability.rb.tt", 'app/models', "alchemy_#{@module_name}_ability.rb"
24
24
  template "module_config.rb.tt", "config/initializers/alchemy_#{@module_name}.rb"
25
25
  end
26
26
  end
@@ -1,9 +1,15 @@
1
1
  require 'shellwords'
2
+ require 'alchemy/seeder'
2
3
  require 'alchemy/tasks/helpers'
3
4
  include Alchemy::Tasks::Helpers
4
5
 
5
6
  namespace :alchemy do
6
7
  namespace :db do
8
+ desc "Seeds the database with Alchemy defaults"
9
+ task seed: [:environment] do
10
+ Alchemy::Seeder.seed!
11
+ end
12
+
7
13
  desc "Dumps the database to STDOUT (Pass DUMP_FILENAME to store the dump into a file)."
8
14
  task dump: :environment do
9
15
  dump_store = ENV['DUMP_FILENAME'] ? " > #{ENV['DUMP_FILENAME']}" : ""
@@ -7,6 +7,7 @@ namespace :alchemy do
7
7
  Rake::Task['alchemy:tidy:cells'].invoke
8
8
  Rake::Task['alchemy:tidy:element_positions'].invoke
9
9
  Rake::Task['alchemy:tidy:content_positions'].invoke
10
+ Rake::Task['alchemy:tidy:remove_orphaned_records'].invoke
10
11
  end
11
12
 
12
13
  desc "Creates missing cells for pages."
@@ -33,6 +34,28 @@ namespace :alchemy do
33
34
  task content_positions: [:environment] do
34
35
  Alchemy::Tidy.update_content_positions
35
36
  end
37
+
38
+ desc "Remove orphaned records (cells, elements, contents)."
39
+ task remove_orphaned_records: [:environment] do
40
+ Rake::Task['alchemy:tidy:remove_orphaned_cells'].invoke
41
+ Rake::Task['alchemy:tidy:remove_orphaned_elements'].invoke
42
+ Rake::Task['alchemy:tidy:remove_orphaned_contents'].invoke
43
+ end
44
+
45
+ desc "Remove orphaned cells."
46
+ task remove_orphaned_cells: [:environment] do
47
+ Alchemy::Tidy.remove_orphaned_cells
48
+ end
49
+
50
+ desc "Remove orphaned elements."
51
+ task remove_orphaned_elements: [:environment] do
52
+ Alchemy::Tidy.remove_orphaned_elements
53
+ end
54
+
55
+ desc "Remove orphaned contents."
56
+ task remove_orphaned_contents: [:environment] do
57
+ Alchemy::Tidy.remove_orphaned_contents
58
+ end
36
59
  end
37
60
  end
38
61
 
@@ -97,5 +120,67 @@ module Alchemy
97
120
  end
98
121
  end
99
122
  end
123
+
124
+ def self.remove_orphaned_cells
125
+ puts "\n## Removing orphaned cells"
126
+ cells = Alchemy::Cell.unscoped.all
127
+ if cells.any?
128
+ orphaned_cells = cells.select do |cell|
129
+ cell.page.nil? && cell.page_id.present?
130
+ end
131
+ if orphaned_cells.any?
132
+ destroy_orphaned_records(orphaned_cells, 'cell')
133
+ else
134
+ log "No orphaned cells found", :skip
135
+ end
136
+ else
137
+ log "No cells found", :skip
138
+ end
139
+ end
140
+
141
+ def self.remove_orphaned_elements
142
+ puts "\n## Removing orphaned elements"
143
+ elements = Alchemy::Element.unscoped.all
144
+ if elements.any?
145
+ orphaned_elements = elements.select do |element|
146
+ element.page.nil? && element.page_id.present? ||
147
+ element.cell.nil? && element.cell_id.present?
148
+ end
149
+ if orphaned_elements.any?
150
+ destroy_orphaned_records(orphaned_elements, 'element')
151
+ else
152
+ log "No orphaned elements found", :skip
153
+ end
154
+ else
155
+ log "No elements found", :skip
156
+ end
157
+ end
158
+
159
+ def self.remove_orphaned_contents
160
+ puts "\n## Removing orphaned contents"
161
+ contents = Alchemy::Content.unscoped.all
162
+ if contents.any?
163
+ orphaned_contents = contents.select do |content|
164
+ content.essence.nil? && content.essence_id.present? ||
165
+ content.element.nil? && content.element_id.present?
166
+ end
167
+ if orphaned_contents.any?
168
+ destroy_orphaned_records(orphaned_contents, 'content')
169
+ else
170
+ log "No orphaned contents found", :skip
171
+ end
172
+ else
173
+ log "No contents found", :skip
174
+ end
175
+ end
176
+
177
+ private
178
+
179
+ def self.destroy_orphaned_records(records, class_name)
180
+ records.each do |record|
181
+ log "Destroy orphaned #{class_name}: #{record.id}"
182
+ record.destroy
183
+ end
184
+ end
100
185
  end
101
186
  end
@@ -2,25 +2,36 @@ require 'alchemy/upgrader'
2
2
  require 'alchemy/version'
3
3
 
4
4
  namespace :alchemy do
5
- desc "Upgrades database content to Alchemy CMS v#{Alchemy::VERSION} (Set UPGRADE env variable to only run a specific task)."
6
- task upgrade: :environment do
7
- Alchemy::Upgrader.run!
5
+ desc "Upgrades your app to AlchemyCMS v#{Alchemy::VERSION}."
6
+ task upgrade: [
7
+ 'alchemy:upgrade:prepare',
8
+ 'alchemy:upgrade:3.0:run', 'alchemy:upgrade:3.0:todo',
9
+ 'alchemy:upgrade:3.1:todo',
10
+ 'alchemy:upgrade:3.2:run', 'alchemy:upgrade:3.2:todo',
11
+ 'alchemy:upgrade:3.3:run', 'alchemy:upgrade:3.3:todo',
12
+ 'alchemy:upgrade:3.4:run',
13
+ 'alchemy:upgrade:3.5:run', 'alchemy:upgrade:3.5:todo'
14
+ ] do
15
+ Alchemy::Upgrader.display_todos
8
16
  end
9
17
 
10
18
  namespace :upgrade do
11
- desc "List all available upgrade tasks."
12
- task list: [:environment] do
13
- puts "\nAvailable upgrade tasks"
14
- puts "-----------------------\n"
15
- methods = Alchemy::Upgrader.all_upgrade_tasks
16
- if methods.any?
17
- methods.each { |method| puts method }
18
- puts "\nUsage:"
19
- puts "------"
20
- puts "Run one or more tasks with `bundle exec rake alchemy:upgrade UPGRADE=task_name1,task_name2`\n"
21
- else
22
- puts "No upgrades available."
23
- end
19
+ desc 'Alchemy Upgrader: Prepares the database and updates Alchemys configuration file.'
20
+ task prepare: [
21
+ 'alchemy:upgrade:database',
22
+ 'alchemy:upgrade:config'
23
+ ]
24
+
25
+ desc "Alchemy Upgrader: Prepares the database."
26
+ task :database => [
27
+ 'alchemy:install:migrations',
28
+ 'db:migrate',
29
+ 'alchemy:db:seed'
30
+ ]
31
+
32
+ desc "Alchemy Upgrader: Copy configuration file."
33
+ task config: [:environment] do |t|
34
+ Alchemy::Upgrader.copy_new_config_file
24
35
  end
25
36
 
26
37
  task fix_picture_format: [:environment] do
@@ -28,5 +39,143 @@ namespace :alchemy do
28
39
  picture.update_column(:image_file_format, picture.image_file_format.to_s.chomp)
29
40
  end
30
41
  end
42
+
43
+ desc 'Upgrade Alchemy to v3.0'
44
+ task '3.0' => [
45
+ 'alchemy:upgrade:prepare',
46
+ 'alchemy:upgrade:3.0:run',
47
+ 'alchemy:upgrade:3.0:todo'
48
+ ] do
49
+ Alchemy::Upgrader.display_todos
50
+ end
51
+
52
+ namespace '3.0' do
53
+ task run: [
54
+ 'alchemy:upgrade:3.0:rename_registered_role_ro_member',
55
+ 'alchemy:upgrade:3.0:publish_unpublished_public_pages'
56
+ ]
57
+
58
+ desc 'Rename the `registered` user role to `member`'
59
+ task rename_registered_role_ro_member: [:environment] do |t|
60
+ Alchemy::Upgrader::ThreePointZero.rename_registered_role_ro_member
61
+ end
62
+
63
+ desc 'Sets `published_at` of public pages without a `published_at` date set to their `updated_at` value'
64
+ task publish_unpublished_public_pages: [:environment] do |t|
65
+ Alchemy::Upgrader::ThreePointZero.publish_unpublished_public_pages
66
+ end
67
+
68
+ task :todo do |t|
69
+ Alchemy::Upgrader::ThreePointZero.alchemy_3_0_todos
70
+ end
71
+ end
72
+
73
+ desc 'Upgrade Alchemy to v3.1'
74
+ task '3.1' => [
75
+ 'alchemy:upgrade:prepare',
76
+ 'alchemy:upgrade:3.1:todo'
77
+ ] do
78
+ Alchemy::Upgrader.display_todos
79
+ end
80
+
81
+ namespace '3.1' do
82
+ task :todo do |t|
83
+ Alchemy::Upgrader::ThreePointOne.alchemy_3_1_todos
84
+ end
85
+ end
86
+
87
+ desc 'Upgrade Alchemy to v3.2'
88
+ task '3.2' => [
89
+ 'alchemy:upgrade:prepare',
90
+ 'alchemy:upgrade:3.2:run',
91
+ 'alchemy:upgrade:3.2:todo'
92
+ ] do
93
+ Alchemy::Upgrader.display_todos
94
+ end
95
+
96
+ namespace '3.2' do
97
+ task run: [
98
+ 'alchemy:upgrade:3.2:upgrade_acts_as_taggable_on_migrations',
99
+ 'alchemy:upgrade:3.2:inject_seeder'
100
+ ]
101
+
102
+ desc 'Install and patch acts_as_taggable_on migrations.'
103
+ task upgrade_acts_as_taggable_on_migrations: [:environment] do |t|
104
+ Alchemy::Upgrader::ThreePointTwo.upgrade_acts_as_taggable_on_migrations
105
+ end
106
+
107
+ desc 'Add Alchemy seeder to `db/seeds.rb` file.'
108
+ task inject_seeder: [:environment] do |t|
109
+ Alchemy::Upgrader::ThreePointTwo.inject_seeder
110
+ end
111
+
112
+ task :todo do |t|
113
+ Alchemy::Upgrader::ThreePointTwo.alchemy_3_2_todos
114
+ end
115
+ end
116
+
117
+ desc 'Upgrade Alchemy to v3.3'
118
+ task '3.3' => [
119
+ 'alchemy:upgrade:prepare',
120
+ 'alchemy:upgrade:3.3:run',
121
+ 'alchemy:upgrade:3.3:todo'
122
+ ] do
123
+ Alchemy::Upgrader.display_todos
124
+ end
125
+
126
+ namespace '3.3' do
127
+ task run: [
128
+ 'alchemy:upgrade:3.3:convert_available_contents',
129
+ 'alchemy:upgrade:3.3:migrate_existing_elements'
130
+ ]
131
+
132
+ desc 'Convert `available_contents` config to `nestable_elements`.'
133
+ task convert_available_contents: [:environment] do |t|
134
+ Alchemy::Upgrader::ThreePointThree.convert_available_contents
135
+ end
136
+
137
+ desc 'Migrate existing elements to `nestable_elements`.'
138
+ task migrate_existing_elements: [:environment] do |t|
139
+ Alchemy::Upgrader::ThreePointThree.migrate_existing_elements
140
+ end
141
+
142
+ task :todo do |t|
143
+ Alchemy::Upgrader::ThreePointThree.alchemy_3_3_todos
144
+ end
145
+ end
146
+
147
+ desc 'Upgrade Alchemy to v3.4'
148
+ task '3.4' => ['alchemy:upgrade:prepare', 'alchemy:upgrade:3.4:run']
149
+
150
+ namespace '3.4' do
151
+ task run: ['alchemy:upgrade:3.4:install_asset_manifests']
152
+
153
+ desc 'Install asset manifests into `vendor/assets`'
154
+ task install_asset_manifests: [:environment] do |t|
155
+ Alchemy::Upgrader::ThreePointFour.install_asset_manifests
156
+ end
157
+ end
158
+
159
+ desc 'Upgrade Alchemy to v3.5'
160
+ task '3.5' => [
161
+ 'alchemy:upgrade:prepare',
162
+ 'alchemy:upgrade:3.5:run',
163
+ 'alchemy:upgrade:3.5:todo'
164
+ ] do
165
+ Alchemy::Upgrader.display_todos
166
+ end
167
+
168
+ namespace '3.5' do
169
+ task run: ['alchemy:upgrade:3.5:install_dragonfly_config']
170
+
171
+ desc 'Install dragonfly config into `config/initializers`'
172
+ task install_dragonfly_config: [:environment] do |t|
173
+ Alchemy::Upgrader::ThreePointFive.install_dragonfly_config
174
+ end
175
+
176
+ task :todo do |t|
177
+ Alchemy::Upgrader::ThreePointFive.alchemy_3_5_todos
178
+ end
179
+ end
31
180
  end
32
181
  end