SQLite compatibility

This commit is contained in:
Karel Picman 2016-02-17 16:32:13 +01:00
parent 71281cdebd
commit e7126d85d2
14 changed files with 124 additions and 75 deletions

View File

@ -4,7 +4,7 @@
#
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com>
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@ -121,7 +121,7 @@ class DmsfController < ApplicationController
@locked_for_user = false
else
if @folder.deleted
if @folder.deleted?
render_404
return
end

View File

@ -3,7 +3,7 @@
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com>
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@ -42,7 +42,7 @@ class DmsfFilesController < ApplicationController
raise DmsfAccessError if @revision.file != @file
end
check_project(@revision.file)
raise ActionController::MissingFile if @file.deleted
raise ActionController::MissingFile if @file.deleted?
log_activity('downloaded')
access = DmsfFileRevisionAccess.new
access.user = User.current
@ -74,7 +74,7 @@ class DmsfFilesController < ApplicationController
raise DmsfAccessError if @revision.file != @file
end
check_project(@revision.file)
raise ActionController::MissingFile if @revision.file.deleted
raise ActionController::MissingFile if @revision.file.deleted?
log_activity('downloaded')
access = DmsfFileRevisionAccess.new
access.user = User.current
@ -231,7 +231,7 @@ class DmsfFilesController < ApplicationController
end
def delete_revision
if @revision # && !@revision.deleted
if @revision
if @revision.delete(true)
flash[:notice] = l(:notice_revision_deleted)
log_activity('deleted')

View File

@ -43,14 +43,13 @@ class DmsfFile < ActiveRecord::Base
:class_name => 'DmsfLock', :foreign_key => 'entity_id', :dependent => :destroy
has_many :referenced_links, -> { where target_type: DmsfFile.model_name.to_s},
:class_name => 'DmsfLink', :foreign_key => 'target_id', :dependent => :destroy
accepts_nested_attributes_for :revisions, :locks, :referenced_links, :project
accepts_nested_attributes_for :revisions, :locks, :referenced_links, :project
scope :visible, lambda { |*args|
where(deleted: false)
}
scope :deleted, lambda { |*args|
where(deleted: true)
}
STATUS_DELETED = 1
STATUS_ACTIVE = 0
scope :visible, -> { where(:deleted => STATUS_ACTIVE) }
scope :deleted, -> { where(:deleted => STATUS_DELETED) }
validates :name, :presence => true
validates_format_of :name, :with => DmsfFolder.invalid_characters,
@ -82,7 +81,7 @@ class DmsfFile < ActiveRecord::Base
acts_as_searchable :columns => ["#{table_name}.name", "#{DmsfFileRevision.table_name}.title", "#{DmsfFileRevision.table_name}.description", "#{DmsfFileRevision.table_name}.comment"],
:project_key => 'project_id',
:date_column => "#{table_name}.updated_at"
:date_column => "#{table_name}.updated_at"
before_create :default_values
def default_values
@ -121,7 +120,7 @@ class DmsfFile < ActiveRecord::Base
def last_revision
unless @last_revision
@last_revision = deleted ? self.revisions.first : self.revisions.visible.first
@last_revision = self.deleted? ? self.revisions.first : self.revisions.visible.first
end
@last_revision
end
@ -129,6 +128,10 @@ class DmsfFile < ActiveRecord::Base
def set_last_revision(new_revision)
@last_revision = new_revision
end
def deleted?
self.deleted == STATUS_DELETED
end
def delete(commit)
if locked_for_user?
@ -143,7 +146,7 @@ class DmsfFile < ActiveRecord::Base
if commit
self.destroy
else
self.deleted = true
self.deleted = STATUS_DELETED
self.deleted_by_user = User.current
save
end
@ -155,13 +158,13 @@ class DmsfFile < ActiveRecord::Base
end
def restore
if self.dmsf_folder_id && (self.folder.nil? || self.folder.deleted)
if self.dmsf_folder_id && (self.folder.nil? || self.folder.deleted?)
errors[:base] << l(:error_parent_folder)
return false
end
self.revisions.each { |r| r.restore }
self.referenced_links.each { |l| l.restore }
self.deleted = false
self.deleted = STATUS_ACTIVE
self.deleted_by_user = nil
save
end

View File

