diff options
Diffstat (limited to 'app/presenters')
24 files changed, 177 insertions, 64 deletions
diff --git a/app/presenters/alert_management/alert_presenter.rb b/app/presenters/alert_management/alert_presenter.rb index 1cebf5c561a..c6c6fe837a0 100644 --- a/app/presenters/alert_management/alert_presenter.rb +++ b/app/presenters/alert_management/alert_presenter.rb @@ -112,3 +112,5 @@ module AlertManagement end end end + +AlertManagement::AlertPresenter.prepend_mod_with('AlertManagement::AlertPresenter') diff --git a/app/presenters/blob_presenter.rb b/app/presenters/blob_presenter.rb index cff935d51b5..56dd056b9bc 100644 --- a/app/presenters/blob_presenter.rb +++ b/app/presenters/blob_presenter.rb @@ -1,6 +1,12 @@ # frozen_string_literal: true class BlobPresenter < Gitlab::View::Presenter::Delegated + include ApplicationHelper + include BlobHelper + include DiffHelper + include TreeHelper + include ChecksCollaboration + presents :blob def highlight(to: nil, plain: nil) @@ -14,16 +20,68 @@ class BlobPresenter < Gitlab::View::Presenter::Delegated ) end + def plain_data + return if blob.binary? + + highlight(plain: false) + end + def web_url - Gitlab::Routing.url_helpers.project_blob_url(blob.repository.project, File.join(blob.commit_id, blob.path)) + url_helpers.project_blob_url(project, ref_qualified_path) end def web_path - Gitlab::Routing.url_helpers.project_blob_path(blob.repository.project, File.join(blob.commit_id, blob.path)) + url_helpers.project_blob_path(project, ref_qualified_path) + end + + def edit_blob_path + url_helpers.project_edit_blob_path(project, ref_qualified_path) + end + + def raw_path + url_helpers.project_raw_path(project, ref_qualified_path) + end + + def replace_path + url_helpers.project_create_blob_path(project, ref_qualified_path) + end + + def fork_and_edit_path + fork_path_for_current_user(project, edit_blob_path) + end + + def ide_fork_and_edit_path + fork_path_for_current_user(project, ide_edit_path) + end + + def can_modify_blob? + super(blob, project, blob.commit_id) + end + + def ide_edit_path + super(project, blob.commit_id, blob.path) + end + + def external_storage_url + return unless static_objects_external_storage_enabled? + + external_storage_url_or_path(url_helpers.project_raw_url(project, ref_qualified_path)) end private + def url_helpers + Gitlab::Routing.url_helpers + end + + def project + blob.repository.project + end + + def ref_qualified_path + File.join(blob.commit_id, blob.path) + end + def load_all_blob_data blob.load_all_data! if blob.respond_to?(:load_all_data!) end diff --git a/app/presenters/ci/build_presenter.rb b/app/presenters/ci/build_presenter.rb index 51a81158f78..384cb3285fc 100644 --- a/app/presenters/ci/build_presenter.rb +++ b/app/presenters/ci/build_presenter.rb @@ -51,4 +51,4 @@ module Ci end end -Ci::BuildPresenter.prepend_if_ee('EE::Ci::BuildPresenter') +Ci::BuildPresenter.prepend_mod_with('Ci::BuildPresenter') diff --git a/app/presenters/ci/build_runner_presenter.rb b/app/presenters/ci/build_runner_presenter.rb index 6978bc46475..5b233ad89ec 100644 --- a/app/presenters/ci/build_runner_presenter.rb +++ b/app/presenters/ci/build_runner_presenter.rb @@ -138,4 +138,4 @@ module Ci end end -Ci::BuildRunnerPresenter.prepend_if_ee('EE::Ci::BuildRunnerPresenter') +Ci::BuildRunnerPresenter.prepend_mod_with('Ci::BuildRunnerPresenter') diff --git a/app/presenters/ci/pipeline_artifacts/code_quality_mr_diff_presenter.rb b/app/presenters/ci/pipeline_artifacts/code_quality_mr_diff_presenter.rb index 2fe3104fe69..d28b4523fd5 100644 --- a/app/presenters/ci/pipeline_artifacts/code_quality_mr_diff_presenter.rb +++ b/app/presenters/ci/pipeline_artifacts/code_quality_mr_diff_presenter.rb @@ -5,18 +5,20 @@ module Ci class CodeQualityMrDiffPresenter < Gitlab::View::Presenter::Delegated include Gitlab::Utils::StrongMemoize - def for_files(filenames) - quality_files = raw_report["files"].select { |key| filenames.include?(key) } + def for_files(merge_request) + filenames = merge_request.new_paths + mr_diff_report = raw_report(merge_request.id) + quality_files = mr_diff_report["files"]&.select { |key| filenames.include?(key) } { files: quality_files } end private - def raw_report + def raw_report(merge_request_id) strong_memoize(:raw_report) do self.each_blob do |blob| - Gitlab::Json.parse(blob).with_indifferent_access + Gitlab::Json.parse(blob).with_indifferent_access.fetch("merge_request_#{merge_request_id}", {}) end end end diff --git a/app/presenters/ci/pipeline_presenter.rb b/app/presenters/ci/pipeline_presenter.rb index a2cdabb912f..82f00f74692 100644 --- a/app/presenters/ci/pipeline_presenter.rb +++ b/app/presenters/ci/pipeline_presenter.rb @@ -8,15 +8,16 @@ module Ci # We use a class method here instead of a constant, allowing EE to redefine # the returned `Hash` more easily. def self.failure_reasons - { unknown_failure: 'Unknown pipeline failure!', - config_error: 'CI/CD YAML configuration error!', - external_validation_failure: 'External pipeline validation failed!', - activity_limit_exceeded: 'Pipeline activity limit exceeded!', - size_limit_exceeded: 'Pipeline size limit exceeded!', - job_activity_limit_exceeded: 'Pipeline job activity limit exceeded!', - deployments_limit_exceeded: 'Pipeline deployments limit exceeded!', - project_deleted: 'The associated project was deleted', - user_blocked: 'The user who created this pipeline is blocked' } + { unknown_failure: 'The reason for the pipeline failure is unknown.', + config_error: 'The pipeline failed due to an error on the CI/CD configuration file.', + external_validation_failure: 'The external pipeline validation failed.', + user_not_verified: 'The pipeline failed due to the user not being verified', + activity_limit_exceeded: 'The pipeline activity limit was exceeded.', + size_limit_exceeded: 'The pipeline size limit was exceeded.', + job_activity_limit_exceeded: 'The pipeline job activity limit was exceeded.', + deployments_limit_exceeded: 'The pipeline deployments limit was exceeded.', + project_deleted: 'The project associated with this pipeline was deleted.', + user_blocked: 'The user who created this pipeline is blocked.' } end presents :pipeline @@ -163,4 +164,4 @@ module Ci end end -Ci::PipelinePresenter.prepend_if_ee('EE::Ci::PipelinePresenter') +Ci::PipelinePresenter.prepend_mod_with('Ci::PipelinePresenter') diff --git a/app/presenters/clusterable_presenter.rb b/app/presenters/clusterable_presenter.rb index 62488465c24..a316793dae9 100644 --- a/app/presenters/clusterable_presenter.rb +++ b/app/presenters/clusterable_presenter.rb @@ -86,4 +86,4 @@ class ClusterablePresenter < Gitlab::View::Presenter::Delegated end end -ClusterablePresenter.prepend_if_ee('EE::ClusterablePresenter') +ClusterablePresenter.prepend_mod_with('ClusterablePresenter') diff --git a/app/presenters/clusters/cluster_presenter.rb b/app/presenters/clusters/cluster_presenter.rb index 038fc752255..eb4bd8532af 100644 --- a/app/presenters/clusters/cluster_presenter.rb +++ b/app/presenters/clusters/cluster_presenter.rb @@ -76,7 +76,7 @@ module Clusters def gitlab_managed_apps_logs_path return unless logs_project && can_read_cluster? - if cluster.application_elastic_stack&.available? + if cluster.elastic_stack_adapter&.available? elasticsearch_project_logs_path(logs_project, cluster_id: cluster.id, format: :json) else k8s_project_logs_path(logs_project, cluster_id: cluster.id, format: :json) @@ -144,4 +144,4 @@ module Clusters end end -Clusters::ClusterPresenter.prepend_if_ee('EE::Clusters::ClusterPresenter') +Clusters::ClusterPresenter.prepend_mod_with('Clusters::ClusterPresenter') diff --git a/app/presenters/commit_status_presenter.rb b/app/presenters/commit_status_presenter.rb index c8d3457b04a..8ef6e2b7962 100644 --- a/app/presenters/commit_status_presenter.rb +++ b/app/presenters/commit_status_presenter.rb @@ -15,6 +15,7 @@ class CommitStatusPresenter < Gitlab::View::Presenter::Delegated scheduler_failure: 'The scheduler failed to assign job to the runner, please try again or contact system administrator', data_integrity_failure: 'There has been a structural integrity problem detected, please contact system administrator', forward_deployment_failure: 'The deployment job is older than the previously succeeded deployment job, and therefore cannot be run', + pipeline_loop_detected: 'This job could not be executed because it would create infinitely looping pipelines', invalid_bridge_trigger: 'This job could not be executed because downstream pipeline trigger definition is invalid', downstream_bridge_project_not_found: 'This job could not be executed because downstream bridge project could not be found', insufficient_bridge_permissions: 'This job could not be executed because of insufficient permissions to create a downstream pipeline', @@ -23,7 +24,8 @@ class CommitStatusPresenter < Gitlab::View::Presenter::Delegated secrets_provider_not_found: 'The secrets provider can not be found', reached_max_descendant_pipelines_depth: 'You reached the maximum depth of child pipelines', project_deleted: 'The job belongs to a deleted project', - user_blocked: 'The user who created this job is blocked' + user_blocked: 'The user who created this job is blocked', + ci_quota_exceeded: 'No more CI minutes available' }.freeze private_constant :CALLOUT_FAILURE_MESSAGES @@ -39,4 +41,4 @@ class CommitStatusPresenter < Gitlab::View::Presenter::Delegated end end -CommitStatusPresenter.prepend_if_ee('::EE::CommitStatusPresenter') +CommitStatusPresenter.prepend_mod_with('CommitStatusPresenter') diff --git a/app/presenters/group_clusterable_presenter.rb b/app/presenters/group_clusterable_presenter.rb index dfe8e315f94..adbe20517be 100644 --- a/app/presenters/group_clusterable_presenter.rb +++ b/app/presenters/group_clusterable_presenter.rb @@ -49,4 +49,4 @@ class GroupClusterablePresenter < ClusterablePresenter end end -GroupClusterablePresenter.prepend_if_ee('EE::GroupClusterablePresenter') +GroupClusterablePresenter.prepend_mod_with('GroupClusterablePresenter') diff --git a/app/presenters/group_member_presenter.rb b/app/presenters/group_member_presenter.rb index df51f1eb075..5ab4b51f472 100644 --- a/app/presenters/group_member_presenter.rb +++ b/app/presenters/group_member_presenter.rb @@ -16,4 +16,4 @@ class GroupMemberPresenter < MemberPresenter end end -GroupMemberPresenter.prepend_if_ee('EE::GroupMemberPresenter') +GroupMemberPresenter.prepend_mod_with('GroupMemberPresenter') diff --git a/app/presenters/instance_clusterable_presenter.rb b/app/presenters/instance_clusterable_presenter.rb index 94c1195ed6a..84b3328b37f 100644 --- a/app/presenters/instance_clusterable_presenter.rb +++ b/app/presenters/instance_clusterable_presenter.rb @@ -87,4 +87,4 @@ class InstanceClusterablePresenter < ClusterablePresenter end end -InstanceClusterablePresenter.prepend_if_ee('EE::InstanceClusterablePresenter') +InstanceClusterablePresenter.prepend_mod_with('InstanceClusterablePresenter') diff --git a/app/presenters/issue_presenter.rb b/app/presenters/issue_presenter.rb index 76bf3bf4577..b7f4ac0555d 100644 --- a/app/presenters/issue_presenter.rb +++ b/app/presenters/issue_presenter.rb @@ -16,4 +16,4 @@ class IssuePresenter < Gitlab::View::Presenter::Delegated end end -IssuePresenter.prepend_if_ee('EE::IssuePresenter') +IssuePresenter.prepend_mod_with('IssuePresenter') diff --git a/app/presenters/label_presenter.rb b/app/presenters/label_presenter.rb index c23d6ce2218..9e51e6fa4ba 100644 --- a/app/presenters/label_presenter.rb +++ b/app/presenters/label_presenter.rb @@ -51,4 +51,4 @@ class LabelPresenter < Gitlab::View::Presenter::Delegated end end -LabelPresenter.prepend_if_ee('EE::LabelPresenter') +LabelPresenter.prepend_mod_with('LabelPresenter') diff --git a/app/presenters/member_presenter.rb b/app/presenters/member_presenter.rb index 0c67fc98ced..b37a43bf251 100644 --- a/app/presenters/member_presenter.rb +++ b/app/presenters/member_presenter.rb @@ -52,4 +52,4 @@ class MemberPresenter < Gitlab::View::Presenter::Delegated end end -MemberPresenter.prepend_if_ee('EE::MemberPresenter') +MemberPresenter.prepend_mod_with('MemberPresenter') diff --git a/app/presenters/merge_request_presenter.rb b/app/presenters/merge_request_presenter.rb index a22138011ae..7d0fa9e2f8a 100644 --- a/app/presenters/merge_request_presenter.rb +++ b/app/presenters/merge_request_presenter.rb @@ -151,11 +151,12 @@ class MergeRequestPresenter < Gitlab::View::Presenter::Delegated def assign_to_closing_issues_link # rubocop: disable CodeReuse/ServiceClass - issues = MergeRequests::AssignIssuesService.new(project, - current_user, - merge_request: merge_request, - closes_issues: closing_issues - ).assignable_issues + issues = MergeRequests::AssignIssuesService.new(project: project, + current_user: current_user, + params: { + merge_request: merge_request, + closes_issues: closing_issues + }).assignable_issues path = assign_related_issues_project_merge_request_path(project, merge_request) if issues.present? if issues.count > 1 @@ -273,4 +274,4 @@ class MergeRequestPresenter < Gitlab::View::Presenter::Delegated end end -MergeRequestPresenter.prepend_if_ee('EE::MergeRequestPresenter') +MergeRequestPresenter.prepend_mod_with('MergeRequestPresenter') diff --git a/app/presenters/packages/detail/package_presenter.rb b/app/presenters/packages/detail/package_presenter.rb index 6640b0c5e94..4fa207b1205 100644 --- a/app/presenters/packages/detail/package_presenter.rb +++ b/app/presenters/packages/detail/package_presenter.rb @@ -17,6 +17,7 @@ module Packages name: name, package_files: @package.package_files.map { |pf| build_package_file_view(pf) }, package_type: @package.package_type, + status: @package.status, project_id: @package.project_id, tags: @package.tags.as_json, updated_at: @package.updated_at, diff --git a/app/presenters/project_clusterable_presenter.rb b/app/presenters/project_clusterable_presenter.rb index 718f653eab1..1c5f11ffe59 100644 --- a/app/presenters/project_clusterable_presenter.rb +++ b/app/presenters/project_clusterable_presenter.rb @@ -44,4 +44,4 @@ class ProjectClusterablePresenter < ClusterablePresenter end end -ProjectClusterablePresenter.prepend_if_ee('EE::ProjectClusterablePresenter') +ProjectClusterablePresenter.prepend_mod_with('ProjectClusterablePresenter') diff --git a/app/presenters/project_member_presenter.rb b/app/presenters/project_member_presenter.rb index ff9c3df793a..17947266ed7 100644 --- a/app/presenters/project_member_presenter.rb +++ b/app/presenters/project_member_presenter.rb @@ -16,4 +16,4 @@ class ProjectMemberPresenter < MemberPresenter end end -ProjectMemberPresenter.prepend_if_ee('EE::ProjectMemberPresenter') +ProjectMemberPresenter.prepend_mod_with('ProjectMemberPresenter') diff --git a/app/presenters/project_presenter.rb b/app/presenters/project_presenter.rb index aad1c816cf1..4f803ba34f4 100644 --- a/app/presenters/project_presenter.rb +++ b/app/presenters/project_presenter.rb @@ -108,7 +108,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated end def add_license_ide_path - ide_edit_path(project, default_branch_or_master, 'LICENSE') + ide_edit_path(project, default_branch_or_main, 'LICENSE') end def add_changelog_path @@ -116,7 +116,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated end def add_changelog_ide_path - ide_edit_path(project, default_branch_or_master, 'CHANGELOG') + ide_edit_path(project, default_branch_or_main, 'CHANGELOG') end def add_contribution_guide_path @@ -124,7 +124,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated end def add_contribution_guide_ide_path - ide_edit_path(project, default_branch_or_master, 'CONTRIBUTING.md') + ide_edit_path(project, default_branch_or_main, 'CONTRIBUTING.md') end def add_readme_path @@ -132,13 +132,24 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated end def add_readme_ide_path - ide_edit_path(project, default_branch_or_master, 'README.md') + ide_edit_path(project, default_branch_or_main, 'README.md') end def add_ci_yml_path add_special_file_path(file_name: ci_config_path_or_default) end + def add_code_quality_ci_yml_path + add_special_file_path( + file_name: ci_config_path_or_default, + commit_message: s_("CommitMessage|Add %{file_name} and create a code quality job") % { file_name: ci_config_path_or_default }, + additional_params: { + template: 'Code-Quality', + code_quality_walkthrough: true + } + ) + end + def license_short_name license = repository.license license&.nickname || license&.name || 'LICENSE' @@ -210,7 +221,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated strong_start: '<strong class="project-stat-value">'.html_safe, strong_end: '</strong>'.html_safe }, - empty_repo? ? nil : project_commits_path(project, repository.root_ref)) + empty_repo? ? nil : project_commits_path(project, default_branch_or_main)) end def branches_anchor_data @@ -249,10 +260,10 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated nil, nil, { - 'target_branch' => default_branch_or_master, - 'original_branch' => default_branch_or_master, + 'target_branch' => default_branch_or_main, + 'original_branch' => default_branch_or_main, 'can_push_code' => 'true', - 'path' => project_create_blob_path(project, default_branch_or_master), + 'path' => project_create_blob_path(project, default_branch_or_main), 'project_path' => project.path } ) @@ -268,7 +279,7 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated def new_file_anchor_data if can_current_user_push_to_default_branch? - new_file_path = empty_repo? ? ide_edit_path(project, default_branch_or_master) : project_new_blob_path(project, default_branch_or_master) + new_file_path = empty_repo? ? ide_edit_path(project, default_branch_or_main) : project_new_blob_path(project, default_branch_or_main) AnchorData.new(false, statistic_icon + _('New file'), @@ -390,16 +401,16 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated end def topics_to_show - project.tag_list.take(MAX_TOPICS_TO_SHOW) # rubocop: disable CodeReuse/ActiveRecord + project.topic_list.take(MAX_TOPICS_TO_SHOW) # rubocop: disable CodeReuse/ActiveRecord end def topics_not_shown - project.tag_list - topics_to_show + project.topic_list - topics_to_show end def count_of_extra_topics_not_shown - if project.tag_list.count > MAX_TOPICS_TO_SHOW - project.tag_list.count - MAX_TOPICS_TO_SHOW + if project.topic_list.count > MAX_TOPICS_TO_SHOW + project.topic_list.count - MAX_TOPICS_TO_SHOW else 0 end @@ -468,16 +479,17 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated end end - def add_special_file_path(file_name:, commit_message: nil, branch_name: nil) + def add_special_file_path(file_name:, commit_message: nil, branch_name: nil, additional_params: {}) commit_message ||= s_("CommitMessage|Add %{file_name}") % { file_name: file_name } project_new_blob_path( project, - default_branch_or_master, + default_branch_or_main, file_name: file_name, commit_message: commit_message, - branch_name: branch_name + branch_name: branch_name, + **additional_params ) end end -ProjectPresenter.prepend_if_ee('EE::ProjectPresenter') +ProjectPresenter.prepend_mod_with('ProjectPresenter') diff --git a/app/presenters/projects/import_export/project_export_presenter.rb b/app/presenters/projects/import_export/project_export_presenter.rb index b52f3411c49..611294ddfd8 100644 --- a/app/presenters/projects/import_export/project_export_presenter.rb +++ b/app/presenters/projects/import_export/project_export_presenter.rb @@ -31,11 +31,11 @@ module Projects def group_members return [] unless current_user.can?(:admin_group, project.group) - # We need `.where.not(user_id: nil)` here otherwise when a group has an + # We need `.connected_to_user` here otherwise when a group has an # invitee, it would make the following query return 0 rows since a NULL # user_id would be present in the subquery # See http://stackoverflow.com/questions/129077/not-in-clause-and-null-values - non_null_user_ids = project.project_members.where.not(user_id: nil).select(:user_id) + non_null_user_ids = project.project_members.connected_to_user.select(:user_id) GroupMembersFinder.new(project.group).execute.where.not(user_id: non_null_user_ids) end # rubocop: enable CodeReuse/ActiveRecord diff --git a/app/presenters/service_hook_presenter.rb b/app/presenters/service_hook_presenter.rb index bc20d5b1a3b..8f2ba1a905f 100644 --- a/app/presenters/service_hook_presenter.rb +++ b/app/presenters/service_hook_presenter.rb @@ -4,10 +4,10 @@ class ServiceHookPresenter < Gitlab::View::Presenter::Delegated presents :service_hook def logs_details_path(log) - project_service_hook_log_path(service.project, service, log) + project_service_hook_log_path(integration.project, integration, log) end def logs_retry_path(log) - retry_project_service_hook_log_path(service.project, service, log) + retry_project_service_hook_log_path(integration.project, integration, log) end end diff --git a/app/presenters/snippet_blob_presenter.rb b/app/presenters/snippet_blob_presenter.rb index 597ef6ebc39..e9c710e4a0f 100644 --- a/app/presenters/snippet_blob_presenter.rb +++ b/app/presenters/snippet_blob_presenter.rb @@ -9,12 +9,6 @@ class SnippetBlobPresenter < BlobPresenter render_rich_partial end - def plain_data - return if blob.binary? - - highlight(plain: false) - end - def raw_path snippet_blob_raw_route(only_path: true) end diff --git a/app/presenters/terraform/modules_presenter.rb b/app/presenters/terraform/modules_presenter.rb new file mode 100644 index 00000000000..608f69e2019 --- /dev/null +++ b/app/presenters/terraform/modules_presenter.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +module Terraform + class ModulesPresenter < Gitlab::View::Presenter::Simple + attr_accessor :packages, :system + + presents :modules + + def initialize(packages, system) + @packages = packages + @system = system + end + + def modules + project_url = @packages.first&.project&.web_url + versions = @packages.map do |package| + { + 'version' => package.version, + 'submodules' => [], + 'root' => { + 'dependencies' => [], + 'providers' => [ + { + 'name' => @system, + 'version' => '' + } + ] + } + } + end + + [ + { + 'versions' => versions, + 'source' => project_url + }.compact + ] + end + end +end |