diff --git a/app/controllers/dmsf_controller.rb b/app/controllers/dmsf_controller.rb index 6c147003..b705f29d 100644 --- a/app/controllers/dmsf_controller.rb +++ b/app/controllers/dmsf_controller.rb @@ -202,7 +202,7 @@ class DmsfController < ApplicationController end begin DmsfMailer.get_notify_users(User.current, deleted_files).each do |u| - DmsfMailer.files_deleted(u, deleted_files).deliver + DmsfMailer.files_deleted(u, @project, deleted_files).deliver end rescue Exception => e Rails.logger.error "Could not send email notifications: #{e.message}" diff --git a/app/controllers/dmsf_files_controller.rb b/app/controllers/dmsf_files_controller.rb index c379f18b..0d33d6eb 100644 --- a/app/controllers/dmsf_files_controller.rb +++ b/app/controllers/dmsf_files_controller.rb @@ -82,7 +82,7 @@ class DmsfFilesController < ApplicationController @revision.minor_version = last_revision.minor_version version = params[:version].to_i file_upload = params[:file_upload] - if file_upload.nil? + unless file_upload @revision.disk_filename = last_revision.disk_filename @revision.increase_version(version, false) @revision.mime_type = last_revision.mime_type @@ -119,7 +119,7 @@ class DmsfFilesController < ApplicationController log_activity('new revision') begin DmsfMailer.get_notify_users(User.current, [@file]).each do |u| - DmsfMailer.files_updated(u, [@file]).deliver + DmsfMailer.files_updated(u, @project, [@file]).deliver end rescue Exception => e logger.error "Could not send email notifications: #{e.message}" @@ -137,7 +137,7 @@ class DmsfFilesController < ApplicationController log_activity('deleted') begin DmsfMailer.get_notify_users(User.current, [@file]).each do |u| - DmsfMailer.files_deleted(u, [@file]).deliver + DmsfMailer.files_deleted(u, @project, [@file]).deliver end rescue Exception => e Rails.logger.error "Could not send email notifications: #{e.message}" diff --git a/app/controllers/dmsf_upload_controller.rb b/app/controllers/dmsf_upload_controller.rb index 14be01f3..1145af60 100644 --- a/app/controllers/dmsf_upload_controller.rb +++ b/app/controllers/dmsf_upload_controller.rb @@ -85,16 +85,21 @@ class DmsfUploadController < ApplicationController files = [] failed_uploads = [] commited_files.each_value do |commited_file| - name = commited_file['name']; + name = commited_file[:name] new_revision = DmsfFileRevision.new file = DmsfFile.visible.find_file_by_name(@project, @folder, name) - if file.nil? + unless file + link = DmsfLink.find_link_by_file_name(@project, @folder, name) + file = link.target_file if link + end + + unless file file = DmsfFile.new file.project = @project file.name = name file.folder = @folder - file.notification = Setting.plugin_redmine_dmsf['dmsf_default_notifications'].present? + file.notification = Setting.plugin_redmine_dmsf[:dmsf_default_notifications].present? new_revision.minor_version = 0 new_revision.major_version = 0 @@ -109,17 +114,17 @@ class DmsfUploadController < ApplicationController new_revision.minor_version = last_revision.minor_version end - commited_disk_filepath = "#{DmsfHelper.temp_dir}/#{commited_file['disk_filename'].gsub(/[\/\\]/,'')}" + commited_disk_filepath = "#{DmsfHelper.temp_dir}/#{commited_file[:disk_filename].gsub(/[\/\\]/,'')}" - new_revision.project = @project - new_revision.folder = @folder + new_revision.project = link ? link.target_project : @project + new_revision.folder = link ? link.target_folder : @folder new_revision.file = file new_revision.user = User.current new_revision.name = name - new_revision.title = commited_file['title'] - new_revision.description = commited_file['description'] - new_revision.comment = commited_file['comment'] - new_revision.increase_version(commited_file['version'].to_i, true) + new_revision.title = commited_file[:title] + new_revision.description = commited_file[:description] + new_revision.comment = commited_file[:comment] + new_revision.increase_version(commited_file[:version].to_i, true) new_revision.mime_type = Redmine::MimeType.of(new_revision.name) new_revision.size = File.size(commited_disk_filepath) @@ -142,8 +147,8 @@ class DmsfUploadController < ApplicationController # Need to save file first to generate id for it in case of creation. # File id is needed to properly generate revision disk filename - if commited_file['dmsf_file_revision'].present? - commited_file['dmsf_file_revision']['custom_field_values'].each_with_index do |v, i| + if commited_file[:dmsf_file_revision].present? + commited_file[:dmsf_file_revision][:custom_field_values].each_with_index do |v, i| new_revision.custom_field_values[i].value = v[1] end end @@ -170,7 +175,7 @@ class DmsfUploadController < ApplicationController files.each { |file| log_activity(file, 'uploaded') if file } begin DmsfMailer.get_notify_users(User.current, files).each do |u| - DmsfMailer.files_updated(u, files).deliver + DmsfMailer.files_updated(u, @project, files).deliver end rescue Exception => e Rails.logger.error "Could not send email notifications: #{e.message}" diff --git a/app/models/dmsf_file.rb b/app/models/dmsf_file.rb index 3c1a9ac8..73001479 100644 --- a/app/models/dmsf_file.rb +++ b/app/models/dmsf_file.rb @@ -85,12 +85,11 @@ class DmsfFile < ActiveRecord::Base visible.where(:project_id => project.id, :dmsf_folder_id => nil).order('name ASC') end - def self.find_file_by_name(project, folder, name) - if folder - visible.where(:project_id => project, :dmsf_folder_id => folder.id, :name => name).first - else - visible.where(:project_id => project, :dmsf_folder_id => nil, :name => name).first - end + def self.find_file_by_name(project, folder, name) + where( + :project_id => project, + :dmsf_folder_id => folder ? folder.id : nil, + :name => name).visible.first end def last_revision diff --git a/app/models/dmsf_link.rb b/app/models/dmsf_link.rb index f9311444..74205f41 100644 --- a/app/models/dmsf_link.rb +++ b/app/models/dmsf_link.rb @@ -58,5 +58,16 @@ class DmsfLink < ActiveRecord::Base def title self.name end + + def self.find_link_by_file_name(project, folder, filename) + links = DmsfLink.where( + :project_id => project.id, + :dmsf_folder_id => folder ? folder.id : nil, + :target_type => DmsfFile.model_name).visible.all + links.each do |link| + return link if link.target_file.name == filename + end + nil + end end diff --git a/app/models/dmsf_mailer.rb b/app/models/dmsf_mailer.rb index f0962a1f..c1980a59 100644 --- a/app/models/dmsf_mailer.rb +++ b/app/models/dmsf_mailer.rb @@ -22,9 +22,8 @@ require 'mailer' class DmsfMailer < Mailer layout 'mailer' - def files_updated(user, files) - if user && files.count > 0 - project = files[0].project + def files_updated(user, project, files) + if user && project && files.count > 0 files = files.select { |file| file.notify? } redmine_headers 'Project' => project.identifier if project @@ -38,9 +37,8 @@ class DmsfMailer < Mailer end end - def files_deleted(user, files) - if user && files.count > 0 - project = files[0].project + def files_deleted(user, project, files) + if user && files.count > 0 files = files.select { |file| file.notify? } redmine_headers 'Project' => project.identifier if project @@ -85,8 +83,9 @@ class DmsfMailer < Mailer end def self.get_notify_users(user, files) - return [] if files.empty? - project = files[0].project + notify_files = files.select { |file| file.notify? } + return [] if notify_files.empty? + project = notify_files[0].project notify_members = project.members notify_members = notify_members.select do |notify_member| notify_user = notify_member.user diff --git a/app/models/dmsf_upload.rb b/app/models/dmsf_upload.rb index a5e3bc8a..5fb2161a 100644 --- a/app/models/dmsf_upload.rb +++ b/app/models/dmsf_upload.rb @@ -1,8 +1,8 @@ # Redmine plugin for Document Management System "Features" # -# Copyright (C) 2011 Vít Jonáš -# Copyright (C) 2012 Daniel Munn -# Copyright (C) 2013 Karel Pičman +# Copyright (C) 2011 Vít Jonáš +# Copyright (C) 2012 Daniel Munn +# Copyright (C) 2011-14 Karel Pičman # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -38,12 +38,12 @@ class DmsfUpload def self.create_from_uploaded_file(project, folder, uploaded_file) uploaded = { - 'disk_filename' => DmsfHelper.temp_filename(uploaded_file.original_filename), - 'content_type' => uploaded_file.content_type.to_s, - 'original_filename' => uploaded_file.original_filename, + :disk_filename => DmsfHelper.temp_filename(uploaded_file.original_filename), + :content_type => uploaded_file.content_type.to_s, + :original_filename => uploaded_file.original_filename, } - File.open("#{DmsfHelper.temp_dir}/#{uploaded["disk_filename"]}", "wb") do |f| + File.open("#{DmsfHelper.temp_dir}/#{uploaded[:disk_filename]}", 'wb') do |f| while (buffer = uploaded_file.read(8192)) f.write(buffer) end @@ -52,15 +52,19 @@ class DmsfUpload end def initialize(project, folder, uploaded) - @name = uploaded['original_filename'] + @name = uploaded[:original_filename] - dmsf_file = DmsfFile.visible.find_file_by_name(project, folder, @name) + file = DmsfFile.find_file_by_name(project, folder, @name) + unless file + link = DmsfLink.find_link_by_file_name(project, folder, @name) + file = link.target_file if link + end - @disk_filename = uploaded['disk_filename'] - @mime_type = uploaded['content_type'] + @disk_filename = uploaded[:disk_filename] + @mime_type = uploaded[:content_type] @size = File.size(disk_file) - if dmsf_file.nil? || dmsf_file.last_revision.nil? + if file.nil? || file.last_revision.nil? @title = DmsfFileRevision.filename_to_title(@name) @description = nil @major_version = 0 @@ -68,24 +72,24 @@ class DmsfUpload @workflow = nil @custom_values = DmsfFileRevision.new(:file => DmsfFile.new(:project => @project)).custom_field_values else - last_revision = dmsf_file.last_revision + last_revision = file.last_revision @title = last_revision.title @description = last_revision.description @major_version = last_revision.major_version @minor_version = last_revision.minor_version @workflow = last_revision.workflow - @custom_values = Array.new(dmsf_file.last_revision.custom_values) + @custom_values = Array.new(file.last_revision.custom_values) # Add default value for CFs not existing - present_custom_fields = dmsf_file.last_revision.custom_values.collect(&:custom_field).uniq - dmsf_file.last_revision.available_custom_fields.each do |cf| + present_custom_fields = file.last_revision.custom_values.collect(&:custom_field).uniq + file.last_revision.available_custom_fields.each do |cf| unless present_custom_fields.include?(cf) @custom_values << CustomValue.new({:custom_field => cf, :value => cf.default_value}) if cf.default_value end end end - @locked = dmsf_file && dmsf_file.locked_for_user? + @locked = file && file.locked_for_user? end -end +end \ No newline at end of file diff --git a/app/views/dmsf_files/_file_new_revision.html.erb b/app/views/dmsf_files/_file_new_revision.html.erb index b54214f5..3db76d92 100644 --- a/app/views/dmsf_files/_file_new_revision.html.erb +++ b/app/views/dmsf_files/_file_new_revision.html.erb @@ -26,8 +26,8 @@ <% if @file.locked_for_user? %>

