alchemy_cms 3.2.0.beta → 3.2.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +661 -863
  3. data/README.md +5 -63
  4. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +11 -10
  5. data/app/assets/javascripts/alchemy/alchemy.initializer.js.coffee +6 -0
  6. data/app/assets/stylesheets/alchemy/_extends.scss +0 -6
  7. data/app/assets/stylesheets/alchemy/_mixins.scss +6 -0
  8. data/app/assets/stylesheets/alchemy/buttons.scss +1 -1
  9. data/app/assets/stylesheets/alchemy/elements.scss +1 -1
  10. data/app/assets/stylesheets/alchemy/menubar.scss +1 -1
  11. data/app/assets/stylesheets/alchemy/selects.scss +5 -1
  12. data/app/assets/stylesheets/alchemy/upload.scss +1 -1
  13. data/app/controllers/alchemy/admin/pages_controller.rb +1 -1
  14. data/app/controllers/alchemy/base_controller.rb +4 -57
  15. data/app/controllers/alchemy/messages_controller.rb +2 -2
  16. data/app/controllers/alchemy/pages_controller.rb +22 -31
  17. data/app/controllers/alchemy/pictures_controller.rb +2 -2
  18. data/app/helpers/alchemy/admin/base_helper.rb +7 -0
  19. data/app/helpers/alchemy/admin/elements_helper.rb +31 -15
  20. data/app/helpers/alchemy/admin/pages_helper.rb +17 -0
  21. data/app/helpers/alchemy/base_helper.rb +0 -28
  22. data/app/helpers/alchemy/pages_helper.rb +18 -12
  23. data/app/helpers/alchemy/url_helper.rb +2 -2
  24. data/app/models/alchemy/cell.rb +1 -1
  25. data/app/models/alchemy/content/factory.rb +12 -6
  26. data/app/models/alchemy/element.rb +3 -3
  27. data/app/models/alchemy/element/definitions.rb +1 -1
  28. data/app/models/alchemy/element_to_page.rb +7 -0
  29. data/app/models/alchemy/language.rb +1 -1
  30. data/app/models/alchemy/page.rb +8 -1
  31. data/app/models/alchemy/page/page_cells.rb +2 -2
  32. data/app/models/alchemy/page/page_elements.rb +23 -5
  33. data/app/models/alchemy/page/page_natures.rb +3 -3
  34. data/app/models/alchemy/page/page_scopes.rb +1 -1
  35. data/app/models/alchemy/picture.rb +1 -1
  36. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +1 -1
  37. data/app/views/alchemy/admin/pages/_form.html.erb +1 -1
  38. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -1
  39. data/app/views/alchemy/breadcrumb/_page.html.erb +3 -2
  40. data/app/views/alchemy/breadcrumb/_separator.html.erb +1 -0
  41. data/app/views/alchemy/breadcrumb/_wrapper.html.erb +13 -0
  42. data/app/views/alchemy/language_links/_language.html.erb +1 -1
  43. data/app/views/alchemy/navigation/_link.html.erb +1 -1
  44. data/app/views/alchemy/pages/show.rss.builder +5 -7
  45. data/app/views/layouts/alchemy/admin.html.erb +5 -0
  46. data/config/routes.rb +13 -10
  47. data/lib/alchemy/configuration_methods.rb +29 -0
  48. data/lib/alchemy/controller_actions.rb +12 -4
  49. data/lib/alchemy/engine.rb +3 -0
  50. data/lib/alchemy/errors.rb +1 -1
  51. data/lib/alchemy/essence.rb +14 -12
  52. data/lib/alchemy/on_page_layout.rb +58 -0
  53. data/lib/alchemy/page_layout.rb +1 -1
  54. data/lib/alchemy/permissions.rb +21 -16
  55. data/lib/alchemy/routing_constraints.rb +49 -0
  56. data/lib/alchemy/seeder.rb +4 -2
  57. data/lib/alchemy/ssl_protection.rb +30 -0
  58. data/lib/alchemy/test_support/essence_shared_examples.rb +118 -25
  59. data/lib/alchemy/test_support/factories.rb +5 -8
  60. data/lib/alchemy/test_support/integration_helpers.rb +16 -10
  61. data/lib/alchemy/upgrader/three_point_two.rb +34 -4
  62. data/lib/alchemy/version.rb +1 -1
  63. data/lib/rails/generators/alchemy/{scaffold → install}/files/_article_editor.html.erb +0 -0
  64. data/lib/rails/generators/alchemy/{scaffold → install}/files/_article_view.html.erb +0 -0
  65. data/lib/rails/generators/alchemy/{scaffold → install}/files/_standard.html.erb +0 -0
  66. data/lib/rails/generators/alchemy/{scaffold → install}/files/alchemy.de.yml +0 -0
  67. data/lib/rails/generators/alchemy/{scaffold → install}/files/alchemy.elements.css.scss +0 -0
  68. data/lib/rails/generators/alchemy/{scaffold → install}/files/alchemy.en.yml +0 -0
  69. data/lib/rails/generators/alchemy/{scaffold → install}/files/alchemy.es.yml +0 -0
  70. data/lib/rails/generators/alchemy/{scaffold → install}/files/application.html.erb +0 -0
  71. data/lib/rails/generators/alchemy/install/install_generator.rb +69 -0
  72. data/lib/rails/generators/alchemy/{scaffold/files/elements.yml → install/templates/elements.yml.tt} +2 -0
  73. data/lib/rails/generators/alchemy/{scaffold → install}/templates/page_layouts.yml.tt +2 -0
  74. data/lib/rails/generators/alchemy/views/views_generator.rb +41 -0
  75. data/lib/rails/templates/alchemy.rb +2 -2
  76. data/lib/tasks/alchemy/db.rake +0 -5
  77. data/lib/tasks/alchemy/install.rake +10 -5
  78. data/lib/tasks/alchemy/tidy.rake +2 -0
  79. data/spec/controllers/admin/attachments_controller_spec.rb +1 -1
  80. data/spec/controllers/admin/clipboard_controller_spec.rb +1 -1
  81. data/spec/controllers/admin/contents_controller_spec.rb +1 -1
  82. data/spec/controllers/admin/dashboard_controller_spec.rb +2 -2
  83. data/spec/controllers/admin/elements_controller_spec.rb +1 -1
  84. data/spec/controllers/admin/essence_files_controller_spec.rb +1 -1
  85. data/spec/controllers/admin/essence_pictures_controller_spec.rb +1 -1
  86. data/spec/controllers/admin/languages_controller_spec.rb +1 -1
  87. data/spec/controllers/admin/layoutpages_controller_spec.rb +1 -1
  88. data/spec/controllers/admin/pages_controller_spec.rb +4 -4
  89. data/spec/controllers/admin/pictures_controller_spec.rb +1 -1
  90. data/spec/controllers/admin/resources_controller_spec.rb +1 -1
  91. data/spec/controllers/admin/trash_controller_spec.rb +1 -1
  92. data/spec/controllers/alchemy/admin/tags_controller_spec.rb +1 -1
  93. data/spec/controllers/attachments_controller_spec.rb +1 -1
  94. data/spec/controllers/base_controller_spec.rb +22 -0
  95. data/spec/controllers/elements_controller_spec.rb +1 -1
  96. data/spec/controllers/pages_controller_spec.rb +15 -16
  97. data/spec/controllers/pictures_controller_spec.rb +212 -162
  98. data/spec/dummy/app/controllers/login_controller.rb +5 -0
  99. data/spec/dummy/app/models/dummy_model.rb +3 -0
  100. data/spec/dummy/config/alchemy/cells.yml +4 -1
  101. data/spec/dummy/config/alchemy/elements.yml +8 -0
  102. data/spec/dummy/config/alchemy/page_layouts.yml +5 -1
  103. data/spec/dummy/config/routes.rb +1 -2
  104. data/spec/dummy/db/migrate/20150412103152_create_dummy_model.rb +7 -0
  105. data/spec/dummy/db/schema.rb +30 -26
  106. data/spec/features/admin/dashboard_spec.rb +11 -9
  107. data/spec/features/admin/language_tree_feature_spec.rb +5 -6
  108. data/spec/features/admin/legacy_page_url_management_spec.rb +1 -1
  109. data/spec/features/admin/link_overlay_spec.rb +1 -1
  110. data/spec/features/admin/locale_select_feature_spec.rb +1 -1
  111. data/spec/features/admin/modules_integration_spec.rb +1 -1
  112. data/spec/features/admin/navigation_feature_spec.rb +1 -1
  113. data/spec/features/admin/page_creation_feature_spec.rb +1 -1
  114. data/spec/features/admin/page_editing_feature_spec.rb +3 -3
  115. data/spec/features/admin/picture_library_integration_spec.rb +1 -1
  116. data/spec/features/admin/resources_integration_spec.rb +1 -1
  117. data/spec/features/admin/site_select_feature_spec.rb +32 -0
  118. data/spec/features/admin/tinymce_feature_spec.rb +1 -3
  119. data/spec/features/page_feature_spec.rb +36 -27
  120. data/spec/features/security_spec.rb +1 -1
  121. data/spec/features/translation_integration_spec.rb +3 -3
  122. data/spec/helpers/admin/elements_helper_spec.rb +103 -26
  123. data/spec/helpers/admin/pages_helper_spec.rb +32 -1
  124. data/spec/helpers/base_helper_spec.rb +0 -45
  125. data/spec/helpers/pages_helper_spec.rb +18 -17
  126. data/spec/helpers/url_helper_spec.rb +8 -5
  127. data/spec/libraries/controller_actions_spec.rb +2 -2
  128. data/spec/libraries/on_page_layout_spec.rb +112 -0
  129. data/spec/libraries/page_layout_spec.rb +5 -1
  130. data/spec/libraries/permissions_spec.rb +13 -15
  131. data/spec/models/cell_spec.rb +4 -0
  132. data/spec/models/content_spec.rb +6 -0
  133. data/spec/models/dummy_model_spec.rb +11 -0
  134. data/spec/models/element_spec.rb +6 -1
  135. data/spec/models/element_to_page_spec.rb +14 -0
  136. data/spec/models/page_spec.rb +111 -19
  137. data/spec/routing/routing_spec.rb +120 -101
  138. data/spec/spec_helper.rb +3 -3
  139. metadata +36 -21
  140. data/app/views/alchemy/breadcrumb/_spacer.html.erb +0 -1
  141. data/lib/alchemy/capistrano.rb +0 -230
  142. data/lib/alchemy/test_support/auth_helpers.rb +0 -35
  143. data/lib/rails/generators/alchemy/deploy_script/deploy_script_generator.rb +0 -90
  144. data/lib/rails/generators/alchemy/deploy_script/templates/deploy.rb.tt +0 -113
  145. data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +0 -63
  146. data/spec/dummy/app/controllers/errors_controller.rb +0 -5
