Cascading Settings
- GitLab 13.11에서 소개되었습니다.
계층 설정 프레임워크는 그룹이 조상(상위 그룹에서 그룹 계층 구조 상) 및 인스턴스 수준의 응용 프로그램 설정에서 설정 값을 핵심적으로 상속하고 그룹 계층 구조에서 하위 그룹에 대해 설정 값을 강제로 적용할 수 있도록 합니다.
계층 설정은 현재 NamespaceSetting
에서만 정의할 수 있지만 향후 프레임워크가 다른 객체로 확장될 수 있습니다.
새로운 계층 설정 추가
설정은 기본적으로 계층으로 정의되지 않습니다. 계층 설정을 정의하려면 다음 단계를 수행하세요:
-
NamespaceSetting
모델에서cascading_attr
도우미 메서드를 사용하여 새로운 속성을 정의하십시오. 여러 속성을 한 줄에 정의하려면 배열을 사용할 수 있습니다.class NamespaceSetting include CascadingNamespaceSettingAttribute cascading_attr :delayed_project_removal end
-
데이터베이스 열을 생성합니다.
완전히 새로운 설정을 위해 다음 데이터베이스 마이그레이션 도우미를 사용할 수 있습니다. 이 도우미는
namespace_settings
및application_settings
각각 두 개의 열을 생성합니다.class AddDelayedProjectRemovalCascadingSetting < Gitlab::Database::Migration[2.1] include Gitlab::Database::MigrationHelpers::CascadingNamespaceSettings def up add_cascading_namespace_setting :delayed_project_removal, :boolean, default: false, null: false end def down remove_cascading_namespace_setting :delayed_project_removal end end
기존 설정을 계층 설정으로 변환하려면 열을 추가하고 기존 열을 변경하는 개별 마이그레이션을 수행해야 합니다. 필요한 경우 아래 사양을 사용하여 마이그레이션을 생성하십시오:
-
namespace_settings
테이블의 열:-
delayed_project_removal
: 기본값 없음. 널 값 허용. 원하는 열 유형 사용. -
lock_delayed_project_removal
: 부울 열. 기본값은 false입니다. 널 값 허용되지 않음.
-
-
application_settings
테이블의 열:-
delayed_project_removal
:namespace_settings
에 생성된 열과 일치하는 유형. 원하는대로 기본값 설정. 널 값 허용되지 않음. -
lock_delayed_project_removal
: 부울 열. 기본값은 false입니다. 널 값 허용되지 않음.
-
-
편의 메서드
cascading_attr
메서드를 사용하여 속성을 정의하면 여러 편의 메서드가 자동으로 정의됩니다.
정의:
cascading_attr :delayed_project_removal
사용 가능한 편의 메서드:
delayed_project_removal
delayed_project_removal=
delayed_project_removal_locked?
delayed_project_removal_locked_by_ancestor?
delayed_project_removal_locked_by_application_setting?
-
delayed_project_removal?
(부울 속성 전용) -
delayed_project_removal_locked_ancestor
(잠긴 네임스페이스 설정 객체인[namespace_id]
를 반환)
속성 리더 메서드 (delayed_project_removal
)
속성 리더 메서드(delayed_project_removal
)는 다음 기준을 사용하여 올바른 계층 값 반환:
- 속성이 변경된 경우 변경된 값 반환. 이를 통해 표준 Rails 검증기를 사용할 수 있도록 하지만
nil
값은 반드시 허용되어야 합니다. - 잠긴 조상 값 반환.
- 잠긴 인스턴스 수준의 응용 프로그램 설정 값 반환.
- 네임스페이스의 속성이 nil이 아닌 경우 해당 네임스페이스의 값 반환.
- 값이 nil이 아닌 경우 가장 가까운 조상에서 값을 반환.
- 인스턴스 수준의 응용 프로그램 설정 반환.
_locked?
메서드
기본적으로 _locked?
메서드(delayed_project_removal_locked?
)는 그룹 또는 응용 프로그램 설정의 조상이 속성을 잠그면 true
를 반환합니다.
그룹에서 속성이 잠겨 있는 경우 false
을 반환합니다.
include_self: true
를 지정하면 예를 들어 프로젝트에서 속성이 잠겨 있는지 확인할 때 속성이 그룹에서 잠겨 있는 경우 true
가 반환됩니다.
프론트엔드에 계층 설정 표시
프론트엔드에 계층 설정을 표시하는 데 사용할 수 있는 몇 가지 Rails 뷰 도우미, HAML 부분 및 JavaScript 함수가 있습니다.
Rails 뷰 도우미
cascading_namespace_setting_locked?
설정이 잠겨 있는지 확인하려면 _locked?
메서드에 대한 호출을 통합니다.
인수 | 설명 | 유형 | 필수 (기본값) |
---|---|---|---|
attribute
| 설정 이름. 예: :delayed_project_removal .
|
String 또는 Symbol 경로
| true
|
group
| 현재 그룹 | Group
| true
|
**args
| 사용자 정의 인수 | false
|
HAML 부분
_enforcement_checkbox.html.haml
강제 체크박스를 렌더링합니다.
Local | Description | Type | Required (default value) |
---|---|---|---|
attribute
| 설정의 이름입니다. 예를 들어 :delayed_project_removal .
|
String or Symbol
| true
|
group
| 현재 그룹입니다. | Group
| true
|
form
| Rails FormBuilder object. | ActionView::Helpers::FormBuilder
| true
|
setting_locked
| 설정이 상위 그룹이나 관리자 설정에서 잠겨 있는지 여부입니다. cascading_namespace_setting_locked? 로 계산할 수 있습니다.
| Boolean
| true
|
help_text
| 체크박스 아래에 표시되는 텍스트입니다. | String
|
false (하위 그룹은 이 설정을 변경할 수 없습니다.)
|
_setting_label_checkbox.html.haml
체크박스 설정의 레이블을 렌더링합니다.
Local | Description | Type | Required (default value) |
---|---|---|---|
attribute
| 설정의 이름입니다. 예를 들어 :delayed_project_removal .
|
String or Symbol
| true
|
group
| 현재 그룹입니다. | Group
| true
|
form
| Rails FormBuilder object. | ActionView::Helpers::FormBuilder
| true
|
setting_locked
| 설정이 상위 그룹이나 관리자 설정에서 잠겨 있는지 여부입니다. cascading_namespace_setting_locked? 로 계산할 수 있습니다.
| Boolean
| true
|
settings_path_helper
| 조상 설정에 대한 경로를 생성하는 람다 함수입니다. 예를 들어, settings_path_helper: -> (locked_ancestor) { edit_group_path(locked_ancestor, anchor: 'js-permissions-settings') }
| Lambda
| true
|
help_text
| 체크박스 아래에 표시되는 텍스트입니다. | String
|
false (nil )
|
_setting_label_fieldset.html.haml
fieldset
설정의 레이블을 렌더링합니다.
Local | Description | Type | Required (default value) |
---|---|---|---|
attribute
| 설정의 이름입니다. 예를 들어 :delayed_project_removal .
|
String or Symbol
| true
|
group
| 현재 그룹입니다. | Group
| true
|
setting_locked
| 설정이 잠겨 있는지 여부입니다. cascading_namespace_setting_locked? 로 계산할 수 있습니다.
| Boolean
| true
|
settings_path_helper
| 조상 설정에 대한 경로를 생성하는 람다 함수입니다. 예를 들어, -> (locked_ancestor) { edit_group_path(locked_ancestor, anchor: 'js-permissions-settings') }
| Lambda
| true
|
help_text
| 체크박스 아래에 표시되는 텍스트입니다. | String
|
false (nil )
|
호버링하는 경우 팝오버를 표시하는 데 필요한 자바스크립트를 초기화하는 mount 요소를 렌더링합니다. 이 부분은 페이지당 한 번만 필요합니다.
JavaScript
initCascadingSettingsLockPopovers
POPOVER를 표시하는 데 필요한 JavaScript를 초기화합니다. 이때, lock 아이콘()에 호버할 때 이 팝오버가 표시됩니다.
이 함수는 페이지별 JavaScript에서 가져와서 호출해야 합니다.
모두 함께 넣기
-# app/views/groups/edit.html.haml
= render 'shared/namespaces/cascading_settings/lock_popovers'
- delayed_project_removal_locked = cascading_namespace_setting_locked?(:delayed_project_removal, @group)
- merge_method_locked = cascading_namespace_setting_locked?(:merge_method, @group)
= form_for @group do |f|
.form-group{ data: { testid: 'delayed-project-removal-form-group' } }
.gl-form-checkbox.custom-control.custom-checkbox
= f.check_box :delayed_project_removal, checked: @group.namespace_settings.delayed_project_removal?, disabled: delayed_project_removal_locked, class: 'custom-control-input'
= render 'shared/namespaces/cascading_settings/setting_label_checkbox', attribute: :delayed_project_removal,
group: @group,
form: f,
setting_locked: delayed_project_removal_locked,
settings_path_helper: -> (locked_ancestor) { edit_group_path(locked_ancestor, anchor: 'js-permissions-settings') },
help_text: s_('Settings|Projects will be permanently deleted after a 7-day delay. Inherited by subgroups.') do
= s_('Settings|Enable delayed project deletion')
= render 'shared/namespaces/cascading_settings/enforcement_checkbox',
attribute: :delayed_project_removal,
group: @group,
form: f,
setting_locked: delayed_project_removal_locked
%fieldset.form-group
= render 'shared/namespaces/cascading_settings/setting_label_fieldset', attribute: :merge_method,
group: @group,
setting_locked: merge_method_locked,
settings_path_helper: -> (locked_ancestor) { edit_group_path(locked_ancestor, anchor: 'js-permissions-settings') },
help_text: s_('Settings|Determine what happens to the commit history when you merge a merge request.') do
= s_('Settings|Merge method')
.gl-form-radio.custom-control.custom-radio
= f.gitlab_ui_radio_component :merge_method, :merge, s_('Settings|Merge commit'), help_text: s_('Settings|Every merge creates a merge commit.'), radio_options: { disabled: merge_method_locked }
.gl-form-radio.custom-control.custom-radio
= f.gitlab_ui_radio_component :merge_method, :rebase_merge, s_('Settings|Merge commit with semi-linear history'), help_text: s_('Settings|Every merge creates a merge commit.'), radio_options: { disabled: merge_method_locked }
.gl-form-radio.custom-control.custom-radio
= f.gitlab_ui_radio_component :merge_method, :ff, s_('Settings|Fast-forward merge'), help_text: s_('Settings|No merge commits are created.'), radio_options: { disabled: merge_method_locked }
= render 'shared/namespaces/cascading_settings/enforcement_checkbox',
attribute: :merge_method,
group: @group,
form: f,
setting_locked: merge_method_locked
// app/assets/javascripts/pages/groups/edit/index.js
import { initCascadingSettingsLockPopovers } from '~/namespaces/cascading_settings';
initCascadingSettingsLockPopovers();