<%= l(:info_file_locked) %>

<% else %> - <%= form_for(@revision, :url => {:action => 'create_revision', :id => @file}, - :html => {:method=>:post, :multipart => true, :id => 'new_revision_form'}) do |f| %> + <%= form_for(@revision, :url => { :action => 'create_revision', :id => @file }, + :html => { :method => :post, :multipart => true, :id => 'new_revision_form' }) do |f| %>

diff --git a/app/views/dmsf_upload/_upload_file.html.erb b/app/views/dmsf_upload/_upload_file.html.erb index 8176802b..a552bb44 100644 --- a/app/views/dmsf_upload/_upload_file.html.erb +++ b/app/views/dmsf_upload/_upload_file.html.erb @@ -1,9 +1,9 @@ <%#= # Redmine plugin for Document Management System "Features" # -# Copyright (C) 2011 Vít Jonáš -# Copyright (C) 2012 Daniel Munn -# Copyright (C) 2013 Karel Pičman +# Copyright (C) 2011 Vít Jonáš +# Copyright (C) 2012 Daniel Munn +# Copyright (C) 2011-14 Karel Pičman # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -25,7 +25,7 @@

<%= label_tag("commited_files[#{i}][title]", "#{l(:label_title)}:") %> - <%= text_field_tag("commited_files[#{i}][title]", upload.title, :size => '32') %> + <%= text_field_tag("commited_files[#{i}][title]", upload.title, :size => 32) %>