@@ -83,7 +83,7 @@ module Alchemy
83
83
  # All pages from +Alchemy::Site.current+
84
84
  #
85
85
  scope :from_current_site, -> {
86
- where(alchemy_languages: {site_id: Site.current || Site.default}).joins(:language)
86
+ where(Language.table_name => {site_id: Site.current || Site.default}).joins(:language)
87
87
  }
88
88
 
89
89
  # All pages for xml sitemap
@@ -71,7 +71,7 @@ module Alchemy
71
71
  }
72
72
 
73
73
  scope :deletable, -> {
74
- where("#{self.table_name}.id NOT IN (SELECT picture_id FROM alchemy_essence_pictures)")
74
+ where("#{table_name}.id NOT IN (SELECT picture_id FROM #{EssencePicture.table_name})")
75
75
  }
76
76
 
77
77
  scope :without_tag, -> {
@@ -49,6 +49,6 @@
49
49
  <% else %>
50
50
  <%= render_message :error do %>
51
51
  <h2>Root page not found.</h2>
52
- <p>Please run <code>rake alchemy:db:seed</code> task.</p>
52
+ <p>Please run <code>bin/rake db:seed</code> task.</p>
53
53
  <% end %>
54
54
  <% end %>
@@ -1,7 +1,7 @@
1
1
  <%= alchemy_form_for [:admin, @page], class: 'edit_page' do |f| %>
2
2
  <%= f.input :page_layout,
3
3
  collection: @page_layouts,
4
- label: @page.layout_description.blank? ? (%(<span class="inline warning icon" title="#{ _t(:page_layout_description_missing) }"></span>&nbsp;) + _t(:page_type)).html_safe : _t(:page_type),
4
+ label: page_layout_label(@page),
5
5
  include_blank: false,
6
6
  input_html: {class: 'alchemy_selectbox'} %>
7
7
  <div class="input check_boxes">
@@ -23,6 +23,6 @@
23
23
  class: 'thumbnail_background'
24
24
  ) %>
