diff options
| author | Steven Thonus <steven@ln2.nl> | 2013-11-29 17:10:59 +0100 |
|---|---|---|
| committer | Steven Thonus <steven@ln2.nl> | 2013-12-16 14:39:14 +0100 |
| commit | 37383966ef3fada865d3d21a8ce7a3c640bbd11e (patch) | |
| tree | c7fe9015cd5d3b336e868498bb478fd523de0a86 /app | |
| parent | 99490159e5f9d6ff4b45f78b977d01caa1e3c4fc (diff) | |
| download | gitlab-ce-37383966ef3fada865d3d21a8ce7a3c640bbd11e.tar.gz | |
Archiving old projects; archived projects aren't shown on dashboard
features for archive projects
abilities for archived project
other abilities for archive projects
only limit commits and merges for archived projects
ability changed to prohibited actions on archived projects
added spec and feature tests for archive projects
changed search bar not to include archived projects
Diffstat (limited to 'app')
| -rw-r--r-- | app/controllers/dashboard_controller.rb | 2 | ||||
| -rw-r--r-- | app/controllers/projects_controller.rb | 20 | ||||
| -rw-r--r-- | app/helpers/search_helper.rb | 4 | ||||
| -rw-r--r-- | app/models/ability.rb | 37 | ||||
| -rw-r--r-- | app/models/project.rb | 12 | ||||
| -rw-r--r-- | app/views/dashboard/projects.html.haml | 4 | ||||
| -rw-r--r-- | app/views/projects/_home_panel.html.haml | 4 | ||||
| -rw-r--r-- | app/views/projects/edit.html.haml | 27 |
8 files changed, 94 insertions, 16 deletions
diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index 045e5805bd0..aaab4b40c4c 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -73,6 +73,6 @@ class DashboardController < ApplicationController protected def load_projects - @projects = current_user.authorized_projects.sorted_by_activity + @projects = current_user.authorized_projects.sorted_by_activity.non_archived end end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 1835671fe98..e1c55e7d913 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -5,7 +5,7 @@ class ProjectsController < ApplicationController # Authorize before_filter :authorize_read_project!, except: [:index, :new, :create] - before_filter :authorize_admin_project!, only: [:edit, :update, :destroy, :transfer] + before_filter :authorize_admin_project!, only: [:edit, :update, :destroy, :transfer, :archive, :unarchive] before_filter :require_non_empty_project, only: [:blob, :tree, :graph] layout 'navless', only: [:new, :create, :fork] @@ -116,6 +116,24 @@ class ProjectsController < ApplicationController end end + def archive + return access_denied! unless can?(current_user, :archive_project, project) + project.archive! + + respond_to do |format| + format.html { redirect_to @project } + end + end + + def unarchive + return access_denied! unless can?(current_user, :archive_project, project) + project.unarchive! + + respond_to do |format| + format.html { redirect_to @project } + end + end + private def set_title diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb index 109acfd192b..f24156e4d85 100644 --- a/app/helpers/search_helper.rb +++ b/app/helpers/search_helper.rb @@ -73,14 +73,14 @@ module SearchHelper # Autocomplete results for the current user's projects def projects_autocomplete - current_user.authorized_projects.map do |p| + current_user.authorized_projects.non_archived.map do |p| { label: "project: #{simple_sanitize(p.name_with_namespace)}", url: project_path(p) } end end # Autocomplete results for the current user's projects def public_projects_autocomplete - Project.public_or_internal_only(current_user).map do |p| + Project.public_or_internal_only(current_user).non_archived.map do |p| { label: "project: #{simple_sanitize(p.name_with_namespace)}", url: project_path(p) } end end diff --git a/app/models/ability.rb b/app/models/ability.rb index 6df56eed5b8..cf925141f2d 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -59,31 +59,35 @@ class Ability # Rules based on role in project if team.masters.include?(user) - rules << project_master_rules + rules += project_master_rules elsif team.developers.include?(user) - rules << project_dev_rules + rules += project_dev_rules elsif team.reporters.include?(user) - rules << project_report_rules + rules += project_report_rules elsif team.guests.include?(user) - rules << project_guest_rules + rules += project_guest_rules end if project.public? || project.internal? - rules << public_project_rules + rules += public_project_rules end if project.owner == user || user.admin? - rules << project_admin_rules + rules += project_admin_rules end if project.group && project.group.has_owner?(user) - rules << project_admin_rules + rules += project_admin_rules end - rules.flatten + if project.archived? + rules -= project_archived_rules + end + + rules end def public_project_rules @@ -125,6 +129,16 @@ class Ability ] end + def project_archived_rules + [ + :write_merge_request, + :push_code, + :push_code_to_protected_branches, + :modify_merge_request, + :admin_merge_request + ] + end + def project_master_rules project_dev_rules + [ :push_code_to_protected_branches, @@ -147,7 +161,8 @@ class Ability :change_namespace, :change_visibility_level, :rename_project, - :remove_project + :remove_project, + :archive_project ] end @@ -160,7 +175,7 @@ class Ability # Only group owner and administrators can manage group if group.has_owner?(user) || user.admin? - rules << [ + rules += [ :manage_group, :manage_namespace ] @@ -174,7 +189,7 @@ class Ability # Only namespace owner and administrators can manage it if namespace.owner == user || user.admin? - rules << [ + rules += [ :manage_namespace ] end diff --git a/app/models/project.rb b/app/models/project.rb index 506f34ca6b6..d389579b3a1 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -116,6 +116,8 @@ class Project < ActiveRecord::Base scope :public_only, -> { where(visibility_level: PUBLIC) } scope :public_or_internal_only, ->(user) { where("visibility_level IN (:levels)", levels: user ? [ INTERNAL, PUBLIC ] : [ PUBLIC ]) } + scope :non_archived, -> { where(archived: false) } + enumerize :issues_tracker, in: (Gitlab.config.issues_tracker.keys).append(:gitlab), default: :gitlab class << self @@ -132,7 +134,7 @@ class Project < ActiveRecord::Base end def search query - joins(:namespace).where("projects.name LIKE :query OR projects.path LIKE :query OR namespaces.name LIKE :query OR projects.description LIKE :query", query: "%#{query}%") + joins(:namespace).where("projects.archived = ?", false).where("projects.name LIKE :query OR projects.path LIKE :query OR namespaces.name LIKE :query OR projects.description LIKE :query", query: "%#{query}%") end def find_with_namespace(id) @@ -472,4 +474,12 @@ class Project < ActiveRecord::Base def visibility_level_field visibility_level end + + def archive! + update_attribute(:archived, true) + end + + def unarchive! + update_attribute(:archived, false) + end end diff --git a/app/views/dashboard/projects.html.haml b/app/views/dashboard/projects.html.haml index b42bbf58dc4..23d78720881 100644 --- a/app/views/dashboard/projects.html.haml +++ b/app/views/dashboard/projects.html.haml @@ -82,6 +82,10 @@ = link_to project.forked_from_project.name_with_namespace, project_path(project.forked_from_project) .project-info .pull-right + - if project.archived? + %span.label + %i.icon-book + Archived - project.labels.each do |label| %span.label.label-info %i.icon-tag diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml index 19c150b54fb..ae5deb0b6de 100644 --- a/app/views/projects/_home_panel.html.haml +++ b/app/views/projects/_home_panel.html.haml @@ -7,6 +7,10 @@ %span.visibility-level-label = visibility_level_icon(@project.visibility_level) = visibility_level_label(@project.visibility_level) + - if @project.archived? + %span.visibility-level-label + %i.icon-book + Archived .span7 - unless empty_repo diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index 57936cff10f..c56919e792c 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -98,6 +98,33 @@ %i.icon-chevron-down .js-toggle-visibility-container.hide + - if can? current_user, :archive_project, @project + .ui-box.ui-box-danger + .title + - if @project.archived? + Unarchive project + - else + Archive project + .ui-box-body + - if @project.archived? + %p + Unarchiving the project will mark its repository as active. + %br + The project can be committed to. + %br + %strong Once active this project shows up in the search and on the dashboard. + = link_to 'Unarchive', unarchive_project_path(@project), confirm: "Are you sure that you want to unarchive this project?\nWhen this project is unarchived it is active and can be comitted to again.", method: :post, class: "btn btn-remove" + - else + %p + Archiving the project will mark its repository as read-only. + %br + It is hidden from the dashboard and doesn't show up in searches. + %br + %strong Archived projects cannot be committed to! + = link_to 'Archive', archive_project_path(@project), confirm: "Are you sure that you want to archive this project?\nAn archived project cannot be committed to.", method: :post, class: "btn btn-remove" + - else + %p.nothing_here_message Only the project owner can archive a project + - if can?(current_user, :change_namespace, @project) .ui-box.ui-box-danger .title Transfer project |
