skylinecms 3.2.0 → 3.3.0

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 (102) hide show
  1. data/.yardopts +1 -1
  2. data/CHANGELOG +50 -0
  3. data/README.md +11 -3
  4. data/app/controllers/skyline/application_controller.rb +6 -5
  5. data/app/controllers/skyline/articles_controller.rb +4 -4
  6. data/app/controllers/skyline/content_controller.rb +2 -4
  7. data/app/controllers/skyline/media/data_controller.rb +1 -0
  8. data/app/controllers/skyline/site/media_files_data_controller.rb +1 -0
  9. data/app/controllers/skyline/user_preferences_controller.rb +1 -1
  10. data/app/controllers/skyline/users_controller.rb +5 -1
  11. data/app/controllers/skyline/variant_current_editor_controller.rb +6 -1
  12. data/app/controllers/skyline/variants_controller.rb +2 -2
  13. data/app/helpers/skyline/content_helper.rb +1 -1
  14. data/app/helpers/skyline/editors/editor.rb +6 -6
  15. data/app/helpers/skyline/editors/joinable_list.rb +1 -1
  16. data/app/helpers/skyline/form_helper.rb +1 -0
  17. data/app/helpers/skyline/menu_helper.rb +0 -8
  18. data/app/helpers/skyline/presenters/presenter.rb +2 -2
  19. data/app/middleware/skyline/sprockets_middleware.rb +3 -8
  20. data/app/models/skyline/article.rb +29 -25
  21. data/app/models/skyline/article_version.rb +20 -20
  22. data/app/models/skyline/associated_tag.rb +1 -1
  23. data/app/models/skyline/grant.rb +1 -1
  24. data/app/models/skyline/link_section_link.rb +1 -1
  25. data/app/models/skyline/media_cache.rb +1 -1
  26. data/app/models/skyline/media_dir.rb +0 -2
  27. data/app/models/skyline/media_node.rb +1 -1
  28. data/app/models/skyline/object_ref.rb +3 -3
  29. data/app/models/skyline/page.rb +1 -3
  30. data/app/models/skyline/publication.rb +3 -1
  31. data/app/models/skyline/ref_object.rb +1 -1
  32. data/app/models/skyline/referable_uri.rb +1 -1
  33. data/app/models/skyline/right.rb +1 -1
  34. data/app/models/skyline/role.rb +1 -1
  35. data/app/models/skyline/section.rb +9 -9
  36. data/app/models/skyline/sections/content_collection_section.rb +3 -3
  37. data/app/models/skyline/sections/link_section.rb +3 -3
  38. data/app/models/skyline/sections/media_section.rb +2 -0
  39. data/app/models/skyline/sections/rss_section.rb +11 -12
  40. data/app/models/skyline/tag.rb +1 -1
  41. data/app/models/skyline/user.rb +213 -202
  42. data/app/models/skyline/user_preference.rb +2 -2
  43. data/app/models/skyline/variant.rb +18 -14
  44. data/app/observers/skyline/version_stamper.rb +1 -1
  45. data/app/templates/skyline/page/default/index.html.erb +1 -1
  46. data/app/views/skyline/articles/_security.html.erb +1 -1
  47. data/app/views/skyline/articles/edit.html.erb +1 -1
  48. data/app/views/skyline/content/{_add.rhtml → _add.html.erb} +0 -0
  49. data/app/views/skyline/content/{_filter.rhtml → _filter.html.erb} +0 -0
  50. data/app/views/skyline/content/{create.rhtml → create.html.erb} +0 -0
  51. data/app/views/skyline/content/{edit.rhtml → edit.html.erb} +0 -0
  52. data/app/views/skyline/content/{error.rhtml → error.html.erb} +0 -0
  53. data/app/views/skyline/content/{list.rhtml → list.html.erb} +3 -3
  54. data/app/views/skyline/content/{show.rhtml → show.html.erb} +0 -0
  55. data/app/views/skyline/content_sections/_tags.html.erb +1 -1
  56. data/app/views/skyline/shared/_header_area.html.erb +1 -1
  57. data/app/views/skyline/users/_new.html.erb +1 -1
  58. data/config/initializers/middlewares.rb +5 -1
  59. data/config/initializers/mime_types.rb +0 -6
  60. data/config/initializers/observers.rb +1 -1
  61. data/config/locales/en-US.yml +1 -1
  62. data/db/fixtures/roles_and_rights.rb +5 -5
  63. data/db/fixtures/roots.rb +1 -1
  64. data/doc/concepts.md +37 -0
  65. data/lib/skyline/belongs_to_referable.rb +5 -5
  66. data/lib/skyline/content/class_meta_data.rb +4 -3
  67. data/lib/skyline/content/content.rb +28 -18
  68. data/lib/skyline/content/exportable.rb +3 -3
  69. data/lib/skyline/content/field_meta_data.rb +12 -11
  70. data/lib/skyline/content/implementation.rb +7 -6
  71. data/lib/skyline/content/meta_data/field.rb +1 -1
  72. data/lib/skyline/content/stack.rb +1 -1
  73. data/lib/skyline/content/versioning/version.rb +1 -1
  74. data/lib/skyline/engine.rb +1 -1
  75. data/lib/skyline/has_many_referables_in.rb +4 -4
  76. data/lib/skyline/plugins/manager.rb +4 -3
  77. data/lib/skyline/plugins/plugin.rb +9 -1
  78. data/lib/skyline/rendering/renderer.rb +12 -2
  79. data/lib/skyline/sections/interface.rb +1 -1
  80. data/lib/skyline/taggable.rb +4 -4
  81. data/lib/skyline/version.rb +2 -2
  82. data/public/skyline/javascripts/src/application.js +1 -1
  83. data/public/skyline/javascripts/src/application_preinit.js +1 -0
  84. data/public/skyline/javascripts/src/library_uploader.js +1 -1
  85. data/public/skyline/javascripts/src/skyline.editor/src/skyline.editor.js +18 -18
  86. data/public/skyline/javascripts/src/skyline.editor/src/tinymce_preinit.js +4 -0
  87. data/public/skyline/javascripts/src/skyline.js +20 -18
  88. data/public/skyline/javascripts/src/skyline/src/skyline.js +2 -2
  89. data/public/skyline/javascripts/src/skyline/src/uploader.js +1 -1
  90. data/skylinecms.gemspec +7 -5
  91. data/test/factories.rb +2 -0
  92. data/test/integration/media_browser_super_access_test.rb +3 -3
  93. data/test/integration/media_browser_user_access_test.rb +2 -2
  94. data/test/integration/user_preferences_test.rb +5 -5
  95. data/test/test_helper.rb +1 -0
  96. data/test/unit/article_test.rb +1 -1
  97. data/test/unit/locales_test.rb +13 -3
  98. data/test/unit/test_content_object_test.rb +1 -1
  99. data/test/unit/test_section_test.rb +3 -2
  100. data/test/unit/user_preference_test.rb +2 -2
  101. data/vendor/digitpaint/nested_attributes_positioning.rb +5 -5
  102. metadata +66 -40