25
25
  <div class="picture_name" title="<%= picture_to_assign.name %>">
26
- <%= picture_to_assign.name.empty? ? "&nbsp;" : picture_to_assign.name %>
26
+ <%= picture_to_assign.name %>
27
27
  </div>
28
28
  </div>
@@ -4,12 +4,13 @@
4
4
  <% elsif page == pages.last %>
5
5
  <% css_classes << "last" %>
6
6
  <% end %>
7
+
7
8
  <%= link_to_unless(
8
9
  !options[:link_active_page] && options[:page] == page,
9
10
  h(page.name),
10
11
  show_alchemy_page_path(page),
11
12
  class: css_classes.compact.join(" "),
12
13
  title: page.title
13
- ) do |name, url, html_options| %>
14
+ ) do |name, _url, html_options| %>
14
15
  <%= content_tag :span, name, html_options %>
15
- <% end %>
16
+ <% end %>
@@ -0,0 +1 @@
1
+ <span class="separator"><%= sanitize options[:separator] %></span>
@@ -0,0 +1,13 @@
1
+ <% if pages.any? %>
2
+ <div class="breadcrumb">
3
+ <%= render({
4
+ collection: pages,
5
+ partial: 'alchemy/breadcrumb/page',
6
+ spacer_template: 'alchemy/breadcrumb/separator',
7
+ locals: {
8
+ pages: pages,
9
+ options: options
10
+ }
11
+ }.delete_if { |k, _v| k == :spacer_template && options[:separator].blank? }) %>
12
+ </div>
13
+ <% end %>
@@ -6,7 +6,7 @@
6
6
 
