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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,8 +1,8 @@
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2013 Karel Pičman <karel.picman@kontron.com>
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-14 Karel Pičman <karel.picman@kontron.com>
#
# 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

View File

@ -26,8 +26,8 @@
<% if @file.locked_for_user? %>
<p class="warning"><%= l(:info_file_locked) %></p>
<% 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| %>
<div class="clear">
<div class="splitcontentleft">
<p>

View File

@ -1,9 +1,9 @@
<%#=
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2013 Karel Pičman <karel.picman@kontron.com>
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2012 Daniel Munn <dan.munn@munnster.co.uk>
# Copyright (C) 2011-14 Karel Pičman <karel.picman@kontron.com>
#
# 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 @@
<div class="splitcontentleft">
<p>
<%= 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>
</div>
<div class="splitcontentright">
@ -40,7 +40,7 @@
<%= label_tag("commited_files[#{i}][description]", "#{l(:label_description)}:") %>
</p>
<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 class="splitcontentleft">
<p>
@ -69,10 +69,10 @@
<% end %>
<p>
<%= 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>
<div class="data">
<%= text_area_tag("commited_files[#{i}][comment]", upload.comment, :rows => 2, :style => 'width: 99%;') %>
</div>
</div>
<%= 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
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