#183 Upload a new version via a link
This commit is contained in:
parent
d8390053f3
commit
cff23b0153
@ -202,7 +202,7 @@ class DmsfController < ApplicationController
|
|||||||
end
|
end
|
||||||
begin
|
begin
|
||||||
DmsfMailer.get_notify_users(User.current, deleted_files).each do |u|
|
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
|
end
|
||||||
rescue Exception => e
|
rescue Exception => e
|
||||||
Rails.logger.error "Could not send email notifications: #{e.message}"
|
Rails.logger.error "Could not send email notifications: #{e.message}"
|
||||||
|
|||||||
@ -82,7 +82,7 @@ class DmsfFilesController < ApplicationController
|
|||||||
@revision.minor_version = last_revision.minor_version
|
@revision.minor_version = last_revision.minor_version
|
||||||
version = params[:version].to_i
|
version = params[:version].to_i
|
||||||
file_upload = params[:file_upload]
|
file_upload = params[:file_upload]
|
||||||
if file_upload.nil?
|
unless file_upload
|
||||||
@revision.disk_filename = last_revision.disk_filename
|
@revision.disk_filename = last_revision.disk_filename
|
||||||
@revision.increase_version(version, false)
|
@revision.increase_version(version, false)
|
||||||
@revision.mime_type = last_revision.mime_type
|
@revision.mime_type = last_revision.mime_type
|
||||||
@ -119,7 +119,7 @@ class DmsfFilesController < ApplicationController
|
|||||||
log_activity('new revision')
|
log_activity('new revision')
|
||||||
begin
|
begin
|
||||||
DmsfMailer.get_notify_users(User.current, [@file]).each do |u|
|
DmsfMailer.get_notify_users(User.current, [@file]).each do |u|
|
||||||
DmsfMailer.files_updated(u, [@file]).deliver
|
DmsfMailer.files_updated(u, @project, [@file]).deliver
|
||||||
end
|
end
|
||||||
rescue Exception => e
|
rescue Exception => e
|
||||||
logger.error "Could not send email notifications: #{e.message}"
|
logger.error "Could not send email notifications: #{e.message}"
|
||||||
@ -137,7 +137,7 @@ class DmsfFilesController < ApplicationController
|
|||||||
log_activity('deleted')
|
log_activity('deleted')
|
||||||
begin
|
begin
|
||||||
DmsfMailer.get_notify_users(User.current, [@file]).each do |u|
|
DmsfMailer.get_notify_users(User.current, [@file]).each do |u|
|
||||||
DmsfMailer.files_deleted(u, [@file]).deliver
|
DmsfMailer.files_deleted(u, @project, [@file]).deliver
|
||||||
end
|
end
|
||||||
rescue Exception => e
|
rescue Exception => e
|
||||||
Rails.logger.error "Could not send email notifications: #{e.message}"
|
Rails.logger.error "Could not send email notifications: #{e.message}"
|
||||||
|
|||||||
@ -85,16 +85,21 @@ class DmsfUploadController < ApplicationController
|
|||||||
files = []
|
files = []
|
||||||
failed_uploads = []
|
failed_uploads = []
|
||||||
commited_files.each_value do |commited_file|
|
commited_files.each_value do |commited_file|
|
||||||
name = commited_file['name'];
|
name = commited_file[:name]
|
||||||
|
|
||||||
new_revision = DmsfFileRevision.new
|
new_revision = DmsfFileRevision.new
|
||||||
file = DmsfFile.visible.find_file_by_name(@project, @folder, name)
|
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 = DmsfFile.new
|
||||||
file.project = @project
|
file.project = @project
|
||||||
file.name = name
|
file.name = name
|
||||||
file.folder = @folder
|
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.minor_version = 0
|
||||||
new_revision.major_version = 0
|
new_revision.major_version = 0
|
||||||
@ -109,17 +114,17 @@ class DmsfUploadController < ApplicationController
|
|||||||
new_revision.minor_version = last_revision.minor_version
|
new_revision.minor_version = last_revision.minor_version
|
||||||
end
|
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.project = link ? link.target_project : @project
|
||||||
new_revision.folder = @folder
|
new_revision.folder = link ? link.target_folder : @folder
|
||||||
new_revision.file = file
|
new_revision.file = file
|
||||||
new_revision.user = User.current
|
new_revision.user = User.current
|
||||||
new_revision.name = name
|
new_revision.name = name
|
||||||
new_revision.title = commited_file['title']
|
new_revision.title = commited_file[:title]
|
||||||
new_revision.description = commited_file['description']
|
new_revision.description = commited_file[:description]
|
||||||
new_revision.comment = commited_file['comment']
|
new_revision.comment = commited_file[:comment]
|
||||||
new_revision.increase_version(commited_file['version'].to_i, true)
|
new_revision.increase_version(commited_file[:version].to_i, true)
|
||||||
new_revision.mime_type = Redmine::MimeType.of(new_revision.name)
|
new_revision.mime_type = Redmine::MimeType.of(new_revision.name)
|
||||||
new_revision.size = File.size(commited_disk_filepath)
|
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.
|
# Need to save file first to generate id for it in case of creation.
|
||||||
# File id is needed to properly generate revision disk filename
|
# File id is needed to properly generate revision disk filename
|
||||||
if commited_file['dmsf_file_revision'].present?
|
if commited_file[:dmsf_file_revision].present?
|
||||||
commited_file['dmsf_file_revision']['custom_field_values'].each_with_index do |v, i|
|
commited_file[:dmsf_file_revision][:custom_field_values].each_with_index do |v, i|
|
||||||
new_revision.custom_field_values[i].value = v[1]
|
new_revision.custom_field_values[i].value = v[1]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -170,7 +175,7 @@ class DmsfUploadController < ApplicationController
|
|||||||
files.each { |file| log_activity(file, 'uploaded') if file }
|
files.each { |file| log_activity(file, 'uploaded') if file }
|
||||||
begin
|
begin
|
||||||
DmsfMailer.get_notify_users(User.current, files).each do |u|
|
DmsfMailer.get_notify_users(User.current, files).each do |u|
|
||||||
DmsfMailer.files_updated(u, files).deliver
|
DmsfMailer.files_updated(u, @project, files).deliver
|
||||||
end
|
end
|
||||||
rescue Exception => e
|
rescue Exception => e
|
||||||
Rails.logger.error "Could not send email notifications: #{e.message}"
|
Rails.logger.error "Could not send email notifications: #{e.message}"
|
||||||
|
|||||||
@ -86,11 +86,10 @@ class DmsfFile < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
def self.find_file_by_name(project, folder, name)
|
def self.find_file_by_name(project, folder, name)
|
||||||
if folder
|
where(
|
||||||
visible.where(:project_id => project, :dmsf_folder_id => folder.id, :name => name).first
|
:project_id => project,
|
||||||
else
|
:dmsf_folder_id => folder ? folder.id : nil,
|
||||||
visible.where(:project_id => project, :dmsf_folder_id => nil, :name => name).first
|
:name => name).visible.first
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def last_revision
|
def last_revision
|
||||||
|
|||||||
@ -59,4 +59,15 @@ class DmsfLink < ActiveRecord::Base
|
|||||||
self.name
|
self.name
|
||||||
end
|
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
|
end
|
||||||
|
|||||||
@ -22,9 +22,8 @@ require 'mailer'
|
|||||||
class DmsfMailer < Mailer
|
class DmsfMailer < Mailer
|
||||||
layout 'mailer'
|
layout 'mailer'
|
||||||
|
|
||||||
def files_updated(user, files)
|
def files_updated(user, project, files)
|
||||||
if user && files.count > 0
|
if user && project && files.count > 0
|
||||||
project = files[0].project
|
|
||||||
files = files.select { |file| file.notify? }
|
files = files.select { |file| file.notify? }
|
||||||
|
|
||||||
redmine_headers 'Project' => project.identifier if project
|
redmine_headers 'Project' => project.identifier if project
|
||||||
@ -38,9 +37,8 @@ class DmsfMailer < Mailer
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def files_deleted(user, files)
|
def files_deleted(user, project, files)
|
||||||
if user && files.count > 0
|
if user && files.count > 0
|
||||||
project = files[0].project
|
|
||||||
files = files.select { |file| file.notify? }
|
files = files.select { |file| file.notify? }
|
||||||
|
|
||||||
redmine_headers 'Project' => project.identifier if project
|
redmine_headers 'Project' => project.identifier if project
|
||||||
@ -85,8 +83,9 @@ class DmsfMailer < Mailer
|
|||||||
end
|
end
|
||||||
|
|
||||||
def self.get_notify_users(user, files)
|
def self.get_notify_users(user, files)
|
||||||
return [] if files.empty?
|
notify_files = files.select { |file| file.notify? }
|
||||||
project = files[0].project
|
return [] if notify_files.empty?
|
||||||
|
project = notify_files[0].project
|
||||||
notify_members = project.members
|
notify_members = project.members
|
||||||
notify_members = notify_members.select do |notify_member|
|
notify_members = notify_members.select do |notify_member|
|
||||||
notify_user = notify_member.user
|
notify_user = notify_member.user
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
# Redmine plugin for Document Management System "Features"
|
# 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) 2012 Daniel Munn <dan.munn@munnster.co.uk>
|
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
|
||||||
# Copyright (C) 2013 Karel Pičman <karel.picman@kontron.com>
|
# Copyright (C) 2011-14 Karel Pičman <karel.picman@kontron.com>
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or
|
# This program is free software; you can redistribute it and/or
|
||||||
# modify it under the terms of the GNU General Public License
|
# 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)
|
def self.create_from_uploaded_file(project, folder, uploaded_file)
|
||||||
uploaded = {
|
uploaded = {
|
||||||
'disk_filename' => DmsfHelper.temp_filename(uploaded_file.original_filename),
|
:disk_filename => DmsfHelper.temp_filename(uploaded_file.original_filename),
|
||||||
'content_type' => uploaded_file.content_type.to_s,
|
:content_type => uploaded_file.content_type.to_s,
|
||||||
'original_filename' => uploaded_file.original_filename,
|
: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))
|
while (buffer = uploaded_file.read(8192))
|
||||||
f.write(buffer)
|
f.write(buffer)
|
||||||
end
|
end
|
||||||
@ -52,15 +52,19 @@ class DmsfUpload
|
|||||||
end
|
end
|
||||||
|
|
||||||
def initialize(project, folder, uploaded)
|
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']
|
@disk_filename = uploaded[:disk_filename]
|
||||||
@mime_type = uploaded['content_type']
|
@mime_type = uploaded[:content_type]
|
||||||
@size = File.size(disk_file)
|
@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)
|
@title = DmsfFileRevision.filename_to_title(@name)
|
||||||
@description = nil
|
@description = nil
|
||||||
@major_version = 0
|
@major_version = 0
|
||||||
@ -68,24 +72,24 @@ class DmsfUpload
|
|||||||
@workflow = nil
|
@workflow = nil
|
||||||
@custom_values = DmsfFileRevision.new(:file => DmsfFile.new(:project => @project)).custom_field_values
|
@custom_values = DmsfFileRevision.new(:file => DmsfFile.new(:project => @project)).custom_field_values
|
||||||
else
|
else
|
||||||
last_revision = dmsf_file.last_revision
|
last_revision = file.last_revision
|
||||||
@title = last_revision.title
|
@title = last_revision.title
|
||||||
@description = last_revision.description
|
@description = last_revision.description
|
||||||
@major_version = last_revision.major_version
|
@major_version = last_revision.major_version
|
||||||
@minor_version = last_revision.minor_version
|
@minor_version = last_revision.minor_version
|
||||||
@workflow = last_revision.workflow
|
@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
|
# Add default value for CFs not existing
|
||||||
present_custom_fields = dmsf_file.last_revision.custom_values.collect(&:custom_field).uniq
|
present_custom_fields = file.last_revision.custom_values.collect(&:custom_field).uniq
|
||||||
dmsf_file.last_revision.available_custom_fields.each do |cf|
|
file.last_revision.available_custom_fields.each do |cf|
|
||||||
unless present_custom_fields.include?(cf)
|
unless present_custom_fields.include?(cf)
|
||||||
@custom_values << CustomValue.new({:custom_field => cf, :value => cf.default_value}) if cf.default_value
|
@custom_values << CustomValue.new({:custom_field => cf, :value => cf.default_value}) if cf.default_value
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@locked = dmsf_file && dmsf_file.locked_for_user?
|
@locked = file && file.locked_for_user?
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
@ -26,8 +26,8 @@
|
|||||||
<% if @file.locked_for_user? %>
|
<% if @file.locked_for_user? %>
|
||||||
<p class="warning"><%= l(:info_file_locked) %></p>
|
<p class="warning"><%= l(:info_file_locked) %></p>
|
||||||
<% else %>
|
<% else %>
|
||||||
<%= form_for(@revision, :url => {:action => 'create_revision', :id => @file},
|
<%= form_for(@revision, :url => { :action => 'create_revision', :id => @file },
|
||||||
:html => {:method=>:post, :multipart => true, :id => 'new_revision_form'}) do |f| %>
|
:html => { :method => :post, :multipart => true, :id => 'new_revision_form' }) do |f| %>
|
||||||
<div class="clear">
|
<div class="clear">
|
||||||
<div class="splitcontentleft">
|
<div class="splitcontentleft">
|
||||||
<p>
|
<p>
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
<%#=
|
<%#=
|
||||||
# Redmine plugin for Document Management System "Features"
|
# 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) 2012 Daniel Munn <dan.munn@munnster.co.uk>
|
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
|
||||||
# Copyright (C) 2013 Karel Pičman <karel.picman@kontron.com>
|
# Copyright (C) 2011-14 Karel Pičman <karel.picman@kontron.com>
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or
|
# This program is free software; you can redistribute it and/or
|
||||||
# modify it under the terms of the GNU General Public License
|
# modify it under the terms of the GNU General Public License
|
||||||
@ -25,7 +25,7 @@
|
|||||||
<div class="splitcontentleft">
|
<div class="splitcontentleft">
|
||||||
<p>
|
<p>
|
||||||
<%= label_tag("commited_files[#{i}][title]", "#{l(:label_title)}:") %>
|
<%= 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) %>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="splitcontentright">
|
<div class="splitcontentright">
|
||||||
@ -40,7 +40,7 @@
|
|||||||
<%= label_tag("commited_files[#{i}][description]", "#{l(:label_description)}:") %>
|
<%= label_tag("commited_files[#{i}][description]", "#{l(:label_description)}:") %>
|
||||||
</p>
|
</p>
|
||||||
<div class="wiki data clear">
|
<div class="wiki data clear">
|
||||||
<%= 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') %>
|
||||||
</div>
|
</div>
|
||||||
<div class="splitcontentleft">
|
<div class="splitcontentleft">
|
||||||
<p>
|
<p>
|
||||||
@ -69,10 +69,10 @@
|
|||||||
<% end %>
|
<% end %>
|
||||||
<p>
|
<p>
|
||||||
<%= label_tag("commited_files[#{i}][comment]", "#{l(:label_comment)}:") %>
|
<%= label_tag("commited_files[#{i}][comment]", "#{l(:label_comment)}:") %>
|
||||||
<div class="data">
|
|
||||||
<%= text_area_tag("commited_files[#{i}][comment]", upload.comment, :rows=> '2', :style => 'width: 99%;') %>
|
|
||||||
</div>
|
|
||||||
</p>
|
</p>
|
||||||
|
<div class="data">
|
||||||
|
<%= text_area_tag("commited_files[#{i}][comment]", upload.comment, :rows => 2, :style => 'width: 99%;') %>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<%= wikitoolbar_for "commited_files_#{i}_description" %>
|
<%= wikitoolbar_for "commited_files_#{i}_description" %>
|
||||||
|
|||||||
@ -102,38 +102,44 @@ class DmsfLinksTest < RedmineDmsf::Test::UnitTest
|
|||||||
assert_equal 1, @folder_link.target_folder_id
|
assert_equal 1, @folder_link.target_folder_id
|
||||||
end
|
end
|
||||||
|
|
||||||
def target_folder
|
def test_target_folder
|
||||||
assert_equal @folder2, @file_link.target_folder
|
assert_equal @folder2, @file_link.target_folder
|
||||||
assert_equal @folder1, @folder_link.target_folder
|
assert_equal @folder1, @folder_link.target_folder
|
||||||
end
|
end
|
||||||
|
|
||||||
def target_file_id
|
def test_target_file_id
|
||||||
assert_equal 4, @file_link.target_file_id
|
assert_equal 4, @file_link.target_file_id
|
||||||
assert_nil @folder_link.target_file
|
assert_nil @folder_link.target_file
|
||||||
end
|
end
|
||||||
|
|
||||||
def target_file
|
def test_target_file
|
||||||
assert_equal @file4, @file_link.target_file
|
assert_equal @file4, @file_link.target_file
|
||||||
assert_nil @folder_link.target_file
|
assert_nil @folder_link.target_file
|
||||||
end
|
end
|
||||||
|
|
||||||
def target_project
|
def test_target_project
|
||||||
assert_equal @project, @file_link.target_project
|
assert_equal @project1, @file_link.target_project
|
||||||
assert_equal @project, @folder_link.target_project
|
assert_equal @project1, @folder_link.target_project
|
||||||
end
|
end
|
||||||
|
|
||||||
def folder
|
def test_folder
|
||||||
assert_equal @folder1, @file_link.folder
|
assert_equal @folder1, @file_link.folder
|
||||||
assert_nil @folder_link.folder
|
assert_nil @folder_link.folder
|
||||||
end
|
end
|
||||||
|
|
||||||
def title
|
def test_title
|
||||||
assert_equal @file_link.name, @file_link.title
|
assert_equal @file_link.name, @file_link.title
|
||||||
assert_equal @folder_link.name, @folder_link.title
|
assert_equal @folder_link.name, @folder_link.title
|
||||||
end
|
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
|
def test_destroy
|
||||||
@folder_link.destroy
|
@folder_link.destroy
|
||||||
assert_nil DmsfLink.find_by_id 1
|
assert_nil DmsfLink.find_by_id 1
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
Loading…
x
Reference in New Issue
Block a user