7
7
  <%= link_to(
8
8
  content_tag(:span, language.label(options[:linkname])).html_safe,
9
- show_alchemy_page_path(language.pages.language_roots.first, lang: language.code),
9
+ show_alchemy_page_path(language.pages.language_roots.first, locale: language.code),
10
10
  class: css_classes.join(" "),
11
11
  title: link_title
12
12
  ) %>
@@ -13,7 +13,7 @@
13
13
  {
14
14
  class: (page_active?(page) ? 'active' : nil),
15
15
  title: (options[:show_title] ? page.title : nil),
16
- lang: page.language_code,
16
+ locale: page.language_code,
17
17
  data: {'page-id' => page.id}
18
18
  }
19
19
  ) %>
@@ -1,22 +1,20 @@
1
- xml.instruct! :xml, :version => "1.0"
2
- xml.rss :version => "2.0" do
1
+ xml.instruct! :xml, version: "1.0"
2
+ xml.rss version: "2.0" do
3
3
 
4
4
  xml.channel do
5
5
 
6
6
  xml.title @page.title
7
7
  xml.description @page.meta_description
8
- xml.link show_page_url(:urlname => @page.urlname, :lang => multi_language? ? @page.language_code : nil)
8
+ xml.link show_page_url(urlname: @page.urlname, locale: multi_language? ? @page.language_code : nil)
9
9
 
