summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuis Del Giudice <luis.dg19@gmail.com>2016-10-08 12:51:44 -0400
committerAdam Niedzielski <adamsunday@gmail.com>2017-03-10 14:26:43 +0100
commit660cb96e5f551aea687ca6b908ca3bdbd51e8baa (patch)
tree4d16f3c26609973b79b18f646361d7a3d1b01bb7
parent81ad61113112c49704cfe24b8e47479976422e60 (diff)
downloadgitlab-ce-adam-prevent-two-issue-trackers.tar.gz
Prevent more than one issue tracker to be active for the same projectadam-prevent-two-issue-trackers
-rw-r--r--app/controllers/projects/services_controller.rb3
-rw-r--r--app/models/project_services/issue_tracker_service.rb11
-rw-r--r--changelogs/unreleased/adam-prevent-two-issue-trackers.yml4
-rw-r--r--spec/models/project_services/issue_tracker_service_spec.rb19
4 files changed, 36 insertions, 1 deletions
diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb
index 17cb1d5be24..f9d798d0455 100644
--- a/app/controllers/projects/services_controller.rb
+++ b/app/controllers/projects/services_controller.rb
@@ -13,7 +13,8 @@ class Projects::ServicesController < Projects::ApplicationController
end
def update
- if @service.update_attributes(service_params[:service])
+ @service.assign_attributes(service_params[:service])
+ if @service.save(context: :manual_change)
redirect_to(
edit_namespace_project_service_path(@project.namespace, @project, @service.to_param),
notice: 'Successfully updated.'
diff --git a/app/models/project_services/issue_tracker_service.rb b/app/models/project_services/issue_tracker_service.rb
index 9e65fdbf9d6..50435b67eda 100644
--- a/app/models/project_services/issue_tracker_service.rb
+++ b/app/models/project_services/issue_tracker_service.rb
@@ -1,4 +1,6 @@
class IssueTrackerService < Service
+ validate :one_issue_tracker, if: :activated?, on: :manual_change
+
default_value_for :category, 'issue_tracker'
# Pattern used to extract links from comments
@@ -92,4 +94,13 @@ class IssueTrackerService < Service
def issues_tracker
Gitlab.config.issues_tracker[to_param]
end
+
+ def one_issue_tracker
+ return if template?
+ return if project.blank?
+
+ if project.services.external_issue_trackers.where.not(id: id).any?
+ errors.add(:base, 'Another issue tracker is already in use. Only one issue tracker service can be active at a time')
+ end
+ end
end
diff --git a/changelogs/unreleased/adam-prevent-two-issue-trackers.yml b/changelogs/unreleased/adam-prevent-two-issue-trackers.yml
new file mode 100644
index 00000000000..307b7ec7359
--- /dev/null
+++ b/changelogs/unreleased/adam-prevent-two-issue-trackers.yml
@@ -0,0 +1,4 @@
+---
+title: Prevent more than one issue tracker to be active for the same project
+merge_request:
+author: luisdgs19
diff --git a/spec/models/project_services/issue_tracker_service_spec.rb b/spec/models/project_services/issue_tracker_service_spec.rb
new file mode 100644
index 00000000000..04b304b45db
--- /dev/null
+++ b/spec/models/project_services/issue_tracker_service_spec.rb
@@ -0,0 +1,19 @@
+require 'spec_helper'
+
+describe IssueTrackerService, models: true do
+ describe 'Validations' do
+ let(:project) { create :project }
+
+ it 'does not allow more than one active issue tracker on manual change' do
+ create(:service, project: project, active: true, category: 'issue_tracker')
+ redmine_service = RedmineService.new(project: project, active: true)
+
+ valid = redmine_service.valid?(:manual_change)
+
+ expect(valid).to be_falsey
+ expect(redmine_service.errors[:base]).to include(
+ 'Another issue tracker is already in use. Only one issue tracker service can be active at a time'
+ )
+ end
+ end
+end