alchemy_cms 2.2.4 → 2.3.rc5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (215) hide show
  1. data/.gitignore +1 -1
  2. data/.travis.yml +3 -4
  3. data/Gemfile +1 -0
  4. data/README.md +10 -6
  5. data/alchemy_cms.gemspec +5 -2
  6. data/app/assets/images/alchemy/icons.png +0 -0
  7. data/app/assets/images/sassy-ie-overlay.png +0 -0
  8. data/app/assets/javascripts/alchemy/alchemy.base.js +50 -59
  9. data/app/assets/javascripts/alchemy/alchemy.buttons.js +14 -4
  10. data/app/assets/javascripts/alchemy/alchemy.datepicker.js +8 -2
  11. data/app/assets/javascripts/alchemy/alchemy.elements_window.js +11 -3
  12. data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +1 -1
  13. data/app/assets/javascripts/alchemy/alchemy.link_overlay.js.coffee +14 -1
  14. data/app/assets/javascripts/alchemy/alchemy.preview.js +1 -1
  15. data/app/assets/javascripts/alchemy/alchemy.preview_window.js +12 -4
  16. data/app/assets/javascripts/alchemy/alchemy.uploader.js +4 -1
  17. data/app/assets/javascripts/alchemy/alchemy.windows.js +18 -8
  18. data/app/assets/stylesheets/alchemy/_defaults.scss +84 -120
  19. data/app/assets/stylesheets/alchemy/alchemy.css +2 -2
  20. data/app/assets/stylesheets/alchemy/archive.css.scss +288 -0
  21. data/app/assets/stylesheets/alchemy/base.css.scss +95 -390
  22. data/app/assets/stylesheets/alchemy/dashboard.css.scss +4 -4
  23. data/app/assets/stylesheets/alchemy/elements.css.scss +83 -118
  24. data/app/assets/stylesheets/alchemy/flash.css.scss +1 -1
  25. data/app/assets/stylesheets/alchemy/form_elements.css.scss +528 -0
  26. data/app/assets/stylesheets/alchemy/frame.css.scss +13 -39
  27. data/app/assets/stylesheets/alchemy/icons.css.scss +217 -228
  28. data/app/assets/stylesheets/alchemy/jquery-ui.alchemy.css.scss +48 -50
  29. data/app/assets/stylesheets/alchemy/jquery.Jcrop.css.scss +1 -1
  30. data/app/assets/stylesheets/alchemy/login.css.scss +1 -5
  31. data/app/assets/stylesheets/alchemy/menubar.css.scss +19 -29
  32. data/app/assets/stylesheets/alchemy/pagination.css.scss +3 -4
  33. data/app/assets/stylesheets/alchemy/sitemap.css.scss +81 -81
  34. data/app/assets/stylesheets/alchemy/tables.css.scss +63 -57
  35. data/app/assets/stylesheets/alchemy/tinymce_dialog.css.scss +57 -57
  36. data/app/assets/stylesheets/alchemy/upload.css.scss +6 -6
  37. data/app/assets/stylesheets/tiny_mce/plugins/inlinepopups/skins/alchemy/window.css.scss +6 -10
  38. data/app/controllers/alchemy/admin/attachments_controller.rb +5 -4
  39. data/app/controllers/alchemy/admin/base_controller.rb +1 -9
  40. data/app/controllers/alchemy/admin/contents_controller.rb +4 -6
  41. data/app/controllers/alchemy/admin/elements_controller.rb +2 -2
  42. data/app/controllers/alchemy/admin/pages_controller.rb +2 -2
  43. data/app/controllers/alchemy/admin/pictures_controller.rb +74 -15
  44. data/app/controllers/alchemy/attachments_controller.rb +8 -2
  45. data/app/controllers/alchemy/base_controller.rb +47 -5
  46. data/app/controllers/alchemy/elements_controller.rb +1 -1
  47. data/app/controllers/alchemy/messages_controller.rb +12 -12
  48. data/app/controllers/alchemy/pages_controller.rb +5 -1
  49. data/app/controllers/alchemy/pictures_controller.rb +9 -4
  50. data/app/controllers/alchemy/user_sessions_controller.rb +2 -4
  51. data/app/helpers/alchemy/admin/base_helper.rb +98 -19
  52. data/app/helpers/alchemy/admin/contents_helper.rb +2 -2
  53. data/app/helpers/alchemy/admin/elements_helper.rb +2 -3
  54. data/app/helpers/alchemy/base_helper.rb +6 -5
  55. data/app/helpers/alchemy/elements_helper.rb +2 -2
  56. data/app/helpers/alchemy/essences_helper.rb +4 -5
  57. data/app/helpers/alchemy/pages_helper.rb +15 -79
  58. data/app/helpers/alchemy/url_helper.rb +67 -0
  59. data/app/mailers/alchemy/messages.rb +1 -1
  60. data/app/mailers/alchemy/notifications.rb +1 -1
  61. data/app/models/alchemy/attachment.rb +11 -2
  62. data/app/models/alchemy/cell.rb +20 -10
  63. data/app/models/alchemy/content.rb +4 -3
  64. data/app/models/alchemy/element.rb +170 -178
  65. data/app/models/alchemy/language/code.rb +4 -1
  66. data/app/models/alchemy/message.rb +19 -3
  67. data/app/models/alchemy/page.rb +45 -40
  68. data/app/models/alchemy/picture.rb +24 -2
  69. data/app/models/alchemy/user.rb +2 -3
  70. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +12 -12
  71. data/app/views/alchemy/admin/attachments/_attachment.html.erb +1 -1
  72. data/app/views/alchemy/admin/attachments/create.js.erb +1 -0
  73. data/app/views/alchemy/admin/attachments/edit.html.erb +9 -3
  74. data/app/views/alchemy/admin/attachments/index.html.erb +3 -2
  75. data/app/views/alchemy/admin/contents/_missing.html.erb +1 -1
  76. data/app/views/alchemy/admin/contents/create.js.erb +54 -0
  77. data/app/views/alchemy/admin/contents/new.html.erb +9 -4
  78. data/app/views/alchemy/admin/elements/{_add_content.html.erb → _add_picture.html.erb} +4 -4
  79. data/app/views/alchemy/admin/elements/_elements_select.html.erb +2 -1
  80. data/app/views/alchemy/admin/elements/_new_element_form.html.erb +1 -1
  81. data/app/views/alchemy/admin/elements/{_picture_editor.html.erb → _picture_gallery_editor.html.erb} +7 -11
  82. data/app/views/alchemy/admin/elements/fold.js.erb +46 -0
  83. data/app/views/alchemy/admin/elements/index.html.erb +24 -24
  84. data/app/views/alchemy/admin/elements/list.js.erb +11 -9
  85. data/app/views/alchemy/admin/essence_files/assign.js.erb +3 -1
  86. data/app/views/alchemy/admin/essence_pictures/destroy.js.erb +28 -0
  87. data/app/views/alchemy/admin/pages/_contactform_links.html.erb +8 -6
  88. data/app/views/alchemy/admin/pages/_external_link.html.erb +11 -9
  89. data/app/views/alchemy/admin/pages/_file_link.html.erb +10 -8
  90. data/app/views/alchemy/admin/pages/_internal_link.html.erb +14 -10
  91. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -1
  92. data/app/views/alchemy/admin/pages/_page.html.erb +1 -1
  93. data/app/views/alchemy/admin/pages/_page_for_links.html.erb +32 -21
  94. data/app/views/alchemy/admin/pages/configure.html.erb +2 -2
  95. data/app/views/alchemy/admin/pages/configure_external.html.erb +13 -13
  96. data/app/views/alchemy/admin/pages/edit.html.erb +2 -2
  97. data/app/views/alchemy/admin/pages/index.html.erb +26 -24
  98. data/app/views/alchemy/admin/pages/link.html.erb +2 -5
  99. data/app/views/alchemy/admin/partials/_upload_form.html.erb +28 -12
  100. data/app/views/alchemy/admin/pictures/_archive.html.erb +54 -0
  101. data/app/views/alchemy/admin/pictures/_archive_overlay.html.erb +10 -7
  102. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +21 -22
  103. data/app/views/alchemy/admin/pictures/_filter_bar.html.erb +31 -0
  104. data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +9 -0
  105. data/app/views/alchemy/admin/pictures/_picture.html.erb +36 -6
  106. data/app/views/alchemy/admin/pictures/_tag_list.html.erb +27 -0
  107. data/app/views/alchemy/admin/pictures/archive_overlay.js.erb +3 -1
  108. data/app/views/alchemy/admin/pictures/create.js.erb +4 -5
  109. data/app/views/alchemy/admin/pictures/edit.html.erb +26 -0
  110. data/app/views/alchemy/admin/pictures/edit_multiple.html.erb +39 -0
  111. data/app/views/alchemy/admin/pictures/index.html.erb +81 -70
  112. data/app/views/alchemy/admin/pictures/index.js.erb +3 -0
  113. data/app/views/alchemy/admin/pictures/new.html.erb +1 -0
  114. data/app/views/alchemy/admin/resources/index.html.erb +3 -1
  115. data/app/views/alchemy/admin/users/_table.html.erb +1 -1
  116. data/app/views/alchemy/admin/users/index.html.erb +27 -23
  117. data/app/views/alchemy/elements/_article_editor.html.erb +7 -2
  118. data/app/views/alchemy/elements/_bild_editor.html.erb +1 -1
  119. data/app/views/alchemy/elements/_bild_text_editor.html.erb +6 -1
  120. data/app/views/alchemy/elements/_bild_text_view.html.erb +3 -3
  121. data/app/views/alchemy/elements/_image_mosaic_editor.html.erb +1 -1
  122. data/app/views/alchemy/elements/_image_mosaic_view.html.erb +2 -2
  123. data/app/views/alchemy/elements/_intro_image_text_view.html.erb +4 -4
  124. data/app/views/alchemy/elements/_searchresult_editor.html.erb +4 -1
  125. data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +1 -1
  126. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +2 -3
  127. data/app/views/alchemy/essences/_essence_picture_tools.html.erb +1 -1
  128. data/app/views/alchemy/search/_form.html.erb +8 -0
  129. data/app/views/alchemy/search/_result.html.erb +3 -2
  130. data/app/views/alchemy/search/_results.html.erb +28 -0
  131. data/app/views/alchemy/user_sessions/leave.html.erb +4 -4
  132. data/app/views/alchemy/user_sessions/login.html.erb +1 -2
  133. data/app/views/layouts/alchemy/admin.html.erb +30 -10
  134. data/app/views/layouts/alchemy/login.html.erb +2 -39
  135. data/config/alchemy/elements.yml +1 -2
  136. data/config/alchemy/page_layouts.yml +8 -5
  137. data/config/authorization_rules.rb +27 -18
  138. data/config/initializers/localeapp.rb +9 -0
  139. data/config/locales/alchemy.de.yml +93 -56
  140. data/config/locales/alchemy.en.yml +73 -50
  141. data/config/routes.rb +3 -1
  142. data/db/migrate/20120704181529_add_upload_hash_to_alchemy_picture.rb +5 -0
  143. data/db/migrate/20120705214247_acts_as_taggable_on_migration.rb +28 -0
  144. data/db/migrate/20120728185830_add_cached_tag_list_to_alchemy_pictures.rb +5 -0
  145. data/db/migrate/20120831135441_set_alchemy_languages_country_code_default_to_empty_string.rb +9 -0
  146. data/lib/alchemy/capistrano.rb +2 -2
  147. data/lib/alchemy/essence.rb +14 -0
  148. data/lib/alchemy/page_layout.rb +0 -6
  149. data/lib/alchemy/resource.rb +9 -15
  150. data/lib/alchemy/upgrader.rb +18 -3
  151. data/lib/alchemy/version.rb +5 -1
  152. data/lib/alchemy_cms.rb +4 -1
  153. data/lib/rails/generators/alchemy/deploy_script/deploy_script_generator.rb +16 -6
  154. data/lib/rails/generators/alchemy/deploy_script/templates/deploy.rb.tt +17 -3
  155. data/lib/rails/generators/alchemy/elements/elements_generator.rb +6 -1
  156. data/lib/rails/generators/alchemy/elements/templates/editor.html.erb +10 -1
  157. data/lib/rails/generators/alchemy/elements/templates/view.html.erb +17 -18
  158. data/lib/rails/generators/alchemy/scaffold/files/pages.html.erb +4 -2
  159. data/lib/tasks/fleximage.rake +2 -2
  160. data/spec/controllers/admin/contents_controller_spec.rb +2 -2
  161. data/spec/controllers/admin/elements_controller_spec.rb +30 -1
  162. data/spec/controllers/admin/pages_controller_spec.rb +35 -18
  163. data/spec/controllers/admin/trash_controller_spec.rb +40 -16
  164. data/spec/controllers/attachments_controller_spec.rb +62 -0
  165. data/spec/controllers/base_controller_spec.rb +43 -42
  166. data/spec/controllers/elements_controller_spec.rb +30 -0
  167. data/spec/controllers/pages_controller_spec.rb +22 -5
  168. data/spec/controllers/pictures_controller_spec.rb +82 -0
  169. data/spec/dummy/app/models/event.rb +2 -1
  170. data/spec/dummy/config/database.yml +3 -2
  171. data/spec/dummy/db/schema.rb +51 -27
  172. data/spec/factories.rb +29 -8
  173. data/spec/helpers/admin/base_helper_spec.rb +134 -21
  174. data/spec/helpers/admin/contents_helper_spec.rb +2 -2
  175. data/spec/helpers/admin/elements_helper_spec.rb +17 -9
  176. data/spec/helpers/admin/essences_helper_spec.rb +7 -6
  177. data/spec/helpers/essences_helper_spec.rb +8 -7
  178. data/spec/helpers/pages_helper_spec.rb +208 -325
  179. data/spec/helpers/url_helper_spec.rb +171 -0
  180. data/spec/integration/admin/link_overlay_spec.rb +53 -0
  181. data/spec/integration/admin/modules_integration_spec.rb +22 -26
  182. data/spec/integration/admin/pages_controller_spec.rb +10 -19
  183. data/spec/integration/admin/picture_library_integration_spec.rb +52 -0
  184. data/spec/integration/admin/resources_integration_spec.rb +68 -75
  185. data/spec/integration/pages_controller_spec.rb +70 -61
  186. data/spec/integration/security_spec.rb +3 -5
  187. data/spec/integration/translation_integration_spec.rb +56 -0
  188. data/spec/libraries/essence_spec.rb +18 -0
  189. data/spec/libraries/resource_spec.rb +101 -79
  190. data/spec/libraries/resources_helper_spec.rb +3 -0
  191. data/spec/models/content_spec.rb +63 -60
  192. data/spec/models/element_spec.rb +203 -93
  193. data/spec/models/language_spec.rb +90 -65
  194. data/spec/models/page_layout_spec.rb +37 -0
  195. data/spec/models/page_spec.rb +181 -113
  196. data/spec/models/picture_spec.rb +73 -26
  197. data/spec/models/resource_spec.rb +52 -23
  198. data/spec/support/alchemy/specs_helpers.rb +2 -0
  199. data/spec/support/image.png +0 -0
  200. data/spec/{helpers/url_helpers_spec.rb → url_helpers_spec.rb} +0 -0
  201. data/vendor/assets/javascripts/jquery_plugins/jquery.selectBoxIt.js +1909 -0
  202. data/vendor/assets/javascripts/jquery_plugins/preloadCssImages.jQuery_v5.js +152 -0
  203. metadata +106 -33
  204. data/app/assets/stylesheets/alchemy/buttons.css.scss +0 -361
  205. data/app/assets/stylesheets/alchemy/jquery.sb.css.scss +0 -260
  206. data/app/views/alchemy/admin/contents/create.js.coffee +0 -49
  207. data/app/views/alchemy/admin/elements/fold.js.coffee +0 -37
  208. data/app/views/alchemy/admin/essence_pictures/destroy.js.coffee +0 -19
  209. data/app/views/alchemy/admin/pictures/_pictures_list.html.erb +0 -16
  210. data/app/views/alchemy/admin/pictures/update.js.erb +0 -3
  211. data/spec/dummy/config/locales/en.yml +0 -5
  212. data/spec/dummy/config/locales/fo.yml +0 -5
  213. data/spec/page_layout_spec.rb +0 -35
  214. data/vendor/assets/javascripts/jquery_plugins/jquery.in-place-edit.js +0 -172
  215. data/vendor/assets/javascripts/jquery_plugins/jquery.sb.min.js +0 -14
