From d1d793e41c2185d5726d2c99ea1260d3cafe224f Mon Sep 17 00:00:00 2001 From: "vit.jonas@gmail.com" Date: Sun, 9 Oct 2011 22:08:03 +0000 Subject: [PATCH] * work on Issue 142: Copy Folder option git-svn-id: http://redmine-dmsf.googlecode.com/svn/trunk/redmine_dmsf@251 5e329b0b-a2ee-ea63-e329-299493fc886d --- app/controllers/dmsf_files_copy_controller.rb | 74 +++---------------- app/models/dmsf_file.rb | 45 +++++++++-- config/locales/cs.yml | 2 + config/locales/de.yml | 2 + config/locales/en-GB.yml | 2 + config/locales/en-IS.yml | 2 + config/locales/en.yml | 2 + config/locales/es.yml | 2 + config/locales/fr.yml | 2 + config/locales/ja.yml | 2 + config/locales/ru.yml | 2 + config/locales/zh.yml | 2 + 12 files changed, 68 insertions(+), 71 deletions(-) diff --git a/app/controllers/dmsf_files_copy_controller.rb b/app/controllers/dmsf_files_copy_controller.rb index a4d2e44e..62e11c12 100644 --- a/app/controllers/dmsf_files_copy_controller.rb +++ b/app/controllers/dmsf_files_copy_controller.rb @@ -59,59 +59,23 @@ class DmsfFilesCopyController < ApplicationController return end - name = @file.name + new_file = @file.copy_to(@target_project, @target_folder) - file = DmsfFile.find_file_by_name(@target_project, @target_folder, name) - if file.nil? - file = DmsfFile.new - file.project = @target_project - file.name = name - file.folder = @target_folder - file.notification = !Setting.plugin_redmine_dmsf["dmsf_default_notifications"].blank? - else - if file.locked_for_user? - flash[:error] = l(:error_file_is_locked) - redirect_to :action => "new", :id => @file, :target_project_id => @target_project, :target_folder_id => @target_folder - return - end - end - - last_revision = @file.last_revision - - new_revision = DmsfFileRevision.new - new_revision.folder = @target_folder - new_revision.file = file - new_revision.project = file.project - new_revision.user = User.current - new_revision.name = name - new_revision.title = @file.title - new_revision.description = @file.description - new_revision.comment = l(:comment_copied_from, :source => "#{@project.identifier}:#{@file.dmsf_path_str}") - new_revision.source_revision = last_revision - new_revision.major_version = last_revision.major_version - new_revision.minor_version = last_revision.minor_version - new_revision.workflow = last_revision.workflow - new_revision.mime_type = last_revision.mime_type - new_revision.size = last_revision.size - new_revision.disk_filename = last_revision.disk_filename - - if file.save && new_revision.save - file.reload - else - flash[:error] = error_messages_for(file) + unless new_file.errors.empty? + flash[:error] = "#{l(:error_file_cannot_be_copied)}: #{new_file.errors.full_messages.join(", ")}" redirect_to :action => "new", :id => @file, :target_project_id => @target_project, :target_folder_id => @target_folder return end flash[:notice] = l(:notice_file_copied) - log_activity(file, "was copied (is copy)") + log_activity(new_file, "was copied (is copy)") begin - DmsfMailer.deliver_files_updated(User.current, [file]) + DmsfMailer.deliver_files_updated(User.current, [new_file]) rescue ActionView::MissingTemplate => e Rails.logger.error "Could not send email notifications: " + e end - redirect_to :controller => "dmsf_files", :action => "show", :id => file + redirect_to :controller => "dmsf_files", :action => "show", :id => new_file end def move @@ -132,39 +96,23 @@ class DmsfFilesCopyController < ApplicationController return end - if @file.locked_for_user? - flash[:error] = l(:error_file_is_locked) + unless @file.move_to(@target_project, @target_folder) + flash[:error] = "#{l(:error_file_cannot_be_moved)}: #{@file.errors.full_messages.join(", ")}" redirect_to :action => "new", :id => @file, :target_project_id => @target_project, :target_folder_id => @target_folder return end - new_revision = @file.last_revision.clone + @file.reload - new_revision.folder = @target_folder - new_revision.project = @target_project - new_revision.comment = l(:comment_moved_from, :source => "#{@project.identifier}:#{@file.dmsf_path_str}") - - @file.folder = @target_folder - @file.project = @target_project - - if @file.save && new_revision.save - @file.reload - else - flash[:error] = error_messages_for(@file) - redirect_to :action => "new", :id => @file, :target_project_id => @target_project, :target_folder_id => @target_folder - return - end - flash[:notice] = l(:notice_file_moved) log_activity(@file, "was moved (is copy)") - begin + begin + # TODO: implement proper mail notification DmsfMailer.deliver_files_updated(User.current, [@file]) rescue ActionView::MissingTemplate => e Rails.logger.error "Could not send email notifications: " + e end - # TODO: implement proper mail notification - redirect_to :controller => "dmsf_files", :action => "show", :id => @file end diff --git a/app/models/dmsf_file.rb b/app/models/dmsf_file.rb index 292b10dd..595ef2c8 100644 --- a/app/models/dmsf_file.rb +++ b/app/models/dmsf_file.rb @@ -83,14 +83,6 @@ class DmsfFile < ActiveRecord::Base def last_revision self.revisions.first end - - #def revisions(offset = nil, limit = nil) - # DmsfFileRevision.find(:all, :conditions => - # ["dmsf_file_id = :file_id and deleted = :deleted", - # {:file_id => self.id, :deleted => false}], - # :order => "major_version DESC, minor_version DESC, updated_at DESC", - # :limit => limit, :offset => offset) - #end def delete if locked_for_user? @@ -195,6 +187,43 @@ class DmsfFile < ActiveRecord::Base projects end + def move_to(project, folder) + if self.locked_for_user? + errors.add_to_base(l(:error_file_is_locked)) + return false + end + + new_revision = self.last_revision.clone + + new_revision.folder = folder ? folder : nil + new_revision.project = folder ? folder.project : project + new_revision.comment = l(:comment_moved_from, :source => "#{self.project.identifier}:#{self.dmsf_path_str}") + + self.folder = new_revision.folder + self.project = new_revision.project + + return self.save && new_revision.save + end + + def copy_to(project, folder) + file = DmsfFile.new + file.folder = folder ? folder : nil + file.project = folder ? folder.project : project + file.name = self.name + file.notification = !Setting.plugin_redmine_dmsf["dmsf_default_notifications"].blank? + + new_revision = self.last_revision.clone + + new_revision.file = file + new_revision.folder = folder ? folder : nil + new_revision.project = folder ? folder.project : project + new_revision.comment = l(:comment_copied_from, :source => "#{self.project.identifier}:#{self.dmsf_path_str}") + + new_revision.save if file.save + + return file + end + # To fullfill searchable module expectations def self.search(tokens, projects=nil, options={}) tokens = [] << tokens unless tokens.is_a?(Array) diff --git a/config/locales/cs.yml b/config/locales/cs.yml index b1cc1bf0..21c1c42d 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -176,4 +176,6 @@ cs: :label_dmsf_folder_plural: "Dmsf složky" :comment_moved_from: "Přesunuto z %{source}" :error_target_folder_same: "Cílový adresář a projekt jsou stejné jako aktuální" + :error_file_cannot_be_moved: "Soubor nemůže být přesunut" + :error_file_cannot_be_copied: "Soubor nemůže být zkopírován" \ No newline at end of file diff --git a/config/locales/de.yml b/config/locales/de.yml index 46b6318c..f19de524 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -177,4 +177,6 @@ de: :label_dmsf_folder_plural: "Dmsf folders" :comment_moved_from: "Moved from %{source}" :error_target_folder_same: "Target folder and project are the same as current" + :error_file_cannot_be_moved: "File can't be moved" + :error_file_cannot_be_copied: "File can't be copied" \ No newline at end of file diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index 9fa08d61..f57203a8 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -172,4 +172,6 @@ en-GB: :label_dmsf_folder_plural: "Dmsf folders" :comment_moved_from: "Moved from %{source}" :error_target_folder_same: "Target folder and project are the same as current" + :error_file_cannot_be_moved: "File can't be moved" + :error_file_cannot_be_copied: "File can't be copied" \ No newline at end of file diff --git a/config/locales/en-IS.yml b/config/locales/en-IS.yml index 9fa08d61..f57203a8 100644 --- a/config/locales/en-IS.yml +++ b/config/locales/en-IS.yml @@ -172,4 +172,6 @@ en-GB: :label_dmsf_folder_plural: "Dmsf folders" :comment_moved_from: "Moved from %{source}" :error_target_folder_same: "Target folder and project are the same as current" + :error_file_cannot_be_moved: "File can't be moved" + :error_file_cannot_be_copied: "File can't be copied" \ No newline at end of file diff --git a/config/locales/en.yml b/config/locales/en.yml index 8912c89d..0bfa659a 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -176,4 +176,6 @@ en: :label_dmsf_folder_plural: "Dmsf folders" :comment_moved_from: "Moved from %{source}" :error_target_folder_same: "Target folder and project are the same as current" + :error_file_cannot_be_moved: "File can't be moved" + :error_file_cannot_be_copied: "File can't be copied" \ No newline at end of file diff --git a/config/locales/es.yml b/config/locales/es.yml index 9a0cfc6f..b2b03887 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -174,4 +174,6 @@ es: :label_dmsf_folder_plural: "Dmsf folders" :comment_moved_from: "Moved from %{source}" :error_target_folder_same: "Target folder and project are the same as current" + :error_file_cannot_be_moved: "File can't be moved" + :error_file_cannot_be_copied: "File can't be copied" \ No newline at end of file diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 2d75529c..8278b0c5 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -172,4 +172,6 @@ fr: :label_dmsf_folder_plural: "Dmsf folders" :comment_moved_from: "Moved from %{source}" :error_target_folder_same: "Target folder and project are the same as current" + :error_file_cannot_be_moved: "File can't be moved" + :error_file_cannot_be_copied: "File can't be copied" \ No newline at end of file diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 59c72f56..36e2e40d 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -177,4 +177,6 @@ ja: #Not translated :comment_moved_from: "Moved from %{source}" :error_target_folder_same: "Target folder and project are the same as current" + :error_file_cannot_be_moved: "File can't be moved" + :error_file_cannot_be_copied: "File can't be copied" \ No newline at end of file diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 57dd25b6..510234f9 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -178,4 +178,6 @@ ru: #Not translated :comment_moved_from: "Moved from %{source}" :error_target_folder_same: "Target folder and project are the same as current" + :error_file_cannot_be_moved: "File can't be moved" + :error_file_cannot_be_copied: "File can't be copied" \ No newline at end of file diff --git a/config/locales/zh.yml b/config/locales/zh.yml index e05c6b97..6ea2a133 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -179,4 +179,6 @@ zh: :label_dmsf_folder_plural: "Dmsf folders" :comment_moved_from: "Moved from %{source}" :error_target_folder_same: "Target folder and project are the same as current" + :error_file_cannot_be_moved: "File can't be moved" + :error_file_cannot_be_copied: "File can't be copied" \ No newline at end of file