Project

General

Profile

Feature #12704 » 12704_allow_selecting_subprojects_on_new_issue_page_17216.patch

Marius BĂLTEANU, 2018-02-26 22:33

View differences:

app/models/issue.rb
1514 1514
  end
1515 1515

  
1516 1516
  # Returns a scope of projects that user can assign the issue to
1517
  def allowed_target_projects(user=User.current)
1518
    current_project = new_record? ? nil : project
1517
  def allowed_target_projects(user=User.current, context=nil)
1518
    if new_record? && context.is_a?(Project) && !copy?
1519
      current_project = context.self_and_descendants
1520
    elsif new_record?
1521
      current_project = nil
1522
    else
1523
      current_project = project
1524
    end
1525

  
1519 1526
    self.class.allowed_target_projects(user, current_project)
1520 1527
  end
1521 1528

  
......
1523 1530
  # If current_project is given, it will be included in the scope
1524 1531
  def self.allowed_target_projects(user=User.current, current_project=nil)
1525 1532
    condition = Project.allowed_to_condition(user, :add_issues)
1526
    if current_project
1533
    if current_project.is_a?(Project)
1527 1534
      condition = ["(#{condition}) OR #{Project.table_name}.id = ?", current_project.id]
1535
    elsif current_project
1536
      condition = ["(#{condition}) AND #{Project.table_name}.id IN (?)", current_project.map(&:id)]
1528 1537
    end
1529 1538
    Project.where(condition).having_trackers
1530 1539
  end
app/views/issues/_form.html.erb
9 9
</p>
10 10
<% end %>
11 11

  
12
<% if (@issue.safe_attribute?('project_id') || @issue.project_id_changed?) && (!@issue.new_record? || @project.nil? || @issue.copy?) %>
13
<p><%= f.select :project_id, project_tree_options_for_select(@issue.allowed_target_projects, :selected => @issue.project), {:required => true},
12
<% projects = @issue.allowed_target_projects(User.current, @project) %>
13
<% if (@issue.safe_attribute?('project_id') || @issue.project_id_changed?) && (@project.nil? || projects.length > 1 || @issue.copy?) %>
14
<p><%= f.select :project_id, project_tree_options_for_select(projects, :selected => @issue.project), {:required => true},
14 15
                :onchange => "updateIssueFrom('#{escape_javascript update_issue_form_path(@project, @issue)}', this)" %></p>
15 16
<% end %>
16 17

  
test/functional/issues_controller_test.rb
2302 2302
    assert_select 'form#issue-form[action=?]', '/projects/ecookbook/issues'
2303 2303
    assert_select 'form#issue-form' do
2304 2304
      assert_select 'input[name=?]', 'issue[is_private]'
2305
      assert_select 'select[name=?]', 'issue[project_id]', 0
2305
      assert_select 'select[name=?]', 'issue[project_id]'
2306 2306
      assert_select 'select[name=?]', 'issue[tracker_id]'
2307 2307
      assert_select 'input[name=?]', 'issue[subject]'
2308 2308
      assert_select 'textarea[name=?]', 'issue[description]'
......
2326 2326
    end
2327 2327
  end
2328 2328

  
2329
  def test_get_new_should_show_project_selector_for_project_with_subprojects
2330
    @request.session[:user_id] = 2
2331
    get :new, :params => {
2332
        :project_id => 1,
2333
        :tracker_id => 1
2334
      }
2335
    assert_response :success
2336

  
2337
    assert_select 'select[name="issue[project_id]"]' do
2338
      assert_select 'option', 3
2339
      assert_select 'option[selected=selected]', :text => 'eCookbook'
2340
      assert_select 'option[value=?]', '5', :text => '  » Private child of eCookbook'
2341
      assert_select 'option[value=?]', '3', :text => '  » eCookbook Subproject 1'
2342

  
2343
      # user_id 2 is not allowed to add issues on project_id 4 (it's not a member)
2344
      assert_select 'option[value=?]', '4', 0
2345
    end
2346
  end
2347

  
2348
  def test_get_new_should_not_show_project_selector_for_project_without_subprojects
2349
    @request.session[:user_id] = 2
2350
    get :new, :params => {
2351
        :project_id => 2,
2352
        :tracker_id => 1
2353
      }
2354
    assert_response :success
2355

  
2356
    assert_select 'select[name="issue[project_id]"]', 0
2357
  end
2358

  
2329 2359
  def test_get_new_with_minimal_permissions
2330 2360
    Role.find(1).update_attribute :permissions, [:add_issues]
2331 2361
    WorkflowTransition.where(:role_id => 1).delete_all
......
2339 2369

  
2340 2370
    assert_select 'form#issue-form' do
2341 2371
      assert_select 'input[name=?]', 'issue[is_private]', 0
2342
      assert_select 'select[name=?]', 'issue[project_id]', 0
2372
      assert_select 'select[name=?]', 'issue[project_id]'
2343 2373
      assert_select 'select[name=?]', 'issue[tracker_id]'
2344 2374
      assert_select 'input[name=?]', 'issue[subject]'
2345 2375
      assert_select 'textarea[name=?]', 'issue[description]'
(6-6/6)