@@ -4,17 +4,21 @@ module Alchemy
4
4
  module Generators
5
5
  class DeployScriptGenerator < ::Rails::Generators::Base
6
6
 
7
- desc "This generator generates a Capistrano deploy script."
8
- class_option :scm, :type => :string, :desc => "Set the type of scm you use for deployment.", :default => 'svn'
7
+ desc "This generator generates a Capistrano receipt for deploying Alchemy CMS."
8
+ class_option :scm, :type => :string, :desc => "Set the type of scm you use for deployment.", :default => 'git'
9
9
  class_option :db, :type => :string, :desc => "Set the type of database you use on your server.", :default => 'mysql'
10
10
  source_root File.expand_path('templates', File.dirname(__FILE__))
11
11
 
12
12
  def copy_script
13
- @ssh_user = ask('Please enter SSH username:')
14
- @ssh_password = ask('Please enter SSH password:')
15
- port = ask('Please enter SSH port (22):')
16
- @ssh_port = port.blank? ? 22 : port
17
13
  @server = ask('Please enter server ip or domain:')
14
+ if !yes?('Do you use ssh public keys to connect to your server? (y/N)')
15
+ if @store_credentials = yes?('Do want to store the ssh credentials? (PLEASE DO NOT STORE THEM IF THE REPOSITORY IS PUBLIC) (y/N)')
16
+ @ssh_user = ask('Please enter ssh username:')
17
+ @ssh_password = ask('Please enter ssh password:')
18
+ port = ask('Please enter ssh port (22):')
19
+ @ssh_port = port.blank? ? "22" : port
20
+ end
21
+ end
18
22
  @deploy_path = ask('Please enter the path to the public html folder:')
