diff --git a/app/controllers/dmsf_controller.rb b/app/controllers/dmsf_controller.rb index c1a39b61..985333c5 100644 --- a/app/controllers/dmsf_controller.rb +++ b/app/controllers/dmsf_controller.rb @@ -195,7 +195,6 @@ class DmsfController < ApplicationController @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 diff --git a/app/controllers/dmsf_folder_permissions_controller.rb b/app/controllers/dmsf_folder_permissions_controller.rb index 8d58d61f..47c5f1ea 100644 --- a/app/controllers/dmsf_folder_permissions_controller.rb +++ b/app/controllers/dmsf_folder_permissions_controller.rb @@ -20,7 +20,7 @@ class DmsfFolderPermissionsController < ApplicationController - before_action :find_folder, :only => [:destroy] + before_action :find_folder, only: [:destroy, :new, :autocomplete_for_user] before_action :find_project before_action :authorize before_action :permissions @@ -49,7 +49,10 @@ class DmsfFolderPermissionsController < ApplicationController private def users_for_new_users - Principal.active.visible.member_of(@project).like(params[:q]).order(:type, :lastname).to_a + users = @dmsf_folder.permissions_users + ids = users.collect{ |u| u[0].id } + Principal.active.visible.member_of(@project).like(params[:q]).where(['id NOT IN (?)', ids.join(',')]).order( + :type, :lastname).to_a end def find_project diff --git a/app/helpers/dmsf_folder_permissions_helper.rb b/app/helpers/dmsf_folder_permissions_helper.rb index 8ada6ed6..597bd39c 100644 --- a/app/helpers/dmsf_folder_permissions_helper.rb +++ b/app/helpers/dmsf_folder_permissions_helper.rb @@ -1,15 +1,35 @@ +# encoding: utf-8 +# +# Redmine plugin for Document Management System "Features" +# +# Copyright © 2011 Vít Jonáš +# Copyright © 2011-18 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 DmsfFolderPermissionsHelper def users_checkboxes(users) s = '' - if users - users.each do |user| - content = check_box_tag('permissions[user_ids][]', user.id, true, :id => nil) + user.name - s << content_tag(:label, content, :id => "user_permission_ids_#{user.id}", :class => 'inline') - end - end - s.html_safe - end + users.each do |user| + user = [user, false] unless user.is_a?(Array) + content = check_box_tag('permissions[user_ids][]', user[0].id, true, disabled: user[1], id: nil) + user[0].name + s << content_tag(:label, content, id: "user_permission_ids_#{user[0].id}", class: 'inline') + end + s.html_safe + end def render_principals_for_new_folder_permissions(users) principals_check_box_tags 'user_ids[]', users diff --git a/app/models/dmsf_folder.rb b/app/models/dmsf_folder.rb index 8d217888..196fc73d 100644 --- a/app/models/dmsf_folder.rb +++ b/app/models/dmsf_folder.rb @@ -543,8 +543,41 @@ class DmsfFolder < ActiveRecord::Base title.gsub(/[#{INVALID_CHARACTERS}]/, '.').gsub(/\.{2,}/, '.').chomp('.') end + def permission_for_role(role) + options = Hash.new + options[:checked] = false + options[:disabled] = false + permission_for_role_recursive(self, role, options) + options[:disabled] = false unless options[:checked] + options.values + end + + def permissions_users + users = Array.new + permissions_users_recursive(self, users, false) + users + end + private + def permission_for_role_recursive(folder, role, options) + options[:checked] = folder.dmsf_folder_permissions.roles.exists?(object_id: role.id) + if !options[:checked] && folder.dmsf_folder && !folder.dmsf_folder.deleted? + options[:disabled] = true + permission_for_role_recursive(folder.dmsf_folder, role, options) + end + end + + def permissions_users_recursive(folder, users, disabled) + if folder + usrs = Principal.active.where(id: folder.dmsf_folder_permissions.users.map{ |p| p.object_id }) + usrs.each do |u| + users << [u, disabled] + end + permissions_users_recursive(folder.dmsf_folder, users, true) + end + end + def self.directory_subtree(tree, folder, level, current_folder) folders = DmsfFolder.where(project_id: folder.project_id, dmsf_folder_id: folder.id).notsystem.visible(false).to_a folders.delete(current_folder) diff --git a/app/views/dmsf/edit.html.erb b/app/views/dmsf/edit.html.erb index 023b8e58..7e69ff70 100644 --- a/app/views/dmsf/edit.html.erb +++ b/app/views/dmsf/edit.html.erb @@ -77,12 +77,16 @@

<%= label_tag '', l(:label_permissions) %> <% User.current.managed_roles(@project).each do |role| %> - <% checked = @folder.dmsf_folder_permissions.roles.exists?(object_id: role.id) %> - + <% checked, disabled = @folder.permission_for_role(role) %> + <% end %>
- <% checkboxes = users_checkboxes(@users) %> + <% users = @folder.permissions_users %> + <% checkboxes = users_checkboxes(users) %> <%= checkboxes %>
<% if checkboxes.present? %> diff --git a/app/views/dmsf_folder_permissions/_new.html.erb b/app/views/dmsf_folder_permissions/_new.html.erb index dc639fc7..c0388254 100644 --- a/app/views/dmsf_folder_permissions/_new.html.erb +++ b/app/views/dmsf_folder_permissions/_new.html.erb @@ -22,22 +22,20 @@

