From dc06d7d3ae30ed85e5e36c0599d134192f882afa Mon Sep 17 00:00:00 2001 From: Karel Picman Date: Tue, 12 Nov 2013 13:44:25 +0100 Subject: [PATCH] Code revision --- app/controllers/dmsf_controller.rb | 144 ++++++------ app/views/dmsf/show.html.erb | 221 +++++++++--------- app/views/dmsf_files/show.html.erb | 72 +++--- assets/javascripts/redmine_dmsf.js | 32 +++ init.rb | 53 ++--- lib/redmine_dmsf.rb | 27 ++- lib/redmine_dmsf/hooks/base_view_hooks.rb | 33 +++ .../hooks/view_projects_form_hook.rb | 2 +- 8 files changed, 334 insertions(+), 250 deletions(-) create mode 100644 assets/javascripts/redmine_dmsf.js create mode 100644 lib/redmine_dmsf/hooks/base_view_hooks.rb diff --git a/app/controllers/dmsf_controller.rb b/app/controllers/dmsf_controller.rb index 44339f0f..60f5c64b 100644 --- a/app/controllers/dmsf_controller.rb +++ b/app/controllers/dmsf_controller.rb @@ -1,7 +1,8 @@ -# -*- coding: utf-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 @@ -20,6 +21,10 @@ class DmsfController < ApplicationController unloadable + class ZipMaxFilesError < StandardError; end + class EmailMaxFileSize < StandardError; end + class FileNotFound < StandardError; end + before_filter :find_project before_filter :authorize, :except => [:delete_entries] before_filter :find_folder, :except => [:new, :create, :edit_root, :save_root] @@ -51,44 +56,40 @@ class DmsfController < ApplicationController if selected_folders.nil? && selected_files.nil? flash[:warning] = l(:warning_no_entries_selected) - redirect_to :action => "show", :id => @project, :folder_id => @folder + redirect_to :action => 'show', :id => @project, :folder_id => @folder return end - if !params[:email_entries].blank? + if params[:email_entries].present? email_entries(selected_folders, selected_files) else download_entries(selected_folders, selected_files) end rescue ZipMaxFilesError - flash[:error] = l(:error_max_files_exceeded, :number => Setting.plugin_redmine_dmsf["dmsf_max_file_download"].to_i.to_s) - redirect_to({:controller => "dmsf", :action => "show", :id => @project, :folder_id => @folder}) + flash[:error] = l(:error_max_files_exceeded, :number => Setting.plugin_redmine_dmsf['dmsf_max_file_download']) + redirect_to({:controller => 'dmsf', :action => 'show', :id => @project, :folder_id => @folder}) rescue EmailMaxFileSize - flash[:error] = l(:error_max_email_filesize_exceeded, :number => Setting.plugin_redmine_dmsf["dmsf_max_email_filesize"].to_s) - redirect_to({:controller => "dmsf", :action => "show", :id => @project, :folder_id => @folder}) + flash[:error] = l(:error_max_email_filesize_exceeded, :number => Setting.plugin_redmine_dmsf['dmsf_max_email_filesize']) + redirect_to({:controller => 'dmsf', :action => 'show', :id => @project, :folder_id => @folder}) + rescue FileNotFound + render_404 rescue DmsfAccessError render_403 end def entries_email @email_params = params[:email] - if @email_params["to"].strip.blank? + if @email_params['to'].strip.blank? flash.now[:error] = l(:error_email_to_must_be_entered) - render :action => "email_entries" + render :action => 'email_entries' return end - DmsfMailer.send_documents(User.current, @email_params["to"], @email_params["cc"], - @email_params["subject"], @email_params["zipped_content"], @email_params["body"]).deliver - File.delete(@email_params["zipped_content"]) - flash[:notice] = l(:notice_email_sent, @email_params["to"]) - redirect_to({:controller => "dmsf", :action => "show", :id => @project, :folder_id => @folder}) - end - - class ZipMaxFilesError < StandardError - end - - class EmailMaxFileSize < StandardError - end + DmsfMailer.send_documents(User.current, @email_params['to'], @email_params['cc'], + @email_params['subject'], @email_params['zipped_content'], @email_params['body']).deliver + File.delete(@email_params['zipped_content']) + flash[:notice] = l(:notice_email_sent, @email_params['to']) + redirect_to({:controller => 'dmsf', :action => 'show', :id => @project, :folder_id => @folder}) + end def delete_entries selected_folders = params[:subfolders] @@ -99,7 +100,7 @@ class DmsfController < ApplicationController failed_entries = [] deleted_files = [] deleted_folders = [] - unless selected_folders.nil? + if selected_folders if User.current.allowed_to?(:folder_manipulation, @project) selected_folders.each do |subfolderid| subfolder = DmsfFolder.visible.find(subfolderid) @@ -114,11 +115,11 @@ class DmsfController < ApplicationController flash[:error] = l(:error_user_has_not_right_delete_folder) end end - unless selected_files.nil? + if selected_files if User.current.allowed_to?(:file_manipulation, @project) selected_files.each do |fileid| file = DmsfFile.visible.find(fileid) - next if file.nil? + next unless file if file.project != @project || !file.delete failed_entries.push(file) else @@ -130,25 +131,27 @@ class DmsfController < ApplicationController end end unless deleted_files.empty? - deleted_files.each {|f| log_activity(f, "deleted")} + deleted_files.each do |f| + log_activity(f, 'deleted') + end DmsfMailer.files_deleted(User.current, deleted_files).deliver end if failed_entries.empty? flash[:notice] = l(:notice_entries_deleted) else - flash[:warning] = l(:warning_some_entries_were_not_deleted, :entries => failed_entries.map{|e| e.title}.join(", ")) + flash[:warning] = l(:warning_some_entries_were_not_deleted, :entries => failed_entries.map{|e| e.title}.join(', ')) end end - redirect_to :controller => "dmsf", :action => "show", :id => @project, :folder_id => @folder + redirect_to :controller => 'dmsf', :action => 'show', :id => @project, :folder_id => @folder end # Folder manipulation def new - @folder = DmsfFolder.new #Bugfix form error + @folder = DmsfFolder.new @pathfolder = @parent - render :action => "edit" + render :action => 'edit' end def create @@ -157,10 +160,10 @@ class DmsfController < ApplicationController @folder.user = User.current if @folder.save flash[:notice] = l(:notice_folder_created) - redirect_to({:controller => "dmsf", :action => "show", :id => @project, :folder_id => @folder}) + redirect_to({:controller => 'dmsf', :action => 'show', :id => @project, :folder_id => @folder}) else @pathfolder = @parent - render :action => "edit" + render :action => 'edit' end end @@ -171,29 +174,29 @@ class DmsfController < ApplicationController def save unless params[:dmsf_folder] - redirect_to :controller => "dmsf", :action => "show", :id => @project, :folder_id => @folder + redirect_to :controller => 'dmsf', :action => 'show', :id => @project, :folder_id => @folder return end @pathfolder = copy_folder(@folder) @folder.attributes = params[:dmsf_folder] if @folder.save flash[:notice] = l(:notice_folder_details_were_saved) - redirect_to :controller => "dmsf", :action => "show", :id => @project, :folder_id => @folder + redirect_to :controller => 'dmsf', :action => 'show', :id => @project, :folder_id => @folder else - render :action => "edit" + render :action => 'edit' end end def delete check_project(@delete_folder = DmsfFolder.visible.find(params[:delete_folder_id])) - if !@delete_folder.nil? + if @delete_folder if @delete_folder.delete flash[:notice] = l(:notice_folder_deleted) else flash[:error] = @delete_folder.errors[:base][0] end end - redirect_to :controller => "dmsf", :action => "show", :id => @project, :folder_id => @folder + redirect_to :controller => 'dmsf', :action => 'show', :id => @project, :folder_id => @folder rescue DmsfAccessError render_403 end @@ -205,7 +208,7 @@ class DmsfController < ApplicationController @project.dmsf_description = params[:project][:dmsf_description] @project.save! flash[:notice] = l(:notice_folder_details_were_saved) - redirect_to :controller => "dmsf", :action => "show", :id => @project + redirect_to :controller => 'dmsf', :action => 'show', :id => @project end def notify_activate @@ -261,7 +264,7 @@ class DmsfController < ApplicationController flash[:notice] = l(:notice_folder_locked) end redirect_to params[:current] ? params[:current] : - {:controller => "dmsf", :action => "show", :id => @project, :folder_id => @folder.folder} + {:controller => 'dmsf', :action => 'show', :id => @project, :folder_id => @folder.folder} end def unlock @@ -278,25 +281,9 @@ class DmsfController < ApplicationController end end redirect_to params[:current] ? params[:current] : - {:controller => "dmsf", :action => "show", :id => @project, :folder_id => @folder.folder} + {:controller => 'dmsf', :action => 'show', :id => @project, :folder_id => @folder.folder} end -# def assign -# end -# -# def assignment -# revision = DmsfFileRevision.find_by_id params[:dmsf_file_revision_id] -# if revision -# revision.set_workflow(params[:dmsf_workflow_id], params[:action]) -# revision.assign_workflow(params[:dmsf_workflow_id]) -# if request.post? && revision.save -# flash[:notice] = l(:notice_successful_create) -# end -# end -# redirect_to params[:current] ? params[:current] : -# {:controller => "dmsf", :action => "show", :id => @project, :folder_id => @folder.folder} -# end - private def log_activity(file, action) @@ -307,31 +294,31 @@ class DmsfController < ApplicationController zip = DmsfZip.new zip_entries(zip, selected_folders, selected_files) - ziped_content = "#{DmsfHelper.temp_dir}/#{DmsfHelper.temp_filename("dmsf_email_sent_documents.zip")}"; + ziped_content = "#{DmsfHelper.temp_dir}/#{DmsfHelper.temp_filename('dmsf_email_sent_documents.zip')}"; - File.open(ziped_content, "wb") do |f| - zip_file = File.open(zip.finish, "rb") + File.open(ziped_content, 'wb') do |f| + zip_file = File.open(zip.finish, 'rb') while (buffer = zip_file.read(8192)) f.write(buffer) end end - max_filesize = Setting.plugin_redmine_dmsf["dmsf_max_email_filesize"].to_f + max_filesize = Setting.plugin_redmine_dmsf['dmsf_max_email_filesize'].to_f if max_filesize > 0 && File.size(ziped_content) > max_filesize * 1048576 raise EmailMaxFileSize end zip.files.each do |f| - log_activity(f,"emailing zip") + log_activity(f, 'emailing zip') audit = DmsfFileRevisionAccess.new(:user_id => User.current.id, :dmsf_file_revision_id => f.last_revision.id, :action => DmsfFileRevisionAccess::EmailAction) audit.save! end - @email_params = {"zipped_content" => ziped_content} - render :action => "email_entries" + @email_params = {'zipped_content' => ziped_content} + render :action => 'email_entries' ensure - zip.close unless zip.nil? + zip.close if zip end def download_entries(selected_folders, selected_files) @@ -339,36 +326,39 @@ class DmsfController < ApplicationController zip_entries(zip, selected_folders, selected_files) zip.files.each do |f| - log_activity(f,"download zip") + log_activity(f, 'download zip') audit = DmsfFileRevisionAccess.new(:user_id => User.current.id, :dmsf_file_revision_id => f.last_revision.id, :action => DmsfFileRevisionAccess::DownloadAction) audit.save! end send_file(zip.finish, - :filename => filename_for_content_disposition(@project.name + "-" + DateTime.now.strftime("%y%m%d%H%M%S") + ".zip"), - :type => "application/zip", - :disposition => "attachment") + :filename => filename_for_content_disposition("#{@project.name}-#{DateTime.now.strftime('%y%m%d%H%M%S')}.zip"), + :type => 'application/zip', + :disposition => 'attachment') ensure - zip.close unless zip.nil? + zip.close if zip end def zip_entries(zip, selected_folders, selected_files) if selected_folders && selected_folders.is_a?(Array) selected_folders.each do |selected_folder_id| check_project(folder = DmsfFolder.visible.find(selected_folder_id)) - zip.add_folder(folder, (@folder.dmsf_path_str unless @folder.nil?)) unless folder.nil? + zip.add_folder(folder, @folder.dmsf_path_str) if folder end end if selected_files && selected_files.is_a?(Array) selected_files.each do |selected_file_id| - check_project(file = DmsfFile.visible.find(selected_file_id)) - zip.add_file(file, (@folder.dmsf_path_str unless @folder.nil?)) unless file.nil? + check_project(file = DmsfFile.visible.find(selected_file_id)) + if file && file.last_revision && File.exists?(file.last_revision.disk_file) + zip.add_file(file, (@folder.dmsf_path_str if @folder)) + else + raise FileNotFound + end end end - - max_files = 0 - max_files = Setting.plugin_redmine_dmsf["dmsf_max_file_download"].to_i + + max_files = Setting.plugin_redmine_dmsf['dmsf_max_file_download'].to_i if max_files > 0 && zip.files.length > max_files raise ZipMaxFilesError, zip.files.length end @@ -381,21 +371,21 @@ class DmsfController < ApplicationController end def find_folder - @folder = DmsfFolder.visible.find(params[:folder_id]) if params.keys.include?("folder_id") + @folder = DmsfFolder.visible.find(params[:folder_id]) if params.keys.include?('folder_id') check_project(@folder) rescue DmsfAccessError render_403 end def find_parent - @parent = DmsfFolder.visible.find(params[:parent_id]) if params.keys.include?("parent_id") + @parent = DmsfFolder.visible.find(params[:parent_id]) if params.keys.include?('parent_id') check_project(@parent) rescue DmsfAccessError render_403 end def check_project(entry) - if !entry.nil? && entry.project != @project + if entry && entry.project != @project raise DmsfAccessError, l(:error_entry_project_does_not_match_current_project) end end diff --git a/app/views/dmsf/show.html.erb b/app/views/dmsf/show.html.erb index 7a7b4d3e..461bcf3d 100644 --- a/app/views/dmsf/show.html.erb +++ b/app/views/dmsf/show.html.erb @@ -1,3 +1,25 @@ +<%#= +# 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 +# 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. +%> + <% html_title(l(:dmsf)) %>
@@ -5,11 +27,11 @@ <% if @folder.nil? %>   <%= link_to('', {:action => 'edit_root', :id => @project}, - :title => l(:link_edit, :title => l(:link_documents)), :class => 'icon icon-edit') %> + :title => l(:link_edit, :title => l(:link_documents)), :class => 'icon icon-edit') %> <% elsif (@folder && !@folder.locked_for_user? ) %>   <%= link_to('', {:action => 'edit', :id => @project, :folder_id => @folder }, - :title => l(:link_edit, :title => h(@folder.title)), :class => 'icon icon-edit') %> + :title => l(:link_edit, :title => h(@folder.title)), :class => 'icon icon-edit') %> <% end %> <% if @folder && (!@folder.locked_for_user? || User.current.allowed_to?(:force_file_unlock, @project)) %> <% if @folder.locked? %> @@ -56,8 +78,7 @@
<%= textilizable(@folder ? @folder.description : @project.dmsf_description) %> -
- <%#= render 'custom_fields', :object => @folder %> +
<%= error_messages_for('dmsf_workflow') %> @@ -68,8 +89,8 @@
<%= submit_tag(l(:submit_download), :title => l(:title_download_checked), :name => 'download_entries') %> <%= submit_tag(l(:submit_email), :title => l(:title_send_checked_by_email), :name => 'email_entries') %> - <% if User.current.allowed_to?(:file_manipulation, @project) && (!@folder.nil? && !@folder.locked_for_user?) %> - + <% if User.current.allowed_to?(:file_manipulation, @project) && (@folder && !@folder.locked_for_user?) %> + <% end %>
@@ -92,22 +113,20 @@ <% @subfolders.each do |subfolder| %> - + @@ -118,12 +137,12 @@
<% if subfolder.notification %> <%= link_to_function(image_tag('notify.png', :plugin => :redmine_dmsf), - "manipulation_link('#{url_for(:action => 'notify_deactivate', :id => @project, :folder_id => subfolder)}')", - :title => l(:title_notifications_active_deactivate)) %> + "manipulation_link('#{url_for(:action => 'notify_deactivate', :id => @project, :folder_id => subfolder)}')", + :title => l(:title_notifications_active_deactivate)) %> <% else %> <%= link_to_function(image_tag('notifynot.png', :plugin => :redmine_dmsf), - "manipulation_link('#{url_for(:action => 'notify_activate', :id => @project, :folder_id => subfolder)}')", - :title => l(:title_notifications_not_active_activate)) %> + "manipulation_link('#{url_for(:action => 'notify_activate', :id => @project, :folder_id => subfolder)}')", + :title => l(:title_notifications_not_active_activate)) %> <% end %>
<% end %> @@ -131,8 +150,8 @@ <% if User.current.allowed_to?(:folder_manipulation, @project) %>
<%= link_to(image_tag('edit.png', :class =>'detail_icon'), - {:action => 'edit', :id => @project, :folder_id => subfolder }, - :title => l(:link_edit, :title => h(subfolder.title))) unless subfolder.locked_for_user? %> + {:action => 'edit', :id => @project, :folder_id => subfolder }, + :title => l(:link_edit, :title => h(subfolder.title))) unless subfolder.locked_for_user? %>
<% end %>
@@ -140,23 +159,24 @@ <% if subfolder.locked? %> <% if subfolder.unlockable? %> <%= link_to_function(image_tag('unlock.png', :plugin => :redmine_dmsf), - "manipulation_link('#{url_for(:controller => 'dmsf', :action => 'unlock', - :id => @project, :folder_id => subfolder)}')", - :title => l(:title_unlock_file))%> + "manipulation_link('#{url_for(:controller => 'dmsf', :action => 'unlock', + :id => @project, :folder_id => subfolder)}')", + :title => l(:title_unlock_file))%> <% else %> - <%= image_tag('locked.png', :plugin => :redmine_dmsf, :title => l(:title_folder_parent_locked, :name => subfolder.lock.reverse[0].folder.title)) %> + <%= image_tag('locked.png', :plugin => :redmine_dmsf, + :title => l(:title_folder_parent_locked, :name => subfolder.lock.reverse[0].folder.title)) %> <% end %> <% else %> <%= link_to_function(image_tag('lock.png', :plugin => :redmine_dmsf), - "manipulation_link('#{url_for(:controller => 'dmsf', :action => 'lock', - :id => @project, :folder_id => subfolder)}')", - :title => l(:title_lock_file)) %> + "manipulation_link('#{url_for(:controller => 'dmsf', :action => 'lock', + :id => @project, :folder_id => subfolder)}')", + :title => l(:title_lock_file)) %> <% end %>   <% end %> <%= link_to_function(image_tag('delete.png', :plugin => :redmine_dmsf), - "confirmation_link('#{url_for(:action => 'delete', :id => @project, :folder_id => @folder, :delete_folder_id => subfolder)}')", - :title => l(:title_delete)) unless (subfolder.locked_for_user?)%> + "confirmation_link('#{url_for(:action => 'delete', :id => @project, :folder_id => @folder, :delete_folder_id => subfolder)}', '#{l(:question_do_you_really_want_to_delete_this_entry)}')", + :title => l(:title_delete)) unless subfolder.locked_for_user? %>