19
23
  @scm = options[:scm]
20
24
  @repository_url = ask('Please enter the URL to your projects repository:')
@@ -24,6 +28,12 @@ module Alchemy
24
28
  end
25
29
  @database_type = options[:db]
26
30
  template "deploy.rb.tt", Rails.root.join('config', 'deploy.rb')
31
+ puts "\nSetting up Capistrano"
32
+ `capify .`
33
+ puts "\nWe are done!\n"
34
+ puts "\nPlease run 'cap deploy:setup'\n to setup the server for deployment."
35
+ puts "\nIf you want to deploy Alchemy the first time type:\ncap deploy:cold"
36
+ puts "\nAfter the first deploy you just need to type:\ncap deploy"
27
37
  end
28
38
 
29
39
  end
@@ -3,9 +3,21 @@ require 'alchemy/capistrano'
3
3
  load 'deploy/assets'
4
4
 
5
5
  # ssh settings
6
+ <%- if @ssh_user.blank? -%>
7
+ set(:user) { Capistrano::CLI.ui.ask('Enter your ssh username: ') }
8
+ <%- else -%>
6
9
  set :user, "<%= @ssh_user %>"
10
+ <%- end -%>
11
+ <%- if @ssh_password.blank? -%>
12
+ set(:password) { Capistrano::CLI.password_prompt("Enter the password for #{user}: ") }
13
+ <%- else -%>
7
14
  set :password, "<%= @ssh_password %>"