10
10
  @page.feed_elements.each do |element|
11
11
  xml.item do
12
12
  xml.title element.content_for_rss_title.try(:ingredient)
13
13
  xml.description element.content_for_rss_description.try(:ingredient)
14
14
  xml.pubDate element.ingredient('date').to_s(:rfc822) if element.has_ingredient?('date')
15
- xml.link show_page_url(:urlname => @page.urlname, :anchor => element_dom_id(element), :lang => multi_language? ? @page.language_code : nil)
16
- xml.guid show_page_url(:urlname => @page.urlname, :anchor => element_dom_id(element), :lang => multi_language? ? @page.language_code : nil)
15
+ xml.link show_page_url(urlname: @page.urlname, anchor: element_dom_id(element), locale: multi_language? ? @page.language_code : nil)
16
+ xml.guid show_page_url(urlname: @page.urlname, anchor: element_dom_id(element), locale: multi_language? ? @page.language_code : nil)
17
17
  end
18
18
  end
19
-
20
19
  end
21
-
22
20
  end
@@ -86,6 +86,11 @@
86
86
  <%= select_tag 'change_locale',
87
87
  options_for_select(translations_for_select, ::I18n.locale),
88
88
  class: 'alchemy_selectbox tiny' %>
89
+ <%- if multi_site? -%>
90
+ <%= select_tag 'change_site',
91
+ options_for_select(sites_for_select, Alchemy::Site.current.id),
92
+ class: 'alchemy_selectbox tiny' %>
93
+ <%- end -%>
89
94
  </div>
90
95
  </div>
91
96
  <% end %>
data/config/routes.rb CHANGED
@@ -1,5 +1,6 @@
1
- Alchemy::Engine.routes.draw do
1
+ require 'alchemy/routing_constraints'
2
2
 
3
+ Alchemy::Engine.routes.draw do
3
4
  root :to => 'pages#show'
4
5
 
5
6
  get '/sitemap.xml' => 'pages#sitemap', format: 'xml'
@@ -34,20 +35,22 @@ Alchemy::Engine.routes.draw do
34
35
 
35
36
  namespace :api, defaults: {format: 'json'} do
36
37
  resources :contents, only: [:index, :show]
38
+
37
39
  resources :elements, only: [:index, :show] do
38
40
  get '/contents' => 'contents#index', as: 'contents'
39
41
  get '/contents/:name' => 'contents#show', as: 'content'
40
42
  end
43
+
41
44
  resources :pages, only: [:index] do
42
45
  get 'elements' => 'elements#index', as: 'elements'
43
46
  get 'elements/:named' => 'elements#index', as: 'named_elements'
44
47
  end
48
+
45
49
  get '/pages/*urlname(.:format)' => 'pages#show', as: 'page'
46
50
  get '/admin/pages/:id(.:format)' => 'pages#show', as: 'preview_page'
47
51
  end
48
52
 
49
53
  namespace :admin do
50
-
51
54
  resources :contents do
52
55
  collection do
53
56
  post :order
@@ -149,16 +152,16 @@ Alchemy::Engine.routes.draw do
149
152
  end
150
153
 
151
154
  resources :sites
152
-
153
155
  end
154
156
 
155
- get '/:lang' => 'pages#show',
156
- :constraints => {:lang => /[a-z]{2}(-[a-z]{2})?/},
157
- :as => :show_language_root
157
+ get '/:locale' => 'pages#show',
158
+ constraints: {locale: Alchemy::RoutingConstraints::LOCALE_REGEXP},
159
+ as: :show_language_root
158
160
 