<%= l(:label_user_search) %>

-<%= form_tag(append_dmsf_folder_permissions_path, - :remote => true, - :method => :post, - :id => 'new-user-form') do %> +<%= form_tag(append_dmsf_folder_permissions_path, remote: true, method: :post, id: 'new-user-form') do %> <%= hidden_field_tag :project_id, @project.id %>

<%= label_tag 'user_search', l(:label_user_search) %><%= text_field_tag 'user_search', nil %>

<%= late_javascript_tag "observeSearchfield('user_search', 'users_for_users', '#{ escape_javascript url_for( - :controller => 'dmsf_folder_permissions', :action => 'autocomplete_for_user', :project_id => @project) }')" %> + controller: 'dmsf_folder_permissions', action: 'autocomplete_for_user', project_id: @project, + dmsf_folder_id: @dmsf_folder) }')" %>
<%= render_principals_for_new_folder_permissions(@principals) %>

- <%= submit_tag l(:button_add), :name => nil, :onclick => "hideModal(this);" %> - <%= submit_tag l(:button_cancel), :name => nil, :onclick => "hideModal(this);", :type => 'button' %> + <%= submit_tag l(:button_add), name: nil, onclick: 'hideModal(this);' %> + <%= submit_tag l(:button_cancel), name: nil, onclick: 'hideModal(this);', type: 'button' %>

<% end %> diff --git a/test/functional/dmsf_folder_permissions_controller_test.rb b/test/functional/dmsf_folder_permissions_controller_test.rb index 6cd8a8d1..b53ef286 100644 --- a/test/functional/dmsf_folder_permissions_controller_test.rb +++ b/test/functional/dmsf_folder_permissions_controller_test.rb @@ -46,20 +46,22 @@ class DmsfFolderPermissionsControllerTest < RedmineDmsf::Test::TestCase end def test_new - get :new, :params => {:project_id => @project1, :format => 'js'}, :xhr => true + get :new, params: { project_id: @project1, dmsf_folder_id: @folder7, format: 'js'}, xhr: true assert_response :success assert_template 'new' assert_equal 'text/javascript', response.content_type end def test_autocomplete_for_user - get :autocomplete_for_user, :params => {:project_id => @project1, :q => 'smi', :format => 'js'}, :xhr => true + get :autocomplete_for_user, params: { project_id: @project1, dmsf_folder_id: @folder7, q: 'smi', format: 'js'}, + xhr: true assert_response :success assert_include 'John Smith', response.body end def test_append - get :new, :params => {:project_id => @project1, :user_ids => [@manager.id], :format => 'js'}, :xhr => true + get :new, params: { project_id: @project1, dmsf_folder_id: @folder7, user_ids: [@manager.id], format: 'js'}, + xhr: true assert_response :success assert_template 'new' assert_equal 'text/javascript', response.content_type diff --git a/test/unit/dmsf_folder_test.rb b/test/unit/dmsf_folder_test.rb index 0f363612..0765c06d 100644 --- a/test/unit/dmsf_folder_test.rb +++ b/test/unit/dmsf_folder_test.rb @@ -22,7 +22,8 @@ require File.expand_path('../../test_helper', __FILE__) class DmsfFolderTest < RedmineDmsf::Test::UnitTest - fixtures :projects, :users, :email_addresses, :dmsf_folders, :roles, :members, :member_roles, :dmsf_folder_permissions + fixtures :projects, :users, :email_addresses, :dmsf_folders, :roles, :members, :member_roles, + :dmsf_folder_permissions def setup @project = Project.find 1 @@ -35,8 +36,8 @@ class DmsfFolderTest < RedmineDmsf::Test::UnitTest @folder7 = DmsfFolder.find 7 @manager = User.find 2 @developer = User.find 3 - manager_role = Role.find 1 - manager_role.add_permission! :view_dmsf_folders + @manager_role = Role.find 1 + @manager_role.add_permission! :view_dmsf_folders developer_role = Role.find 2 developer_role.add_permission! :view_dmsf_folders User.current = @manager @@ -52,6 +53,7 @@ class DmsfFolderTest < RedmineDmsf::Test::UnitTest assert_kind_of Project, @project assert_kind_of User, @manager assert_kind_of User, @developer + assert_kind_of Role, @manager_role end def test_visiblity @@ -188,4 +190,17 @@ class DmsfFolderTest < RedmineDmsf::Test::UnitTest assert_equal 'test', DmsfFolder::get_valid_title("test#{DmsfFolder::INVALID_CHARACTERS}") end + def test_permission_for_role + checked, disabled = @folder7.permission_for_role(@manager_role) + assert checked + assert !disabled + end + + def test_permissions_users + users = @folder7.permissions_users + assert users.any? + assert users[0] + assert !users[1] + end + end \ No newline at end of file