From 00c0044d5ad2a14f02047b80eb8697222eb68697 Mon Sep 17 00:00:00 2001 From: William Schey Date: Mon, 2 Feb 2015 16:03:03 +1000 Subject: [PATCH] Add an External Link type This can be used for linking to documents that are not maintained by the system. --- app/controllers/dmsf_controller.rb | 24 +++++- app/controllers/dmsf_links_controller.rb | 39 +++++++-- app/models/dmsf_folder.rb | 11 ++- app/models/dmsf_link.rb | 3 +- app/views/dmsf/_url.html.erb | 59 +++++++++++++ app/views/dmsf/_url_trash.html.erb | 53 ++++++++++++ app/views/dmsf/show.html.erb | 39 +++++---- app/views/dmsf/trash.html.erb | 11 +++ app/views/dmsf_links/_form.html.erb | 82 +++++++++++-------- config/locales/cs.yml | 1 + config/locales/de.yml | 1 + config/locales/en.yml | 2 + config/locales/es.yml | 1 + config/locales/fr.yml | 1 + config/locales/ja.yml | 1 + config/locales/pl.yml | 1 + config/locales/ru.yml | 1 + config/locales/sl.yml | 1 + config/locales/zh-TW.yml | 1 + config/locales/zh.yml | 1 + config/routes.rb | 9 +- db/migrate/20150130052716_add_external.rb | 15 ++++ .../20150202010301_add_user_to_links.rb | 9 ++ lib/redmine_dmsf/patches/project_patch.rb | 8 +- 24 files changed, 312 insertions(+), 62 deletions(-) create mode 100644 app/views/dmsf/_url.html.erb create mode 100644 app/views/dmsf/_url_trash.html.erb create mode 100644 db/migrate/20150130052716_add_external.rb create mode 100644 db/migrate/20150202010301_add_user_to_links.rb diff --git a/app/controllers/dmsf_controller.rb b/app/controllers/dmsf_controller.rb index a58852d8..bbe14442 100644 --- a/app/controllers/dmsf_controller.rb +++ b/app/controllers/dmsf_controller.rb @@ -85,12 +85,26 @@ class DmsfController < ApplicationController DmsfLink.where(:project_id => @project.id, :target_type => DmsfFile.model_name).visible.each do |l| r = l.target_file.last_revision if r - r.custom_field_values.each do |v| + r.custom_field_values.each do |v| + if v.custom_field_id == params[:custom_field_id].to_i + if v.custom_field.compare_values?(v.value, params[:custom_value]) + @file_links << l + break + end + end + end + end + end + @url_links = [] + DmsfLink.where(:project_id => @project.id, :target_type => 'DmsfUrl').visible.each do |l| + r = l.target_file.last_revision + if r + r.custom_field_values.each do |v| if v.custom_field_id == params[:custom_field_id].to_i if v.custom_field.compare_values?(v.value, params[:custom_value]) @file_links << l break - end + end end end end @@ -100,6 +114,7 @@ class DmsfController < ApplicationController @files = @project.dmsf_files.visible @dir_links = @project.folder_links.visible @file_links = @project.file_links.visible + @url_links = @project.url_links.visible end @locked_for_user = false else @@ -107,6 +122,7 @@ class DmsfController < ApplicationController @files = @folder.files.visible @dir_links = @folder.folder_links.visible @file_links = @folder.file_links.visible + @url_links = @folder.url_links.visible @locked_for_user = @folder.locked_for_user? end @@ -117,7 +133,8 @@ class DmsfController < ApplicationController @trash_enabled = DmsfFolder.deleted.where(:project_id => @project.id).any? || DmsfFile.deleted.where(:project_id => @project.id).any? || DmsfLink.deleted.where(:project_id => @project.id, :target_type => DmsfFolder.model_name).any? || - DmsfLink.deleted.where(:project_id => @project.id, :target_type => DmsfFile.model_name).any? + DmsfLink.deleted.where(:project_id => @project.id, :target_type => DmsfFile.model_name).any? || + DmsfLink.deleted.where(:project_id => @project.id, :target_type => 'DmsfUrl').any? end def trash @@ -128,6 +145,7 @@ class DmsfController < ApplicationController @files = DmsfFile.deleted.where(:project_id => @project.id) @dir_links = DmsfLink.deleted.where(:project_id => @project.id, :target_type => DmsfFolder.model_name) @file_links = DmsfLink.deleted.where(:project_id => @project.id, :target_type => DmsfFile.model_name) + @url_links = DmsfLink.deleted.where(:project_id => @project.id, :target_type => 'DmsfUrl') end def download_email_entries diff --git a/app/controllers/dmsf_links_controller.rb b/app/controllers/dmsf_links_controller.rb index 45a9ee10..c5a1321e 100644 --- a/app/controllers/dmsf_links_controller.rb +++ b/app/controllers/dmsf_links_controller.rb @@ -29,9 +29,10 @@ class DmsfLinksController < ApplicationController if params[:dmsf_link].present? # Reload - @dmsf_link.dmsf_folder_id = params[:dmsf_link][:dmsf_folder_id] + @dmsf_link.dmsf_folder_id = params[:dmsf_link][:dmsf_folder_id] # TODO: Add stuff in here for external links so that if error occurs, repopulate the same @dmsf_file_id = params[:dmsf_link][:dmsf_file_id] @type = params[:dmsf_link][:type] + @link_external = (params[:external_link] == 'true') @dmsf_link.target_project_id = params[:dmsf_link][:target_project_id] @target_folder_id = params[:dmsf_link][:target_folder_id].to_i if params[:reload].blank? && DmsfLinksHelper.is_a_number?(params[:dmsf_link][:target_folder_id]) if @type == 'link_to' @@ -68,6 +69,7 @@ class DmsfLinksController < ApplicationController @dmsf_link.dmsf_folder_id = params[:dmsf_folder_id] @dmsf_file_id = params[:dmsf_file_id] @type = params[:type] + @link_external = false @dmsf_link.target_project_id = params[:project_id] @target_folder_id = params[:dmsf_folder_id].to_i if params[:dmsf_folder_id].present? if @type == 'link_to' @@ -86,13 +88,18 @@ class DmsfLinksController < ApplicationController def create @dmsf_link = DmsfLink.new + @dmsf_link.user = User.current if params[:dmsf_link][:type] == 'link_from' # Link from @dmsf_link.project_id = params[:dmsf_link][:project_id] @dmsf_link.dmsf_folder_id = params[:dmsf_link][:dmsf_folder_id] @dmsf_link.target_project_id = params[:dmsf_link][:target_project_id] - if params[:dmsf_link][:target_file_id].present? + @link_external = (params[:external_link] == 'true') + @dmsf_link.external_url = params[:dmsf_link][:external_url] + if (@link_external) + @dmsf_link.target_type = 'DmsfUrl' + elsif params[:dmsf_link][:target_file_id].present? @dmsf_link.target_id = params[:dmsf_link][:target_file_id] @dmsf_link.target_type = DmsfFile.model_name else @@ -116,7 +123,11 @@ class DmsfLinksController < ApplicationController @dmsf_link.project_id = params[:dmsf_link][:target_project_id] @dmsf_link.dmsf_folder_id = DmsfLinksHelper.is_a_number?(params[:dmsf_link][:target_folder_id]) ? params[:dmsf_link][:target_folder_id].to_i : nil @dmsf_link.target_project_id = params[:dmsf_link][:project_id] - if params[:dmsf_link][:dmsf_file_id].present? + @link_external = (params[:external_link] == 'true') + @dmsf_link.external_url = params[:dmsf_link][:external_url] + if (@link_external) + @dmsf_link.target_type = 'DmsfUrl' + elsif params[:dmsf_link][:dmsf_file_id].present? @dmsf_link.target_id = params[:dmsf_link][:dmsf_file_id] @dmsf_link.target_type = DmsfFile.model_name else @@ -143,12 +154,24 @@ class DmsfLinksController < ApplicationController end end end - - def destroy - if @dmsf_link.delete - flash[:notice] = l(:notice_successful_delete) + + def destroy + begin + if @dmsf_link + commit = params[:commit] == 'yes' + if @dmsf_link.delete(commit) + flash[:notice] = l(:notice_successful_delete) + else + @dmsf_link.errors.each do |e, msg| + flash[:error] = msg + end + end end - + rescue Exception => e + errors[:base] << e.message + return false + end + redirect_to :back end diff --git a/app/models/dmsf_folder.rb b/app/models/dmsf_folder.rb index 9b833fdb..10d07b77 100644 --- a/app/models/dmsf_folder.rb +++ b/app/models/dmsf_folder.rb @@ -37,7 +37,9 @@ class DmsfFolder < ActiveRecord::Base has_many :folder_links, :class_name => 'DmsfLink', :foreign_key => 'dmsf_folder_id', :conditions => {:target_type => DmsfFolder.model_name}, :dependent => :destroy has_many :file_links, :class_name => 'DmsfLink', :foreign_key => 'dmsf_folder_id', - :conditions => {:target_type => DmsfFile.model_name}, :dependent => :destroy + :conditions => {:target_type => DmsfFile.model_name}, :dependent => :destroy + has_many :url_links, :class_name => 'DmsfLink', :foreign_key => 'dmsf_folder_id', + :conditions => {:target_type => 'DmsfUrl'}, :dependent => :destroy has_many :referenced_links, :class_name => 'DmsfLink', :foreign_key => 'target_id', :conditions => {:target_type => DmsfFolder.model_name}, :dependent => :destroy has_many :locks, :class_name => 'DmsfLock', :foreign_key => 'entity_id', @@ -243,6 +245,10 @@ class DmsfFolder < ActiveRecord::Base self.file_links.visible.each do |l| l.copy_to project, new_folder end + + self.url_links.visible.each do |l| + l.copy_to project, new_folder + end return new_folder end @@ -304,6 +310,9 @@ class DmsfFolder < ActiveRecord::Base file_links.each do |file_link| last_update = file_link.updated_at if file_link.updated_at > last_update end + url_links.each do |url_link| + last_update = url_link.updated_at if url_link.updated_at > last_update + end last_update end diff --git a/app/models/dmsf_link.rb b/app/models/dmsf_link.rb index 39820776..c401f290 100644 --- a/app/models/dmsf_link.rb +++ b/app/models/dmsf_link.rb @@ -22,9 +22,9 @@ class DmsfLink < ActiveRecord::Base belongs_to :project belongs_to :dmsf_folder belongs_to :deleted_by_user, :class_name => 'User', :foreign_key => 'deleted_by_user_id' + belongs_to :user validates :name, :presence => true - validates :target_id, :presence => true validates_length_of :name, :maximum => 255 scope :visible, where(:deleted => false) @@ -95,6 +95,7 @@ class DmsfLink < ActiveRecord::Base :target_id => self.target_id, :target_type => self.target_type, :name => self.name, + :external_url => self.external_url, :project_id => project.id, :dmsf_folder_id => folder ? folder.id : nil) link.save diff --git a/app/views/dmsf/_url.html.erb b/app/views/dmsf/_url.html.erb new file mode 100644 index 00000000..2bce6474 --- /dev/null +++ b/app/views/dmsf/_url.html.erb @@ -0,0 +1,59 @@ +<%#= +# Redmine plugin for Document Management System "Features" +# +# Copyright (C) 2011-14 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 +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +%> + + + + <%= link_to(h(title), + link.external_url, + :target => "_blank", + :class => 'icon icon-link') %> +
<%= link.external_url %>
+ + +<%= format_time(link.updated_at) %> + + +<%= h(link.user) %> + + <% if @file_manipulation_allowed %> +
+ <% if @file_manipulation_allowed %> + + + + <%= link_to('', + dmsf_link_path(link), + :data => {:confirm => l(:text_are_you_sure)}, + :method => :delete, + :title => l(:title_delete), + :class => 'icon icon-del') %> + <% else %> + + + + + <% end %> +
+ <% end %> + +1 + + + diff --git a/app/views/dmsf/_url_trash.html.erb b/app/views/dmsf/_url_trash.html.erb new file mode 100644 index 00000000..215e6729 --- /dev/null +++ b/app/views/dmsf/_url_trash.html.erb @@ -0,0 +1,53 @@ +<%#= +# Redmine plugin for Document Management System "Features" +# +# Copyright (C) 2011-14 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 +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +%> + + + + <%= link_to(h(title), + link.external_url, + :target => "_blank", + :class => 'icon icon-link') %> +
<%= link.external_url %>
+ + +<%= format_time(link.updated_at) %> + + +<%= h(link.user) %> + + <% if @file_manipulation_allowed %> +
+ <%= link_to('', + restore_dmsf_link_path(:id => link), + :title => l(:title_restore), + :class => 'icon icon-dmsf-restore') %> + <%= link_to('', + dmsf_link_path(:id => link, :commit => 'yes'), + :data => {:confirm => l(:text_are_you_sure)}, + :method => :delete, + :title => l(:title_delete), + :class => 'icon icon-dmsf-rev-delete') %> +
+ <% end %> + +1 + + + diff --git a/app/views/dmsf/show.html.erb b/app/views/dmsf/show.html.erb index 491e0ff4..0960e64b 100644 --- a/app/views/dmsf/show.html.erb +++ b/app/views/dmsf/show.html.erb @@ -181,20 +181,31 @@ <% end %> <% @file_links.each do |link| %> - <% unless link.target_file.last_revision %> - <% Rails.logger.error "Error: dmsf_file id #{link.target_id} has no revision!" %> - <% next %> - <% end %> - - <%= render(:partial => 'file', :locals => { - :project => link.target_project, - :file => link.target_file, - :link => link, - :id => link.id, - :name => 'file_links[]', - :title => link.name }) %> - - <% end %> + <% unless link.target_file.last_revision %> + <% Rails.logger.error "Error: dmsf_file id #{link.target_id} has no revision!" %> + <% next %> + <% end %> + + <%= render(:partial => 'file', :locals => { + :project => link.target_project, + :file => link.target_file, + :link => link, + :id => link.id, + :name => 'file_links[]', + :title => link.name }) %> + + <% end %> + <% @url_links.each do |link| %> + + <%= render(:partial => 'url', :locals => { + :project => link.target_project, + :file => link.target_file, + :link => link, + :id => link.id, + :name => 'file_links[]', + :title => link.name }) %> + + <% end %> <% end %> diff --git a/app/views/dmsf/trash.html.erb b/app/views/dmsf/trash.html.erb index 72d2011f..1837407b 100644 --- a/app/views/dmsf/trash.html.erb +++ b/app/views/dmsf/trash.html.erb @@ -117,6 +117,17 @@ :title => link.name }) %> <% end %> + <% @url_links.each do |link| %> + + <%= render(:partial => 'url_trash', :locals => { + :project => link.target_project, + :file => link.target_file, + :link => link, + :id => link.id, + :name => 'url_links[]', + :title => link.name }) %> + + <% end %> <% end %> diff --git a/app/views/dmsf_links/_form.html.erb b/app/views/dmsf_links/_form.html.erb index 4d33d59f..90721736 100644 --- a/app/views/dmsf_links/_form.html.erb +++ b/app/views/dmsf_links/_form.html.erb @@ -24,6 +24,7 @@ <% if @dmsf_file_id %> <% file = DmsfFile.find_by_id @dmsf_file_id%> <% title = file.title if file %> + <% title = file.title if file %> <% end %> <%= render(:partial => '/dmsf/path', :locals => {:folder => @dmsf_link.folder, :filename => title}) %> @@ -34,40 +35,51 @@ <%= f.hidden_field :dmsf_folder_id, :value => @dmsf_link.dmsf_folder_id if @dmsf_link.dmsf_folder_id %> <%= f.hidden_field :type, :value => @type %> <%= f.hidden_field :dmsf_file_id, :value => @dmsf_file_id %> -
-