159
161
  # The page show action has to be last route
160
- get '(/:lang)/*urlname(.:format)' => 'pages#show',
161
- :constraints => {:lang => /[a-z]{2}(-[a-z]{2})?/},
162
- :as => :show_page
163
-
162
+ constraints(locale: Alchemy::RoutingConstraints::LOCALE_REGEXP) do
163
+ get '(/:locale)/*urlname(.:format)' => 'pages#show',
164
+ constraints: Alchemy::RoutingConstraints.new,
165
+ as: :show_page
166
+ end
164
167
  end
@@ -0,0 +1,29 @@
1
+ module Alchemy
2
+ module ConfigurationMethods
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ helper_method :configuration, :multi_language?, :multi_site?
7
+ end
8
+
9
+ # Returns the configuration value of given key.
10
+ #
11
+ # Config file is in +config/alchemy/config.yml+
12
+ #
13
+ def configuration(name)
14
+ Config.get(name)
15
+ end
16
+
17
+ # Returns true if more than one language is published.
18
+ #
19
+ def multi_language?
20
+ Language.published.count > 1
21
+ end
22
+
23
+ # Returns true if more than one site exists.
24
+ #
25
+ def multi_site?
26
+ Site.count > 1
27
+ end
28
+ end
29
+ end
@@ -46,7 +46,16 @@ module Alchemy
46
46
  # Returns the current site.
47
47
  #
48
48
  def current_alchemy_site
49
- @current_alchemy_site ||= Site.find_for_host(request.host)
49
+ @current_alchemy_site ||= begin
50
+ site_id = params[:site_id] || session[:site_id]
51
+ if site_id.nil?
52
+ session.delete :site_id
53
+ Site.find_for_host(request.host)
54
+ else
55
+ session[:site_id] = site_id
56
+ Site.find(site_id)
57
+ end
58
+ end
50
59
  end
51
60
 
52
61
  # Ensures usage of Alchemy's permissions class.
@@ -95,8 +104,8 @@ module Alchemy
95
104
  end
96
105
 
97
106
  def load_alchemy_language_from_params
98
- if params[:lang].present?
99
- Language.find_by_code(params[:lang])
107
+ if params[:locale].present?
108
+ Language.find_by_code(params[:locale])
100
109
  end
101
110
  end
102
111
 
@@ -125,6 +134,5 @@ module Alchemy
125
134
  Language.current = language
126
135
  end
127
136
  end
128
-
129
137
  end
130
138
  end
@@ -25,6 +25,7 @@ require 'userstamp'
25
25
  require_relative './auth_accessors'
26
26
  require_relative './cache_digests/template_tracker'
27
27
  require_relative './config'
28
+ require_relative './configuration_methods'
28
29
  require_relative './controller_actions'
29
30
  require_relative './errors'
30
31
  require_relative './essence'
@@ -37,9 +38,11 @@ require_relative './logger'
37
38
  require_relative './modules'
38
39
  require_relative './mount_point'
39
40
  require_relative './name_conversions'
41
+ require_relative './on_page_layout'
40
42
  require_relative './page_layout'
41
43
  require_relative './permissions'
42
44
  require_relative './picture_attributes'
45
+ require_relative './ssl_protection'
43
46
  require_relative './resource'
44
47
  require_relative './tinymce'
45
48
  require_relative './touching'
@@ -13,7 +13,7 @@ module Alchemy
13
13
  class DefaultLanguageNotFoundError < StandardError
14
14
  # Raised if no default language can be found.
15
15
  def message
16
- "No default language found. Have you run the rake alchemy:db:seed task?"
16
+ "No default language found! Please run the `bin/rake db:seed` task."
17
17
  end
18
18
  end
19
19
 
