Displaying folder permissions from parent folders
This commit is contained in:
parent
c6f711ff7d
commit
958abb6714
@ -195,7 +195,6 @@ class DmsfController < ApplicationController
|
|||||||
@parent = @folder.dmsf_folder
|
@parent = @folder.dmsf_folder
|
||||||
@pathfolder = copy_folder(@folder)
|
@pathfolder = copy_folder(@folder)
|
||||||
@force_file_unlock_allowed = User.current.allowed_to?(:force_file_unlock, @project)
|
@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
|
end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
|
|||||||
@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
class DmsfFolderPermissionsController < ApplicationController
|
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 :find_project
|
||||||
before_action :authorize
|
before_action :authorize
|
||||||
before_action :permissions
|
before_action :permissions
|
||||||
@ -49,7 +49,10 @@ class DmsfFolderPermissionsController < ApplicationController
|
|||||||
private
|
private
|
||||||
|
|
||||||
def users_for_new_users
|
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
|
end
|
||||||
|
|
||||||
def find_project
|
def find_project
|
||||||
|
|||||||
@ -1,15 +1,35 @@
|
|||||||
|
# encoding: utf-8
|
||||||
|
#
|
||||||
|
# Redmine plugin for Document Management System "Features"
|
||||||
|
#
|
||||||
|
# Copyright © 2011 Vít Jonáš <vit.jonas@gmail.com>
|
||||||
|
# Copyright © 2011-18 Karel Pičman <karel.picman@kontron.com>
|
||||||
|
#
|
||||||
|
# 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
|
module DmsfFolderPermissionsHelper
|
||||||
|
|
||||||
def users_checkboxes(users)
|
def users_checkboxes(users)
|
||||||
s = ''
|
s = ''
|
||||||
if users
|
users.each do |user|
|
||||||
users.each do |user|
|
user = [user, false] unless user.is_a?(Array)
|
||||||
content = check_box_tag('permissions[user_ids][]', user.id, true, :id => nil) + user.name
|
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.id}", :class => 'inline')
|
s << content_tag(:label, content, id: "user_permission_ids_#{user[0].id}", class: 'inline')
|
||||||
end
|
end
|
||||||
end
|
s.html_safe
|
||||||
s.html_safe
|
end
|
||||||
end
|
|
||||||
|
|
||||||
def render_principals_for_new_folder_permissions(users)
|
def render_principals_for_new_folder_permissions(users)
|
||||||
principals_check_box_tags 'user_ids[]', users
|
principals_check_box_tags 'user_ids[]', users
|
||||||
|
|||||||
@ -543,8 +543,41 @@ class DmsfFolder < ActiveRecord::Base
|
|||||||
title.gsub(/[#{INVALID_CHARACTERS}]/, '.').gsub(/\.{2,}/, '.').chomp('.')
|
title.gsub(/[#{INVALID_CHARACTERS}]/, '.').gsub(/\.{2,}/, '.').chomp('.')
|
||||||
end
|
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
|
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)
|
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 = DmsfFolder.where(project_id: folder.project_id, dmsf_folder_id: folder.id).notsystem.visible(false).to_a
|
||||||
folders.delete(current_folder)
|
folders.delete(current_folder)
|
||||||
|
|||||||
@ -77,12 +77,16 @@
|
|||||||
<p>
|
<p>
|
||||||
<%= label_tag '', l(:label_permissions) %>
|
<%= label_tag '', l(:label_permissions) %>
|
||||||
<% User.current.managed_roles(@project).each do |role| %>
|
<% 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) %>
|
||||||
<label class="inline"><%= check_box_tag 'permissions[role_ids][]', role.id, checked, :id => nil %> <%= role %></label>
|
<label class="inline">
|
||||||
|
<%= check_box_tag 'permissions[role_ids][]', role.id, checked, disabled: disabled, id: nil %>
|
||||||
|
<%= role %>
|
||||||
|
</label>
|
||||||
<% end %>
|
<% end %>
|
||||||
<span id="user_permissions">
|
<span id="user_permissions">
|
||||||
<br/>
|
<br/>
|
||||||
<% checkboxes = users_checkboxes(@users) %>
|
<% users = @folder.permissions_users %>
|
||||||
|
<% checkboxes = users_checkboxes(users) %>
|
||||||
<%= checkboxes %>
|
<%= checkboxes %>
|
||||||
</span>
|
</span>
|
||||||
<% if checkboxes.present? %>
|
<% if checkboxes.present? %>
|
||||||
|
|||||||
@ -22,22 +22,20 @@
|
|||||||
|
|
||||||
<h3 class="title"><%= l(:label_user_search) %></h3>
|
<h3 class="title"><%= l(:label_user_search) %></h3>
|
||||||
|
|
||||||
<%= form_tag(append_dmsf_folder_permissions_path,
|
<%= form_tag(append_dmsf_folder_permissions_path, remote: true, method: :post, id: 'new-user-form') do %>
|
||||||
:remote => true,
|
|
||||||
:method => :post,
|
|
||||||
:id => 'new-user-form') do %>
|
|
||||||
<%= hidden_field_tag :project_id, @project.id %>
|
<%= hidden_field_tag :project_id, @project.id %>
|
||||||
|
|
||||||
<p><%= label_tag 'user_search', l(:label_user_search) %><%= text_field_tag 'user_search', nil %></p>
|
<p><%= label_tag 'user_search', l(:label_user_search) %><%= text_field_tag 'user_search', nil %></p>
|
||||||
<%= late_javascript_tag "observeSearchfield('user_search', 'users_for_users', '#{ escape_javascript url_for(
|
<%= 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) }')" %>
|
||||||
|
|
||||||
<div id="users_for_watcher">
|
<div id="users_for_watcher">
|
||||||
<%= render_principals_for_new_folder_permissions(@principals) %>
|
<%= render_principals_for_new_folder_permissions(@principals) %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p class="buttons">
|
<p class="buttons">
|
||||||
<%= submit_tag l(:button_add), :name => nil, :onclick => "hideModal(this);" %>
|
<%= 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_cancel), name: nil, onclick: 'hideModal(this);', type: 'button' %>
|
||||||
</p>
|
</p>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@ -46,20 +46,22 @@ class DmsfFolderPermissionsControllerTest < RedmineDmsf::Test::TestCase
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_new
|
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_response :success
|
||||||
assert_template 'new'
|
assert_template 'new'
|
||||||
assert_equal 'text/javascript', response.content_type
|
assert_equal 'text/javascript', response.content_type
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_autocomplete_for_user
|
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_response :success
|
||||||
assert_include 'John Smith', response.body
|
assert_include 'John Smith', response.body
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_append
|
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_response :success
|
||||||
assert_template 'new'
|
assert_template 'new'
|
||||||
assert_equal 'text/javascript', response.content_type
|
assert_equal 'text/javascript', response.content_type
|
||||||
|
|||||||
@ -22,7 +22,8 @@
|
|||||||
require File.expand_path('../../test_helper', __FILE__)
|
require File.expand_path('../../test_helper', __FILE__)
|
||||||
|
|
||||||
class DmsfFolderTest < RedmineDmsf::Test::UnitTest
|
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
|
def setup
|
||||||
@project = Project.find 1
|
@project = Project.find 1
|
||||||
@ -35,8 +36,8 @@ class DmsfFolderTest < RedmineDmsf::Test::UnitTest
|
|||||||
@folder7 = DmsfFolder.find 7
|
@folder7 = DmsfFolder.find 7
|
||||||
@manager = User.find 2
|
@manager = User.find 2
|
||||||
@developer = User.find 3
|
@developer = User.find 3
|
||||||
manager_role = Role.find 1
|
@manager_role = Role.find 1
|
||||||
manager_role.add_permission! :view_dmsf_folders
|
@manager_role.add_permission! :view_dmsf_folders
|
||||||
developer_role = Role.find 2
|
developer_role = Role.find 2
|
||||||
developer_role.add_permission! :view_dmsf_folders
|
developer_role.add_permission! :view_dmsf_folders
|
||||||
User.current = @manager
|
User.current = @manager
|
||||||
@ -52,6 +53,7 @@ class DmsfFolderTest < RedmineDmsf::Test::UnitTest
|
|||||||
assert_kind_of Project, @project
|
assert_kind_of Project, @project
|
||||||
assert_kind_of User, @manager
|
assert_kind_of User, @manager
|
||||||
assert_kind_of User, @developer
|
assert_kind_of User, @developer
|
||||||
|
assert_kind_of Role, @manager_role
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_visiblity
|
def test_visiblity
|
||||||
@ -188,4 +190,17 @@ class DmsfFolderTest < RedmineDmsf::Test::UnitTest
|
|||||||
assert_equal 'test', DmsfFolder::get_valid_title("test#{DmsfFolder::INVALID_CHARACTERS}")
|
assert_equal 'test', DmsfFolder::get_valid_title("test#{DmsfFolder::INVALID_CHARACTERS}")
|
||||||
end
|
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
|
end
|
||||||
Loading…
x
Reference in New Issue
Block a user