#183 Upload a new version via a link

This commit is contained in:
Karel Picman 2014-03-03 14:05:00 +01:00
parent d8390053f3
commit cff23b0153
10 changed files with 91 additions and 67 deletions

View File

@ -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}"

View File

@ -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}"

View File

@ -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}"

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -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" %>

View File

@ -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