skylinecms 3.2.0 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
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