From 0f9cf15262345c6d887d07c06d1f9efd246e8685 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Pi=C4=8Dman?= Date: Fri, 1 Jun 2018 09:23:58 +0200 Subject: [PATCH] A problem by attaching documents to issues #866 --- app/models/dmsf_file.rb | 2 +- app/models/dmsf_file_revision.rb | 2 +- app/models/dmsf_folder.rb | 11 +++++++-- app/views/dmsf/_dmsf_rows.erb | 2 +- .../controllers/issues_controller_hooks.rb | 2 +- lib/redmine_dmsf/patches/issue_patch.rb | 2 +- lib/redmine_dmsf/webdav/project_resource.rb | 24 ++++++++----------- test/unit/dmsf_folder_test.rb | 8 ++++++- 8 files changed, 31 insertions(+), 22 deletions(-) diff --git a/app/models/dmsf_file.rb b/app/models/dmsf_file.rb index d0b8e2c3..dc73d380 100644 --- a/app/models/dmsf_file.rb +++ b/app/models/dmsf_file.rb @@ -52,7 +52,7 @@ class DmsfFile < ActiveRecord::Base scope :deleted, -> { where(:deleted => STATUS_DELETED) } 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) validate :validates_name_uniqueness diff --git a/app/models/dmsf_file_revision.rb b/app/models/dmsf_file_revision.rb index df934983..5acaec06 100644 --- a/app/models/dmsf_file_revision.rb +++ b/app/models/dmsf_file_revision.rb @@ -66,7 +66,7 @@ class DmsfFileRevision < ActiveRecord::Base joins("JOIN #{Project.table_name} ON #{Project.table_name}.id = #{DmsfFile.table_name}.project_id").visible 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) validates :description, length: { maximum: 1.kilobyte } diff --git a/app/models/dmsf_folder.rb b/app/models/dmsf_folder.rb index e0a5e446..5640dba8 100644 --- a/app/models/dmsf_folder.rb +++ b/app/models/dmsf_folder.rb @@ -43,7 +43,7 @@ class DmsfFolder < ActiveRecord::Base :class_name => 'DmsfLock', :foreign_key => 'entity_id', :dependent => :destroy has_many :dmsf_folder_permissions, :dependent => :destroy - INVALID_CHARACTERS = /\A[^\[\]\/\\\?":<>#%\*]*\z/.freeze + INVALID_CHARACTERS = '\[\]\/\\\?":<>#%\*'.freeze STATUS_DELETED = 1.freeze STATUS_ACTIVE = 0.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_uniqueness_of :title, :scope => [:dmsf_folder_id, :project_id, :deleted], 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) validate :check_cycle validates_length_of :description, :maximum => 65535 @@ -551,6 +551,13 @@ class DmsfFolder < ActiveRecord::Base self.save 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 def self.directory_subtree(tree, folder, level, current_folder) diff --git a/app/views/dmsf/_dmsf_rows.erb b/app/views/dmsf/_dmsf_rows.erb index 4f0aa300..45540ab1 100644 --- a/app/views/dmsf/_dmsf_rows.erb +++ b/app/views/dmsf/_dmsf_rows.erb @@ -86,7 +86,7 @@ :position => position}) %> <% 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!" %> <% next %> <% end %> diff --git a/lib/redmine_dmsf/hooks/controllers/issues_controller_hooks.rb b/lib/redmine_dmsf/hooks/controllers/issues_controller_hooks.rb index 1769acf7..62a4daf1 100644 --- a/lib/redmine_dmsf/hooks/controllers/issues_controller_hooks.rb +++ b/lib/redmine_dmsf/hooks/controllers/issues_controller_hooks.rb @@ -79,7 +79,7 @@ module RedmineDmsf system_folder = issue.system_folder(false, old_project_id) if system_folder # 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 if system_folder.dmsf_folder system_folder.dmsf_folder.project_id = project_id diff --git a/lib/redmine_dmsf/patches/issue_patch.rb b/lib/redmine_dmsf/patches/issue_patch.rb index a8596a9b..d5b0694e 100644 --- a/lib/redmine_dmsf/patches/issue_patch.rb +++ b/lib/redmine_dmsf/patches/issue_patch.rb @@ -112,7 +112,7 @@ module RedmineDmsf folder = DmsfFolder.new folder.dmsf_folder_id = parent.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.system = true folder.save diff --git a/lib/redmine_dmsf/webdav/project_resource.rb b/lib/redmine_dmsf/webdav/project_resource.rb index f575ba8e..157fca79 100644 --- a/lib/redmine_dmsf/webdav/project_resource.rb +++ b/lib/redmine_dmsf/webdav/project_resource.rb @@ -112,23 +112,19 @@ module RedmineDmsf end def project_id - self.project.id if self.project + project.id if project end - # Characters that MATCH this regex will be replaced with dots, no more than one dot in a row. - INVALID_CHARACTERS = /[\/\\\?":<>#%\*\[\]]/.freeze # = / \ ? " : < > # % * [ ] - - def self.create_project_name(p) - use_project_names = Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] - if use_project_names - # 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, 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 + def self.create_project_name(project) + if project + if Setting.plugin_redmine_dmsf['dmsf_webdav_use_project_names'] + "#{DmsfFolder::get_valid_title(project.name)} #{project.id}" + else + project.identifier + end + end end + end end end diff --git a/test/unit/dmsf_folder_test.rb b/test/unit/dmsf_folder_test.rb index 406e4717..d784858d 100644 --- a/test/unit/dmsf_folder_test.rb +++ b/test/unit/dmsf_folder_test.rb @@ -167,4 +167,10 @@ class DmsfFolderTest < RedmineDmsf::Test::UnitTest assert !tree.to_s.include?('...folder2'), "'...folder2' string in the folder tree not expected." 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 \ No newline at end of file