Merge pull request #342 from williamschey/devel-1.5.1

Add an External Link type
This commit is contained in:
Karel Picman 2015-02-02 07:31:36 +01:00
commit 841ca4b0a7
24 changed files with 312 additions and 62 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,59 @@
<%#=
# Redmine plugin for Document Management System "Features"
#
# 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
# 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.
%>
<td class="check"></td>
<td class="title">
<%= link_to(h(title),
link.external_url,
:target => "_blank",
:class => 'icon icon-link') %>
<div class="filename" title="<%= l(:label_target_folder)%>"><%= link.external_url %></div>
</td>
<td class="size"></td>
<td class="modified"><%= format_time(link.updated_at) %></td>
<td class="version"></td>
<td class="workflow"></td>
<td class="author"><%= h(link.user) %></td>
<td class="actions">
<% if @file_manipulation_allowed %>
<div class="right_icon_box">
<% if @file_manipulation_allowed %>
<span class="icon"></span>
<span class="icon"></span>
<span class="icon icon-margin-left"></span>
<%= link_to('',
dmsf_link_path(link),
:data => {:confirm => l(:text_are_you_sure)},
:method => :delete,
:title => l(:title_delete),
:class => 'icon icon-del') %>
<% else %>
<span class="icon"></span>
<span class="icon"></span>
<span class="icon icon-margin-left"></span>
<span class="icon"></span>
<% end %>
</div>
<% end %>
</td>
<td class="hidden">1</td>
<td class="hidden"></td>
<td class="hidden"></td>
<td class="hidden"></td>

View File

@ -0,0 +1,53 @@
<%#=
# Redmine plugin for Document Management System "Features"
#
# 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
# 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.
%>
<td class="check"></td>
<td class="title">
<%= link_to(h(title),
link.external_url,
:target => "_blank",
:class => 'icon icon-link') %>
<div class="filename" title="<%= l(:label_target_folder)%>"><%= link.external_url %></div>
</td>
<td class="size"></td>
<td class="modified"><%= format_time(link.updated_at) %></td>
<td class="version"></td>
<td class="workflow"></td>
<td class="author"><%= h(link.user) %></td>
<td class="actions">
<% if @file_manipulation_allowed %>
<div class="right_icon_box">
<%= 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') %>
</div>
<% end %>
</td>
<td class="hidden">1</td>
<td class="hidden"></td>
<td class="hidden"></td>
<td class="hidden"></td>

View File

@ -181,20 +181,31 @@
</tr>
<% 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 %>
<tr class="gray">
<%= render(:partial => 'file', :locals => {
:project => link.target_project,
:file => link.target_file,
:link => link,
:id => link.id,
:name => 'file_links[]',
:title => link.name }) %>
</tr>
<% end %>
<% unless link.target_file.last_revision %>
<% Rails.logger.error "Error: dmsf_file id #{link.target_id} has no revision!" %>
<% next %>
<% end %>
<tr class="gray">
<%= render(:partial => 'file', :locals => {
:project => link.target_project,
:file => link.target_file,
:link => link,
:id => link.id,
:name => 'file_links[]',
:title => link.name }) %>
</tr>
<% end %>
<% @url_links.each do |link| %>
<tr class="gray">
<%= render(:partial => 'url', :locals => {
:project => link.target_project,
:file => link.target_file,
:link => link,
:id => link.id,
:name => 'file_links[]',
:title => link.name }) %>
</tr>
<% end %>
</tbody>
</table>
<% end %>

View File

@ -117,6 +117,17 @@
:title => link.name }) %>
</tr>
<% end %>
<% @url_links.each do |link| %>
<tr class="gray">
<%= render(:partial => 'url_trash', :locals => {
:project => link.target_project,
:file => link.target_file,
:link => link,
:id => link.id,
:name => 'url_links[]',
:title => link.name }) %>
</tr>
<% end %>
</tbody>
</table>
<% end %>

View File

@ -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 %>
<div class="box dmsf_detail">
<p>
<% 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)) %>
</p>
<p>
<% 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)) %>
</p>
<% if @type == 'link_from' %>
<p>
<% 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 %>
<div class="box dmsf_detail">
<p>
<%= radio_button_tag(:external_link,'false',@link_external == false) %> Internal</br>
<%= radio_button_tag(:external_link,'true',@link_external) %> External
</p>
<div id="link_internal" style="<%= @link_external ? 'display:none' : '' %>">
<p>
<% 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)) %>
</p>
<p>
<% 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)) %>
</p>
<% if @type == 'link_from' %>
<p>
<% 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 %>
<% end %>
<%= f.select(:target_file_id,
options_for_select(DmsfFolder.file_list(files), @target_file_id)) %>
</p>
<% end %>
<%= f.select(:target_file_id,
options_for_select(DmsfFolder.file_list(files), @target_file_id)) %>
</p>
<% end %>
<p>
<p>
</div>
<div id="link_external" style="<%= @link_external ? '' : 'display:none' %>">
<%= label_tag('dmsf_link[external_url]', l(:label_link_external_url), :class => 'required') %>
<%= text_field_tag 'dmsf_link[external_url]', @dmsf_link.external_url, :size => 40, :maxlength => 255 %>
</div>
<%= label_tag('dmsf_link[name]', l(:label_link_name), :class => 'required') %>
<%= text_field_tag 'dmsf_link[name]', @dmsf_link.name, :size => 40, :maxlength => 255 %>
</p>
@ -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();
});
</script>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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/<file id>
##
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 => ''

View File

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

View File

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

View File

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