diff options
author | Oswaldo Ferreira <oswaldo@gitlab.com> | 2018-02-20 17:56:36 +0300 |
---|---|---|
committer | Oswaldo Ferreira <oswaldo@gitlab.com> | 2018-02-20 19:03:06 +0300 |
commit | e0e3f1c2750b6db9343d530d00b096bcb1a57677 (patch) | |
tree | 1ee744d81f999a06250c11c41c363cf29b5ce52e /app/presenters/project_presenter.rb | |
parent | ccc858a5dfdb446d9648db2449d3ee3ef7a2be59 (diff) |
Move button list logic to project presenter
Diffstat (limited to 'app/presenters/project_presenter.rb')
-rw-r--r-- | app/presenters/project_presenter.rb | 359 |
1 files changed, 359 insertions, 0 deletions
diff --git a/app/presenters/project_presenter.rb b/app/presenters/project_presenter.rb new file mode 100644 index 00000000000..c76a529f56b --- /dev/null +++ b/app/presenters/project_presenter.rb @@ -0,0 +1,359 @@ +class ProjectPresenter < Gitlab::View::Presenter::Delegated + include ActionView::Helpers::NumberHelper + include ActionView::Helpers::UrlHelper + include GitlabRoutingHelper + include StorageHelper + include TreeHelper + + presents :project + + def project_stat_anchor_items(show_auto_devops_callout:) + [ + files_anchor_data, + commits_anchor_data, + branches_anchor_data, + tags_anchor_data, + readme_anchor_data, + changelog_anchor_data, + license_anchor_data, + contribution_guide_anchor_data, + gitlab_ci_anchor_data, + autodevops_anchor_data(show_auto_devops_callout: show_auto_devops_callout), + kubernetes_cluster_anchor_data + ].compact.reject { |i| !i[:enabled] } + end + + def project_stat_button_items(show_auto_devops_callout:) + [ + changelog_anchor_data, + license_anchor_data, + contribution_guide_anchor_data, + autodevops_anchor_data(show_auto_devops_callout: show_auto_devops_callout), + kubernetes_cluster_anchor_data, + gitlab_ci_anchor_data, + koding_anchor_data + ].compact.reject { |i| i[:enabled] } + end + + def empty_project_stat_anchor_items + [ + autodevops_anchor_data, + kubernetes_cluster_anchor_data + ].compact.reject { |i| !i[:enabled] } + end + + def empty_project_stat_button_items + [ + new_file_anchor_data, + readme_anchor_data, + license_anchor_data, + autodevops_anchor_data, + kubernetes_cluster_anchor_data + ].compact.reject { |i| i[:enabled] } + end + + def default_project_view + return anonymous_project_view unless current_user + + user_view = current_user.project_view + + if can?(current_user, :download_code, project) + user_view + elsif user_view == "activity" + "activity" + elsif can?(current_user, :read_wiki, project) + "wiki" + elsif feature_available?(:issues, current_user) + "projects/issues/issues" + else + "customize_workflow" + end + end + + def readme_path + filename_path(:readme) + end + + def changelog_path + filename_path(:changelog) + end + + def license_path + filename_path(:license_blob) + end + + def ci_configuration_path + filename_path(:gitlab_ci_yml) + end + + def contribution_guide_path + if project && contribution_guide = repository.contribution_guide + project_blob_path( + project, + tree_join(project.default_branch, + contribution_guide.name) + ) + end + end + + def add_license_path + add_special_file_path(file_name: 'LICENSE') + end + + def add_ci_yml_path + add_special_file_path(file_name: '.gitlab-ci.yml') + end + + def add_readme_path + add_special_file_path(file_name: 'README.md') + end + + def add_koding_stack_path + project_new_blob_path( + project, + default_branch || 'master', + file_name: '.koding.yml', + commit_message: "Add Koding stack script", + content: <<-CONTENT.strip_heredoc + provider: + aws: + access_key: '${var.aws_access_key}' + secret_key: '${var.aws_secret_key}' + resource: + aws_instance: + #{project.path}-vm: + instance_type: t2.nano + user_data: |- + + # Created by GitLab UI for :> + + echo _KD_NOTIFY_@Installing Base packages...@ + + apt-get update -y + apt-get install git -y + + echo _KD_NOTIFY_@Cloning #{project.name}...@ + + export KODING_USER=${var.koding_user_username} + export REPO_URL=#{root_url}${var.koding_queryString_repo}.git + export BRANCH=${var.koding_queryString_branch} + + sudo -i -u $KODING_USER git clone $REPO_URL -b $BRANCH + + echo _KD_NOTIFY_@#{project.name} cloned.@ + CONTENT + ) + end + + def license_short_name + license = repository.license + license&.nickname || license&.name || 'LICENSE' + end + + private + + def filename_path(filename) + if blob = repository.public_send(filename) # rubocop:disable GitlabSecurity/PublicSend + project_blob_path( + project, + tree_join(default_branch, blob.name) + ) + end + end + + def anonymous_project_view + if !project.empty_repo? && can?(current_user, :download_code, project) + 'files' + else + 'activity' + end + end + + def add_special_file_path(file_name:, commit_message: nil, branch_name: nil) + commit_message ||= s_("CommitMessage|Add %{file_name}") % { file_name: file_name } + project_new_blob_path( + project, + project.default_branch || 'master', + file_name: file_name, + commit_message: commit_message, + branch_name: branch_name + ) + end + + def can_current_user_push_code? + if empty_repo? + can?(current_user, :push_code, project) + else + user_can_push_to_branch?(current_user, default_branch) + end + end + + def files_anchor_data + { + enabled: true, + label: _('Files (%{human_size})') % { human_size: storage_counter(statistics.total_repository_size) }, + link: project_tree_path(project) + } + end + + def commits_anchor_data + { + enabled: true, + label: n_('Commit (%{commit_count})', 'Commits (%{commit_count})', statistics.commit_count) % { commit_count: number_with_delimiter(statistics.commit_count) }, + link: project_commits_path(project, repository.root_ref) + } + end + + def branches_anchor_data + { + enabled: true, + label: n_('Branch (%{branch_count})', 'Branches (%{branch_count})', repository.branch_count) % { branch_count: number_with_delimiter(repository.branch_count) }, + link: project_branches_path(project) + } + end + + def tags_anchor_data + { + enabled: true, + label: n_('Tag (%{tag_count})', 'Tags (%{tag_count})', repository.tag_count) % { tag_count: number_with_delimiter(repository.tag_count) }, + link: project_tags_path(project) + } + end + + def new_file_anchor_data + if current_user && can_current_user_push_code? + { + enabled: false, + label: _('New file'), + link: project_new_blob_path(project, default_branch || 'master'), + class_modifier: 'new' + } + end + end + + def readme_anchor_data + if current_user && can_current_user_push_code? && repository.readme.blank? + { + enabled: false, + label: _('Add Readme'), + link: add_readme_path + } + elsif repository.readme.present? + { + enabled: true, + label: _('Readme'), + link: default_project_view != 'readme' ? readme_path : '#readme' + } + end + end + + def changelog_anchor_data + if current_user && can_current_user_push_code? && repository.changelog.blank? + { + enabled: false, + label: _('Add Changelog'), + link: add_special_file_path(file_name: 'CHANGELOG') + } + elsif repository.changelog.present? + { + enabled: true, + label: _('Changelog'), + link: changelog_path + } + end + end + + def license_anchor_data + if current_user && can_current_user_push_code? && repository.license_blob.blank? + { + enabled: false, + label: _('Add License'), + link: add_license_path + } + elsif repository.license_blob.present? + { + enabled: true, + label: license_short_name, + link: license_path + } + end + end + + def contribution_guide_anchor_data + if current_user && can_current_user_push_code? && repository.contribution_guide.blank? + { + enabled: false, + label: _('Add Contribution guide'), + link: add_special_file_path(file_name: 'CONTRIBUTING.md', commit_message: 'Add contribution guide') + } + elsif repository.contribution_guide.present? + { + enabled: true, + label: _('Contribution guide'), + link: contribution_guide_path + } + end + end + + def autodevops_anchor_data(show_auto_devops_callout: false) + if current_user && can?(current_user, :admin_pipeline, project) && repository.gitlab_ci_yml.blank? && !show_auto_devops_callout + { + enabled: auto_devops_enabled?, + label: auto_devops_enabled? ? _('Auto DevOps enabled') : _('Enable Auto DevOps'), + link: project_settings_ci_cd_path(project, anchor: 'js-general-pipeline-settings') + } + elsif auto_devops_enabled? + { + enabled: true, + label: _('Auto DevOps enabled'), + link: nil + } + end + end + + def kubernetes_cluster_anchor_data + if current_user && can?(current_user, :create_cluster, project) + cluster_link = clusters.size == 1 ? project_cluster_path(project, clusters.first) : project_clusters_path(project) + + if clusters.empty? + cluster_link = new_project_cluster_path(project) + end + + { + enabled: !clusters.empty?, + label: clusters.empty? ? _('Add Kubernetes cluster') : n_('Kubernetes cluster', 'Kubernetes clusters', clusters.size), + link: cluster_link + } + end + end + + def gitlab_ci_anchor_data + if current_user && can_current_user_push_code? && repository.gitlab_ci_yml.blank? && !auto_devops_enabled? + { + enabled: false, + label: _('Set up CI/CD'), + link: add_ci_yml_path + } + elsif repository.gitlab_ci_yml.present? + { + enabled: true, + label: _('CI/CD configuration'), + link: ci_configuration_path + } + end + end + + def koding_anchor_data + if current_user && can_current_user_push_code? && koding_enabled? && repository.koding_yml.blank? + { + enabled: false, + label: _('Set up Koding'), + link: add_koding_stack_path + } + end + end + + def koding_enabled? + Gitlab::CurrentSettings.koding_enabled? + end +end |