@@ -177,20 +197,19 @@ - + <% end %> @@ -313,91 +333,80 @@ <% end %> <% -sUrl = "jquery.dataTables/en.json" +sUrl = 'jquery.dataTables/en.json' sUrl = "jquery.dataTables/#{I18n.locale.to_s.downcase}.json" if I18n.locale && !I18n.locale.to_s.match(/^en.*/) %> <% content_for :header_tags do %> - <%= stylesheet_link_tag "jquery-ui/jquery-ui-1.9.2.css", :plugin => "redmine_dmsf" %> - <%= stylesheet_link_tag "plupload/jquery.ui.plupload.css", :plugin => "redmine_dmsf" %> - <%= stylesheet_link_tag "jquery.dataTables/jquery-ui.dataTables.css", :plugin => "redmine_dmsf" %> - <%= stylesheet_link_tag "dmsf", :plugin => "redmine_dmsf" %> + <%= stylesheet_link_tag 'jquery-ui/jquery-ui-1.9.2.css', :plugin => 'redmine_dmsf' %> + <%= stylesheet_link_tag 'plupload/jquery.ui.plupload.css', :plugin => 'redmine_dmsf' %> + <%= stylesheet_link_tag 'jquery.dataTables/jquery-ui.dataTables.css', :plugin => 'redmine_dmsf' %> + <%= stylesheet_link_tag 'dmsf', :plugin => 'redmine_dmsf' %> - <%= javascript_include_tag "jquery-1.6.1.min.js", :plugin => "redmine_dmsf" %> - <%= javascript_include_tag "jquery-ui-1.8.13.min.js", :plugin => "redmine_dmsf" %> - <%= javascript_include_tag "jquery.dataTables/jquery.dataTables.min.js", :plugin => "redmine_dmsf" %> + <%= javascript_include_tag 'jquery-1.6.1.min.js', :plugin => 'redmine_dmsf' %> + <%= javascript_include_tag 'jquery-ui-1.8.13.min.js', :plugin => 'redmine_dmsf' %> + <%= javascript_include_tag 'jquery.dataTables/jquery.dataTables.min.js', :plugin => 'redmine_dmsf' %> <% end %> <%= render(:partial => 'multi_upload') if (User.current.allowed_to?(:file_manipulation, @project) && - (@folder.nil? || (!@folder.nil? &&!@folder.locked_for_user?))) %> + (@folder.nil? || (@folder && !@folder.locked_for_user?))) %>
diff --git a/app/views/dmsf_files/show.html.erb b/app/views/dmsf_files/show.html.erb index ffbb7a57..08a15816 100644 --- a/app/views/dmsf_files/show.html.erb +++ b/app/views/dmsf_files/show.html.erb @@ -1,3 +1,25 @@ +<%#= +# 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 +# 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. +%> + <% html_title(l(:dmsf)) %>
@@ -8,36 +30,36 @@ <%= image_tag('locked.png', :plugin => :redmine_dmsf, :title => l(:title_file_parent_locked, :name => @file.lock.reverse[0].folder.title)) %> <% else %> <%= link_to_function(image_tag('unlock.png', :plugin => 'redmine_dmsf'), - "manipulation_link('#{url_for(:action => 'unlock', :id => @file, :current => request.url)}')", - :title => l(:title_unlock_file)) %> + "manipulation_link('#{url_for(:action => 'unlock', :id => @file, :current => request.url)}')", + :title => l(:title_unlock_file)) %> <% end %> <% else %> <%= link_to_function(image_tag('lock.png', :plugin => 'redmine_dmsf'), - "manipulation_link('#{url_for(:action => 'lock', :id => @file, :current => request.url)}')", - :title => l(:title_lock_file)) %> + "manipulation_link('#{url_for(:action => 'lock', :id => @file, :current => request.url)}')", + :title => l(:title_lock_file)) %> <% end %> <% end %> <% if User.current.allowed_to?(:file_manipulation, @project) && !@file.locked_for_user? %>   <%= link_to_function(image_tag('delete.png', :plugin => 'redmine_dmsf'), - "confirmation_link('#{url_for(:action => 'delete', :id => @file)}', '#{l(:question_do_you_really_want_to_delete_this_entry)}')", - :title => l(:title_delete)) %> + "confirmation_link('#{url_for(:action => 'delete', :id => @file)}', '#{l(:question_do_you_really_want_to_delete_this_entry)}')", + :title => l(:title_delete)) %> <% end %> <% if User.current.allowed_to?(:file_approval, @project) %>   <% if @file.notification %> <%= link_to_function(image_tag('notify.png', :plugin => 'redmine_dmsf'), - "manipulation_link('#{url_for(:action => 'notify_deactivate', :id => @file, :current => request.url)}')", - :title => l(:title_notifications_active_deactivate)) %> + "manipulation_link('#{url_for(:action => 'notify_deactivate', :id => @file, :current => request.url)}')", + :title => l(:title_notifications_active_deactivate)) %> <% else %> <%= link_to_function(image_tag('notifynot.png', :plugin => 'redmine_dmsf'), - "manipulation_link('#{url_for(:action => 'notify_activate', :id => @file, :current => request.url)}')", - :title => l(:title_notifications_not_active_activate)) %> + "manipulation_link('#{url_for(:action => 'notify_activate', :id => @file, :current => request.url)}')", + :title => l(:title_notifications_not_active_activate)) %> <% end %> <% end %> <% end %>   - <%= link_to(image_tag('copy.png'), {:controller => :dmsf_files_copy, :action => "new", :id => @file }, :title => l(:title_copy_or_move)) %> + <%= link_to(image_tag('copy.png'), {:controller => :dmsf_files_copy, :action => 'new', :id => @file }, :title => l(:title_copy_or_move)) %>