8
- set :port, <%= @ssh_port || 22 %>
15
+ <%- end -%>
16
+ <%- if @ssh_port != "22" && !@store_credentials -%>
17
+ set(:port) { Capistrano::CLI.ui.ask('Enter the ssh port: ') }
18
+ <%- elsif @ssh_port != "22" && @store_credentials -%>
19
+ set :port, <%= @ssh_port %>
20
+ <%- end -%>
9
21
 
10
22
  # domain names
11
23
  role :app, "<%= @server %>"
@@ -45,9 +57,10 @@ after "deploy", "deploy:cleanup"
45
57
 
46
58
  # special tasks
47
59
 
48
- namespace :logs do
60
+ namespace :log do
61
+
49
62
  desc "show last 100 lines of log"
50
- task :tail do
63
+ task :show do
51
64
  run "tail -n100 #{shared_path}/log/#{rails_env}.log"
52
65
  end
53
66
 
@@ -55,6 +68,7 @@ namespace :logs do
55
68
  task :watch do
56
69
  stream("tail -f #{shared_path}/log/#{rails_env}.log")
57
70
  end
71
+
58
72
  end
59
73
 
60
74
  namespace :deploy do
@@ -15,7 +15,12 @@ module Alchemy
15
15
  @elements = get_elements_from_yaml