@ -30,9 +30,11 @@ class DmsfFileRevision < ActiveRecord::Base
has_many :dmsf_workflow_step_assignment, :dependent => :destroy
accepts_nested_attributes_for :access, :dmsf_workflow_step_assignment, :file, :user
# Returns a list of revisions that are not deleted here, or deleted at parent level either
scope :visible, -> { where(deleted: false) }
scope :deleted, -> { where(deleted: true) }
STATUS_DELETED = 1
STATUS_ACTIVE = 0
scope :visible, -> { where(:deleted => STATUS_ACTIVE) }
scope :deleted, -> { where(:deleted => STATUS_DELETED) }
acts_as_customizable
acts_as_event :title => Proc.new {|o| "#{l(:label_dmsf_updated)}: #{o.file.dmsf_path_str}"},
@ -49,11 +51,11 @@ class DmsfFileRevision < ActiveRecord::Base
joins(
"INNER JOIN #{DmsfFile.table_name} ON #{DmsfFileRevision.table_name}.dmsf_file_id = #{DmsfFile.table_name}.id " +
"INNER JOIN #{Project.table_name} ON #{DmsfFile.table_name}.project_id = #{Project.table_name}.id").
where("#{DmsfFile.table_name}.deleted = :false", {:false => false})
where("#{DmsfFile.table_name}.deleted = ?", STATUS_ACTIVE)
validates :title, :presence => true
validates_format_of :name, :with => DmsfFolder.invalid_characters,
:message => l(:error_contains_invalid_character)
:message => l(:error_contains_invalid_character)
def project
self.file.project if self.file
@ -88,14 +90,14 @@ class DmsfFileRevision < ActiveRecord::Base
if commit
self.destroy
else
self.deleted = true
self.deleted = DmsfFile::STATUS_DELETED
self.deleted_by_user = User.current
save
end
end
def restore
self.deleted = false
self.deleted = DmsfFile::STATUS_ACTIVE
self.deleted_by_user = nil
save
end

View File

@ -1,6 +1,7 @@
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@ -42,6 +43,6 @@ class DmsfFileRevisionAccess < ActiveRecord::Base
"INNER JOIN #{DmsfFileRevision.table_name} ON #{DmsfFileRevisionAccess.table_name}.dmsf_file_revision_id = #{DmsfFileRevision.table_name}.id " +
"INNER JOIN #{DmsfFile.table_name} ON #{DmsfFileRevision.table_name}.dmsf_file_id = #{DmsfFile.table_name}.id " +
"INNER JOIN #{Project.table_name} ON #{DmsfFile.table_name}.project_id = #{Project.table_name}.id").
where("#{DmsfFile.table_name}.deleted = :false", {:false => false})
where("#{DmsfFile.table_name}.deleted = ?", DmsfFile::STATUS_ACTIVE)
end

View File

@ -3,7 +3,7 @@
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2011-15 Karel Pičman <karel.picman@konton.com>
# Copyright (C) 2011-16 Karel Pičman <karel.picman@konton.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@ -48,12 +48,11 @@ class DmsfFolder < ActiveRecord::Base
:class_name => 'DmsfLock', :foreign_key => 'entity_id', :dependent => :destroy
accepts_nested_attributes_for :user, :project, :folder, :subfolders, :files, :folder_links, :file_links, :url_links, :referenced_links, :locks
scope :visible, lambda { |*args|
where(deleted: false)
}
scope :deleted, lambda { |*args|
where(deleted: true)
}
STATUS_DELETED = 1
STATUS_ACTIVE = 0
scope :visible, -> { where(:deleted => STATUS_ACTIVE) }
scope :deleted, -> { where(:deleted => STATUS_DELETED) }
acts_as_customizable
@ -71,10 +70,10 @@ class DmsfFolder < ActiveRecord::Base
validates :title, :presence => true
validates_uniqueness_of :title, :scope => [:dmsf_folder_id, :project_id, :deleted],
conditions: -> { where.not(deleted: true) }
conditions: -> { where(:deleted => STATUS_ACTIVE) }
validates_format_of :title, :with => @@invalid_characters,
:message => l(:error_contains_invalid_character)
validate :check_cycle
validate :check_cycle
before_create :default_values
def default_values
@ -119,19 +118,23 @@ class DmsfFolder < ActiveRecord::Base
if commit
self.destroy
else
self.deleted = true
self.deleted = STATUS_DELETED
self.deleted_by_user = User.current
self.save
end
end
def deleted?
self.deleted == STATUS_DELETED
end
def restore
if self.dmsf_folder_id && (self.folder.nil? || self.folder.deleted)
if self.dmsf_folder_id && (self.folder.nil? || self.folder.deleted?)
errors[:base] << l(:error_parent_folder)
return false
end
self.referenced_links.each { |l| l.restore }
self.deleted = false
self.deleted = STATUS_ACTIVE
self.deleted_by_user = nil
self.save
end

