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

@ -14,7 +14,8 @@ IMPORTANT
1. Files in the filesystem are re-organized by a new system based on dates. 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. 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: #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: #747 - Background icon repeating in admin panel (Redmine 3.4.2)
* Bug: #746 - Thumbnail macro: size paramter not respected * Bug: #746 - Thumbnail macro: size paramter not respected
@ -46,6 +47,7 @@ IMPORTANT
* Bug: #683 - Approval reminder problem * Bug: #683 - Approval reminder problem
* New: #667 - A better navigation in found results * New: #667 - A better navigation in found results
* New: #651 - Incomplete copy of a file to another project * 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: #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: #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 * New: #48 - Linking Issues and DMSF Documents

View File

@ -31,4 +31,6 @@ gem 'dalli'
group :xapian do group :xapian do
gem 'xapian-full-alaveteli', :require => false gem 'xapian-full-alaveteli', :require => false
end 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' render :action => 'edit'
end 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 def create
@folder = DmsfFolder.new @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.project = @project
@folder.user = User.current @folder.user = User.current
saved = @folder.update_from_params(params)
# 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
respond_to do |format| respond_to do |format|
format.js format.js
format.api { format.api {
@ -233,7 +207,7 @@ class DmsfController < ApplicationController
format.html { format.html {
if saved if saved
flash[:notice] = l(:notice_folder_created) 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 else
@pathfolder = @parent @pathfolder = @parent
render :action => 'edit' render :action => 'edit'
@ -243,53 +217,13 @@ class DmsfController < ApplicationController
end 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 def save
unless params[:dmsf_folder] unless params[:dmsf_folder]
redirect_to dmsf_folder_path(:id => @project, :folder_id => @folder) redirect_to dmsf_folder_path(:id => @project, :folder_id => @folder)
return return
end end
@pathfolder = copy_folder(@folder) @pathfolder = copy_folder(@folder)
@folder.title = params[:dmsf_folder][:title].strip saved = @folder.update_from_params(params)
@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
respond_to do |format| respond_to do |format|
format.api { format.api {
unless saved unless saved
@ -299,7 +233,7 @@ class DmsfController < ApplicationController
format.html { format.html {
if saved if saved
flash[:notice] = l(:notice_folder_details_were_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 else
render :action => 'edit' render :action => 'edit'
end end

View File

@ -56,8 +56,6 @@ class DmsfFile < ActiveRecord::Base
validate :validates_name_uniqueness validate :validates_name_uniqueness
attr_accessible :project, :project_id
def validates_name_uniqueness def validates_name_uniqueness
existing_file = DmsfFile.visible.findn_file_by_name(self.project_id, self.dmsf_folder, self.name) 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) 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", :timestamp => "#{DmsfFileRevision.table_name}.updated_at",
:author_key => "#{DmsfFileRevision.table_name}.user_id", :author_key => "#{DmsfFileRevision.table_name}.user_id",
:permission => :view_dmsf_file_revisions, :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 joins("JOIN #{Project.table_name} ON #{Project.table_name}.id = #{DmsfFile.table_name}.project_id").visible
validates :title, :presence => true validates :title, :presence => true

View File

@ -40,7 +40,7 @@ class DmsfFileRevisionAccess < ActiveRecord::Base
:timestamp => "#{DmsfFileRevisionAccess.table_name}.updated_at", :timestamp => "#{DmsfFileRevisionAccess.table_name}.updated_at",
:author_key => "#{DmsfFileRevisionAccess.table_name}.user_id", :author_key => "#{DmsfFileRevisionAccess.table_name}.user_id",
:permission => :view_dmsf_file_revision_accesses, :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(: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"). joins("JOIN #{Project.table_name} on dmsf_files.project_id = projects.id").
where(:dmsf_files => { :deleted => DmsfFile::STATUS_ACTIVE }) where(:dmsf_files => { :deleted => DmsfFile::STATUS_ACTIVE })

View File

@ -542,6 +542,41 @@ class DmsfFolder < ActiveRecord::Base
@issue @issue
end 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 private
def self.directory_subtree(tree, folder, level, current_folder) def self.directory_subtree(tree, folder, level, current_folder)

View File

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

85
init.rb
View File

@ -1,5 +1,5 @@
# encoding: utf-8 # encoding: utf-8
# #
# Redmine plugin for Document Management System "Features" # Redmine plugin for Document Management System "Features"
# #
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com> # Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
@ -20,20 +20,22 @@
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # 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 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' author 'Vít Jonáš / Daniel Munn / Karel Pičman'
description 'Document Management System Features' description 'Document Management System Features'
version '1.6.0' 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' requires_redmine :version_or_higher => '3.3.0'
settings :partial => 'settings/dmsf_settings', settings :partial => 'settings/dmsf_settings',
:default => { :default => {
'dmsf_max_file_upload' => '0', 'dmsf_max_file_upload' => '0',
@ -54,66 +56,11 @@ Redmine::Plugin.register :redmine_dmsf do
'dmsf_act_as_attachable' => false, 'dmsf_act_as_attachable' => false,
'dmsf_show_system_folders' => 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) # Uncomment to remove the original Documents from searching (replaced with DMSF)
# Redmine::Search.available_search_types.delete('documents') # 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 end
Redmine::Search.map do |search| unless Redmine::Plugin.installed?(:easy_extensions)
search.register :dmsf_files require_relative 'after_init'
search.register :dmsf_folders
end end

View File

@ -33,4 +33,4 @@ module RedmineDmsf
end end
end end
end end