16
16
  @elements.each do |element|
17
17
  @element = element
18
- @contents = (element["contents"] or [])
18
+ if @element['available_contents']
19
+ @available_contents_names = @element['available_contents'].collect { |c| c['name'] }
20
+ @contents = (element["contents"].delete_if { |c| @available_contents_names.include?(c['name']) } or [])
21
+ else
22
+ @contents = (element["contents"] or [])
23
+ end
19
24
  @element_name = element["name"].underscore
20
25
  template "editor.html.erb", "#{@elements_dir}/_#{@element_name}_editor.html.erb"
21
26
  template "view.html.erb", "#{@elements_dir}/_#{@element_name}_view.html.erb"
@@ -1,3 +1,12 @@
1
- <%- @contents.each do |content| -%>
1
+ <%- if @element['picture_gallery'] -%>
2
+ <%%= render_picture_gallery_editor(element, :max_images => nil, :crop => true) %>
3
+ <%- end -%>
4
+ <% @contents.each do |content| -%>
2
5
  <%%= render_essence_editor_by_name(element, '<%= content["name"] %>') %>
6
+ <% end -%>
7
+ <%- if @element['available_contents'] -%>
8
+ <%% element.contents.where(:name => ['<%= @available_contents_names.join("', '") %>']).each do |content| %>
9
+ <%%= render_essence_editor content %>
10
+ <%% end %>
11
+ <p><%%= render_new_content_link(element) %></p>
3
12
  <%- end -%>
@@ -1,21 +1,20 @@
1
- <div class="<%= @element_name %>" id="<%%= element_dom_id(element) %>"<%%= element_preview_code(element) -%>>
2
- <%- unless @contents.blank? -%>
3
- <%- @contents.each do |content| -%>
4
- <%- if content["type"] == "Alchemy::EssencePicture" -%>
5
- <div class="<%= @element_name %>_images">
6
- <%%- element.all_contents_by_type("Alchemy::EssencePicture").each do |content| -%>
7
- <div class="<%= @element_name %>_image <%%= content.essence.css_class %>">
8
- <%%= render_essence_view(content, :image_size => "160x120") %>
9
- </div>
10
- <%%- end -%>
11
- </div>
12
- <%- elsif @contents.size > 1 -%>
13
- <div class="<%= content["name"] %>">
14
- <%%= render_essence_view_by_name(element, '<%= content["name"] %>') %>
15
- </div>
16
- <%- else -%>
17
- <%%= render_essence_view_by_name(element, '<%= content["name"] %>') %>
18
- <%- end -%>
1
+ <div class="<%= @element_name %>" id="<%%= element_dom_id(element) %>"<%%= element_preview_code(element) %>>
2
+ <%- if @element["picture_gallery"] -%>
3
+ <div class="<%= @element_name %>_images">
4
+ <%%- element.contents.gallery_pictures.each do |image| -%>
5
+ <div class="<%= @element_name %>_image <%%= image.essence.css_class %>">
6
+ <%%= render_essence_view(image, :image_size => "160x120") %>
7
+ </div>
8
+ <%%- end -%>
9
+ </div>
10
+ <%- end -%>
11
+ <%- @contents.each do |content| -%>
12
+ <%- if @contents.length > 1 -%>
13
+ <div class="<%= content["name"] %>">
14
+ <%%= render_essence_view_by_name(element, '<%= content["name"] %>') %>
15
+ </div>
16
+ <%- else -%>
17
+ <%%= render_essence_view_by_name(element, '<%= content["name"] %>') %>
19
18
  <%- end -%>
