summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/controllers/projects/issues_controller.rb8
-rw-r--r--app/models/concerns/issuable.rb9
-rw-r--r--app/services/issues/create_service.rb4
-rw-r--r--app/services/issues/move_service.rb87
-rw-r--r--app/views/shared/issuable/_form.html.haml24
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