summaryrefslogtreecommitdiffstats
path: root/app/models/wiki_content.rb
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2017-07-26 16:41:06 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2017-07-26 16:41:06 +0000
commit71423af0b2029922fe1de50bf3b7ccc2315d2e91 (patch)
tree8fa56fc6a36a359bb5ceab4cb2383d7084e2a360 /app/models/wiki_content.rb
parent1b1a9b6ed58cdda462d9faab46642c11f20c2e15 (diff)
downloadredmine-71423af0b2029922fe1de50bf3b7ccc2315d2e91.tar.gz
redmine-71423af0b2029922fe1de50bf3b7ccc2315d2e91.zip
Get rid of acts_as_versioned.
WikiContent::Version becomes WikiContentVersion. git-svn-id: http://svn.redmine.org/redmine/trunk@16889 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'app/models/wiki_content.rb')
-rw-r--r--app/models/wiki_content.rb125
1 files changed, 27 insertions, 98 deletions
diff --git a/app/models/wiki_content.rb b/app/models/wiki_content.rb
index 0de717cd4..3360b71ca 100644
--- a/app/models/wiki_content.rb
+++ b/app/models/wiki_content.rb
@@ -21,15 +21,22 @@ class WikiContent < ActiveRecord::Base
self.locking_column = 'version'
belongs_to :page, :class_name => 'WikiPage'
belongs_to :author, :class_name => 'User'
+ has_many :versions, :class_name => 'WikiContentVersion', :dependent => :delete_all
validates_presence_of :text
validates_length_of :comments, :maximum => 1024, :allow_nil => true
- acts_as_versioned
-
+ after_save :create_version
after_save :send_notification
scope :without_text, lambda {select(:id, :page_id, :version, :updated_on)}
+ def initialize(*args)
+ super
+ if new_record?
+ self.version = 1
+ end
+ end
+
def visible?(user=User.current)
page.visible?(user)
end
@@ -56,107 +63,25 @@ class WikiContent < ActiveRecord::Base
true
end
- class Version
- belongs_to :page, :class_name => '::WikiPage'
- belongs_to :author, :class_name => '::User'
-
- acts_as_event :title => Proc.new {|o| "#{l(:label_wiki_edit)}: #{o.page.title} (##{o.version})"},
- :description => :comments,
- :datetime => :updated_on,
- :type => 'wiki-page',
- :group => :page,
- :url => Proc.new {|o| {:controller => 'wiki', :action => 'show', :project_id => o.page.wiki.project, :id => o.page.title, :version => o.version}}
-
- acts_as_activity_provider :type => 'wiki_edits',
- :timestamp => "#{WikiContent.versioned_table_name}.updated_on",
- :author_key => "#{WikiContent.versioned_table_name}.author_id",
- :permission => :view_wiki_edits,
- :scope => select("#{WikiContent.versioned_table_name}.updated_on, #{WikiContent.versioned_table_name}.comments, " +
- "#{WikiContent.versioned_table_name}.#{WikiContent.version_column}, #{WikiPage.table_name}.title, " +
- "#{WikiContent.versioned_table_name}.page_id, #{WikiContent.versioned_table_name}.author_id, " +
- "#{WikiContent.versioned_table_name}.id").
- joins("LEFT JOIN #{WikiPage.table_name} ON #{WikiPage.table_name}.id = #{WikiContent.versioned_table_name}.page_id " +
- "LEFT JOIN #{Wiki.table_name} ON #{Wiki.table_name}.id = #{WikiPage.table_name}.wiki_id " +
- "LEFT JOIN #{Project.table_name} ON #{Project.table_name}.id = #{Wiki.table_name}.project_id")
-
- after_destroy :page_update_after_destroy
-
- def text=(plain)
- case Setting.wiki_compression
- when 'gzip'
- begin
- self.data = Zlib::Deflate.deflate(plain, Zlib::BEST_COMPRESSION)
- self.compression = 'gzip'
- rescue
- self.data = plain
- self.compression = ''
- end
- else
- self.data = plain
- self.compression = ''
- end
- plain
- end
-
- def text
- @text ||= begin
- str = case compression
- when 'gzip'
- Zlib::Inflate.inflate(data)
- else
- # uncompressed data
- data
- end
- str.force_encoding("UTF-8")
- str
- end
- end
-
- def project
- page.project
- end
-
- def attachments
- page.nil? ? [] : page.attachments
- end
-
- # Return true if the content is the current page content
- def current_version?
- page.content.version == self.version
- end
-
- # Returns the previous version or nil
- def previous
- @previous ||= WikiContent::Version.
- reorder('version DESC').
- includes(:author).
- where("wiki_content_id = ? AND version < ?", wiki_content_id, version).first
- end
-
- # Returns the next version or nil
- def next
- @next ||= WikiContent::Version.
- reorder('version ASC').
- includes(:author).
- where("wiki_content_id = ? AND version > ?", wiki_content_id, version).first
- end
-
- private
-
- # Updates page's content if the latest version is removed
- # or destroys the page if it was the only version
- def page_update_after_destroy
- latest = page.content.versions.reorder("#{self.class.table_name}.version DESC").first
- if latest && page.content.version != latest.version
- raise ActiveRecord::Rollback unless page.content.revert_to!(latest)
- elsif latest.nil?
- raise ActiveRecord::Rollback unless page.destroy
- end
+ # Reverts the record to a previous version
+ def revert_to!(version)
+ if version.wiki_content_id == id
+ update_columns(
+ :author_id => version.author_id,
+ :text => version.text,
+ :comments => version.comments,
+ :version => version.version,
+ :updated_on => version.updated_on
+ ) && reload
end
end
private
+ def create_version
+ versions << WikiContentVersion.new(attributes.except("id"))
+ end
+
def send_notification
# new_record? returns false in after_save callbacks
if saved_change_to_id?
@@ -169,4 +94,8 @@ class WikiContent < ActiveRecord::Base
end
end
end
+
+ # For backward compatibility
+ # TODO: remove it in Redmine 5
+ Version = WikiContentVersion
end