20
19
  <%- end -%>
21
20
  </div>
@@ -2,9 +2,11 @@
2
2
  <html>
3
3
  <head>
4
4
  <%= render_meta_data %>
5
+ <%= stylesheet_link_tag 'application' %>
5
6
  </head>
6
7
  <body>
7
- <%= yield %>
8
- <%= alchemy_preview_mode_code %>
8
+ <%= yield %>
9
+ <%= alchemy_preview_mode_code %>
10
+ <%= alchemy_menu_bar %>
9
11
  </body>
10
12
  </html>
@@ -11,8 +11,8 @@ namespace :fleximage do
11
11
  model_class.find(:all).each do |obj|
12
12
  if obj.has_image?
13
13
  img = obj.load_image
14
- obj.update_attribute :image_width, img.columns if obj.respond_to?(:image_width=)
15
- obj.update_attribute :image_height, img.rows if obj.respond_to?(:image_height=)
14
+ obj.update_column :image_width, img.columns if obj.respond_to?(:image_width=)
15
+ obj.update_column :image_height, img.rows if obj.respond_to?(:image_height=)
16
16
  end
17
17
  end
18
18
  end
@@ -23,7 +23,7 @@ describe Alchemy::Admin::ContentsController do
23
23
  describe '#update' do
24
24
 
25
25
  it "should update a content via ajax" do
26
- @element = FactoryGirl.create(:element)
26
+ @element = FactoryGirl.create(:element, :create_contents_after_create => true)
27
27
  post :update, {:id => @element.contents.find_by_name('intro').id, :content => {:body => 'Peters Petshop'}, :format => :js}
28
28
  @element.ingredient('intro').should == "Peters Petshop"
29
29
  end
@@ -35,7 +35,7 @@ describe Alchemy::Admin::ContentsController do
35
35
  context "with content_ids in params" do
36
36
 
37
37
  before(:each) do
38
- @element = FactoryGirl.create(:element)
38
+ @element = FactoryGirl.create(:element, :create_contents_after_create => true)
39
39
  end
40
40
 
41
41
  it "should reorder the contents" do
@@ -73,10 +73,39 @@ module Alchemy
73
73
 
74
74
  describe '#create' do
75
75
 
76
- render_views
76
+ context "with cells" do
77
+
78
+ before do
79
+ @page = FactoryGirl.create(:public_page, :do_not_autogenerate => false)
80
+ @cell = FactoryGirl.create(:cell, :name => 'header', :page => @page)
81
+ Page.any_instance.stub(:can_have_cells?).and_return(true)
82
+ Cell.stub!(:definition_for).and_return({'name' => 'header', 'elements' => ['article']})
83
+ end
84
+
85
+ context "and cell name in element name" do
86
+
87
+ it "should put the element in the correct cell" do
88
+ post :create, {:element => {:name => "article#header", :page_id => @page.id}}
89
+ @cell.elements.first.should be_an_instance_of(Element)
90
+ end
91
+
92
+ end
93
+
94
+ context "and no cell name in element name" do
95
+
96
+ it "should put the element in the main cell" do
97
+ post :create, {:element => {:name => "article", :page_id => @page.id}}
98
+ @page.elements.not_in_cell.first.should be_an_instance_of(Element)
99
+ end
100
+
101
+ end
102
+
103
+ end
77
104
 
78
105
  context "with paste_from_clipboard in parameters" do
79
106
 
107
+ render_views
108
+
80
109
  let(:clipboard) { session[:clipboard] = Clipboard.new }
81
110
  let(:element_in_clipboard) { @element ||= FactoryGirl.create(:element, :page_id => page.id) }
82
111
 
@@ -44,8 +44,8 @@ module Alchemy
44
44
  context "with paste_from_clipboard in parameters" do
45
45
 
