diff --git a/doc/user/admin_area/settings/visibility_and_access_controls.md b/doc/user/admin_area/settings/visibility_and_access_controls.md index 361a14be75c7a2f34a31de6d83ad17b7658e31dc..118d375da010d962cad88369eade2607c19b8482 100644 --- a/doc/user/admin_area/settings/visibility_and_access_controls.md +++ b/doc/user/admin_area/settings/visibility_and_access_controls.md @@ -53,6 +53,7 @@ By default both administrators and anyone with the **Owner** role can delete a p > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/255449) in GitLab 14.2 for groups created after August 12, 2021. > - [Renamed](https://gitlab.com/gitlab-org/gitlab/-/issues/352960) from default delayed project deletion in GitLab 15.1. > - [Enabled for projects in personal namespaces](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/89466) in GitLab 15.1. +> - [Disabled for projects in personal namespaces](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/95495) in GitLab 15.3. Instance-level protection against accidental deletion of groups and projects. diff --git a/doc/user/project/settings/index.md b/doc/user/project/settings/index.md index 5a3a7e13205e5f5ccdf3e2a968d9a01f0bb3bcd8..b973a0f56d182329eac9af8a02c70cef8d9f85cf 100644 --- a/doc/user/project/settings/index.md +++ b/doc/user/project/settings/index.md @@ -447,9 +447,10 @@ in GitLab 12.6, and then to [immediate deletion](https://gitlab.com/gitlab-org/g ### Delayed project deletion **(PREMIUM)** -> [Enabled for projects in personal namespaces](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/89466) in GitLab 15.1. +> - [Enabled for projects in personal namespaces](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/89466) in GitLab 15.1. +> - [Disabled for projects in personal namespaces](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/95495) in GitLab 15.3. -Projects can be deleted after a delay period. Multiple settings can affect whether +Projects in a group (not a personal namespace) can be deleted after a delay period. Multiple settings can affect whether delayed project deletion is enabled for a particular project: - Self-managed instance [settings](../../admin_area/settings/visibility_and_access_controls.md#delayed-project-deletion). diff --git a/ee/app/models/ee/project.rb b/ee/app/models/ee/project.rb index 5464757b9c9564c97b1cfb27f1a65d92a18d5c34..8a2266983ff2076dc6ff722410732fd382d45ddb 100644 --- a/ee/app/models/ee/project.rb +++ b/ee/app/models/ee/project.rb @@ -137,7 +137,7 @@ def lock_for_confirmation!(id) scope :verification_failed_wikis, -> { joins(:repository_state).merge(ProjectRepositoryState.verification_failed_wikis) } scope :for_plan_name, -> (name) { joins(namespace: { gitlab_subscription: :hosted_plan }).where(plans: { name: name }) } scope :with_feature_available, -> (name) do - projects_with_feature_available_in_plan = ::Project.in_namespace(::Namespace.with_feature_available_in_plan(name)) + projects_with_feature_available_in_plan = ::Project.for_group(::Group.with_feature_available_in_plan(name)) public_projects_in_public_groups = ::Project.public_only.for_group(::Group.public_only) from_union([projects_with_feature_available_in_plan, public_projects_in_public_groups]) end @@ -983,16 +983,11 @@ def requirements_ci_variables end end - # Return the group's setting for delayed deletion + # Return the group's setting for delayed deletion, false for user namespace projects def group_deletion_mode_configured? - if group&.namespace_settings - group.namespace_settings.delayed_project_removal? - elsif namespace&.namespace_settings - # for projects under user namespace - namespace.namespace_settings.delayed_project_removal? - else - false - end + return false unless group&.namespace_settings + + group.namespace_settings.delayed_project_removal? end # If the project is inside a fork network, the mirror URL must diff --git a/ee/spec/controllers/projects_controller_spec.rb b/ee/spec/controllers/projects_controller_spec.rb index 7247c72eb21eaac525ee5dedd998408ce6a805c3..e6d0173d592f41938cc2b240f2d9d06706e6ffd8 100644 --- a/ee/spec/controllers/projects_controller_spec.rb +++ b/ee/spec/controllers/projects_controller_spec.rb @@ -788,23 +788,7 @@ context 'for projects in user namespace' do let(:project) { create(:project, namespace: user.namespace) } - context 'when feature is enabled at instance level' do - before do - stub_application_setting(deletion_adjourned_period: 7) - stub_application_setting(delayed_project_removal: true) - end - - it_behaves_like 'marks project for deletion' - end - - context 'when feature is not enabled at instance level' do - before do - stub_application_setting(deletion_adjourned_period: 0) - stub_application_setting(delayed_project_removal: false) - end - - it_behaves_like 'deletes project right away' - end + it_behaves_like 'deletes project right away' end end diff --git a/ee/spec/factories/namespaces/user_namespaces.rb b/ee/spec/factories/namespaces/user_namespaces.rb deleted file mode 100644 index a0e4a9234073941f9828e5cb420167a7e97ef6af..0000000000000000000000000000000000000000 --- a/ee/spec/factories/namespaces/user_namespaces.rb +++ /dev/null @@ -1,24 +0,0 @@ -# frozen_string_literal: true - -FactoryBot.modify do - factory :user_namespace do - trait :user_namespace_with_plan do - transient do - plan { :free_plan } - trial_ends_on { nil } - end - - after(:create) do |user_namespace, evaluator| - if evaluator.plan - create(:namespace_settings, namespace: user_namespace) - - create(:gitlab_subscription, - namespace: user_namespace, - hosted_plan: create(evaluator.plan), - trial: evaluator.trial_ends_on.present?, - trial_ends_on: evaluator.trial_ends_on) - end - end - end - end -end diff --git a/ee/spec/models/project_spec.rb b/ee/spec/models/project_spec.rb index 11a7383fc466c78b6922ad5a6e688964208a5c90..025b60315a53d46dbab8eb7f61f932c169e1eb4d 100644 --- a/ee/spec/models/project_spec.rb +++ b/ee/spec/models/project_spec.rb @@ -455,13 +455,9 @@ premium_project = create(:project, :archived, creator: user, namespace: premium_group) no_plan_project = create(:project, :archived, creator: user, namespace: no_plan_group) no_plan_public_project = create(:project, :archived, creator: user, visibility: ::Gitlab::VisibilityLevel::PUBLIC, namespace: no_plan_group) - free_user_namespace = create(:user_namespace, :user_namespace_with_plan, plan: :free_plan) - ultimate_user_namespace = create(:user_namespace, :user_namespace_with_plan, plan: :ultimate_plan) - free_personal_project = create(:project, :archived, creator: user, namespace: free_user_namespace) - ultimate_personal_project = create(:project, :archived, creator: user, namespace: ultimate_user_namespace) - expect(described_class.with_feature_available(:adjourned_deletion_for_projects_and_groups)).to contain_exactly(premium_project, ultimate_project, no_plan_public_project, ultimate_personal_project) - expect(described_class.with_feature_available(:adjourned_deletion_for_projects_and_groups)).not_to include(no_plan_project, free_personal_project) + expect(described_class.with_feature_available(:adjourned_deletion_for_projects_and_groups)).to contain_exactly(premium_project, ultimate_project, no_plan_public_project) + expect(described_class.with_feature_available(:adjourned_deletion_for_projects_and_groups)).not_to include(no_plan_project) end end end