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