data/.yardopts CHANGED
@@ -7,4 +7,4 @@ app/helpers/skyline/*.rb
7
7
  -
8
8
  doc/INSTALL.md
9
9
  doc/MIGRATION.md
10
- doc/Bundler.md
10
+ doc/concepts.md
data/CHANGELOG CHANGED
@@ -1,5 +1,55 @@
1
1
  # Changelog for Skyline #
2
2
 
3
+ ## 3.3.0 (March 16th, 2012) ##
4
+
5
+ ### Core ###
6
+ * [Core] Skyline now works with Rails 3.2.2
7
+ * [Core] Dependency updates for sprockets, shoulda, factory-girl and seed-fu
8
+ * [Core] Fixed lot's of Rails deprecation issues
9
+ * [Core] Allow setting of renderable by string within global namespace
10
+ * [Core] Fix for bug with VERSION display in some git
11
+ * [Core] Observers are added to applications observers instead of overwriting them
12
+
13
+ ### User Interface (Core) ###
14
+ * [UI] Remove unused menu_for helper
15
+ * [UI] Changes to form_for and fields_for syntax
16
+ * [UI] Fix logout link to no longer use :url =>
17
+ * [UI] Update javascript to work with newer sprockets gem
18
+
19
+ ### Plugin management (Core) ###
20
+ * [Plugins] Fix view_paths for skyline plugins
21
+
22
+ ### Articles ###
23
+ * [Articles] Add API for publication/depublication callbacks
24
+ * [Articles] Added created_at and updated_at to publication rollback
25
+
26
+ ### Content elements ###
27
+ * [Content Elements] Redirect to content list for selected item after new/create/edit/delete
28
+
29
+ ### Media Library
30
+ * [MediaLibrary] Media files edit and delete are available through javascript only
31
+ * [MediaLibrary] Do not allow image links with only one size parameter (default to 0x0 image)
32
+
33
+ ### Sections (builtin) ###
34
+ * [Sections] Empty values for MediaSection's dimensions resulted in 0-values for width and height.
35
+ * [Sections] rss_feed method no longer protected in RssSection
36
+
37
+ ### Test ###
38
+ * [Test] Fix Test_section_test: @small_image_no_refs used wrong order for dimensions
39
+ * [Test] Do not use CGI Escaping for JSON in tests
40
+ * [Test] Update reference to test media file in integration test to use more flexible relative path
41
+ * [Test] Fixes for locales-test: load skyline locales as in initializer, I18n.backend.send(:translations) to get all values
42
+
43
+ ### Documentation ###
44
+ * [Documentation] Add link to api
45
+ * [Documentation] Update migration documentation
46
+ * [Documentation] Add concepts documentation
47
+
48
+ ### Settings and users ###
49
+ * [Users] Allow creation of users that were previously deleted
50
+ * [Users] Correctly revoke all grants from a user upon deletion
51
+
52
+
3
53
  ## 3.2.0 (November 1, 2011) ##
4
54
 
5
55
  ### Core ###
data/README.md CHANGED
@@ -2,6 +2,7 @@ Skyline CMS
2
2
  ===========
3
3
 
4
4
  **Homepage**: [http://www.skylinecms.nl](http://www.skylinecms.nl)
5
+ **Documentation**: [http://api.skylinecms.nl](http://api.skylinecms.nl)
5
6
  **Twitter**: Follow [skylinecms](http://www.twitter.com/skylinecms) on twitter
6
7
  **Git**: [http://github.com/digitpaint/skyline](http://github.com/digitpaint/skyline)
7
8
  **Author**: DigitPaint
@@ -30,14 +31,21 @@ either be featured as lists or shown individually
30
31
  Installation and usage
31
32
  ----------------------
32
33
 
33
- Check out our [getting start guide](http://www.skylinecms.nl/documentation/guides/getting_started) to get Skyline
34
- up and running.
34
+ Start with our {file:doc/INSTALL.md installation instructions} to get Skyline up and running.
35
+
36
+ It might be a good idea to read about {file:doc/concepts.md the basic Skyline concepts}.
35
37
 
36
38
  For further information, see our documentation and guides on
37
- [www.skylinecms.nl/documentation](http://www.skylinecms.nl/documentation).
39
+ [www.skylinecms.nl/documentation](http://www.skylinecms.nl/documentation) (currently outdated).
38
40
 
39
41
  If you're running into problems, don't hesitate to contact us!
40
42
 
43
+ Updating
44
+ --------
45
+
46
+ See our {file:doc/MIGRATION.md migration instructions} to update from one Skyline version to another.
47
+
48
+
41
49
  Copyright
42
50
  ---------
43
51
 
@@ -8,7 +8,7 @@ class Skyline::ApplicationController < ApplicationController
8
8
 
9
9
  around_filter Skyline::ArticleVersionObserver.instance
10
10
 
11
- class_inheritable_accessor :default_menu
11
+ class_attribute :default_menu
12
12
  attr_accessor :current_menu
13
13
  hide_action :default_menu, :default_menu=, :current_menu, :current_menu=, :menu, :javascript_redirect_to
14
14
 
@@ -25,6 +25,7 @@ class Skyline::ApplicationController < ApplicationController
25
25
 
26
26
  define_callbacks :authenticate
27
27
 
28
+ class_attribute :authorization_hash
28
29
 
29
30
  class << self
30
31
 
@@ -42,7 +43,7 @@ class Skyline::ApplicationController < ApplicationController
42
43
  def authorize(*actions)
43
44
  options = actions.extract_options!
44
45
  raise ArgumentError, "You must specify the :by option" if !options.has_key?(:by)
45
- authorizations = read_inheritable_attribute(:authorizations) || {}
46
+ authorizations = self.authorization_hash || {}
46
47
  if actions.any?
47
48
  actions.each do |a|
48
49
  authorizations[a] ||= []
@@ -52,11 +53,11 @@ class Skyline::ApplicationController < ApplicationController
52
53
  authorizations[:*] ||= []
53
54
  authorizations[:*] << options[:by]
54
55
  end
55
- write_inheritable_attribute(:authorizations,authorizations)
56
+ self.authorization_hash = authorizations
56
57
  end
57
58
 
58
59
  def authorizations
59
- read_inheritable_attribute(:authorizations) || {}
60
+ self.authorization_hash || {}
60
61
  end
61
62
 
62
63
  end
@@ -115,7 +116,7 @@ class Skyline::ApplicationController < ApplicationController
115
116
  up.each do |k,v|
116
117
  if k == "_delete"
117
118
  v.each do |delete_id|
118
- current_user.user_preferences.remove(delete_id)
119
+ current_user.user_preferences.remove_key(delete_id)
119
120
  end
120
121
  else
121
122
  current_user.user_preferences.set(k,v)
@@ -58,7 +58,7 @@ class Skyline::ArticlesController < Skyline::ApplicationController
58
58
  end
59
59
 
60
60
  if @variant.editable_by?(current_user)
61
- @variant.edit_by!(current_user)
61
+ @variant.edit_by!(current_user)
62
62
  else
63
63
  messages.now[:error] = render_to_string(:partial => "currently_editing")
64
64
  return render(:action => "edit_preview_only")
@@ -101,7 +101,7 @@ class Skyline::ArticlesController < Skyline::ApplicationController
101
101
  begin
102
102
  Skyline::Article.transaction do
103
103
  if params["clone_variant"] == "1"
104
- @variant = @variant.clone()
104
+ @variant = @variant.dup()
105
105
 
106
106
  # Dirty hack so AR thinks this object isn't new.
107
107
  @variant.attributes = new_variant.attributes.except("version")
@@ -133,8 +133,8 @@ class Skyline::ArticlesController < Skyline::ApplicationController
133
133
  notifications[:success] = t(:success, :scope => [@article.class, :update, :flashes])
134
134
  redirect_to edit_skyline_article_path(@article, :variant_id => @variant.id)
135
135
  else
136
- if @variant.errors.on(:version)
137
- messages.now[:error] = @variant.errors.on(:version)
136
+ if @variant.errors[:version]
137
+ messages.now[:error] = @variant.errors[:version]
138
138
  else
139
139
  messages.now[:error] = t(:error, :scope => [@article.class, :update, :flashes])
140
140
  end
@@ -64,7 +64,7 @@ class Skyline::ContentController < Skyline::Skyline2Controller
64
64
 
65
65
  def delete
66
66
  @element = stack.last
67
- if request.post?
67
+ if request.post? || request.xhr?
68
68
  if @element.destroy
69
69
  notifications[:success] = t(:successfully_deleted, :scope => [:content, :flashes], :class => @element.class.singular_name)
70
70
  else
@@ -73,9 +73,7 @@ class Skyline::ContentController < Skyline::Skyline2Controller
73
73
  end
74
74
  respond_to do |format|
75
75
  format.html{ redirect_after(:delete) }
76
- format.js do
77
- render(:update){|p| p.redirect_to controller.send(:redirect_url_after,:delete) }
78
- end
76
+ format.js { javascript_redirect_to(redirect_url_after(:delete)) }
79
77
  end
80
78
  end
81
79
 
@@ -30,6 +30,7 @@ class Skyline::Media::DataController < Skyline::ApplicationController
30
30
  else
31
31
  if params[:size].present?
32
32
  size = params[:size].to_s.split("x").map{|v| v.to_i }
33
+ size = [0, 0] unless size.count == 2
33
34
  size = nil if size[0] == @file.width && size[1] >= @file.height || size[1] == @file.height && size[0] >= @file.width
34
35
  else
35
36
  size = nil
@@ -30,6 +30,7 @@ class Skyline::Site::MediaFilesDataController < ApplicationController
30
30
  else
31
31
  if params[:size].present?
32
32
  size = params[:size].to_s.split("x").map{|v| v.to_i }
33
+ size = [0, 0] unless size.count == 2
33
34
  size = nil if size[0] == @file.width && size[1] >= @file.height || size[1] == @file.height && size[0] >= @file.width
34
35
  else
35
36
  size = nil
@@ -4,7 +4,7 @@ class Skyline::UserPreferencesController < Skyline::ApplicationController
4
4
  user_preference = ActiveSupport::JSON.decode(params[:skyline_up])
5
5
 
6
6
  if user_preference.values.first == "_delete"
7
- current_user.user_preferences.remove(user_preference.keys.first)
7
+ current_user.user_preferences.remove_key(user_preference.keys.first)
8
8
  up = {}
9
9
  else
10
10
  current_user.user_preferences.set(user_preference.keys.first, user_preference.values.first)
@@ -19,7 +19,11 @@ class Skyline::UsersController < Skyline::ApplicationController
19
19
  end
20
20
 
21
21
  def create
22
- @user = Skyline::User.new(params[:user])
22
+ if (@user = Skyline::User.find_by_email(params[:user][:email])) && @user.is_destroyed
23
+ @user.reactivate(params[:user])
24
+ else
25
+ @user = Skyline::User.new(params[:user])
26
+ end
23
27
 
24
28
  if @user.save
25
29
  notifications[:success] = t(:success, :scope => [:user,:create,:flashes])
@@ -27,7 +27,12 @@ class Skyline::VariantCurrentEditorController < Skyline::ApplicationController
27
27
  end
28
28
 
29
29
  def process(request,*args)
30
- logger.silence(ActiveSupport::BufferedLogger::Severity::FATAL){ super }
30
+ old_level = Rails.logger.level
31
+ Rails.logger.level = Logger::FATAL
32
+
33
+ super
34
+ ensure
35
+ Rails.logger.level = old_level
31
36
  end
32
37
 
33
38
  protected
@@ -9,8 +9,8 @@ class Skyline::VariantsController < Skyline::ApplicationController
9
9
  return handle_unauthorized_user unless Skyline::Configuration.enable_multiple_variants
10
10
 
11
11
  if params[:variant_id]
12
- variant_to_clone = @article.variants.find_by_id(params[:variant_id])
13
- variant = variant_to_clone.clone
12
+ variant_to_dup = @article.variants.find_by_id(params[:variant_id])
13
+ variant = variant_to_dup.dup
14
14
  variant.save
15
15
  else
16
16
  variant = @article.variants.create
@@ -135,7 +135,7 @@ module Skyline::ContentHelper
135
135
  end
136
136
 
137
137
  def record_with_errors(content, record, field)
138
- if record.errors.on(field.attribute_name)
138
+ if record.errors[field.attribute_name]
139
139
  content_tag("div", content.html_safe, :class => "fieldWithErrors")
140
140
  else
141
141
  content
@@ -10,9 +10,9 @@ module Skyline::Editors
10
10
  Skyline::Editors::TextField.new(name_chain,record,field,template)
11
11
  end
12
12
  rescue NameError => e
13
- RAILS_DEFAULT_LOGGER.warn(" Editor instantiation error ".center(50,"="))
14
- RAILS_DEFAULT_LOGGER.warn(e.to_s + "\n" + e.backtrace.join("\n"))
15
- RAILS_DEFAULT_LOGGER.warn("=" * 50)
13
+ Rails.logger.warn(" Editor instantiation error ".center(50,"="))
14
+ Rails.logger.warn(e.to_s + "\n" + e.backtrace.join("\n"))
15
+ Rails.logger.warn("=" * 50)
16
16
  Skyline::Editors::TextField.new(name_chain,record,field,template)
17
17
  end
18
18
 
@@ -51,11 +51,11 @@ module Skyline::Editors
51
51
  if self.respond_to? :output_without_errors
52
52
  out << field_with_errors([field_prefix, output_without_errors, field_suffix].join.html_safe)
53
53
  end
54
- content_tag("div",out.html_safe, :id => "field_#{input_id(field_names)}", :class => "editor #{"invalid" if record.errors.on(field.attribute_name)}")
54
+ content_tag("div",out.html_safe, :id => "field_#{input_id(field_names)}", :class => "editor #{"invalid" if record.errors[field.attribute_name].any?}")
55
55
  end
56
56
 
57
57
  def errors
58
- errors = record.errors.on(field.attribute_name)
58
+ errors = record.errors[field.attribute_name]
59
59
  if errors.kind_of?(Array)
60
60
  errors.flatten.to_sentence
61
61
  else
@@ -70,7 +70,7 @@ module Skyline::Editors
70
70
  end
71
71
 
72
72
  def field_with_errors(content)
73
- if self.record.errors.on(self.field.attribute_name)
73
+ if self.record.errors[self.field.attribute_name].any?
74
74
  content_tag("div", content.html_safe, :class => "fieldWithErrors")
75
75
  else
76
76
  content
@@ -4,7 +4,7 @@ class Skyline::Editors::JoinableList < Skyline::Editors::Editor
4
4
 
5
5
  def initialize(names,record,field,template)
6
6
  super
7
- RAILS_DEFAULT_LOGGER.debug("@attribute => #{@attribute_names.inspect}")
7
+ Rails.logger.debug("@attribute => #{@attribute_names.inspect}")
8
8
 
9
9
  @reflection = self.field.reflection
10
10
  if @reflection.macro == :has_many
@@ -9,6 +9,7 @@ module Skyline::FormHelper
9
9
 
10
10
  def skyline_fields_for(record_or_name_or_array, *args, &block)
11
11
  options = args.extract_options!
12
+ args = [nil] if args == []
12
13
  with_custom_field_error_proc do
13
14
  self.fields_for(record_or_name_or_array, *(args << options.merge(:builder => Skyline::FormBuilder)), &proc)
14
15
  end
@@ -18,14 +18,6 @@ module Skyline::MenuHelper
18
18
  content_tag("li", link_to(t(scope.last, :scope => [:navigation, scope[-2]]), url, url_options), options)
19
19
  end
20
20
 
21
- def menu_for(*scope, &block)
22
- return unless controller.current_menu[0, scope.size] == scope
23
- @_menu_scope = scope
24
- menu = capture(&block)
25
- @_menu_scope = []
26
- concat(menu)
27
- end
28
-
29
21
  def current_menu_scope(scope)
30
22
  (@_menu_scope || []) + scope
31
23
  end
@@ -32,13 +32,13 @@ class Skyline::Presenters::Presenter
32
32
 
33
33
 
34
34
  def edit_button(record)
35
- link_to button_text(:edit),{:action => "edit", :types => stack.url_types(:down => [record.id]), :return_to => url_for({:filter => params[:filter]})}, :class => "button small"
35
+ link_to button_text(:edit),{:action => "edit", :types => stack.url_types(:down => [record.id]), :return_to => url_for({:types => record.class.to_s.underscore.pluralize, :filter => params[:filter]})}, :class => "button small"
36
36
  end
37
37
 
38
38
  def delete_button(record)
39
39
  link_to(
40
40
  button_text(:delete),
41
- {:action => "delete",:types => stack.url_types(:down => [record.id]),:return_to => url_for({})},
41
+ {:action => "delete",:types => stack.url_types(:down => [record.id]),:return_to => url_for({:types => record.class.to_s.underscore.pluralize})},
42
42
  :remote => true,
43
43
  :confirm => t(:confirm_deletion, :scope => [:content,:list], :class => self.fieldset.singular_name),
44
44
  :class => "button small red")
@@ -16,9 +16,8 @@ class Skyline::SprocketsMiddleware
16
16
  end
17
17
 
18
18
  def register_load_location(*paths)
19
- all_paths = paths.map { |path| Dir[Pathname.new(@environment.root.absolute_location) + path].sort }.flatten.compact
20
- all_paths.each do |p|
21
- @environment.register_load_location(p)
19
+ paths.each do |p|
20
+ @environment.append_path(p)
22
21
  end
23
22
  end
24
23
 
@@ -40,7 +39,6 @@ class Skyline::SprocketsMiddleware
40
39
  end
41
40
 
42
41
  if path && content = self.render(path)
43
-
44
42
  resp = ::Rack::Response.new do |res|
45
43
  res.status = 200
46
44
  res.headers["Content-Type"] = "text/javascript"
@@ -62,10 +60,7 @@ class Skyline::SprocketsMiddleware
62
60
  end
63
61
 
64
62
  def render(path)
65
- pathname = @environment.find(path.to_s)
66
- @preprocessor = Sprockets::Preprocessor.new(@environment, :strip_comments => @options[:strip_comments])
67
- @preprocessor.require(pathname.source_file)
68
- @preprocessor.concatenation.to_s
63
+ @environment.find_asset(path.to_s).to_s
69
64
  end
70
65
 
71
66
  end
@@ -12,7 +12,7 @@ class Skyline::Article < ActiveRecord::Base
12
12
 
13
13
  def self.inherited(subclass)
14
14
  super
15
- subclass.set_table_name subclass.name.underscore.gsub("/","_")
15
+ subclass.table_name = subclass.name.underscore.gsub("/","_")
16
16
 
17
17
  parentclass = subclass.parent
18
18
  parentclass.class_eval do
@@ -43,9 +43,7 @@ class Skyline::Article < ActiveRecord::Base
43
43
  attr_accessor :to_be_published
44
44
  end
45
45
 
46
- extend ActiveSupport::Memoizable
47
-
48
- set_table_name :skyline_articles
46
+ self.table_name = "skyline_articles"
49
47
 
50
48
  # Associations
51
49
  has_many :versions, :class_name => "Skyline::ArticleVersion"
@@ -64,6 +62,10 @@ class Skyline::Article < ActiveRecord::Base
64
62
  before_destroy :confirm_destroyability
65
63
  after_destroy :reset_ref_object
66
64
  after_destroy :destroy_variants
65
+
66
+ # Custom callbacks
67
+ define_callbacks :publication
68
+ define_callbacks :depublication
67
69
 
68
70
  # Validations
69
71
  validate :has_at_least_one_variant
@@ -132,8 +134,10 @@ class Skyline::Article < ActiveRecord::Base
132
134
  raise StandardError, "can't be depublished because this page is persistent" if self.persistent?
133
135
 
134
136
  if self.published_publication
135
- self.published_publication.destroy unless self.keep_history?
136
- self.published_publication = nil
137
+ self.run_callbacks :depublication do
138
+ self.published_publication.destroy unless self.keep_history?
139
+ self.published_publication = nil
140
+ end
137
141
  end
138
142
 
139
143
  self.published_publication_data = nil
@@ -209,29 +213,29 @@ class Skyline::Article < ActiveRecord::Base
209
213
  false
210
214
  end
211
215
 
212
- def clone
213
- s = super.tap do |clone|
214
- clone.created_at = nil
215
- clone.updated_at = nil
216
- clone.default_variant_id = nil
217
- clone.default_variant_data_id = nil
218
- clone.default_variant = nil
219
- clone.default_variant_data = nil
220
- clone.published_publication_id = nil
221
- clone.published_publication_data_id = nil
216
+ def dup
217
+ s = super.tap do |dup|
218
+ dup.created_at = nil
219
+ dup.updated_at = nil
220
+ dup.default_variant_id = nil
221
+ dup.default_variant_data_id = nil
222
+ dup.default_variant = nil
223
+ dup.default_variant_data = nil
224
+ dup.published_publication_id = nil
225
+ dup.published_publication_data_id = nil
222
226
 
223
- clone.publications.clear
224
- clone.versions.clear
225
- clone.variants.clear
227
+ dup.publications.clear
228
+ dup.versions.clear
229
+ dup.variants.clear
226
230
 
227
231
  self.variants.each do |variant|
228
- variant_clone = variant.clone
229
- clone.variants << variant_clone
230
- variant_clone.article = clone
231
- variant_clone.article_id = nil
232
- self.becomes_default_variant_after_save = variant_clone if variant == self.default_variant
232
+ variant_dup = variant.dup
233
+ dup.variants << variant_dup
234
+ variant_dup.article = dup
235
+ variant_dup.article_id = nil
236
+ self.becomes_default_variant_after_save = variant_dup if variant == self.default_variant
233
237
  end
234
- clone
238
+ dup
235
239
  end
236
240
  end
237
241