Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
1c87faa0
Commit
1c87faa0
authored
Aug 26, 2021
by
GitLab Bot
Browse files
Options
Browse Files
Download
Plain Diff
Automatic merge of gitlab-org/gitlab master
parents
94e23a37
93901366
Changes
21
Hide whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
239 additions
and
8 deletions
+239
-8
app/assets/javascripts/pages/groups/new/index.js
app/assets/javascripts/pages/groups/new/index.js
+3
-0
app/assets/javascripts/pages/groups/new/toggle_invite_members.js
...ets/javascripts/pages/groups/new/toggle_invite_members.js
+14
-0
app/controllers/groups_controller.rb
app/controllers/groups_controller.rb
+13
-2
app/helpers/groups_helper.rb
app/helpers/groups_helper.rb
+12
-0
app/models/group.rb
app/models/group.rb
+1
-1
app/models/namespace_setting.rb
app/models/namespace_setting.rb
+4
-1
app/views/groups/_new_group_fields.html.haml
app/views/groups/_new_group_fields.html.haml
+4
-1
app/views/groups/_personalize.html.haml
app/views/groups/_personalize.html.haml
+27
-0
db/migrate/20210819162047_add_columns_to_namespace_settings.rb
...grate/20210819162047_add_columns_to_namespace_settings.rb
+21
-0
db/schema_migrations/20210819162047
db/schema_migrations/20210819162047
+1
-0
db/structure.sql
db/structure.sql
+2
-0
doc/user/group/index.md
doc/user/group/index.md
+4
-0
ee/app/controllers/groups/analytics/coverage_reports_controller.rb
...ntrollers/groups/analytics/coverage_reports_controller.rb
+1
-1
ee/app/controllers/groups/analytics/repository_analytics_controller.rb
...llers/groups/analytics/repository_analytics_controller.rb
+0
-1
ee/app/policies/ee/group_policy.rb
ee/app/policies/ee/group_policy.rb
+7
-0
ee/spec/controllers/groups/analytics/coverage_reports_controller_spec.rb
...lers/groups/analytics/coverage_reports_controller_spec.rb
+5
-1
ee/spec/features/groups/new_spec.rb
ee/spec/features/groups/new_spec.rb
+23
-0
ee/spec/policies/group_policy_spec.rb
ee/spec/policies/group_policy_spec.rb
+28
-0
locale/gitlab.pot
locale/gitlab.pot
+12
-0
spec/controllers/groups_controller_spec.rb
spec/controllers/groups_controller_spec.rb
+51
-0
spec/helpers/groups_helper_spec.rb
spec/helpers/groups_helper_spec.rb
+6
-0
No files found.
app/assets/javascripts/pages/groups/new/index.js
View file @
1c87faa0
...
...
@@ -5,6 +5,7 @@ import Group from '~/group';
import
{
parseBoolean
}
from
'
~/lib/utils/common_utils
'
;
import
NewGroupCreationApp
from
'
./components/app.vue
'
;
import
GroupPathValidator
from
'
./group_path_validator
'
;
import
initToggleInviteMembers
from
'
./toggle_invite_members
'
;
new
GroupPathValidator
();
// eslint-disable-line no-new
...
...
@@ -31,3 +32,5 @@ function initNewGroupCreation(el) {
const
el
=
document
.
querySelector
(
'
.js-new-group-creation
'
);
initNewGroupCreation
(
el
);
initToggleInviteMembers
();
app/assets/javascripts/pages/groups/new/toggle_invite_members.js
0 → 100644
View file @
1c87faa0
import
{
parseBoolean
}
from
'
~/lib/utils/common_utils
'
;
export
default
function
initToggleInviteMembers
()
{
const
inviteMembersSection
=
document
.
querySelector
(
'
.js-invite-members-section
'
);
const
setupForCompanyRadios
=
document
.
querySelectorAll
(
'
input[name="group[setup_for_company]"]
'
);
if
(
inviteMembersSection
&&
setupForCompanyRadios
.
length
)
{
setupForCompanyRadios
.
forEach
((
el
)
=>
{
el
.
addEventListener
(
'
change
'
,
(
event
)
=>
{
inviteMembersSection
.
classList
.
toggle
(
'
hidden
'
,
!
parseBoolean
(
event
.
target
.
value
));
});
});
}
}
app/controllers/groups_controller.rb
View file @
1c87faa0
...
...
@@ -64,6 +64,7 @@ class GroupsController < Groups::ApplicationController
def
new
@group
=
Group
.
new
(
params
.
permit
(
:parent_id
))
@group
.
build_namespace_settings
end
def
create
...
...
@@ -269,7 +270,9 @@ class GroupsController < Groups::ApplicationController
:default_branch_name
,
:allow_mfa_for_subgroups
,
:resource_access_token_creation_allowed
,
:prevent_sharing_groups_outside_hierarchy
:prevent_sharing_groups_outside_hierarchy
,
:setup_for_company
,
:jobs_to_be_done
]
end
...
...
@@ -342,7 +345,15 @@ class GroupsController < Groups::ApplicationController
render
action:
'new'
end
def
successful_creation_hooks
;
end
def
successful_creation_hooks
update_user_role_and_setup_for_company
end
def
update_user_role_and_setup_for_company
user_params
=
params
.
fetch
(
:user
,
{}).
permit
(
:role
)
user_params
[
:setup_for_company
]
=
@group
.
setup_for_company
if
!
@group
.
setup_for_company
.
nil?
&&
current_user
.
setup_for_company
.
nil?
Users
::
UpdateService
.
new
(
current_user
,
user_params
.
merge
(
user:
current_user
)).
execute
if
user_params
.
present?
end
def
groups
if
@group
.
supports_events?
...
...
app/helpers/groups_helper.rb
View file @
1c87faa0
...
...
@@ -219,6 +219,18 @@ module GroupsHelper
def
group_url_error_message
s_
(
'GroupSettings|Please choose a group URL with no special characters or spaces.'
)
end
# Maps `jobs_to_be_done` values to option texts
def
localized_jobs_to_be_done_choices
{
basics:
_
(
'I want to learn the basics of Git'
),
move_repository:
_
(
'I want to move my repository to GitLab from somewhere else'
),
code_storage:
_
(
'I want to store my code'
),
exploring:
_
(
'I want to explore GitLab to see if it’s worth switching to'
),
ci:
_
(
'I want to use GitLab CI with my existing repository'
),
other:
_
(
'A different reason'
)
}.
with_indifferent_access
.
freeze
end
end
GroupsHelper
.
prepend_mod_with
(
'GroupsHelper'
)
app/models/group.rb
View file @
1c87faa0
...
...
@@ -81,7 +81,7 @@ class Group < Namespace
# debian_distributions and associated component_files must be destroyed by ruby code in order to properly remove carrierwave uploads
has_many
:debian_distributions
,
class_name:
'Packages::Debian::GroupDistribution'
,
dependent: :destroy
# rubocop:disable Cop/ActiveRecordDependent
delegate
:prevent_sharing_groups_outside_hierarchy
,
:new_user_signups_cap
,
to: :namespace_settings
delegate
:prevent_sharing_groups_outside_hierarchy
,
:new_user_signups_cap
,
:setup_for_company
,
:jobs_to_be_done
,
to: :namespace_settings
accepts_nested_attributes_for
:variables
,
allow_destroy:
true
...
...
app/models/namespace_setting.rb
View file @
1c87faa0
...
...
@@ -16,9 +16,12 @@ class NamespaceSetting < ApplicationRecord
before_validation
:normalize_default_branch_name
enum
jobs_to_be_done:
{
basics:
0
,
move_repository:
1
,
code_storage:
2
,
exploring:
3
,
ci:
4
,
other:
5
},
_suffix:
true
NAMESPACE_SETTINGS_PARAMS
=
[
:default_branch_name
,
:delayed_project_removal
,
:lock_delayed_project_removal
,
:resource_access_token_creation_allowed
,
:prevent_sharing_groups_outside_hierarchy
,
:new_user_signups_cap
].
freeze
:prevent_sharing_groups_outside_hierarchy
,
:new_user_signups_cap
,
:setup_for_company
,
:jobs_to_be_done
].
freeze
self
.
primary_key
=
:namespace_id
...
...
app/views/groups/_new_group_fields.html.haml
View file @
1c87faa0
...
...
@@ -13,7 +13,10 @@
-
if
Gitlab
.
config
.
mattermost
.
enabled
.row
=
render
'create_chat_team'
,
f:
f
.row
=
render
'personalize'
,
f:
f
.row.js-invite-members-section
.col-sm-4
=
render_if_exists
'shared/groups/invite_members'
...
...
app/views/groups/_personalize.html.haml
0 → 100644
View file @
1c87faa0
.row
.form-group.col-sm-12.gl-mb-0
%label
.label-bold
=
_
(
'Now, personalize your GitLab experience'
)
%p
=
_
(
"We'll use this to help surface the right features and information to you."
)
.row
.form-group.col-sm-4
=
label
:user
,
:role
,
_
(
'Role'
)
=
select
:user
,
:role
,
::
User
.
roles
.
keys
.
map
{
|
role
|
[
role
.
titleize
,
role
]
},
{
selected:
@current_user
.
role
},
class:
'form-control'
.row
.form-group.col-sm-4
=
f
.
label
:setup_for_company
,
_
(
'Who will be using this group?'
)
.gl-display-flex.gl-flex-direction-column.gl-lg-flex-direction-row
.gl-flex-grow-1.gl-display-flex.gl-align-items-center
=
f
.
radio_button
:setup_for_company
,
true
,
checked:
true
=
f
.
label
:setup_for_company
,
_
(
'My company or team'
),
class:
'gl-font-weight-normal gl-mb-0 gl-ml-2'
,
value:
'true'
.gl-flex-grow-1.gl-display-flex.gl-align-items-center
=
f
.
radio_button
:setup_for_company
,
false
=
f
.
label
:setup_for_company
,
_
(
'Just me'
),
class:
'gl-font-weight-normal gl-mb-0 gl-ml-2'
,
value:
'false'
.row
.form-group.col-sm-4
=
f
.
label
:jobs_to_be_done
,
_
(
"What will you use this group for?"
)
=
f
.
select
:jobs_to_be_done
,
::
NamespaceSetting
.
jobs_to_be_dones
.
keys
.
map
{
|
job_to_be_done
|
[
localized_jobs_to_be_done_choices
[
job_to_be_done
],
job_to_be_done
]
},
{
include_blank:
true
},
class:
'form-control'
db/migrate/20210819162047_add_columns_to_namespace_settings.rb
0 → 100644
View file @
1c87faa0
# frozen_string_literal: true
class
AddColumnsToNamespaceSettings
<
ActiveRecord
::
Migration
[
6.1
]
include
Gitlab
::
Database
::
MigrationHelpers
disable_ddl_transaction!
def
up
with_lock_retries
do
add_column
:namespace_settings
,
:setup_for_company
,
:boolean
add_column
:namespace_settings
,
:jobs_to_be_done
,
:smallint
end
end
def
down
with_lock_retries
do
remove_column
:namespace_settings
,
:setup_for_company
remove_column
:namespace_settings
,
:jobs_to_be_done
end
end
end
db/schema_migrations/20210819162047
0 → 100644
View file @
1c87faa0
5a02c5a24bb4c7cb63da2e5cc53ff89461f328d0092bb4bb6589223dc4bdae8c
\ No newline at end of file
db/structure.sql
View file @
1c87faa0
...
...
@@ -15344,6 +15344,8 @@ CREATE TABLE namespace_settings (
lock_delayed_project_removal boolean DEFAULT false NOT NULL,
prevent_sharing_groups_outside_hierarchy boolean DEFAULT false NOT NULL,
new_user_signups_cap integer,
setup_for_company boolean,
jobs_to_be_done smallint,
CONSTRAINT check_0ba93c78c7 CHECK ((char_length(default_branch_name) <= 255))
);
doc/user/group/index.md
View file @
1c87faa0
...
...
@@ -82,6 +82,10 @@ To create a group:
-
Underscores
-
Dashes and dots (it cannot start with dashes or end in a dot)
1.
Choose the
[
visibility level
](
../../public_access/public_access.md
)
.
1.
Personalize your GitLab experience by answering the following questions:
-
What is your role?
-
Who will be using this group?
-
What will you use this group for?
1.
Invite GitLab members or other users to join the group.
<i
class=
"fa fa-youtube-play youtube"
aria-hidden=
"true"
></i>
...
...
ee/app/controllers/groups/analytics/coverage_reports_controller.rb
View file @
1c87faa0
...
...
@@ -6,7 +6,7 @@ class Groups::Analytics::CoverageReportsController < Groups::Analytics::Applicat
COVERAGE_PARAM
=
'coverage'
before_action
:load_group
before_action
->
{
check_feature_availability!
(
:
group_coverage_reports
)
}
before_action
->
{
authorize_view_by_action!
(
:read_
group_coverage_reports
)
}
def
index
respond_to
do
|
format
|
...
...
ee/app/controllers/groups/analytics/repository_analytics_controller.rb
View file @
1c87faa0
...
...
@@ -4,7 +4,6 @@ class Groups::Analytics::RepositoryAnalyticsController < Groups::Analytics::Appl
layout
'group'
before_action
:load_group
before_action
->
{
check_feature_availability!
(
:group_repository_analytics
)
}
before_action
->
{
authorize_view_by_action!
(
:read_group_repository_analytics
)
}
before_action
only:
[
:show
]
do
push_frontend_feature_flag
(
:usage_data_i_testing_group_code_coverage_visit_total
,
@group
,
default_enabled: :yaml
)
...
...
ee/app/policies/ee/group_policy.rb
View file @
1c87faa0
...
...
@@ -33,6 +33,10 @@ module EE
@subject
.
feature_available?
(
:group_repository_analytics
)
end
condition
(
:group_coverage_reports_available
)
do
@subject
.
feature_available?
(
:group_coverage_reports
)
end
condition
(
:group_activity_analytics_available
)
do
@subject
.
feature_available?
(
:group_activity_analytics
)
end
...
...
@@ -180,6 +184,9 @@ module EE
rule
{
reporter
&
group_repository_analytics_available
}
.
enable
:read_group_repository_analytics
rule
{
reporter
&
group_coverage_reports_available
}
.
enable
:read_group_coverage_reports
rule
{
reporter
&
group_merge_request_analytics_available
}
.
enable
:read_group_merge_request_analytics
...
...
ee/spec/controllers/groups/analytics/coverage_reports_controller_spec.rb
View file @
1c87faa0
...
...
@@ -26,6 +26,10 @@ RSpec.describe Groups::Analytics::CoverageReportsController do
end
context
'without permissions'
do
before
do
group
.
add_guest
(
user
)
end
describe
'GET index'
do
it
'responds 403'
do
get
:index
,
params:
valid_request_params
...
...
@@ -37,7 +41,7 @@ RSpec.describe Groups::Analytics::CoverageReportsController do
context
'with permissions'
do
before
do
group
.
add_
own
er
(
user
)
group
.
add_
report
er
(
user
)
end
context
'without a license'
do
...
...
ee/spec/features/groups/new_spec.rb
0 → 100644
View file @
1c87faa0
# frozen_string_literal: true
require
'spec_helper'
RSpec
.
describe
'New Group page'
do
describe
'toggling the invite members section'
,
:js
do
before
do
sign_in
(
create
(
:user
))
visit
new_group_path
click_link
'Create group'
end
describe
'when selecting options from the "Who will be using this group?" question'
do
it
'toggles the invite members section'
do
expect
(
page
).
to
have_content
(
'Invite Members'
)
choose
'Just me'
expect
(
page
).
not_to
have_content
(
'Invite Members'
)
choose
'My company or team'
expect
(
page
).
to
have_content
(
'Invite Members'
)
end
end
end
end
ee/spec/policies/group_policy_spec.rb
View file @
1c87faa0
...
...
@@ -322,6 +322,34 @@ RSpec.describe GroupPolicy do
it
{
is_expected
.
not_to
be_allowed
(
:read_group_repository_analytics
)
}
end
context
'when group coverage reports is available'
do
before
do
stub_licensed_features
(
group_coverage_reports:
true
)
end
context
'for guests'
do
let
(
:current_user
)
{
guest
}
it
{
is_expected
.
not_to
be_allowed
(
:read_group_coverage_reports
)
}
end
context
'for reporter+'
do
let
(
:current_user
)
{
reporter
}
it
{
is_expected
.
to
be_allowed
(
:read_group_coverage_reports
)
}
end
end
context
'when group coverage reports is not available'
do
let
(
:current_user
)
{
maintainer
}
before
do
stub_licensed_features
(
group_coverage_reports:
false
)
end
it
{
is_expected
.
not_to
be_allowed
(
:read_group_coverage_reports
)
}
end
describe
'per group SAML'
do
def
stub_group_saml_config
(
enabled
)
allow
(
::
Gitlab
::
Auth
::
GroupSaml
::
Config
).
to
receive_messages
(
enabled?:
enabled
)
...
...
locale/gitlab.pot
View file @
1c87faa0
...
...
@@ -23071,6 +23071,9 @@ msgstr ""
msgid "Novice"
msgstr ""
msgid "Now, personalize your GitLab experience"
msgstr ""
msgid "Nuget metadatum must have at least license_url, project_url or icon_url set"
msgstr ""
...
...
@@ -37346,6 +37349,9 @@ msgstr ""
msgid "We'll continuously validate your pipeline configuration. The validation results will appear here."
msgstr ""
msgid "We'll use this to help surface the right features and information to you."
msgstr ""
msgid "We've found no vulnerabilities"
msgstr ""
...
...
@@ -37601,6 +37607,9 @@ msgstr ""
msgid "What is your job title? (optional)"
msgstr ""
msgid "What will you use this group for?"
msgstr ""
msgid "What's new"
msgstr ""
...
...
@@ -37660,6 +37669,9 @@ msgstr ""
msgid "Who will be using this GitLab trial?"
msgstr ""
msgid "Who will be using this group?"
msgstr ""
msgid "Why are you signing up? (Optional)"
msgstr ""
...
...
spec/controllers/groups_controller_spec.rb
View file @
1c87faa0
...
...
@@ -370,6 +370,57 @@ RSpec.describe GroupsController, factory_default: :keep do
end
end
end
context
'when creating a group with the `role` attribute present'
do
it
'changes the users role'
do
sign_in
(
user
)
expect
do
post
:create
,
params:
{
group:
{
name:
'new_group'
,
path:
'new_group'
},
user:
{
role:
'devops_engineer'
}
}
end
.
to
change
{
user
.
reload
.
role
}.
to
(
'devops_engineer'
)
end
end
context
'when creating a group with the `setup_for_company` attribute present'
do
before
do
sign_in
(
user
)
end
subject
do
post
:create
,
params:
{
group:
{
name:
'new_group'
,
path:
'new_group'
,
setup_for_company:
'false'
}
}
end
it
'sets the groups `setup_for_company` value'
do
subject
expect
(
Group
.
last
.
setup_for_company
).
to
be
(
false
)
end
context
'when the user already has a value for `setup_for_company`'
do
before
do
user
.
update_attribute
(
:setup_for_company
,
true
)
end
it
'does not change the users `setup_for_company` value'
do
expect
(
Users
::
UpdateService
).
not_to
receive
(
:new
)
expect
{
subject
}.
not_to
change
{
user
.
reload
.
setup_for_company
}.
from
(
true
)
end
end
context
'when the user has no value for `setup_for_company`'
do
it
'changes the users `setup_for_company` value'
do
expect
(
Users
::
UpdateService
).
to
receive
(
:new
).
and_call_original
expect
{
subject
}.
to
change
{
user
.
reload
.
setup_for_company
}.
to
(
false
)
end
end
end
context
'when creating a group with the `jobs_to_be_done` attribute present'
do
it
'sets the groups `jobs_to_be_done` value'
do
sign_in
(
user
)
post
:create
,
params:
{
group:
{
name:
'new_group'
,
path:
'new_group'
,
jobs_to_be_done:
'other'
}
}
expect
(
Group
.
last
.
jobs_to_be_done
).
to
eq
(
'other'
)
end
end
end
describe
'GET #index'
do
...
...
spec/helpers/groups_helper_spec.rb
View file @
1c87faa0
...
...
@@ -486,4 +486,10 @@ RSpec.describe GroupsHelper do
expect
(
helper
.
can_admin_group_member?
(
group
)).
to
be
(
false
)
end
end
describe
'#localized_jobs_to_be_done_choices'
do
it
'has a translation for all `jobs_to_be_done` values'
do
expect
(
localized_jobs_to_be_done_choices
.
keys
).
to
match_array
(
NamespaceSetting
.
jobs_to_be_dones
.
keys
)
end
end
end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment