summaryrefslogtreecommitdiffstats
path: root/app/models
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
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')
-rw-r--r--app/models/wiki_content.rb125
-rw-r--r--app/models/wiki_content_version.rb117
-rw-r--r--app/models/wiki_page.rb1
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