A problem by attaching documents to issues #866

This commit is contained in:
Karel Pičman 2018-06-01 09:23:58 +02:00
parent 44981a54d8
commit 0f9cf15262
8 changed files with 31 additions and 22 deletions

View File

@ -52,7 +52,7 @@ class DmsfFile < ActiveRecord::Base
scope :deleted, -> { where(:deleted => STATUS_DELETED) } scope :deleted, -> { where(:deleted => STATUS_DELETED) }
validates :name, :presence => true validates :name, :presence => true
validates_format_of :name, :with => DmsfFolder::INVALID_CHARACTERS, validates_format_of :name, :with => /\A[^#{DmsfFolder::INVALID_CHARACTERS}]*\z/,
:message => l(:error_contains_invalid_character) :message => l(:error_contains_invalid_character)
validate :validates_name_uniqueness validate :validates_name_uniqueness

View File

@ -66,7 +66,7 @@ class DmsfFileRevision < ActiveRecord::Base
joins("JOIN #{Project.table_name} ON #{Project.table_name}.id = #{DmsfFile.table_name}.project_id").visible joins("JOIN #{Project.table_name} ON #{Project.table_name}.id = #{DmsfFile.table_name}.project_id").visible
validates :title, :presence => true validates :title, :presence => true
validates_format_of :name, :with => DmsfFolder::INVALID_CHARACTERS, validates_format_of :name, :with => /\A[^#{DmsfFolder::INVALID_CHARACTERS}]*\z/,
:message => l(:error_contains_invalid_character) :message => l(:error_contains_invalid_character)
validates :description, length: { maximum: 1.kilobyte } validates :description, length: { maximum: 1.kilobyte }

View File

@ -43,7 +43,7 @@ class DmsfFolder < ActiveRecord::Base
:class_name => 'DmsfLock', :foreign_key => 'entity_id', :dependent => :destroy :class_name => 'DmsfLock', :foreign_key => 'entity_id', :dependent => :destroy
has_many :dmsf_folder_permissions, :dependent => :destroy has_many :dmsf_folder_permissions, :dependent => :destroy
INVALID_CHARACTERS = /\A[^\[\]\/\\\?":<>#%\*]*\z/.freeze INVALID_CHARACTERS = '\[\]\/\\\?":<>#%\*'.freeze
STATUS_DELETED = 1.freeze STATUS_DELETED = 1.freeze
STATUS_ACTIVE = 0.freeze STATUS_ACTIVE = 0.freeze
AVAILABLE_COLUMNS = %w(id title extension size modified version workflow author).freeze AVAILABLE_COLUMNS = %w(id title extension size modified version workflow author).freeze
@ -97,7 +97,7 @@ class DmsfFolder < ActiveRecord::Base
validates :title, :presence => true validates :title, :presence => true
validates_uniqueness_of :title, :scope => [:dmsf_folder_id, :project_id, :deleted], validates_uniqueness_of :title, :scope => [:dmsf_folder_id, :project_id, :deleted],
conditions: -> { where(:deleted => STATUS_ACTIVE) } conditions: -> { where(:deleted => STATUS_ACTIVE) }
validates_format_of :title, :with => INVALID_CHARACTERS, validates_format_of :title, :with => /\A[^#{INVALID_CHARACTERS}]*\z/,
:message => l(:error_contains_invalid_character) :message => l(:error_contains_invalid_character)
validate :check_cycle validate :check_cycle
validates_length_of :description, :maximum => 65535 validates_length_of :description, :maximum => 65535
@ -551,6 +551,13 @@ class DmsfFolder < ActiveRecord::Base
self.save self.save
end end
def self.get_valid_title(title)
# 1. Invalid characters are replaced with dots.
# 2. Two or more dots in a row are replaced with a single dot.
# 3. Windows' WebClient does not like a dot at the end.
title.gsub(/[#{INVALID_CHARACTERS}]/, '.').gsub(/\.{2,}/, '.').chomp('.')
end
private private
def self.directory_subtree(tree, folder, level, current_folder) def self.directory_subtree(tree, folder, level, current_folder)

View File

@ -86,7 +86,7 @@
:position => position}) %> :position => position}) %>
</tr> </tr>
<% elsif obj.is_a?(DmsfLink) && (obj.target_type == 'DmsfFile') %> <% elsif obj.is_a?(DmsfLink) && (obj.target_type == 'DmsfFile') %>
<% unless obj.target_file.last_revision %> <% unless obj.target_file && obj.target_file.last_revision %>
<% Rails.logger.error "Error: dmsf_file id #{obj.target_id} has no revision!" %> <% Rails.logger.error "Error: dmsf_file id #{obj.target_id} has no revision!" %>
<% next %> <% next %>
<% end %> <% end %>

View File

@ -79,7 +79,7 @@ module RedmineDmsf
system_folder = issue.system_folder(false, old_project_id) system_folder = issue.system_folder(false, old_project_id)
if system_folder if system_folder
# Change the title if the issue's subject changed # Change the title if the issue's subject changed
system_folder.title = "#{issue.id} - #{issue.subject}" system_folder.title = "#{issue.id} - #{DmsfFolder::get_valid_title(issue.subject)}"
# Move system folders if needed # Move system folders if needed
if system_folder.dmsf_folder if system_folder.dmsf_folder
system_folder.dmsf_folder.project_id = project_id system_folder.dmsf_folder.project_id = project_id

View File

@ -112,7 +112,7 @@ module RedmineDmsf
folder = DmsfFolder.new folder = DmsfFolder.new
folder.dmsf_folder_id = parent.id folder.dmsf_folder_id = parent.id
folder.project_id = prj_id folder.project_id = prj_id
folder.title = "#{self.id} - #{self.subject}" folder.title = "#{self.id} - #{DmsfFolder::get_valid_title(self.subject)}"
folder.user_id = User.anonymous.id folder.user_id = User.anonymous.id
folder.system = true folder.system = true
folder.save folder.save

View File

@ -112,23 +112,19 @@ module RedmineDmsf
end end
def project_id def project_id
self.project.id if self.project project.id if project
end end
# Characters that MATCH this regex will be replaced with dots, no more than one dot in a row. def self.create_project_name(project)
INVALID_CHARACTERS = /[\/\\\?":<>#%\*\[\]]/.freeze # = / \ ? " : < > # % * [ ] if project
if Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names']
def self.create_project_name(p) "#{DmsfFolder::get_valid_title(project.name)} #{project.id}"
use_project_names = Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] else
if use_project_names project.identifier
# 1. Invalid characters are replaced with dots. end
# 2. Two or more dots in a row are replaced with a single dot. end
# (3. Windows WebClient does not like a dot at the end, but since the project id tag is appended this is not a problem.)
"#{p.name.gsub(INVALID_CHARACTERS, '.').gsub(/\.{2,}/, '.')} #{p.id}" if p
else
p.identifier if p
end
end end
end end
end end
end end

View File

@ -167,4 +167,10 @@ class DmsfFolderTest < RedmineDmsf::Test::UnitTest
assert !tree.to_s.include?('...folder2'), "'...folder2' string in the folder tree not expected." assert !tree.to_s.include?('...folder2'), "'...folder2' string in the folder tree not expected."
end end
end def test_get_valid_title
assert_equal '1052-6024 . U_CPLD_5M240Z_SMT_MBGA100_1.8V_-40',
DmsfFolder::get_valid_title('1052-6024 : U_CPLD_5M240Z_SMT_MBGA100_1.8V_-40...')
assert_equal 'test', DmsfFolder::get_valid_title("test#{DmsfFolder::INVALID_CHARACTERS}")
end
end