View File

@ -2,7 +2,7 @@
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011-15 Karel Pičman <karel.picman@kontron.com>
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@ -42,8 +42,11 @@ class DmsfLink < ActiveRecord::Base
end
end
scope :visible, -> { where(deleted: false) }
scope :deleted, -> { where(deleted: true) }
STATUS_DELETED = 1
STATUS_ACTIVE = 0
scope :visible, -> { where(:deleted => STATUS_ACTIVE) }
scope :deleted, -> { where(:deleted => STATUS_DELETED) }
def target_folder_id
if self.target_type == DmsfFolder.model_name.to_s
@ -119,20 +122,20 @@ class DmsfLink < ActiveRecord::Base
if commit
self.destroy
else
self.deleted = true
self.deleted = STATUS_DELETED
self.deleted_by_user = User.current
save
end
end
def restore
if self.dmsf_folder_id && (self.folder.nil? || self.folder.deleted)
if self.dmsf_folder_id && (self.folder.nil? || self.folder.deleted?)
errors[:base] << l(:error_parent_folder)
return false
end
self.deleted = false
self.deleted = STATUS_ACTIVE
self.deleted_by_user = nil
save
end
end
end

View File

@ -1,7 +1,9 @@
<%#
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011-15 Karel Picman <karel.picman@kontron.com>
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@ -24,7 +26,7 @@
<% assignments = Array.new %>
<% all_assignments.each do |assignment| %>
<% if assignment.dmsf_file_revision.file.last_revision &&
!assignment.dmsf_file_revision.file.last_revision.deleted &&
!assignment.dmsf_file_revision.file.last_revision.deleted? &&
(assignment.dmsf_file_revision.workflow == DmsfWorkflow::STATE_WAITING_FOR_APPROVAL) &&
(assignment.dmsf_file_revision == assignment.dmsf_file_revision.file.last_revision) %>
<% assignments << assignment %>

View File

@ -0,0 +1,35 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011-16 Karel Pičman <karel.picman@kontron.com>
#
# 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.
class StatusDeleted < ActiveRecord::Migration
def self.up
change_column :dmsf_folders, :deleted, :integer, :null => false, :default => DmsfFolder::STATUS_ACTIVE
change_column :dmsf_files, :deleted, :integer, :null => false, :default => DmsfFile::STATUS_ACTIVE
change_column :dmsf_file_revisions, :deleted, :integer, :null => false, :default => DmsfFileRevision::STATUS_ACTIVE
change_column :dmsf_links, :deleted, :integer, :null => false, :default => DmsfLink::STATUS_ACTIVE
end
def self.down
change_column :dmsf_folders, :deleted, :boolean, :null => false, :default => false
change_column :dmsf_files, :deleted, :boolean, :null => false, :default => false
change_column :dmsf_file_revisions, :deleted, :boolean, :null => false, :default => false
change_column :dmsf_links, :deleted, :boolean, :null => false, :default => false
end
end

View File

