diff options
author | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2017-07-26 16:41:06 +0000 |
---|---|---|
committer | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2017-07-26 16:41:06 +0000 |
commit | 71423af0b2029922fe1de50bf3b7ccc2315d2e91 (patch) | |
tree | 8fa56fc6a36a359bb5ceab4cb2383d7084e2a360 /app/models | |
parent | 1b1a9b6ed58cdda462d9faab46642c11f20c2e15 (diff) | |
download | redmine-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')
-rw-r--r-- | app/models/wiki_content.rb | 125 | ||||
-rw-r--r-- | app/models/wiki_content_version.rb | 117 | ||||
-rw-r--r-- | app/models/wiki_page.rb | 1 |
3 files changed, 144 insertions, 99 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 diff --git a/app/models/wiki_content_version.rb b/app/models/wiki_content_version.rb new file mode 100644 index 000000000..73d708ca8 --- /dev/null +++ b/app/models/wiki_content_version.rb @@ -0,0 +1,117 @@ +# Redmine - project management software
+# Copyright (C) 2006-2017 Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+require 'zlib'
+
+class WikiContentVersion < ActiveRecord::Base
+ 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 => "#{table_name}.updated_on",
+ :author_key => "#{table_name}.author_id",
+ :permission => :view_wiki_edits,
+ :scope => select("#{table_name}.updated_on, #{table_name}.comments, " +
+ "#{table_name}.version, #{WikiPage.table_name}.title, " +
+ "#{table_name}.page_id, #{table_name}.author_id, " +
+ "#{table_name}.id").
+ joins("LEFT JOIN #{WikiPage.table_name} ON #{WikiPage.table_name}.id = #{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 ||= WikiContentVersion.
+ 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 ||= WikiContentVersion.
+ 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
+ end
+end
diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index 6e4cf0c03..9082859d3 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -221,7 +221,6 @@ class WikiPage < ActiveRecord::Base if content.text_changed? begin self.content = content - ret = ret && content.changed? rescue ActiveRecord::RecordNotSaved ret = false end |