Feature #38048 » 38048.patch
app/models/project.rb | ||
---|---|---|
823 | 823 |
'name', |
824 | 824 |
'description', |
825 | 825 |
'homepage', |
826 |
'is_public', |
|
827 | 826 |
'identifier', |
828 | 827 |
'custom_field_values', |
829 | 828 |
'custom_fields', |
... | ... | |
834 | 833 |
'default_issue_query_id', |
835 | 834 |
'default_assigned_to_id') |
836 | 835 | |
836 |
safe_attributes( |
|
837 |
'is_public', |
|
838 |
:if => |
|
839 |
lambda do |project, user| |
|
840 |
if project.new_record? |
|
841 |
if user.admin? |
|
842 |
true |
|
843 |
else |
|
844 |
default_member_role&.has_permission?(:select_project_publicity) |
|
845 |
end |
|
846 |
else |
|
847 |
user.allowed_to?(:select_project_publicity, project) |
|
848 |
end |
|
849 |
end |
|
850 |
) |
|
851 | ||
837 | 852 |
safe_attributes( |
838 | 853 |
'enabled_module_names', |
839 | 854 |
:if => |
app/views/projects/_form.html.erb | ||
---|---|---|
11 | 11 |
<% end %></p> |
12 | 12 |
<p><%= f.text_field :homepage, :size => 60 %></p> |
13 | 13 |
<p> |
14 |
<%= f.check_box :is_public %> |
|
14 |
<%= f.check_box :is_public, :disabled => !@project.safe_attribute?(:is_public) %>
|
|
15 | 15 |
<em class="info"><%= Setting.login_required? ? l(:text_project_is_public_non_member) : l(:text_project_is_public_anonymous) %></em> |
16 | 16 |
</p> |
17 | 17 |
config/locales/de.yml | ||
---|---|---|
957 | 957 |
permission_rename_wiki_pages: Wiki-Seiten umbenennen |
958 | 958 |
permission_save_queries: Filter speichern |
959 | 959 |
permission_select_project_modules: Projektmodule auswählen |
960 |
permission_select_project_publicity: Projekt als privat oder öffentlich markieren |
|
960 | 961 |
permission_set_issues_private: Tickets als privat oder öffentlich markieren |
961 | 962 |
permission_set_notes_private: Kommentar als privat markieren |
962 | 963 |
permission_set_own_issues_private: Eigene Tickets als privat oder öffentlich markieren |
config/locales/en.yml | ||
---|---|---|
522 | 522 |
permission_edit_project: Edit project |
523 | 523 |
permission_close_project: Close / reopen the project |
524 | 524 |
permission_delete_project: Delete the project |
525 |
permission_select_project_publicity: Set project public or private |
|
525 | 526 |
permission_select_project_modules: Select project modules |
526 | 527 |
permission_manage_members: Manage members |
527 | 528 |
permission_manage_project_activities: Manage project activities |
db/migrate/20221214173537_add_select_project_publicity_permission.rb | ||
---|---|---|
1 |
class AddSelectProjectPublicityPermission < ActiveRecord::Migration[5.2] |
|
2 |
def up |
|
3 |
Role.find_each do |r| |
|
4 |
r.add_permission!(:select_project_publicity) if r.permissions.include?(:edit_project) |
|
5 |
end |
|
6 |
end |
|
7 | ||
8 |
def down |
|
9 |
Role.find_each do |r| |
|
10 |
r.remove_permission!(:select_project_publicity) |
|
11 |
end |
|
12 |
end |
|
13 | ||
14 |
def run_in_request?; true end |
|
15 |
end |
lib/redmine/preparation.rb | ||
---|---|---|
39 | 39 |
map.permission :edit_project, {:projects => [:settings, :edit, :update]}, :require => :member |
40 | 40 |
map.permission :close_project, {:projects => [:close, :reopen]}, :require => :member, :read => true |
41 | 41 |
map.permission :delete_project, {:projects => :destroy}, :require => :member, :read => true |
42 |
map.permission :select_project_publicity, {}, :require => :member |
|
42 | 43 |
map.permission :select_project_modules, {:projects => :modules}, :require => :member |
43 | 44 |
map.permission :view_members, {:members => [:index, :show]}, :public => true, :read => true |
44 | 45 |
map.permission :manage_members, {:projects => :settings, :members => [:index, :show, :new, :create, :edit, :update, :destroy, :autocomplete]}, :require => :member |
test/fixtures/roles.yml | ||
---|---|---|
11 | 11 |
- :edit_project |
12 | 12 |
- :close_project |
13 | 13 |
- :delete_project |
14 |
- :select_project_publicity |
|
14 | 15 |
- :select_project_modules |
15 | 16 |
- :manage_members |
16 | 17 |
- :manage_versions |
... | ... | |
85 | 86 |
--- |
86 | 87 |
- :edit_project |
87 | 88 |
- :delete_project |
89 |
- :select_project_publicity |
|
88 | 90 |
- :manage_members |
89 | 91 |
- :manage_versions |
90 | 92 |
- :manage_categories |
... | ... | |
137 | 139 |
permissions: | |
138 | 140 |
--- |
139 | 141 |
- :edit_project |
142 |
- :select_project_publicity |
|
140 | 143 |
- :manage_members |
141 | 144 |
- :manage_versions |
142 | 145 |
- :manage_categories |
test/functional/projects_controller_test.rb | ||
---|---|---|
407 | 407 |
end |
408 | 408 |
end |
409 | 409 | |
410 |
def test_new_by_non_admin_should_enable_setting_public_if_default_role_is_allowed_to_set_public |
|
411 |
Role.non_member.add_permission!(:add_project) |
|
412 |
default_role = Role.generate!(permissions: [:add_project]) |
|
413 |
user = User.generate! |
|
414 |
@request.session[:user_id] = user.id |
|
415 | ||
416 |
with_settings new_project_user_role_id: default_role.id.to_s do |
|
417 |
get :new |
|
418 |
assert_select 'input[name=?][disabled=disabled]', 'project[is_public]' |
|
419 | ||
420 |
default_role.add_permission!(:select_project_publicity) |
|
421 |
get :new |
|
422 |
assert_select 'input[name=?]:not([disabled])', 'project[is_public]' |
|
423 |
end |
|
424 |
end |
|
425 | ||
410 | 426 |
def test_new_should_not_display_invalid_search_link |
411 | 427 |
@request.session[:user_id] = 1 |
412 | 428 | |
... | ... | |
504 | 520 |
:name => "blog", |
505 | 521 |
:description => "weblog", |
506 | 522 |
:identifier => "blog", |
507 |
:is_public => 1, |
|
508 | 523 |
:custom_field_values => { |
509 | 524 |
'3' => 'Beta' |
510 | 525 |
}, |
... | ... | |
518 | 533 |
project = Project.find_by_name('blog') |
519 | 534 |
assert_kind_of Project, project |
520 | 535 |
assert_equal 'weblog', project.description |
521 |
assert_equal true, project.is_public? |
|
522 | 536 |
assert_equal [1, 3], project.trackers.map(&:id).sort |
523 | 537 |
assert_equal ['issue_tracking', 'news', 'repository'], project.enabled_module_names.sort |
524 | 538 | |
... | ... | |
527 | 541 |
assert_equal 1, project.members.size |
528 | 542 |
end |
529 | 543 | |
544 |
test "#create by user without select_project_publicity permission should not create a new private project" do |
|
545 |
Role.non_member.add_permission! :add_project |
|
546 |
default_role = Project.default_member_role |
|
547 |
default_role.remove_permission!(:select_project_publicity) |
|
548 |
puts Setting.default_projects_public? |
|
549 |
@request.session[:user_id] = 9 |
|
550 | ||
551 |
post( |
|
552 |
:create, :params => { |
|
553 |
:project => { |
|
554 |
:name => "blog", |
|
555 |
:identifier => "blog", |
|
556 |
:enabled_module_names => ['issue_tracking', 'news', 'repository'], |
|
557 |
:is_public => 0 |
|
558 |
} |
|
559 |
} |
|
560 |
) |
|
561 | ||
562 |
project = Project.find_by_name('blog') |
|
563 |
assert_equal true, project.is_public? |
|
564 |
end |
|
565 | ||
566 |
test "#create by non-admin user with add_project and select_project_publicity permission should create a new private project" do |
|
567 |
@request.session[:user_id] = 2 |
|
568 | ||
569 |
post( |
|
570 |
:create, :params => { |
|
571 |
:project => { |
|
572 |
:name => "blog", |
|
573 |
:identifier => "blog", |
|
574 |
:enabled_module_names => ['issue_tracking', 'news', 'repository'], |
|
575 |
:is_public => 0 |
|
576 |
} |
|
577 |
} |
|
578 |
) |
|
579 | ||
580 |
project = Project.find_by_name('blog') |
|
581 |
assert_equal false, project.is_public? |
|
582 |
end |
|
583 | ||
530 | 584 |
test "#create by non-admin user with add_project permission should fail with parent_id" do |
531 | 585 |
Role.non_member.add_permission! :add_project |
532 | 586 |
User.find(9).update! :language => 'en' |