@ -104,7 +104,7 @@ class DmsfWebdavDeleteTest < RedmineDmsf::Test::IntegrationTest
delete "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", nil, @admin
assert_response :success # If its in the 20x range it's acceptable, should be 204.
@file1.reload
assert @file1.deleted, "File #{@file1.name} hasn't been deleted"
assert @file1.deleted?, "File #{@file1.name} hasn't been deleted"
end
def test_unathorized_user
@ -112,7 +112,7 @@ class DmsfWebdavDeleteTest < RedmineDmsf::Test::IntegrationTest
delete "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", nil, @jsmith
assert_response :missing # Without folder_view permission, he will not even be aware of its existence.
@file1.reload
assert !@file1.deleted, "File #{@file1.name} is expected to exist"
assert !@file1.deleted?, "File #{@file1.name} is expected to exist"
end
def test_unathorized_user_forbidden
@ -121,7 +121,7 @@ class DmsfWebdavDeleteTest < RedmineDmsf::Test::IntegrationTest
delete "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", nil, @jsmith
assert_response :forbidden # Now jsmith's role has view_folder rights, however they do not hold file manipulation rights.
@file1.reload
assert !@file1.deleted, "File #{@file1.name} is expected to exist"
assert !@file1.deleted?, "File #{@file1.name} is expected to exist"
end
def test_view_folder_not_allowed
@ -130,7 +130,7 @@ class DmsfWebdavDeleteTest < RedmineDmsf::Test::IntegrationTest
delete "/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}", nil, @jsmith
assert_response :missing # Without folder_view permission, he will not even be aware of its existence.
@folder1.reload
assert !@folder1.deleted, "Folder #{@folder1.title} is expected to exist"
assert !@folder1.deleted?, "Folder #{@folder1.title} is expected to exist"
end
def test_folder_manipulation_not_allowed
@ -139,7 +139,7 @@ class DmsfWebdavDeleteTest < RedmineDmsf::Test::IntegrationTest
delete "/dmsf/webdav/#{@project1.identifier}/#{@folder1.title}", nil, @jsmith
assert_response :forbidden # Without manipulation permission, action is forbidden.
@folder1.reload
assert !@folder1.deleted, "Foler #{@folder1.title} is expected to exist"
assert !@folder1.deleted?, "Foler #{@folder1.title} is expected to exist"
end
def test_folder_delete_by_admin
@ -147,7 +147,7 @@ class DmsfWebdavDeleteTest < RedmineDmsf::Test::IntegrationTest
delete "/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}", nil, @admin
assert_response :success
@folder6.reload
assert @folder6.deleted, "Folder #{@folder1.title} is not expected to exist"
assert @folder6.deleted?, "Folder #{@folder1.title} is not expected to exist"
end
def test_folder_delete_by_user
@ -157,7 +157,7 @@ class DmsfWebdavDeleteTest < RedmineDmsf::Test::IntegrationTest
delete "/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}", nil, @jsmith
assert_response :success
@folder6.reload
assert @folder6.deleted, "Folder #{@folder1.title} is not expected to exist"
assert @folder6.deleted?, "Folder #{@folder1.title} is not expected to exist"
end
def test_file_delete_by_administrator
@ -165,7 +165,7 @@ class DmsfWebdavDeleteTest < RedmineDmsf::Test::IntegrationTest
delete "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", nil, @admin
assert_response :success
@file1.reload
assert @file1.deleted, "File #{@file1.name} is not expected to exist"
assert @file1.deleted?, "File #{@file1.name} is not expected to exist"
end
def test_file_delete_by_user
@ -175,7 +175,7 @@ class DmsfWebdavDeleteTest < RedmineDmsf::Test::IntegrationTest
delete "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", nil, @jsmith
assert_response :success
@file1.reload
assert @file1.deleted, "File #{@file1.name} is not expected to exist"
assert @file1.deleted?, "File #{@file1.name} is not expected to exist"
end
def test_locked_folder
@ -186,7 +186,7 @@ class DmsfWebdavDeleteTest < RedmineDmsf::Test::IntegrationTest
delete "/dmsf/webdav/#{@project1.identifier}/#{@folder6.title}", nil, @jsmith
assert_response 423 # Locked
@folder6.reload
assert !@folder6.deleted, "Folder #{@folder6.title} is expected to exist"
assert !@folder6.deleted?, "Folder #{@folder6.title} is expected to exist"
end
def test_locked_file
@ -197,7 +197,7 @@ class DmsfWebdavDeleteTest < RedmineDmsf::Test::IntegrationTest
delete "/dmsf/webdav/#{@project1.identifier}/#{@file1.name}", nil, @jsmith
assert_response 423 # Locked
@file1.reload
assert !@file1.deleted, "File #{@file1.name} is expected to exist"
assert !@file1.deleted?, "File #{@file1.name} is expected to exist"
end
end

View File

@ -35,10 +35,10 @@ class DmsfFileRevisionTest < RedmineDmsf::Test::UnitTest
def test_delete_restore
@revision5.delete false
assert @revision5.deleted,
assert @revision5.deleted?,
"File revision #{@revision5.name} hasn't been deleted"
@revision5.restore
assert !@revision5.deleted,
assert !@revision5.deleted?,
"File revision #{@revision5.name} hasn't been restored"
end

View File

@ -54,12 +54,12 @@ class DmsfFileTest < RedmineDmsf::Test::UnitTest
end
def test_project_dmsf_file_listing_contains_deleted_items
assert @project1.dmsf_files.index{ |f| f.deleted },
assert @project1.dmsf_files.index{ |f| f.deleted? },
'Expected at least one deleted item in <all items>'
end
def test_project_dmsf_file_visible_listing_contains_no_deleted_items
assert @project1.dmsf_files.visible.index{ |f| f.deleted }.nil?,
assert @project1.dmsf_files.visible.index{ |f| f.deleted? }.nil?,
'There is a deleted file, this was unexpected'
end
@ -106,7 +106,7 @@ class DmsfFileTest < RedmineDmsf::Test::UnitTest
User.current = @admin
@file4.folder.unlock!
assert @file4.delete(false), @file4.errors.full_messages.to_sentence
assert @file4.deleted, "File #{@file4.name} is not deleted"
assert @file4.deleted?, "File #{@file4.name} is not deleted"
assert_equal 0, @file4.revisions.visible.count
assert_equal 0, @file4.referenced_links.visible.count
@file4.folder.lock!
@ -117,7 +117,7 @@ class DmsfFileTest < RedmineDmsf::Test::UnitTest
@file4.folder.unlock!
assert @file4.delete(false), @file4.errors.full_messages.to_sentence
@file4.restore
assert !@file4.deleted, "File #{@file4} hasn't been restored"
assert !@file4.deleted?, "File #{@file4} hasn't been restored"
assert_equal 1, @file4.revisions.visible.count
assert_equal 2, @file4.referenced_links.visible.count
@file4.folder.lock!

View File

@ -35,14 +35,14 @@ class DmsfFolderTest < RedmineDmsf::Test::UnitTest
def test_delete
assert @folder6.delete(false), @folder6.errors.full_messages.to_sentence
assert @folder6.deleted, "Folder #{@folder6} hasn't been deleted"
assert @folder6.deleted?, "Folder #{@folder6} hasn't been deleted"
end
def test_restore
assert @folder6.delete(false), @folder6.errors.full_messages.to_sentence
assert @folder6.deleted, "Folder #{@folder6} hasn't been deleted"
assert @folder6.deleted?, "Folder #{@folder6} hasn't been deleted"
assert @folder6.restore, @folder6.errors.full_messages.to_sentence
assert !@folder6.deleted, "Folder #{@folder6} hasn't been restored"
assert !@folder6.deleted?, "Folder #{@folder6} hasn't been restored"
end
def test_destroy

View File

@ -2,7 +2,7 @@
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011-15 Karel Pičman <karel.picman@lbcfree.net>
# Copyright (C) 2011-16 Karel Pičman <karel.picman@lbcfree.net>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@ -185,28 +185,28 @@ class DmsfLinksTest < RedmineDmsf::Test::UnitTest
def test_delete_file_link
assert @file_link.delete(false), @file_link.errors.full_messages.to_sentence
assert @file_link.deleted, "File link hasn't been deleted"
assert @file_link.deleted?, "File link hasn't been deleted"
end
def test_restore_file_link
assert @file_link.delete(false), @file_link.errors.full_messages.to_sentence
assert @file_link.deleted, "File link hasn't been deleted"
assert @file_link.deleted?, "File link hasn't been deleted"
assert @file_link.restore, @file_link.errors.full_messages.to_sentence
assert !@file_link.deleted, "File link hasn't been restored"
assert !@file_link.deleted?, "File link hasn't been restored"
end
def test_delete_folder_link
assert @folder_link.delete(false),
@folder_link.errors.full_messages.to_sentence
assert @folder_link.deleted, "Folder link hasn't been deleted"
assert @folder_link.deleted?, "Folder link hasn't been deleted"
end
def test_restore_folder_link
assert @folder_link.delete(false),
@folder_link.errors.full_messages.to_sentence
assert @folder_link.deleted, "Folder link hasn't been deleted"
assert @folder_link.deleted?, "Folder link hasn't been deleted"
assert @folder_link.restore, @folder_link.errors.full_messages.to_sentence
assert !@folder_link.deleted, "Folder link hasn't been restored"
assert !@folder_link.deleted?, "Folder link hasn't been restored"
end
def test_destroy_file_link