@@ -40,7 +40,7 @@ <%= label_tag("commited_files[#{i}][description]", "#{l(:label_description)}:") %>

- <%= text_area_tag("commited_files[#{i}][description]", upload.description, :rows=> '6', :class => 'wiki-edit') %> + <%= text_area_tag("commited_files[#{i}][description]", upload.description, :rows=> 6, :class => 'wiki-edit') %>

@@ -69,10 +69,10 @@ <% end %>

<%= label_tag("commited_files[#{i}][comment]", "#{l(:label_comment)}:") %> -

- <%= text_area_tag("commited_files[#{i}][comment]", upload.comment, :rows=> '2', :style => 'width: 99%;') %> -

+
+ <%= text_area_tag("commited_files[#{i}][comment]", upload.comment, :rows => 2, :style => 'width: 99%;') %> +
<%= wikitoolbar_for "commited_files_#{i}_description" %> diff --git a/test/unit/dmsf_links_test.rb b/test/unit/dmsf_links_test.rb index e476e255..7a3c02ee 100644 --- a/test/unit/dmsf_links_test.rb +++ b/test/unit/dmsf_links_test.rb @@ -102,38 +102,44 @@ class DmsfLinksTest < RedmineDmsf::Test::UnitTest assert_equal 1, @folder_link.target_folder_id end - def target_folder + def test_target_folder assert_equal @folder2, @file_link.target_folder assert_equal @folder1, @folder_link.target_folder end - def target_file_id + def test_target_file_id assert_equal 4, @file_link.target_file_id assert_nil @folder_link.target_file end - def target_file + def test_target_file assert_equal @file4, @file_link.target_file assert_nil @folder_link.target_file end - def target_project - assert_equal @project, @file_link.target_project - assert_equal @project, @folder_link.target_project + def test_target_project + assert_equal @project1, @file_link.target_project + assert_equal @project1, @folder_link.target_project end - def folder + def test_folder assert_equal @folder1, @file_link.folder assert_nil @folder_link.folder end - def title + def test_title assert_equal @file_link.name, @file_link.title assert_equal @folder_link.name, @folder_link.title end + def test_find_link_by_file_name + assert_equal @file_link, + DmsfLink.find_link_by_file_name(@file_link.project, @file_link.folder, @file_link.target_file.name) + end + def test_destroy @folder_link.destroy assert_nil DmsfLink.find_by_id 1 end + end \ No newline at end of file