- <% if @type == 'link_from' %> - <%= label_tag('dmsf_link[target_project_id]', l(:label_source_project), :class => 'required') %> - <% else %> - <%= label_tag('dmsf_link[target_project_id]', l(:label_target_project), :class => 'required') %> - <% end %> - <%= select_tag('dmsf_link[target_project_id]', - project_tree_options_for_select(DmsfFile.allowed_target_projects_on_copy, - :selected => @dmsf_link.target_project)) %> -

-

- <% if @type == 'link_from' %> - <%= label_tag('dmsf_link[target_folder_id]', l(:label_source_folder)) %> - <% else %> - <%= label_tag('dmsf_link[target_folder_id]', l(:label_target_folder)) %> - <% end %> - <%= select_tag('dmsf_link[target_folder_id]', - folder_tree_options_for_select(DmsfFolder.directory_tree(@dmsf_link.target_project), - :selected => @target_folder_id)) %> -

- <% if @type == 'link_from' %> -

- <% if @target_folder_id %> - <% folder = DmsfFolder.find_by_id @target_folder_id %> - <% files = folder.files.visible if folder %> - <% else %> - <% files = @dmsf_link.target_project.dmsf_files.visible if @dmsf_link.target_project %> +

+

+ <%= radio_button_tag(:external_link,'false',@link_external == false) %> Internal
+ <%= radio_button_tag(:external_link,'true',@link_external) %> External +

+ + + <%= label_tag('dmsf_link[name]', l(:label_link_name), :class => 'required') %> <%= text_field_tag 'dmsf_link[name]', @dmsf_link.name, :size => 40, :maxlength => 255 %>

@@ -85,4 +97,8 @@ $('#dmsf_link_target_file_id').change(function () { $('#content').load("<%= url_for(:action => 'new', :project_id => @project.id) %>", $('#new_dmsf_link').serialize()); }); + $("input[name=external_link]:radio").change(function(){ + $("#link_internal").toggle(); + $("#link_external").toggle(); + }); \ No newline at end of file diff --git a/config/locales/cs.yml b/config/locales/cs.yml index d5568d4f..0a936f4f 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -286,6 +286,7 @@ cs: field_target_file: Zdrojový soubor title_download_entries: Historie stahování label_link_name: Název odkazu + label_link_external_url: URL label_target_folder: Cílový adresář label_source_folder: Zdrojový adresář label_target_project: Cílový projekt diff --git a/config/locales/de.yml b/config/locales/de.yml index 8fa9e9c9..e50cf00b 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -283,6 +283,7 @@ de: field_target_file: Quelldatei title_download_entries: Download entries label_link_name: Name der Verknüpfung + label_link_external_url: URL label_target_folder: Zielordner label_source_folder: Quellordner label_target_project: Zielprojekt diff --git a/config/locales/en.yml b/config/locales/en.yml index 38dd42e7..30ae0746 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -283,7 +283,9 @@ en: label_notifications_off: Notifications off field_target_file: Source file title_download_entries: Download entries + label_link_name: Link name + label_link_external_url: URL label_target_folder: Target folder label_source_folder: Source folder label_target_project: Target project diff --git a/config/locales/es.yml b/config/locales/es.yml index aa9b48d7..97f51ff1 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -286,6 +286,7 @@ es: field_target_file: Source file title_download_entries: Download entries label_link_name: Link name + label_link_external_url: URL label_target_folder: Target folder label_source_folder: Source folder label_target_project: Target project diff --git a/config/locales/fr.yml b/config/locales/fr.yml index c32a288e..7e8722e5 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -286,6 +286,7 @@ fr: field_target_file: Fichier source title_download_entries: Historique des téléchargements label_link_name: Nom du lien + label_link_external_url: Adresse Internet label_target_folder: Dossier cible label_source_folder: Dossier source label_target_project: Projet cible diff --git a/config/locales/ja.yml b/config/locales/ja.yml index bbb356b6..365a0d8a 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -286,6 +286,7 @@ ja: field_target_file: Source file title_download_entries: Download entries label_link_name: Link name + label_link_external_url: URL label_target_folder: Target folder label_source_folder: Source folder label_target_project: Target project diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 0e20df6a..42e8236c 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -286,6 +286,7 @@ pl: field_target_file: Plik źródłowy title_download_entries: Pobrane label_link_name: Nazwa odnośnika + label_link_external_url: URL label_target_folder: Folder docelowy label_source_folder: Folder źródłowy label_target_project: Projekt docelowy diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 426fb039..e2e6f310 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -286,6 +286,7 @@ ru: field_target_file: Source file title_download_entries: Download entries label_link_name: Link name + label_link_external_url: URL label_target_folder: Target folder label_source_folder: Source folder label_target_project: Target project diff --git a/config/locales/sl.yml b/config/locales/sl.yml index e2ab19ff..9db3ef37 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -286,6 +286,7 @@ sl: field_target_file: Source file title_download_entries: Download entries label_link_name: Link name + label_link_external_url: URL label_target_folder: Target folder label_source_folder: Source folder label_target_project: Target project diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index ecf7a0db..d3d70a70 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -288,6 +288,7 @@ field_target_file: Source file title_download_entries: Download entries label_link_name: Link name + label_link_external_url: URL label_target_folder: Target folder label_source_folder: Source folder label_target_project: Target project diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 43549acd..07cb4cce 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -286,6 +286,7 @@ zh: field_target_file: Source file title_download_entries: Download entries label_link_name: Link name + label_link_external_url: URL label_target_folder: Target folder label_source_folder: Source folder label_target_project: Target project diff --git a/config/routes.rb b/config/routes.rb index 359669f1..0852c9ab 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -77,7 +77,14 @@ RedmineApp::Application.routes.draw do get '/dmsf/files/:id', :controller => 'dmsf_files', :action => 'show', :as => 'dmsf_file' delete '/dmsf/files/:id', :controller => 'dmsf_files', :action => 'delete' get '/dmsf/files/:id/restore', :controller => 'dmsf_files', :action => 'restore', :as => 'restore_dmsf_file' - + + # + # url controller + # /dmsf/links/ + ## + get '/dmsf/links/:id/restore', :controller => 'dmsf_links', :action => 'restore', :as => 'restore_dmsf_link' + delete '/dmsf/links/:id', :controller => 'dmsf_links', :action => 'delete' + # Just to keep backward compatibility with old external direct links get '/dmsf_files/:id', :controller => 'dmsf_files', :action => 'show' get '/dmsf_files/:id/download', :controller => 'dmsf_files', :action => 'show', :download => '' diff --git a/db/migrate/20150130052716_add_external.rb b/db/migrate/20150130052716_add_external.rb new file mode 100644 index 00000000..99281c03 --- /dev/null +++ b/db/migrate/20150130052716_add_external.rb @@ -0,0 +1,15 @@ +class AddExternal < ActiveRecord::Migration + def up + change_column :dmsf_links, :target_id, :integer, :null => true + + add_column :dmsf_links, :external_url, :string, :null => true + add_column :dmsf_links, :user_id, :integer + end + + def down + change_column :dmsf_links, :target_id, :integer, :null => false + + remove_column :dmsf_links, :external_url + remove_column :dmsf_links, :user_id + end +end diff --git a/db/migrate/20150202010301_add_user_to_links.rb b/db/migrate/20150202010301_add_user_to_links.rb new file mode 100644 index 00000000..55ed3672 --- /dev/null +++ b/db/migrate/20150202010301_add_user_to_links.rb @@ -0,0 +1,9 @@ +class AddUserToLinks < ActiveRecord::Migration + def up + add_column :dmsf_links, :user_id, :integer + end + + def down + remove_column :dmsf_links, :user_id + end +end diff --git a/lib/redmine_dmsf/patches/project_patch.rb b/lib/redmine_dmsf/patches/project_patch.rb index ef7ee681..e0304620 100644 --- a/lib/redmine_dmsf/patches/project_patch.rb +++ b/lib/redmine_dmsf/patches/project_patch.rb @@ -42,7 +42,10 @@ module RedmineDmsf :dependent => :destroy has_many :file_links, :class_name => 'DmsfLink', :foreign_key => 'project_id', :conditions => { :dmsf_folder_id => nil, :target_type => 'DmsfFile' }, - :dependent => :destroy + :dependent => :destroy + has_many :url_links, :class_name => 'DmsfLink', :foreign_key => 'project_id', + :conditions => { :dmsf_folder_id => nil, :target_type => 'DmsfUrl' }, + :dependent => :destroy end end @@ -89,6 +92,9 @@ module RedmineDmsf project.file_links.visible.each do |l| l.copy_to(self, nil) end + project.url_links.visible.each do |l| + l.copy_to(self, nil) + end end def copy_approval_workflows(project)