46
46
  let(:clipboard) { session[:clipboard] = Clipboard.new }
47
- let(:page_in_clipboard) { @page ||= FactoryGirl.create(:public_page) }
48
- let(:parent) { @page ||= FactoryGirl.create(:public_page) }
47
+ let(:page_in_clipboard) { FactoryGirl.create(:public_page) }
48
+ let(:parent) { FactoryGirl.create(:public_page) }
49
49
 
50
50
  before(:each) do
51
51
  clipboard[:pages] = [{:id => page_in_clipboard.id, :action => 'cut'}]
@@ -63,32 +63,49 @@ module Alchemy
63
63
 
64
64
  describe '#copy_language_tree' do
65
65
 
66
+ let(:language) { Language.get_default }
67
+ let(:new_language) { FactoryGirl.create(:klingonian) }
68
+ let(:language_root) { FactoryGirl.create(:language_root_page, :language => language) }
69
+ let(:new_lang_root) { Page.language_root_for(new_language.id) }
70
+
66
71
  before(:each) do
67
- @language = Language.get_default
68
- @language_root = FactoryGirl.create(:language_root_page, :language => @language, :name => 'Intro')
69
- @level_1 = FactoryGirl.create(:public_page, :language => @language, :parent_id => @language_root.id, :visible => true, :name => 'Level 1')
70
- @level_2 = FactoryGirl.create(:public_page, :language => @language, :parent_id => @level_1.id, :visible => true, :name => 'Level 2')
71
- @level_3 = FactoryGirl.create(:public_page, :language => @language, :parent_id => @level_2.id, :visible => true, :name => 'Level 3')
72
- @level_4 = FactoryGirl.create(:public_page, :language => @language, :parent_id => @level_3.id, :visible => true, :name => 'Level 4')
73
- @new_language = FactoryGirl.create(:language)
74
- session[:language_code] = @new_language.code
75
- session[:language_id] = @new_language.id
76
- post :copy_language_tree, {:languages => {:new_lang_id => @new_language.id, :old_lang_id => @language.id}}
77
- @new_lang_root = Page.language_root_for(@new_language.id)
72
+ level_1 = FactoryGirl.create(:public_page, :parent_id => language_root.id, :visible => true, :name => 'Level 1')
73
+ level_2 = FactoryGirl.create(:public_page, :parent_id => level_1.id, :visible => true, :name => 'Level 2')
74
+ level_3 = FactoryGirl.create(:public_page, :parent_id => level_2.id, :visible => true, :name => 'Level 3')
75
+ level_4 = FactoryGirl.create(:public_page, :parent_id => level_3.id, :visible => true, :name => 'Level 4')
76
+ session[:language_code] = new_language.code
77
+ session[:language_id] = new_language.id
78
+ post :copy_language_tree, {:languages => {:new_lang_id => new_language.id, :old_lang_id => language.id}}
78
79
  end
79
80
 
80
81
  it "should copy all pages" do
81
- @new_lang_root.should_not be_nil
82
- @new_lang_root.descendants.count.should == 4
83
- @new_lang_root.descendants.collect(&:name).should == ["Level 1 (Copy)", "Level 2 (Copy)", "Level 3 (Copy)", "Level 4 (Copy)"]
82
+ new_lang_root.should_not be_nil
83
+ new_lang_root.descendants.count.should == 4
84
+ new_lang_root.descendants.collect(&:name).should == ["Level 1 (Copy)", "Level 2 (Copy)", "Level 3 (Copy)", "Level 4 (Copy)"]
84
85
  end
85
86
 
86
87
  it "should not set layoutpage attribute to nil" do
87
- @new_lang_root.layoutpage.should_not be_nil
88
+ new_lang_root.layoutpage.should_not be_nil
88
89
  end
89
90
 
90
91
  it "should not set layoutpage attribute to true" do
91
- @new_lang_root.layoutpage.should_not be_true
92
+ new_lang_root.layoutpage.should_not be_true
93
+ end
94
+
95
+ end
96
+
97
+ describe '#destroy' do
98
+
99
+ let(:clipboard) { session[:clipboard] = Clipboard.new }
100
+ let(:page) { FactoryGirl.create(:public_page) }
101
+
102
+ before do
103
+ clipboard[:pages] = [{:id => page.id}]
104
+ end
105
+
106
+ it "should also remove the page from clipboard" do
107
+ post :destroy, {:id => page.id, :_method => :delete}
108
+ clipboard[:pages].should be_empty
92
109
  end
93
110
 
94
111
  end
@@ -1,7 +1,5 @@
1
1
  require 'spec_helper'
2
2
 
3
-
4
-
5
3
  module Alchemy
6
4
  module Admin
7
5
 
@@ -9,38 +7,64 @@ module Alchemy
9
7
 
10
8
  render_views
