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