diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/controllers/projects/issues_controller.rb | 8 | ||||
-rw-r--r-- | app/models/concerns/issuable.rb | 9 | ||||
-rw-r--r-- | app/services/issues/create_service.rb | 4 | ||||
-rw-r--r-- | app/services/issues/move_service.rb | 87 | ||||
-rw-r--r-- | app/views/shared/issuable/_form.html.haml | 24 |
5 files changed, 64 insertions, 68 deletions
diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index 9ec342a7b2a..016aa55656e 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -88,11 +88,11 @@ class Projects::IssuesController < Projects::ApplicationController def update @issue = Issues::UpdateService.new(project, current_user, issue_params).execute(issue) - move_service = Issues::MoveService.new(project, current_user, issue_params, - @issue, params['move_to_project_id']) - if move_service.move? - @issue = move_service.execute + if params[:move_to_project_id].to_i > 0 + new_project = Project.find(params[:move_to_project_id]) + move_service = Issues::MoveService.new(project, current_user, issue_params) + @issue = move_service.execute(@issue, new_project) end respond_to do |format| diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index 86ab84615ba..9ab72652190 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -209,4 +209,13 @@ module Issuable Taskable.get_updated_tasks(old_content: previous_changes['description'].first, new_content: description) end + + ## + # Method that checks if issuable can be moved to another project. + # + # Should be overridden if issuable can be moved. + # + def can_move?(*) + false + end end diff --git a/app/services/issues/create_service.rb b/app/services/issues/create_service.rb index 8af1a9b8d3b..e63e1af8766 100644 --- a/app/services/issues/create_service.rb +++ b/app/services/issues/create_service.rb @@ -1,10 +1,10 @@ module Issues class CreateService < Issues::BaseService - def execute(set_author: true) + def execute filter_params label_params = params[:label_ids] issue = project.issues.new(params.except(:label_ids)) - issue.author = current_user if set_author + issue.author = params[:author] || current_user if issue.save issue.update_attributes(label_ids: label_params) diff --git a/app/services/issues/move_service.rb b/app/services/issues/move_service.rb index 47b58d973f9..45b4b50c0f6 100644 --- a/app/services/issues/move_service.rb +++ b/app/services/issues/move_service.rb @@ -1,23 +1,19 @@ module Issues class MoveService < Issues::BaseService - def initialize(project, current_user, params, issue, new_project_id) - super(project, current_user, params) + class MoveError < StandardError; end - @issue_old = issue - @issue_new = nil - @project_old = @project + def execute(issue, new_project) + @old_issue = issue + @old_project = @project + @new_project = new_project - if new_project_id.to_i > 0 - @project_new = Project.find(new_project_id) + unless issue.can_move?(current_user, new_project) + raise MoveError, 'Cannot move issue due to insufficient permissions!' end - if @project_new == @project_old - raise StandardError, 'Cannot move issue to project it originates from!' + if @project == new_project + raise MoveError, 'Cannot move issue to project it originates from!' end - end - - def execute - return unless move? # Using transaction because of a high resources footprint # on rewriting notes (unfolding references) @@ -25,81 +21,72 @@ module Issues ActiveRecord::Base.transaction do # New issue tasks # - create_new_issue + @new_issue = create_new_issue + rewrite_notes - add_moved_from_note + add_note_moved_from # Old issue tasks # - add_moved_to_note - close_old_issue + add_note_moved_to + close_issue mark_as_moved end notify_participants - @issue_new - end - - def move? - @project_new && can_move? + @new_issue end private - def can_move? - @issue_old.can_move?(@current_user) && - @issue_old.can_move?(@current_user, @project_new) - end - def create_new_issue - new_params = { id: nil, iid: nil, milestone: nil, label_ids: [], - project: @project_new, author: @issue_old.author, - description: unfold_references(@issue_old.description) } - - new_params = @issue_old.serializable_hash.merge(new_params) - create_service = CreateService.new(@project_new, @current_user, - new_params) + new_params = { id: nil, iid: nil, label_ids: [], milestone: nil, + project: @new_project, author: @old_issue.author, + description: unfold_references(@old_issue.description) } - @issue_new = create_service.execute(set_author: false) + new_params = @old_issue.serializable_hash.merge(new_params) + CreateService.new(@new_project, @current_user, new_params).execute end def rewrite_notes - @issue_old.notes.find_each do |note| + @old_issue.notes.find_each do |note| new_note = note.dup - new_params = { project: @project_new, noteable: @issue_new, + new_params = { project: @new_project, noteable: @new_issue, note: unfold_references(new_note.note) } new_note.update(new_params) end end - def close_old_issue - close_service = CloseService.new(@project_new, @current_user) - close_service.execute(@issue_old, notifications: false, system_note: false) + def close_issue + close_service = CloseService.new(@old_project, @current_user) + close_service.execute(@old_issue, notifications: false, system_note: false) end - def add_moved_from_note - SystemNoteService.noteable_moved(@issue_new, @project_new, - @issue_old, @current_user, direction: :from) + def add_note_moved_from + SystemNoteService.noteable_moved(@new_issue, @new_project, + @old_issue, @current_user, + direction: :from) end - def add_moved_to_note - SystemNoteService.noteable_moved(@issue_old, @project_old, - @issue_new, @current_user, direction: :to) + def add_note_moved_to + SystemNoteService.noteable_moved(@old_issue, @old_project, + @new_issue, @current_user, + direction: :to) end def unfold_references(content) - unfolder = Gitlab::Gfm::ReferenceUnfolder.new(content, @project_old) - unfolder.unfold(@project_new) + unfolder = Gitlab::Gfm::ReferenceUnfolder.new(content, @old_project) + unfolder.unfold(@new_project) end def notify_participants - notification_service.issue_moved(@issue_old, @issue_new, @current_user) + notification_service.issue_moved(@old_issue, @new_issue, @current_user) end def mark_as_moved - @issue_old.update(moved_to: @issue_new) + @old_issue.update(moved_to: @new_issue) end end end diff --git a/app/views/shared/issuable/_form.html.haml b/app/views/shared/issuable/_form.html.haml index 5276afec1ca..d2fa407f8d3 100644 --- a/app/views/shared/issuable/_form.html.haml +++ b/app/views/shared/issuable/_form.html.haml @@ -67,22 +67,22 @@ - if can? current_user, :admin_label, issuable.project = link_to 'Create new label', new_namespace_project_label_path(issuable.project.namespace, issuable.project), target: :blank -- if issuable.is_a?(Issue) && issuable.can_move?(current_user) +- if issuable.can_move?(current_user) %hr - .form-group - = label_tag :move_to_project_id, 'Move', class: 'control-label' - .col-sm-10 - - projects = project_options(issuable, current_user, ability: :admin_issue) - = select_tag(:move_to_project_id, projects, include_blank: true, - class: 'select2', data: { placeholder: 'Select project' }) + .form-group + = label_tag :move_to_project_id, 'Move', class: 'control-label' + .col-sm-10 + - projects = project_options(issuable, current_user, ability: :admin_issue) + = select_tag(:move_to_project_id, projects, include_blank: true, + class: 'select2', data: { placeholder: 'Select project' }) - if issuable.is_a?(MergeRequest) %hr - - if @merge_request.new_record? - .form-group - = f.label :source_branch, class: 'control-label' - .col-sm-10 - = f.select(:source_branch, [@merge_request.source_branch], { }, { class: 'source_branch select2 span2', disabled: true }) + - if @merge_request.new_record? + .form-group + = f.label :source_branch, class: 'control-label' + .col-sm-10 + = f.select(:source_branch, [@merge_request.source_branch], { }, { class: 'source_branch select2 span2', disabled: true }) .form-group = f.label :target_branch, class: 'control-label' .col-sm-10 |