@@ -36,12 +36,12 @@ module Alchemy #:nodoc:
36
36
  stampable stamper_class_name: Alchemy.user_class_name
37
37
  validate :validate_ingredient, :on => :update, :if => 'validations.any?'
38
38
 
39
- has_one :content, :as => :essence
40
- has_one :element, :through => :content
41
- has_one :page, :through => :element
39
+ has_one :content, :as => :essence, class_name: "Alchemy::Content"
40
+ has_one :element, :through => :content, class_name: "Alchemy::Element"
41
+ has_one :page, :through => :element, class_name: "Alchemy::Page"
42
42
 
43
- scope :available, -> { joins(:element).merge(Element.available) }
44
- scope :from_element, ->(name) { joins(:element).where(alchemy_elements: { name: name }) }
43
+ scope :available, -> { joins(:element).merge(Alchemy::Element.available) }
44
+ scope :from_element, ->(name) { joins(:element).where(Element.table_name => { name: name }) }
45
45
 
46
46
  delegate :restricted?, to: :page, allow_nil: true
47
47
  delegate :trashed?, to: :element, allow_nil: true
@@ -124,7 +124,9 @@ module Alchemy #:nodoc:
124
124
  def validate_ingredient
125
125
  validations.each do |validation|
126
126
  if validation.respond_to?(:keys)
127
- validation.map { |key, _value| self.send("validate_#{key}", validation) }
127
+ validation.map do |key, value|
128
+ self.send("validate_#{key}", value)
129
+ end
128
130
  else
129
131
  self.send("validate_#{validation}")
130
132
  end
@@ -139,23 +141,23 @@ module Alchemy #:nodoc:
139
141
  @validation_errors ||= []
140
142
  end
141
143
 
142
- def validate_presence
143
- if ingredient.blank?
144
+ def validate_presence(validate = true)
145
+ if validate && ingredient.blank?
144
146
  errors.add(ingredient_column, :blank)
145
147
  validation_errors << :blank
146
148
  end
147
149
  end
148
150
 
149
- def validate_uniqueness
150
- return if !public?
151
+ def validate_uniqueness(validate = true)
152
+ return if !validate || !public?
151
153
  if duplicates.any?
152
154
  errors.add(ingredient_column, :taken)
153
155
  validation_errors << :taken
154
156
  end
155
157
  end
156
158
 
157
- def validate_format(validation)
158
- matcher = Config.get('format_matchers')["#{validation['format']}"] || validation['format']
159
+ def validate_format(format)
160
+ matcher = Config.get('format_matchers')[format] || format
159
161
  if ingredient.to_s.match(Regexp.new(matcher)).nil?
160
162
  errors.add(ingredient_column, :invalid)
161
163
  validation_errors << :invalid
@@ -0,0 +1,58 @@
1
+ module Alchemy
2
+
3
+ # = Adds before filter to pages show action
4
+ #
5
+ # Use this mixin to add the +on_page_layout+ class method
6
+ # into your +ApplicationController+.
7
+ #
8
+ # Pass a block or method name in which you have the +@page+ object and can do
9
+ # everything as if you where in a normal controller action.
10
+ #
11
+ # Pass a +Alchemy::PageLayout+ name or +:all+ to
12
+ # call this callback only on specific pages or all pages.
13
+ #
14
+ # == Example:
15
+ #
16
+ # class ApplicationController < ActionController::Base
17
+ # extend Alchemy::OnPageLayout
18
+ #
19
+ # on_page_layout :all do
20
+ # @my_stuff = Stuff.all
21
+ # end
22
+ #
23
+ # on_page_layout :contact, :do_something
24
+ #
25
+ # private
26
+ #
27
+ # def do_something
28
+ # @contacts = Contact.all
29
+ # if @page.tag_list.include?('something')
30
+ # do_something
31
+ # end
32
+ # end
33
+ # end
34
+ #
35
+ module OnPageLayout
36
+
37
+ def on_page_layout(page_layout, callback = nil)
38
+ Alchemy::PagesController.class_eval do
39
+
40
+ append_before_action only: :show, if: -> { call_page_layout_callback_for?(page_layout) } do
41
+ if block_given?
42
+ instance_eval(&Proc.new)
43
+ elsif callback
44
+ self.send(callback)
45
+ else
46
+ raise "You need to either pass a block or method name as callback for `on_page_layout`"
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def call_page_layout_callback_for?(page_layout)
53
+ page_layout.to_sym == :all || @page.page_layout.to_sym == page_layout.to_sym
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -157,7 +157,7 @@ module Alchemy
157
157
  #