@@ -54,10 +76,8 @@ <%= error_messages_for('file') %> <%= error_messages_for('revision') %> - <%= render(:partial => 'file_new_revision') if User.current.allowed_to?(:file_manipulation, @file.project) %> - -<%= form_tag('', :id => 'manipulation_form') %> +<%= form_tag('', :id => 'entries_form') %>

<%= l(:heading_revisions) %>

<% @file.revisions.visible[@revision_pages.current.offset,@revision_pages.items_per_page].each do |revision| %> @@ -67,12 +87,12 @@
<%= link_to_function(image_tag('rev_downloads.png', :plugin => 'redmine_dmsf'), "$('#revision_access-#{revision.id}').toggle()", :title => 'Download entries')%> <%= link_to(image_tag('rev_download.png', :plugin => 'redmine_dmsf'), - {:action => 'show', :id => @file, :download => revision}, - :title => l(:title_title_version_version_download, :title => h(revision.title), :version => revision.version)) %> + {:action => 'show', :id => @file, :download => revision}, + :title => l(:title_title_version_version_download, :title => h(revision.title), :version => revision.version)) %> <% if User.current.allowed_to?(:file_approval, @project) %> <%= link_to_function(image_tag('rev_delete.png', :plugin => 'redmine_dmsf'), - "confirmation_link('#{url_for(:action => 'delete_revision', :id => revision)}', '#{l(:question_do_you_really_want_to_delete_this_revision)}')", - :title => l(:title_delete_revision)) %> + "confirmation_link('#{url_for(:action => 'delete_revision', :id => revision)}', '#{l(:question_do_you_really_want_to_delete_this_revision)}')", + :title => l(:title_delete_revision)) %> <% end %>
<%= l(:info_revision, :rev => revision.id) %> @@ -184,19 +204,5 @@ <%= stylesheet_link_tag 'dmsf', :plugin => 'redmine_dmsf' %> <%= javascript_include_tag 'jquery-1.6.1.min.js', :plugin => 'redmine_dmsf' %> <%= javascript_include_tag 'jquery-ui-1.8.13.min.js', :plugin => 'redmine_dmsf' %> - <%= javascript_include_tag 'jquery.dataTables/jquery.dataTables.min.js', :plugin => 'redmine_dmsf' %> - + <%= javascript_include_tag 'jquery.dataTables/jquery.dataTables.min.js', :plugin => 'redmine_dmsf' %> <% end %> \ No newline at end of file diff --git a/assets/javascripts/redmine_dmsf.js b/assets/javascripts/redmine_dmsf.js new file mode 100644 index 00000000..020f67a6 --- /dev/null +++ b/assets/javascripts/redmine_dmsf.js @@ -0,0 +1,32 @@ +/* +* Redmine plugin for Document Management System "Features" +* +* 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 +* 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. +*/ + +function manipulation_link(action) { + jQuery('#entries_form').attr('action', action); + jQuery('#entries_form').submit(); +}; + +function confirmation_link(action, question) { + if(!window.confirm(question)) { + return; + } + jQuery('#entries_form').attr('action', action); + jQuery('#entries_form').submit(); +}; \ No newline at end of file diff --git a/init.rb b/init.rb index 9105ba48..c23ba62f 100644 --- a/init.rb +++ b/init.rb @@ -23,30 +23,30 @@ require 'redmine_dmsf' require 'zip' Redmine::Plugin.register :redmine_dmsf do - name "DMSF" - author "Vit Jonas / Daniel Munn / Karel Picman" - description "Document Management System Features" - version "1.4.6 stable" - url "https://github.com/danmunn/redmine_dmsf" - author_url "https://code.google.com/p/redmine-dmsf/" + name 'DMSF' + author 'Vit Jonas / Daniel Munn / Karel Picman' + description 'Document Management System Features' + version '1.4.7 devel' + url 'https://github.com/danmunn/redmine_dmsf' + author_url 'https://code.google.com/p/redmine-dmsf/' - requires_redmine :version_or_higher => '2.0.3' + requires_redmine :version_or_higher => '2.3.0' settings :partial => 'settings/dmsf_settings', :default => { - "dmsf_max_file_upload" => "0", - "dmsf_max_file_download" => "0", - "dmsf_max_email_filesize" => "0", - "dmsf_storage_directory" => Rails.root.join('files/dmsf').to_s, - "dmsf_index_database" => Rails.root.join("files/dmsf_index").to_s, - "dmsf_stemming_lang" => "english", - "dmsf_stemming_strategy" => "STEM_NONE", - "dmsf_webdav" => "1" + 'dmsf_max_file_upload' => '0', + 'dmsf_max_file_download' => '0', + 'dmsf_max_email_filesize' => '0', + 'dmsf_storage_directory' => Rails.root.join('files/dmsf').to_s, + 'dmsf_index_database' => Rails.root.join('files/dmsf_index').to_s, + 'dmsf_stemming_lang' => 'english', + 'dmsf_stemming_strategy' => 'STEM_NONE', + 'dmsf_webdav' => '1' } - menu :project_menu, :dmsf, { :controller => "dmsf", :action => "show" }, :caption => :menu_dmsf, :before => :documents, :param => :id + menu :project_menu, :dmsf, { :controller => 'dmsf', :action => 'show' }, :caption => :menu_dmsf, :before => :documents, :param => :id - activity_provider :dmsf_files, :class_name => "DmsfFileRevision", :default => true + activity_provider :dmsf_files, :class_name => 'DmsfFileRevision', :default => true project_module :dmsf do permission :view_dmsf_folders, {:dmsf => [:show], :dmsf_folders_copy => [:new, :copy_to, :move_to]} @@ -65,14 +65,7 @@ Redmine::Plugin.register :redmine_dmsf do # Administration menu extension Redmine::MenuManager.map :admin_menu do |menu| menu.push :approvalworkflows, {:controller => 'dmsf_workflows', :action => 'index'}, :caption => :label_dmsf_workflow_plural - end - - # Adds stylesheet tag - class DmsfViewListener < Redmine::Hook::ViewListener - def view_layouts_base_html_head(context) - stylesheet_link_tag('dmsf', :plugin => :redmine_dmsf) - end - end + end Redmine::WikiFormatting::Macros.register do desc "Wiki link to DMSF file:\n\n" + @@ -85,8 +78,8 @@ Redmine::Plugin.register :redmine_dmsf do entry = DmsfFile.find(entry_id) unless entry.nil? || entry.deleted title = args[1] ? args[1] : entry.title - revision = args[2] ? args[2] : "" - return link_to "#{title}", :controller => "dmsf_files", :action => "show", :id => entry, :download => revision, :only_path => false + revision = args[2] ? args[2] : '' + return link_to "#{title}", :controller => 'dmsf_files', :action => 'show', :id => entry, :download => revision, :only_path => false end nil end @@ -99,13 +92,13 @@ Redmine::Plugin.register :redmine_dmsf do macro :dmsff do |obj, args| if args.length < 1 - return link_to l(:link_documents), :controller => "dmsf", :action => "show", :id => @project, :only_path => false + return link_to l(:link_documents), :controller => 'dmsf', :action => 'show', :id => @project, :only_path => false else entry_id = args[0].strip entry = DmsfFolder.find(entry_id) unless entry.nil? title = args[1] ? args[1] : entry.title - return link_to "#{title}", :controller => "dmsf", :action => "show", :id => entry.project, :folder_id => entry, :only_path => false + return link_to "#{title}", :controller => 'dmsf', :action => 'show', :id => entry.project, :folder_id => entry, :only_path => false end end nil @@ -123,7 +116,7 @@ Redmine::Plugin.register :redmine_dmsf do entry = DmsfFile.find(entry_id) unless entry.nil? || entry.deleted title = args[1] ? args[1] : entry.title - return link_to "#{title}", :controller => "dmsf_files", :action => "show", :id => entry, :only_path => false + return link_to "#{title}", :controller => 'dmsf_files', :action => 'show', :id => entry, :only_path => false end nil end diff --git a/lib/redmine_dmsf.rb b/lib/redmine_dmsf.rb index 13c6cfa7..49aa857c 100644 --- a/lib/redmine_dmsf.rb +++ b/lib/redmine_dmsf.rb @@ -1,4 +1,24 @@ -#Vendor +# 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 +# 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. + +# Vendor require 'redmine_dmsf/vendored_dav4rack' # DMSF libraries @@ -6,11 +26,12 @@ require 'redmine_dmsf/patches' #plugin patches require 'redmine_dmsf/webdav' #DAV4Rack implementation -#Hooks +# Hooks require 'redmine_dmsf/hooks/view_projects_form_hook' +require 'redmine_dmsf/hooks/base_view_hooks' module RedmineDmsf end -#Add plugin's view folder into ActionMailer's paths to search +# Add plugin's view folder into ActionMailer's paths to search ActionMailer::Base.append_view_path(File.expand_path(File.dirname(__FILE__) + '/../app/views')) diff --git a/lib/redmine_dmsf/hooks/base_view_hooks.rb b/lib/redmine_dmsf/hooks/base_view_hooks.rb new file mode 100644 index 00000000..7ae2cf39 --- /dev/null +++ b/lib/redmine_dmsf/hooks/base_view_hooks.rb @@ -0,0 +1,33 @@ +# Redmine plugin for Document Management System "Features" +# +# 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 +# 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. + +module RedmineDmsf + module Hooks + include Redmine::Hook + + class DmsfViewListener < Redmine::Hook::ViewListener + + def view_layouts_base_html_head(context={}) + tags = "\n".html_safe + javascript_include_tag('redmine_dmsf', :plugin => :redmine_dmsf) + tags << "\n".html_safe + stylesheet_link_tag('dmsf', :plugin => :redmine_dmsf) + tags + end + + end + end +end diff --git a/lib/redmine_dmsf/hooks/view_projects_form_hook.rb b/lib/redmine_dmsf/hooks/view_projects_form_hook.rb index ad3acad3..b21f2d03 100644 --- a/lib/redmine_dmsf/hooks/view_projects_form_hook.rb +++ b/lib/redmine_dmsf/hooks/view_projects_form_hook.rb @@ -5,7 +5,7 @@ module RedmineDmsf def view_projects_form(context={}) context[:controller].send(:render_to_string, { - :partial => "hooks/redmine_dmsf/view_projects_form", + :partial => 'hooks/redmine_dmsf/view_projects_form', :locals => context })
<%= check_box_tag("subfolders[]", subfolder.id, false, :title => l(:title_check_for_zip_download_or_email)) %><%= check_box_tag('subfolders[]', subfolder.id, false, :title => l(:title_check_for_zip_download_or_email)) %> <%= link_to(h(subfolder.title), - {:action => "show", :id => @project, :folder_id => subfolder}, - :class => "icon icon-folder") %> -
[<%= subfolder.deep_file_count %>]
- <%#= render 'custom_fields', :object => subfolder %> + {:action => 'show', :id => @project, :folder_id => subfolder}, :class => 'icon icon-folder') %> +
[<%= subfolder.deep_file_count %>]
<%= number_to_human_size(subfolder.deep_size) %> <%= format_time(subfolder.updated_at) %> <% if subfolder.locked_for_user? %> - <%= link_to(image_tag("locked.png", :plugin => :redmine_dmsf), - {:controller => "users", :action => "show", :id => subfolder.lock.reverse[0].user }, - :title => l(:title_locked_by_user, :user => subfolder.lock.reverse[0].user.to_s)) %> + <%= link_to(image_tag('locked.png', :plugin => :redmine_dmsf), + {:controller => 'users', :action => 'show', :id => subfolder.lock.reverse[0].user }, + :title => l(:title_locked_by_user, :user => subfolder.lock.reverse[0].user.to_s)) %> <% elsif subfolder.locked? %> - <%= image_tag("lockedbycurrent.png", :title => l(:title_locked_by_you), :plugin => :redmine_dmsf) %> + <%= image_tag('lockedbycurrent.png', :title => l(:title_locked_by_you), :plugin => :redmine_dmsf) %> <% end %> <% 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 %>
<%= number_to_human_size(file.last_revision.size) %> <%= format_time(file.last_revision.updated_at) %> <% if file.locked_for_user? %> <%= link_to(image_tag('locked.png', :plugin => :redmine_dmsf), - {:controller => 'users', :action => 'show', :id => file.lock.reverse[0].user }, - :title => l(:title_locked_by_user, :user => file.lock.reverse[0].user.to_s)) %> + {:controller => 'users', :action => 'show', :id => file.lock.reverse[0].user }, + :title => l(:title_locked_by_user, :user => file.lock.reverse[0].user.to_s)) %> <% elsif file.locked? %> <%= image_tag('lockedbycurrent.png', :title => l(:title_locked_by_you), :plugin => :redmine_dmsf) %> <% end %> @@ -216,12 +235,12 @@
<% if file.notification %> <%= link_to_function(image_tag('notify.png', :plugin => :redmine_dmsf), - "manipulation_link('#{url_for(:controller => 'dmsf_files', :action => 'notify_deactivate', :id => file)}')", - :title => l(:title_notifications_active_deactivate)) %> + "manipulation_link('#{url_for(:controller => 'dmsf_files', :action => 'notify_deactivate', :id => file)}')", + :title => l(:title_notifications_active_deactivate)) %> <% else %> <%= link_to_function(image_tag('notifynot.png', :plugin => :redmine_dmsf), - "manipulation_link('#{url_for(:controller => 'dmsf_files', :action => 'notify_activate', :id => file)}')", - :title => l(:title_notifications_not_active_activate)) %> + "manipulation_link('#{url_for(:controller => 'dmsf_files', :action => 'notify_activate', :id => file)}')", + :title => l(:title_notifications_not_active_activate)) %> <% end %> <% case file.last_revision.workflow %> <% when DmsfWorkflow::STATE_WAITING_FOR_APPROVAL %> @@ -261,50 +280,51 @@ <% else %> <% if workflows_available %> <%= link_to( - image_tag('none.png', :plugin => :redmine_dmsf), - assign_dmsf_workflow_path( - :project_id => @project.id, - :dmsf_file_revision_id => file.last_revision.id), - :title => l(:label_dmsf_wokflow_action_assign), - :remote => true) %> + image_tag('none.png', :plugin => :redmine_dmsf), + assign_dmsf_workflow_path( + :project_id => @project.id, + :dmsf_file_revision_id => file.last_revision.id), + :title => l(:label_dmsf_wokflow_action_assign), + :remote => true) %> <% end %> <% end %>
<% end %>
- <%= link_to(image_tag('filedetails.png', :plugin => :redmine_dmsf, :class =>"detail_icon"), - {:controller => "dmsf_files", :action => :show, :id => file }, - :title => l(:link_details, :title =>h(file.last_revision.title))) %> + <%= link_to(image_tag('filedetails.png', :plugin => :redmine_dmsf, :class =>'detail_icon'), + {:controller => "dmsf_files", :action => :show, :id => file }, + :title => l(:link_details, :title =>h(file.last_revision.title))) %>
<% unless file.locked_for_user? && !User.current.allowed_to?(:force_file_unlock, @project)%> <% if file.locked? %> <% if file.unlockable? %> <%= link_to_function(image_tag('unlock.png', :plugin => :redmine_dmsf), - "manipulation_link('#{url_for(:controller => 'dmsf_files', :action => 'unlock', :id => file)}')", - :title => l(:title_unlock_file))%> + "manipulation_link('#{url_for(:controller => 'dmsf_files', :action => 'unlock', :id => file)}')", + :title => l(:title_unlock_file))%> <% else %> - <%= image_tag('locked.png', :plugin => :redmine_dmsf, :title => l(:title_file_parent_locked, :name => file.folder.lock.reverse[0].folder.title)) %> + <%= image_tag('locked.png', :plugin => :redmine_dmsf, + :title => l(:title_file_parent_locked, :name => file.folder.lock.reverse[0].folder.title)) %> <% end%> <% else %> <%= link_to_function(image_tag('lock.png', :plugin => :redmine_dmsf), - "manipulation_link('#{url_for(:controller => "dmsf_files", :action => 'lock', :id => file)}')", - :title => l(:title_lock_file)) %> + "manipulation_link('#{url_for(:controller => 'dmsf_files', :action => 'lock', :id => file)}')", + :title => l(:title_lock_file)) %> <% end %>   <% end %> <% if User.current.allowed_to?(:file_manipulation, @project) && !file.locked_for_user? %> <%= link_to_function(image_tag('delete.png', :plugin => :redmine_dmsf), - "confirmation_link('#{url_for(:controller => 'dmsf_files', :action => 'delete', :id => file)}')", - :title => l(:title_delete)) %> + "confirmation_link('#{url_for(:controller => 'dmsf_files', :action => 'delete', :id => file)}', '#{l(:question_do_you_really_want_to_delete_this_entry)}')", + :title => l(:title_delete)) %> <% end %>