From c0777e292e5127203ca34bd028c8a7cda9b72277 Mon Sep 17 00:00:00 2001
From: Karel Picman
Date: Tue, 12 Nov 2013 09:14:01 +0100
Subject: [PATCH] Custom fileds copy/move
---
app/controllers/dmsf_controller.rb | 8 ++-
app/models/dmsf_file.rb | 56 ++++++-------------
app/models/dmsf_file_revision.rb | 29 +++-------
app/models/dmsf_folder.rb | 13 ++---
app/models/dmsf_upload.rb | 40 ++++++++-----
app/views/dmsf/show.html.erb | 18 +++---
.../dmsf_files/_file_new_revision.html.erb | 6 +-
app/views/dmsf_upload/_upload_file.html.erb | 11 ++--
8 files changed, 82 insertions(+), 99 deletions(-)
diff --git a/app/controllers/dmsf_controller.rb b/app/controllers/dmsf_controller.rb
index 50b6a14f..44339f0f 100644
--- a/app/controllers/dmsf_controller.rb
+++ b/app/controllers/dmsf_controller.rb
@@ -28,7 +28,7 @@ class DmsfController < ApplicationController
helper :all
def show
- if @folder.nil?
+ unless @folder
@subfolders = @project.dmsf_folders.visible
@files = @project.dmsf_files.visible
else
@@ -37,7 +37,11 @@ class DmsfController < ApplicationController
end
@files.sort! do |a,b|
- a.last_revision.title <=> b.last_revision.title
+ if a.last_revision && b.last_revision
+ a.last_revision.title <=> b.last_revision.title
+ else
+ 0
+ end
end
end
diff --git a/app/models/dmsf_file.rb b/app/models/dmsf_file.rb
index ab04b03f..55bd8673 100644
--- a/app/models/dmsf_file.rb
+++ b/app/models/dmsf_file.rb
@@ -103,10 +103,7 @@ class DmsfFile < ActiveRecord::Base
errors[:base] << l(:error_file_is_locked)
return false
end
- if Setting.plugin_redmine_dmsf['dmsf_really_delete_files']
- CustomValue.where(:customized_id => self.id).all.each do |v|
- v.destroy
- end
+ if Setting.plugin_redmine_dmsf['dmsf_really_delete_files']
self.revisions.visible.each {|r| r.delete(true)}
self.destroy
else
@@ -179,12 +176,7 @@ class DmsfFile < ActiveRecord::Base
end
projects
end
-
- # Overrides Redmine::Acts::Customizable::InstanceMethods#available_custom_fields
- def available_custom_fields
- DmsfFileRevisionCustomField.all
- end
-
+
def move_to(project, folder)
if self.locked_for_user?
errors[:base] << l(:error_file_is_locked)
@@ -196,18 +188,11 @@ class DmsfFile < ActiveRecord::Base
new_revision.folder = folder
new_revision.project = folder ? folder.project : project
new_revision.comment = l(:comment_moved_from, :source => "#{self.project.identifier}:#{self.dmsf_path_str}")
-
+
new_revision.custom_values = []
- temp_custom_values = self.last_revision.custom_values.select{|cv| new_revision.available_custom_fields.include?(cv.custom_field)}.map(&:clone)
- new_revision.custom_values = temp_custom_values
-
- # Add default value for CFs not existing
- present_custom_fields = new_revision.custom_values.collect(&:custom_field).uniq
- new_revision.available_custom_fields.each do |cf|
- unless present_custom_fields.include?(cf)
- new_revision.custom_values << CustomValue.new({:custom_field => cf, :value => cf.default_value}) if cf.default_value
- end
- end
+ self.last_revision.custom_values.each do |cv|
+ new_revision.custom_values << CustomValue.new({:custom_field => cv.custom_field, :value => cv.value})
+ end
# If the target project differs from the source project we must physically move the file
if self.project != new_revision.project
@@ -219,7 +204,7 @@ class DmsfFile < ActiveRecord::Base
self.folder = new_revision.folder
self.project = new_revision.project
- self.save && new_revision.save
+ self.save && new_revision.save
end
def copy_to(project, folder)
@@ -237,19 +222,14 @@ class DmsfFile < ActiveRecord::Base
new_revision.project = folder ? folder.project : project
new_revision.comment = l(:comment_copied_from, :source => "#{self.project.identifier}: #{self.dmsf_path_str}")
- new_revision.custom_values = Array.new(self.last_revision.custom_values)
-
- # Add default value for CFs not existing
- present_custom_fields = new_revision.custom_values.collect(&:custom_field).uniq
- new_revision.available_custom_fields.each do |cf|
- unless present_custom_fields.include?(cf)
- new_revision.custom_values << CustomValue.new({:custom_field => cf, :value => cf.default_value}) if cf.default_value
- end
+ new_revision.custom_values = []
+ self.last_revision.custom_values.each do |cv|
+ new_revision.custom_values << CustomValue.new({:custom_field => cv.custom_field, :value => cv.value})
end
unless new_revision.save
file.delete
- else
+ else
# If the target project differs from the source project we must physically copy the file
if project != self.project
if File.exist? self.last_revision.disk_file
@@ -263,21 +243,21 @@ class DmsfFile < ActiveRecord::Base
end
# To fullfill searchable module expectations
- def self.search(tokens, projects=nil, options={})
+ def self.search(tokens, projects = nil, options = {})
tokens = [] << tokens unless tokens.is_a?(Array)
projects = [] << projects unless projects.nil? || projects.is_a?(Array)
find_options = {:include => [:project,:revisions]}
- find_options[:order] = "dmsf_files.updated_at " + (options[:before] ? 'DESC' : 'ASC')
+ find_options[:order] = 'dmsf_files.updated_at ' + (options[:before] ? 'DESC' : 'ASC')
limit_options = {}
limit_options[:limit] = options[:limit] if options[:limit]
if options[:offset]
- limit_options[:conditions] = "(dmsf_files.updated_at " + (options[:before] ? '<' : '>') + "'#{connection.quoted_date(options[:offset])}')"
+ limit_options[:conditions] = '(dmsf_files.updated_at ' + (options[:before] ? '<' : '>') + "'#{connection.quoted_date(options[:offset])}')"
end
- columns = ["dmsf_files.name","dmsf_file_revisions.title", "dmsf_file_revisions.description"]
- columns = ["dmsf_file_revisions.title"] if options[:titles_only]
+ columns = %w(dmsf_files.name, dmsf_file_revisions.title, dmsf_file_revisions.description)
+ columns = ['dmsf_file_revisions.title'] if options[:titles_only]
token_clauses = columns.collect {|column| "(LOWER(#{column}) LIKE ?)"}
@@ -309,7 +289,7 @@ class DmsfFile < ActiveRecord::Base
unless database.nil?
enquire = Xapian::Enquire.new(database)
- queryString = tokens.join(' ')
+ query_string = tokens.join(' ')
qp = Xapian::QueryParser.new()
stemmer = Xapian::Stem.new(Setting.plugin_redmine_dmsf['dmsf_stemming_lang'].strip)
qp.stemmer = stemmer
@@ -330,7 +310,7 @@ class DmsfFile < ActiveRecord::Base
qp.default_op = Xapian::Query::OP_OR
end
- query = qp.parse_query(queryString)
+ query = qp.parse_query(query_string)
enquire.query = query
matchset = enquire.mset(0, 1000)
diff --git a/app/models/dmsf_file_revision.rb b/app/models/dmsf_file_revision.rb
index f6c8ebd2..8043de2c 100644
--- a/app/models/dmsf_file_revision.rb
+++ b/app/models/dmsf_file_revision.rb
@@ -71,20 +71,14 @@ class DmsfFileRevision < ActiveRecord::Base
errors[:base] << l(:error_at_least_one_revision_must_be_present)
return false
end
- dependent = DmsfFileRevision.find(:source_dmsf_file_revision_id => self.id, :deleted => false).all
+ dependent = DmsfFileRevision.where(:source_dmsf_file_revision_id => self.id, :deleted => false).all
dependent.each do |d|
d.source_revision = self.source_revision
d.save!
end
if Setting.plugin_redmine_dmsf['dmsf_really_delete_files']
- dependent = DmsfFileRevision..where(:disk_filename => self.disk_filename).all
- File.delete(self.disk_file) if dependent.length <= 1 && File.exist?(self.disk_file)
- DmsfFileRevisionAccess.where(:dmsf_file_revision_id => self.id).all.each do |a|
- a.destroy
- end
- CustomValue.find(:customized_id => self.id).all.each do |v|
- v.destroy
- end
+ dependencies = DmsfFileRevision.where(:disk_filename => self.disk_filename).all.count
+ File.delete(self.disk_file) if dependencies <= 1 && File.exist?(self.disk_file)
self.destroy
else
self.deleted = true
@@ -132,8 +126,7 @@ class DmsfFileRevision < ActiveRecord::Base
# TODO: use standard clone method
def clone
new_revision = DmsfFileRevision.new
- new_revision.file = self.file
- new_revision.project = self.project
+ new_revision.file = self.file
new_revision.disk_filename = self.disk_filename
new_revision.size = self.size
new_revision.mime_type = self.mime_type
@@ -141,17 +134,11 @@ class DmsfFileRevision < ActiveRecord::Base
new_revision.description = self.description
new_revision.workflow = self.workflow
new_revision.major_version = self.major_version
- new_revision.minor_version = self.minor_version
-
+ new_revision.minor_version = self.minor_version
new_revision.source_revision = self
- new_revision.user = User.current
-
- new_revision.name = self.name
- new_revision.folder = self.folder
-
- new_revision.custom_values = self.custom_values.map(&:clone)
-
- return new_revision
+ new_revision.user = User.current
+ new_revision.name = self.name
+ new_revision
end
def workflow_str(name)
diff --git a/app/models/dmsf_folder.rb b/app/models/dmsf_folder.rb
index 1f00e165..d024e186 100644
--- a/app/models/dmsf_folder.rb
+++ b/app/models/dmsf_folder.rb
@@ -192,15 +192,10 @@ class DmsfFolder < ActiveRecord::Base
new_folder.description = self.description
new_folder.user = User.current
- new_folder.custom_values = Array.new(self.custom_values)
-
- # Add default value for CFs not existing
- present_custom_fields = new_folder.custom_values.collect(&:custom_field).uniq
- new_folder.available_custom_fields.each do |cf|
- unless present_custom_fields.include?(cf)
- new_folder.custom_values << CustomValue.new({:custom_field => cf, :value => cf.default_value}) if cf.default_value
- end
- end
+ new_folder.custom_values = []
+ self.custom_values.each do |cv|
+ new_folder.custom_values << CustomValue.new({:custom_field => cv.custom_field, :value => cv.value})
+ end
return new_folder unless new_folder.save
diff --git a/app/models/dmsf_upload.rb b/app/models/dmsf_upload.rb
index 1e7579b9..f19167c5 100644
--- a/app/models/dmsf_upload.rb
+++ b/app/models/dmsf_upload.rb
@@ -1,6 +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
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -17,20 +19,18 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class DmsfUpload
- attr_accessor :name
-
+ attr_accessor :name
attr_accessor :disk_filename
- attr_reader :size
+ attr_reader :size
attr_accessor :mime_type
attr_accessor :title
- attr_accessor :description
-
+ attr_accessor :description
attr_accessor :comment
attr_accessor :major_version
attr_accessor :minor_version
- attr_accessor :locked
-
+ attr_accessor :locked
attr_accessor :workflow
+ attr_accessor :custom_values
def disk_file
"#{DmsfHelper.temp_dir}/#{self.disk_filename}"
@@ -38,9 +38,9 @@ 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|
@@ -52,12 +52,12 @@ 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)
- @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?
@@ -65,7 +65,8 @@ class DmsfUpload
@description = nil
@major_version = 0
@minor_version = 0
- @workflow = nil
+ @workflow = nil
+ @custom_values = DmsfFileRevision.new(:file => DmsfFile.new(:project => @project)).custom_field_values
else
last_revision = dmsf_file.last_revision
@title = last_revision.title
@@ -73,9 +74,18 @@ class DmsfUpload
@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)
+
+ # 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|
+ 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.nil? && dmsf_file.locked_for_user?
+ @locked = dmsf_file && dmsf_file.locked_for_user?
end
end
diff --git a/app/views/dmsf/show.html.erb b/app/views/dmsf/show.html.erb
index 88ef38b2..7a7b4d3e 100644
--- a/app/views/dmsf/show.html.erb
+++ b/app/views/dmsf/show.html.erb
@@ -167,16 +167,20 @@
<% end %>
<% workflows_available = DmsfWorkflow.where(['project_id = ? OR project_id IS NULL', @project.id]).count > 0 %>
<% @files.each do |file| %>
+ <% unless file.last_revision %>
+ <% Rails.logger.error "Error: dmsf_file id #{file.id} has no revision!" %>
+ <% next %>
+ <% end %>
<% wf = DmsfWorkflow.find_by_id(file.last_revision.dmsf_workflow_id) %>
- | <%= check_box_tag("files[]", file.id, false, :title => l(:title_check_for_zip_download_or_email)) %> |
+ <%= check_box_tag('files[]', file.id, false, :title => l(:title_check_for_zip_download_or_email)) %> |
- <% file_download_url = url_for({:only_path => false, :controller => :dmsf_files, :action => "show", :id => file, :download => ""}) %>
+ <% file_download_url = url_for({:only_path => false, :controller => :dmsf_files, :action => 'show', :id => file, :download => ''}) %>
<%= link_to(h(file.last_revision.display_title),
- file_download_url,
- :class => "icon icon-file #{DmsfHelper.filetype_css(file.name)}",
- :title => l(:title_title_version_version_download, :title => h(file.title), :version => file.version),
- "data-downloadurl" => "#{file.last_revision.detect_content_type}:#{h(file.name)}:#{file_download_url}") %>
+ file_download_url,
+ :class => "icon icon-file #{DmsfHelper.filetype_css(file.name)}",
+ :title => l(:title_title_version_version_download, :title => h(file.title), :version => file.version),
+ 'data-downloadurl' => "#{file.last_revision.detect_content_type}:#{h(file.name)}:#{file_download_url}") %>
<%= h(file.display_name) %>
<%#= render 'custom_fields', :object => file.last_revision %>
|
@@ -300,7 +304,7 @@
1 |
- <%=file.last_revision.size%> |
+ <%= file.last_revision.size %> |
<% end %>
diff --git a/app/views/dmsf_files/_file_new_revision.html.erb b/app/views/dmsf_files/_file_new_revision.html.erb
index 3999e585..9398d29e 100644
--- a/app/views/dmsf_files/_file_new_revision.html.erb
+++ b/app/views/dmsf_files/_file_new_revision.html.erb
@@ -1,7 +1,9 @@
-<%#
+<%#=
# Redmine plugin for Document Management System "Features"
#
-# Copyright (C) 2013 Karel Picman
+# Copyright (C) 2011 Vít Jonáš
+# Copyright (C) 2012 Daniel Munn
+# Copyright (C) 2013 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
diff --git a/app/views/dmsf_upload/_upload_file.html.erb b/app/views/dmsf_upload/_upload_file.html.erb
index 1224ba1d..c2819029 100644
--- a/app/views/dmsf_upload/_upload_file.html.erb
+++ b/app/views/dmsf_upload/_upload_file.html.erb
@@ -1,7 +1,9 @@
-<%#
+<%#=
# Redmine plugin for Document Management System "Features"
#
-# Copyright (C) 2013 Karel Picman
+# Copyright (C) 2011 Vít Jonáš
+# Copyright (C) 2012 Daniel Munn
+# Copyright (C) 2013 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
@@ -61,9 +63,8 @@
<%= number_to_human_size(upload.size) %>
-
- <% values = DmsfFileRevision.new(:file => DmsfFile.new(:project => @project)).custom_field_values %>
- <% values.each do |value| %>
+
+ <% upload.custom_values.each do |value| %>
<%= custom_field_tag_with_label("commited_files[#{i}][dmsf_file_revision]", value) %>
<% end %>