11
9
 
12
- before(:each) do
13
- activate_authlogic
14
- UserSession.create FactoryGirl.create(:admin_user)
15
- end
16
-
17
10
  let(:page) do
18
11
  FactoryGirl.create(:page, :parent_id => Page.rootpage.id)
19
12
  end
20
13
 
21
14
  let(:element) do
22
- FactoryGirl.create(:element, :public => false)
15
+ FactoryGirl.create(:element, :public => false, :page => page)
23
16
  end
24
17
 
25
- it "should hold trashed elements" do
26
- # Because of a before_create filter it can not be created with a nil position and needs to be trashed here
18
+ before do
19
+ activate_authlogic
20
+ UserSession.create FactoryGirl.create(:admin_user)
27
21
  element.trash
22
+ end
23
+
24
+ it "should hold trashed elements" do
28
25
  get :index, :page_id => page.id
29
- response.body.should have_selector("#trash_items #element_#{element.id}.element_editor")
26
+ response.body.should have_selector("#element_#{element.id}.element_editor")
30
27
  end
31
28
 
32
29
  it "should not hold elements that are not trashed" do
33
- element = FactoryGirl.create(:element, :page_id => 5, :public => false)
30
+ element = FactoryGirl.create(:element, :page => page, :public => false)
34
31
  get :index, :page_id => page.id
35
- response.body.should_not have_selector("#trash_items #element_#{element.id}.element_editor")
32
+ response.body.should_not have_selector("#element_#{element.id}.element_editor")
33
+ end
34
+
35
+ context "with unique elements inside the trash" do
36
+
37
+ before do
38
+ Element.stub!(:all_definitions_for).and_return([
39
+ {'name' => element.name, 'unique' => true}
40
+ ])
41
+ end
42
+
43
+ context "and no unique elements on the page" do
44
+
45
+ it "unique elements should be draggable" do
46
+ get :index, :page_id => page.id
47
+ response.body.should have_selector("#element_#{element.id}.element_editor.draggable")
48
+ end
49
+
50
+ end
51
+
52
+ context "and with an unique element on the page" do
53
+
54
+ it "unique elements should not be draggable" do
55
+ FactoryGirl.create(:element, :page => page, :public => false)
56
+ get :index, :page_id => page.id
57
+ response.body.should have_selector("#element_#{element.id}.element_editor.not-draggable")
58
+ end
59
+
60
+ end
61
+
36
62
  end
37
63
 
38
64
  context "#clear" do
39
65
 
40
66
  it "should destroy all containing elements" do
41
- # Because of a before_create filter it can not be created with a nil position and needs to be trashed here
42
- element.trash
43
- post :clear, {:page_id => 1}
67
+ post :clear, {:page_id => page.id}
44
68
  Element.trashed.should be_empty
45
69
  end
46
70
 
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+
3
+ # Fixes missing method tempfile error
4
+ class Rack::Test::UploadedFile
5
+ attr_reader :tempfile
6
+ end
7
+
8
+ module Alchemy
9
+ describe AttachmentsController do
10
+
11
+ let(:page) { FactoryGirl.create(:public_page, :restricted => true) }
12
+ let(:element) { FactoryGirl.create(:element, :page => page, :name => 'download', :create_contents_after_create => true) }
13
+ let(:attachment) { Attachment.create(:uploaded_data => fixture_file_upload(File.expand_path('../../support/image.png', __FILE__), 'image/png')) }
14
+
15
+ before do
16
+ essence = element.contents.where(:name => 'file').first.essence
17
+ essence.attachment_id = attachment.id
18
+ essence.save
19
+ end
20
+
21
+ it "should not be possible to download attachments from restricted pages" do
22
+ get :download, :id => attachment.id
23
+ response.status.should == 302
24
+ response.should redirect_to(login_path)
25
+ end
26
+
27
+ context "as registered user" do
28
+
29
+ before do
30
+ activate_authlogic
31
+ UserSession.create(FactoryGirl.create(:registered_user))
32
+ end
33
+
34
+ it "should be possible to download attachments from restricted pages" do
35
+ get :download, :id => attachment.id
36
+ response.status.should == 200
37
+ end
38
+
39
+ end
40
+
41
+ it "should not be possible to see attachments from restricted pages" do
42
+ get :show, :id => attachment.id
43
+ response.status.should == 302
44
+ response.should redirect_to(login_path)
45
+ end
46
+
47
+ context "as registered user" do
48
+
49
+ before do
50
+ activate_authlogic
51
+ UserSession.create(FactoryGirl.create(:registered_user))
52
+ end
53
+
54
+ it "should be possible to see attachments from restricted pages" do
55
+ get :show, :id => attachment.id
56
+ response.status.should == 200
57
+ end
58
+
59
+ end
60
+
61
+ end
62
+ end