From c191bb7c33e34e49f89c4910694252a438c9ce44 Mon Sep 17 00:00:00 2001 From: Karel Picman Date: Thu, 31 Aug 2017 11:59:09 +0200 Subject: [PATCH] Code review --- CHANGELOG.md | 4 +- Gemfile | 4 +- after_init.rb | 83 +++++++++++++++++ app/controllers/dmsf_controller.rb | 88 +++---------------- app/models/dmsf_file.rb | 2 - app/models/dmsf_file_revision.rb | 2 +- app/models/dmsf_file_revision_access.rb | 2 +- app/models/dmsf_folder.rb | 35 ++++++++ app/views/dmsf/edit.html.erb | 1 - init.rb | 85 ++++-------------- .../hooks/views/search_view_hooks.rb | 2 +- 11 files changed, 154 insertions(+), 154 deletions(-) create mode 100644 after_init.rb diff --git a/CHANGELOG.md b/CHANGELOG.md index 784321d8..09381846 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,8 @@ IMPORTANT 1. Files in the filesystem are re-organized by a new system based on dates. 2. DMS storage directory plugin option is related to the rails root directory. -* Bug: #758 - Error in template when retrieving details of a file in a subfolder +* Bug: #758 - Error in template when retrieving details of a file in a subfolder +* New: #755 - Ability to retrieve the MD5 value of a Document type * Bug: #749 - REST API - List of documents in folder fails when using folder_title * Bug: #747 - Background icon repeating in admin panel (Redmine 3.4.2) * Bug: #746 - Thumbnail macro: size paramter not respected @@ -46,6 +47,7 @@ IMPORTANT * Bug: #683 - Approval reminder problem * New: #667 - A better navigation in found results * New: #651 - Incomplete copy of a file to another project +* Bug: #623 - Option "Navigate folders in a tree" seems not to be saved * New: #543 - Feature Request: Document Location - Folder Structure * New: #170 - Document and Folder Access Control. This issue may be duplicated as I saw it on google code some time ago. * New: #48 - Linking Issues and DMSF Documents diff --git a/Gemfile b/Gemfile index 4d3cf5fb..4858cf45 100644 --- a/Gemfile +++ b/Gemfile @@ -31,4 +31,6 @@ gem 'dalli' group :xapian do gem 'xapian-full-alaveteli', :require => false -end \ No newline at end of file +end + +gem 'redmine_extensions' unless Dir.exist?(File.expand_path('../../easyproject', __FILE__)) \ No newline at end of file diff --git a/after_init.rb b/after_init.rb new file mode 100644 index 00000000..57a8f8a7 --- /dev/null +++ b/after_init.rb @@ -0,0 +1,83 @@ +require_dependency 'zip' +require_dependency File.dirname(__FILE__) + '/lib/redmine_dmsf.rb' + +def init + # Administration menu extension + Redmine::MenuManager.map :admin_menu do |menu| + menu.push :dmsf_approvalworkflows, :dmsf_workflows_path, :caption => :label_dmsf_workflow_plural, + :html => { :class => 'icon icon-approvalworkflows' }, :if => Proc.new { |_| User.current.admin? } + end + + Redmine::MenuManager.map :project_menu do |menu| + menu.push :dmsf, { :controller => 'dmsf', :action => 'show' }, :caption => :menu_dmsf, :before => :documents, + :param => :id + end + + # Permissions + Redmine::AccessControl.map do |map| + map.project_module :dmsf do |pmap| + pmap.permission :view_dmsf_file_revision_accesses, + :read => true + pmap.permission :view_dmsf_file_revisions, + :read => true + pmap.permission :view_dmsf_folders, + {:dmsf => [:show], + :dmsf_folders_copy => [:new, :copy_to, :move_to]}, + :read => true + pmap.permission :user_preferences, + {:dmsf_state => [:user_pref_save]} + pmap.permission :view_dmsf_files, + {:dmsf => [:entries_operation, :entries_email, :download_email_entries, :tag_changed], + :dmsf_files => [:show, :view, :thumbnail], + :dmsf_files_copy => [:new, :create, :move], + :dmsf_workflows => [:log]}, + :read => true + pmap.permission :email_documents, + {:dmsf_public_urls => [:create]} + pmap.permission :folder_manipulation, + {:dmsf => [:new, :create, :delete, :edit, :save, :edit_root, :save_root, :lock, :unlock, + :notify_activate, :notify_deactivate, :restore], + :dmsf_folder_permissions => [:new, :append, :autocomplete_for_user]} + pmap.permission :file_manipulation, + {:dmsf_files => [:create_revision, :lock, :unlock, :delete_revision, :notify_activate, + :notify_deactivate, :restore], + :dmsf_upload => [:upload_files, :upload_file, :upload, :commit_files, :commit, + :delete_dmsf_attachment, :delete_dmsf_link_attachment], + :dmsf_links => [:new, :create, :destroy, :restore, :autocomplete_for_project, + :autocomplete_for_folder] + } + pmap.permission :file_delete, + { :dmsf => [:trash, :delete_entries], + :dmsf_files => [:delete]} + pmap.permission :force_file_unlock, {} + pmap.permission :file_approval, + {:dmsf_workflows => [:action, :new_action, :autocomplete_for_user, :start, :assign, :assignment]} + pmap.permission :manage_workflows, + {:dmsf_workflows => [:index, :new, :create, :destroy, :show, :new_step, :add_step, :remove_step, + :reorder_steps, :update, :update_step, :delete_step, :edit]} + pmap.permission :display_system_folders, + :read => true + end + end +end + +unless Redmine::Plugin.installed?(:easy_extensions) + init +else + ActiveSupport.on_load(:easyproject, yield: true) do + init + end +end + +ActionDispatch::Reloader.to_prepare do + # Rubyzip configuration + Zip.unicode_names = true + + Redmine::Search.map do |search| + search.register :dmsf_files + search.register :dmsf_folders + end + + Redmine::Activity.register :dmsf_file_revision_accesses, :default => false + Redmine::Activity.register :dmsf_file_revisions +end diff --git a/app/controllers/dmsf_controller.rb b/app/controllers/dmsf_controller.rb index 5baaa487..bb0a2614 100644 --- a/app/controllers/dmsf_controller.rb +++ b/app/controllers/dmsf_controller.rb @@ -185,44 +185,18 @@ class DmsfController < ApplicationController render :action => 'edit' end + def edit + @parent = @folder.dmsf_folder + @pathfolder = copy_folder(@folder) + @force_file_unlock_allowed = User.current.allowed_to?(:force_file_unlock, @project) + @users = Principal.active.where(:id => @folder.dmsf_folder_permissions.users.map{ |p| p.object_id }) + end + def create @folder = DmsfFolder.new - @folder.title = params[:dmsf_folder][:title].strip - @folder.description = params[:dmsf_folder][:description].strip - @folder.dmsf_folder_id = params[:dmsf_folder][:dmsf_folder_id] @folder.project = @project @folder.user = User.current - - # Custom fields - if params[:dmsf_folder][:custom_field_values].present? - params[:dmsf_folder][:custom_field_values].each_with_index do |v, i| - @folder.custom_field_values[i].value = v[1] - end - end - - # Permissions - @folder.dmsf_folder_permissions.delete_all - if params[:permissions] - if params[:permissions][:role_ids] - params[:permissions][:role_ids].each do |role_id| - permission = DmsfFolderPermission.new - permission.object_id = role_id - permission.object_type = Role.model_name.to_s - @folder.dmsf_folder_permissions << permission - end - end - if params[:permissions][:user_ids] - params[:permissions][:user_ids].each do |user_id| - permission = DmsfFolderPermission.new - permission.object_id = user_id - permission.object_type = User.model_name.to_s - @folder.dmsf_folder_permissions << permission - end - end - end - - saved = @folder.save - + saved = @folder.update_from_params(params) respond_to do |format| format.js format.api { @@ -233,7 +207,7 @@ class DmsfController < ApplicationController format.html { if saved flash[:notice] = l(:notice_folder_created) - redirect_to dmsf_folder_path(:id => @project, :folder_id => @folder) + redirect_to dmsf_folder_path(:id => @project, :folder_id => @folder.dmsf_folder) else @pathfolder = @parent render :action => 'edit' @@ -243,53 +217,13 @@ class DmsfController < ApplicationController end - def edit - @parent = @folder.dmsf_folder - @pathfolder = copy_folder(@folder) - @force_file_unlock_allowed = User.current.allowed_to?(:force_file_unlock, @project) - @users = Principal.active.where(:id => @folder.dmsf_folder_permissions.users.map{ |p| p.object_id }) - end - def save unless params[:dmsf_folder] redirect_to dmsf_folder_path(:id => @project, :folder_id => @folder) return end @pathfolder = copy_folder(@folder) - @folder.title = params[:dmsf_folder][:title].strip - @folder.description = params[:dmsf_folder][:description].strip - @folder.dmsf_folder_id = params[:dmsf_folder][:dmsf_folder_id] - - # Custom fields - if params[:dmsf_folder][:custom_field_values].present? - params[:dmsf_folder][:custom_field_values].each_with_index do |v, i| - @folder.custom_field_values[i].value = v[1] - end - end - - # Permissions - @folder.dmsf_folder_permissions.delete_all - if params[:permissions] - if params[:permissions][:role_ids] - params[:permissions][:role_ids].each do |role_id| - permission = DmsfFolderPermission.new - permission.object_id = role_id - permission.object_type = Role.model_name.to_s - @folder.dmsf_folder_permissions << permission - end - end - if params[:permissions][:user_ids] - params[:permissions][:user_ids].each do |user_id| - permission = DmsfFolderPermission.new - permission.object_id = user_id - permission.object_type = User.model_name.to_s - @folder.dmsf_folder_permissions << permission - end - end - end - - saved = @folder.save - + saved = @folder.update_from_params(params) respond_to do |format| format.api { unless saved @@ -299,7 +233,7 @@ class DmsfController < ApplicationController format.html { if saved flash[:notice] = l(:notice_folder_details_were_saved) - redirect_to dmsf_folder_path(:id => @project, :folder_id => @folder) + redirect_to dmsf_folder_path(:id => @project, :folder_id => @folder.dmsf_folder) else render :action => 'edit' end diff --git a/app/models/dmsf_file.rb b/app/models/dmsf_file.rb index d802220d..9c762818 100644 --- a/app/models/dmsf_file.rb +++ b/app/models/dmsf_file.rb @@ -56,8 +56,6 @@ class DmsfFile < ActiveRecord::Base validate :validates_name_uniqueness - attr_accessible :project, :project_id - def validates_name_uniqueness existing_file = DmsfFile.visible.findn_file_by_name(self.project_id, self.dmsf_folder, self.name) errors.add(:name, l('activerecord.errors.messages.taken')) unless (existing_file.nil? || existing_file.id == self.id) diff --git a/app/models/dmsf_file_revision.rb b/app/models/dmsf_file_revision.rb index df214c69..2fb3922b 100644 --- a/app/models/dmsf_file_revision.rb +++ b/app/models/dmsf_file_revision.rb @@ -49,7 +49,7 @@ class DmsfFileRevision < ActiveRecord::Base :timestamp => "#{DmsfFileRevision.table_name}.updated_at", :author_key => "#{DmsfFileRevision.table_name}.user_id", :permission => :view_dmsf_file_revisions, - :scope => select("#{DmsfFileRevision.table_name}.*").joins(:dmsf_file). + :scope => DmsfFileRevision.joins(:dmsf_file). joins("JOIN #{Project.table_name} ON #{Project.table_name}.id = #{DmsfFile.table_name}.project_id").visible validates :title, :presence => true diff --git a/app/models/dmsf_file_revision_access.rb b/app/models/dmsf_file_revision_access.rb index 516aa97a..a2189aad 100644 --- a/app/models/dmsf_file_revision_access.rb +++ b/app/models/dmsf_file_revision_access.rb @@ -40,7 +40,7 @@ class DmsfFileRevisionAccess < ActiveRecord::Base :timestamp => "#{DmsfFileRevisionAccess.table_name}.updated_at", :author_key => "#{DmsfFileRevisionAccess.table_name}.user_id", :permission => :view_dmsf_file_revision_accesses, - :scope => select("#{DmsfFileRevisionAccess.table_name}.*"). + :scope => DmsfFileRevisionAccess. joins(:dmsf_file_revision).joins("JOIN #{DmsfFile.table_name} ON dmsf_files.id = dmsf_file_revisions.dmsf_file_id"). joins("JOIN #{Project.table_name} on dmsf_files.project_id = projects.id"). where(:dmsf_files => { :deleted => DmsfFile::STATUS_ACTIVE }) diff --git a/app/models/dmsf_folder.rb b/app/models/dmsf_folder.rb index a1614419..60dab618 100644 --- a/app/models/dmsf_folder.rb +++ b/app/models/dmsf_folder.rb @@ -542,6 +542,41 @@ class DmsfFolder < ActiveRecord::Base @issue end + def update_from_params(params) + # Attributes + self.title = params[:dmsf_folder][:title].strip + self.description = params[:dmsf_folder][:description].strip + self.dmsf_folder_id = params[:dmsf_folder][:dmsf_folder_id] + # Custom fields + if params[:dmsf_folder][:custom_field_values].present? + params[:dmsf_folder][:custom_field_values].each_with_index do |v, i| + self.custom_field_values[i].value = v[1] + end + end + # Permissions + self.dmsf_folder_permissions.delete_all + if params[:permissions] + if params[:permissions][:role_ids] + params[:permissions][:role_ids].each do |role_id| + permission = DmsfFolderPermission.new + permission.object_id = role_id + permission.object_type = Role.model_name.to_s + self.dmsf_folder_permissions << permission + end + end + if params[:permissions][:user_ids] + params[:permissions][:user_ids].each do |user_id| + permission = DmsfFolderPermission.new + permission.object_id = user_id + permission.object_type = User.model_name.to_s + self.dmsf_folder_permissions << permission + end + end + end + # Save + self.save + end + private def self.directory_subtree(tree, folder, level, current_folder) diff --git a/app/views/dmsf/edit.html.erb b/app/views/dmsf/edit.html.erb index 23c0b862..eafeab1b 100644 --- a/app/views/dmsf/edit.html.erb +++ b/app/views/dmsf/edit.html.erb @@ -95,7 +95,6 @@ <% if checkboxes.present? %>
<% end %> - <%= link_to l(:label_user_search_add), new_dmsf_folder_permissions_path(:project_id => @project, :dmsf_folder_id => @folder), diff --git a/init.rb b/init.rb index 7f3cd423..bdd97f74 100644 --- a/init.rb +++ b/init.rb @@ -1,5 +1,5 @@ -# encoding: utf-8 -# +# encoding: utf-8 +# # Redmine plugin for Document Management System "Features" # # Copyright (C) 2011 Vít Jonáš @@ -20,20 +20,22 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -require 'redmine' -require 'redmine_dmsf' -require 'zip' - Redmine::Plugin.register :redmine_dmsf do - name 'DMSF' + unless Redmine::Plugin.installed?(:easy_extensions) + name 'DMSF' + url 'http://www.redmine.org/plugins/dmsf' + author_url 'https://github.com/danmunn/redmine_dmsf/graphs/contributors' + else + name 'Easy DMS' + url 'https://www.easyredmine.com' + author_url 'https://www.easyredmine.com' + end author 'Vít Jonáš / Daniel Munn / Karel Pičman' description 'Document Management System Features' version '1.6.0' - url 'http://www.redmine.org/plugins/dmsf' - author_url 'https://github.com/danmunn/redmine_dmsf/graphs/contributors' - + requires_redmine :version_or_higher => '3.3.0' - + settings :partial => 'settings/dmsf_settings', :default => { 'dmsf_max_file_upload' => '0', @@ -54,66 +56,11 @@ Redmine::Plugin.register :redmine_dmsf do 'dmsf_act_as_attachable' => false, 'dmsf_show_system_folders' => false } - - menu :project_menu, :dmsf, { :controller => 'dmsf', :action => 'show' }, :caption => :menu_dmsf, :before => :documents, :param => :id - - Redmine::Activity.register :dmsf_file_revision_accesses, :default => false - Redmine::Activity.register :dmsf_file_revisions - + # Uncomment to remove the original Documents from searching (replaced with DMSF) # Redmine::Search.available_search_types.delete('documents') - - project_module :dmsf do - permission :view_dmsf_file_revision_accesses, - :read => true - permission :view_dmsf_file_revisions, - :read => true - permission :view_dmsf_folders, - { :dmsf => [:show], - :dmsf_folders_copy => [:new, :copy_to, :move_to] }, - :read => true - permission :user_preferences, - { :dmsf_state => [:user_pref_save] } - permission :view_dmsf_files, - { :dmsf => [:entries_operation, :entries_email, :download_email_entries, :tag_changed], - :dmsf_files => [:show, :view, :thumbnail], - :dmsf_files_copy => [:new, :create, :move], - :dmsf_workflows => [:log] }, - :read => true - permission :email_documents, - { :dmsf_public_urls => [:create] } - permission :folder_manipulation, - { :dmsf => [:new, :create, :delete, :edit, :save, :edit_root, :save_root, :lock, :unlock, :notify_activate, :notify_deactivate, :restore], - :dmsf_folder_permissions => [:new, :append, :autocomplete_for_user] } - permission :file_manipulation, - { :dmsf_files => [:create_revision, :lock, :unlock, :delete_revision, :notify_activate, :notify_deactivate, :restore], - :dmsf_upload => [:upload_files, :upload_file, :upload, :commit_files, :commit, :delete_dmsf_attachment, - :delete_dmsf_link_attachment], - :dmsf_links => [:new, :create, :destroy, :restore, :autocomplete_for_project, :autocomplete_for_folder] } - permission :file_delete, - { :dmsf => [:trash, :delete_entries], - :dmsf_files => [:delete] } - permission :force_file_unlock, {} - permission :file_approval, - { :dmsf_workflows => [:action, :new_action, :autocomplete_for_user, :start, :assign, :assignment] } - permission :manage_workflows, - { :dmsf_workflows => [:index, :new, :create, :destroy, :show, :new_step, :add_step, :remove_step, :reorder_steps, - :update, :update_step, :delete_step, :edit] } - permission :display_system_folders, - :read => true - end - - # Administration menu extension - Redmine::MenuManager.map :admin_menu do |menu| - menu.push :dmsf_approvalworkflows, {:controller => 'dmsf_workflows', :action => 'index'}, - :caption => :label_dmsf_workflow_plural, :html => { :class => 'icon icon-approvalworkflows' } - end - - # Rubyzip configuration - Zip.unicode_names = true end -Redmine::Search.map do |search| - search.register :dmsf_files - search.register :dmsf_folders +unless Redmine::Plugin.installed?(:easy_extensions) + require_relative 'after_init' end diff --git a/lib/redmine_dmsf/hooks/views/search_view_hooks.rb b/lib/redmine_dmsf/hooks/views/search_view_hooks.rb index 65a933cd..30306df7 100644 --- a/lib/redmine_dmsf/hooks/views/search_view_hooks.rb +++ b/lib/redmine_dmsf/hooks/views/search_view_hooks.rb @@ -33,4 +33,4 @@ module RedmineDmsf end end -end \ No newline at end of file +end