##// END OF EJS Templates
Support for named route in project menu and a new :permission option (#6426)....
Jean-Philippe Lang -
r13383:64fea07affaf
parent child
Show More
@@ -178,7 +178,11 module Redmine
178 when Hash
178 when Hash
179 project.nil? ? item.url : {item.param => project}.merge(item.url)
179 project.nil? ? item.url : {item.param => project}.merge(item.url)
180 when Symbol
180 when Symbol
181 send(item.url)
181 if project
182 send(item.url, project)
183 else
184 send(item.url)
185 end
182 else
186 else
183 item.url
187 item.url
184 end
188 end
@@ -376,9 +380,9 module Redmine
376
380
377 class MenuItem < MenuNode
381 class MenuItem < MenuNode
378 include Redmine::I18n
382 include Redmine::I18n
379 attr_reader :name, :url, :param, :condition, :parent, :child_menus, :last
383 attr_reader :name, :url, :param, :condition, :parent, :child_menus, :last, :permission
380
384
381 def initialize(name, url, options)
385 def initialize(name, url, options={})
382 raise ArgumentError, "Invalid option :if for menu item '#{name}'" if options[:if] && !options[:if].respond_to?(:call)
386 raise ArgumentError, "Invalid option :if for menu item '#{name}'" if options[:if] && !options[:if].respond_to?(:call)
383 raise ArgumentError, "Invalid option :html for menu item '#{name}'" if options[:html] && !options[:html].is_a?(Hash)
387 raise ArgumentError, "Invalid option :html for menu item '#{name}'" if options[:html] && !options[:html].is_a?(Hash)
384 raise ArgumentError, "Cannot set the :parent to be the same as this item" if options[:parent] == name.to_sym
388 raise ArgumentError, "Cannot set the :parent to be the same as this item" if options[:parent] == name.to_sym
@@ -386,6 +390,8 module Redmine
386 @name = name
390 @name = name
387 @url = url
391 @url = url
388 @condition = options[:if]
392 @condition = options[:if]
393 @permission = options[:permission]
394 @permission ||= false if options.key?(:permission)
389 @param = options[:param] || :id
395 @param = options[:param] || :id
390 @caption = options[:caption]
396 @caption = options[:caption]
391 @html_options = options[:html] || {}
397 @html_options = options[:html] || {}
@@ -423,11 +429,19 module Redmine
423
429
424 # Checks if a user is allowed to access the menu item by:
430 # Checks if a user is allowed to access the menu item by:
425 #
431 #
426 # * Checking the url target (project only)
432 # * Checking the permission or the url target (project only)
427 # * Checking the conditions of the item
433 # * Checking the conditions of the item
428 def allowed?(user, project)
434 def allowed?(user, project)
429 if url.is_a?(Hash) && project && user && !user.allowed_to?(url, project)
435 if user && project
430 return false
436 if permission
437 unless user.allowed_to?(permission, project)
438 return false
439 end
440 elsif permission.nil? && url.is_a?(Hash)
441 unless user.allowed_to?(url, project)
442 return false
443 end
444 end
431 end
445 end
432 if condition && !condition.call(project)
446 if condition && !condition.call(project)
433 # Condition that doesn't pass
447 # Condition that doesn't pass
@@ -47,6 +47,20 class Redmine::MenuManager::MenuHelperTest < ActionView::TestCase
47 end
47 end
48 end
48 end
49
49
50 def test_render_menu_node_with_symbol_as_url
51 node = Redmine::MenuManager::MenuItem.new(:testing, :issues_path)
52 @output_buffer = render_menu_node(node, nil)
53
54 assert_select "a[href=/issues]", "Testing"
55 end
56
57 def test_render_menu_node_with_symbol_as_url_and_project
58 node = Redmine::MenuManager::MenuItem.new(:testing, :project_issues_path)
59 @output_buffer = render_menu_node(node, Project.find(1))
60
61 assert_select "a[href=/projects/ecookbook/issues]", "Testing"
62 end
63
50 def test_render_menu_node_with_nested_items
64 def test_render_menu_node_with_nested_items
51 parent_node = Redmine::MenuManager::MenuItem.new(:parent_node, '/test', { })
65 parent_node = Redmine::MenuManager::MenuItem.new(:parent_node, '/test', { })
52 parent_node << Redmine::MenuManager::MenuItem.new(:child_one_node, '/test', { })
66 parent_node << Redmine::MenuManager::MenuItem.new(:child_one_node, '/test', { })
@@ -216,6 +230,19 class Redmine::MenuManager::MenuHelperTest < ActionView::TestCase
216 assert_equal 2, items.size
230 assert_equal 2, items.size
217 end
231 end
218
232
233 def test_menu_items_for_should_skip_items_that_fail_the_permission
234 menu_name = :test_menu_items_for_should_skip_items_that_fail_the_permission
235 Redmine::MenuManager.map menu_name do |menu|
236 menu.push(:a_menu, :project_issues_path)
237 menu.push(:unallowed, :project_issues_path, :permission => :unallowed)
238 end
239
240 User.current = User.find(2)
241
242 items = menu_items_for(menu_name, Project.find(1))
243 assert_equal 1, items.size
244 end
245
219 def test_menu_items_for_should_skip_items_that_fail_the_conditions
246 def test_menu_items_for_should_skip_items_that_fail_the_conditions
220 menu_name = :test_menu_items_for_should_skip_items_that_fail_the_conditions
247 menu_name = :test_menu_items_for_should_skip_items_that_fail_the_conditions
221 Redmine::MenuManager.map menu_name do |menu|
248 Redmine::MenuManager.map menu_name do |menu|
@@ -46,12 +46,6 class Redmine::MenuManager::MenuItemTest < ActiveSupport::TestCase
46 end
46 end
47 end
47 end
48
48
49 def test_new_menu_item_should_require_the_options
50 assert_raises ArgumentError do
51 Redmine::MenuManager::MenuItem.new(:test_missing_options, '/test')
52 end
53 end
54
55 def test_new_menu_item_with_all_required_parameters
49 def test_new_menu_item_with_all_required_parameters
56 assert Redmine::MenuManager::MenuItem.new(:test_good_menu, '/test', {})
50 assert Redmine::MenuManager::MenuItem.new(:test_good_menu, '/test', {})
57 end
51 end
General Comments 0
You need to be logged in to leave comments. Login now