Code review

This commit is contained in:
Karel Picman 2017-08-31 11:59:09 +02:00
parent bf6575097b
commit c191bb7c33
11 changed files with 154 additions and 154 deletions

View File

@ -15,6 +15,7 @@ IMPORTANT
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
* 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

View File

@ -32,3 +32,5 @@ gem 'dalli'
group :xapian do
gem 'xapian-full-alaveteli', :require => false
end
gem 'redmine_extensions' unless Dir.exist?(File.expand_path('../../easyproject', __FILE__))

83
after_init.rb Normal file
View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -95,7 +95,6 @@
<% if checkboxes.present? %>
<br/>
<% end %>
</span>
<span class="search_for_watchers">
<%= link_to l(:label_user_search_add),
new_dmsf_folder_permissions_path(:project_id => @project, :dmsf_folder_id => @folder),

75
init.rb
View File

@ -1,4 +1,4 @@
# encoding: utf-8
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
@ -20,17 +20,19 @@
# 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
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'
@ -55,65 +57,10 @@ Redmine::Plugin.register :redmine_dmsf do
'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