158
158
  def read_layouts_file
159
159
  if File.exists?(layouts_file_path)
160
- YAML.load_file(layouts_file_path) || []
160
+ YAML.load(ERB.new(File.read(layouts_file_path)).result) || []
161
161
  else
162
162
  raise LoadError, "Could not find page_layouts.yml file! Please run `rails generate alchemy:scaffold`"
163
163
  end
@@ -46,7 +46,7 @@ module Alchemy
46
46
  p.public? && !p.restricted?
47
47
  end
48
48
  can :see, Alchemy::Page, restricted: false, visible: true
49
- can([:show, :download], Alchemy::Picture) { |p| !p.restricted? }
49
+ can(:display, Alchemy::Picture) { |p| !p.restricted? }
50
50
  end
51
51
  end
52
52
 
@@ -72,7 +72,7 @@ module Alchemy
72
72
  p.public?
73
73
  end
74
74
  can :see, Alchemy::Page, restricted: true, visible: true
75
- can [:show, :download], Alchemy::Picture
75
+ can :display, Alchemy::Picture
76
76
  can [:read, :update], Alchemy.user_class, id: @user.id
77
77
  end
78
78
  end
@@ -99,22 +99,22 @@ module Alchemy
99
99
  ]
100
100
 
101
101
  # Controller actions
102
- can :leave, :alchemy_admin
103
- can [:info, :help], :alchemy_admin_dashboard
104
- can :manage, :alchemy_admin_clipboard
105
- can :index, :trash
106
- can :edit, :alchemy_admin_layoutpages
102
+ can :leave, :alchemy_admin
103
+ can [:info, :help], :alchemy_admin_dashboard
104
+ can :manage, :alchemy_admin_clipboard
105
+ can :index, :trash
106
+ can :edit, :alchemy_admin_layoutpages
107
107
 
108
108
  # Resources
109
- can [:read, :download], Alchemy::Attachment
110
- can :manage, Alchemy::Content
111
- can :manage, Alchemy::Element
112
- can :manage, Alchemy::EssenceFile
113
- can :manage, Alchemy::EssencePicture
114
- can :manage, Alchemy::LegacyPageUrl
115
- can :edit_content, Alchemy::Page
116
- can [:read, :thumbnail, :info], Alchemy::Picture
117
- can [:read, :autocomplete], Alchemy::Tag
109
+ can [:read, :download], Alchemy::Attachment
110
+ can :manage, Alchemy::Content
111
+ can :manage, Alchemy::Element
112
+ can :manage, Alchemy::EssenceFile
113
+ can :manage, Alchemy::EssencePicture
114
+ can :manage, Alchemy::LegacyPageUrl
115
+ can :edit_content, Alchemy::Page
116
+ can [:read, :info], Alchemy::Picture
117
+ can [:read, :autocomplete], Alchemy::Tag
118
118
  end
119
119
  end
120
120
 
@@ -203,6 +203,11 @@ module Alchemy
203
203
  :unlock,
204
204
  :visit,
205
205
  to: :edit_content
206
+
207
+ alias_action :show,
208
+ :thumbnail,
209
+ :zoom,
210
+ to: :display
206
211
  end
207
212
 
208
213
  # Include the role specific permissions.