diff options
author | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2015-03-18 02:00:36 +0000 |
---|---|---|
committer | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2015-03-18 02:00:36 +0000 |
commit | 52acd2b45c3676bae3cb9a1c008e4deada3ca840 (patch) | |
tree | 0f7f4ac228cf4cd3623f1d1474017a7facb47cf7 | |
parent | cc4a3b6b620240b72d4138b4e210c047899ac2b3 (diff) | |
parent | 7ff9c8229d8df09be5927086222aad0cd5d71477 (diff) | |
download | gitlab-ce-52acd2b45c3676bae3cb9a1c008e4deada3ca840.tar.gz |
Merge branch 'external_wiki' into 'master'
Add support for external wikis
## What does this MR do?
This MR adds the possibility to replace the link to the internal wiki of gitlab with a custom link.
Currently this is realised as a service.
## What Use Case does this MR solve?
In my Company we already have a wiki System (Confluence).
We have a policy to use the existing wiki, so we can't switch to the internal wiki Gitlab provides.
This currently only leaves us two choices:
1. Disable the gitlab wiki. That means we completly loose the connection between wiki and code from the gitlab ui.
2. Create a simple wiki page with a link to our external wiki and hope that no one uses the internal one.
Both solutions are not really good.
So what can be done to improve the situation while making it as easy as possible for new developers to access both, wiki and gitlab?
Replacing the wiki link kinda like the JIRA integration replaces the issues link looks like a good first step to me. :)
This can probably be extended later to completly prevent access to the internal wiki (currently that's still possible if you know the link) or maybe to check if the link really points to a wiki.
## Screenshot:

See merge request !291
-rw-r--r-- | CHANGELOG | 1 | ||||
-rw-r--r-- | app/controllers/projects/services_controller.rb | 2 | ||||
-rw-r--r-- | app/helpers/external_wiki_helper.rb | 11 | ||||
-rw-r--r-- | app/models/project.rb | 1 | ||||
-rw-r--r-- | app/models/project_services/external_wiki_service.rb | 48 | ||||
-rw-r--r-- | app/views/layouts/nav/_project.html.haml | 2 | ||||
-rw-r--r-- | spec/models/external_wiki_service_spec.rb | 39 |
7 files changed, 102 insertions, 2 deletions
diff --git a/CHANGELOG b/CHANGELOG index c4e47346fd8..bc341ae1b8b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -14,6 +14,7 @@ v 7.9.0 (unreleased) - Fix merge request URL passed to Webhooks. (Stan Hu) - Fix bug that caused a server error when editing a comment to "+1" or "-1" (Stan Hu) - Fix code preview theme setting for comments, issues, merge requests, and snippets (Stan Hu) + - Add a service to support external wikis (Hannes Rosenögger) - Move labels/milestones tabs to sidebar - Upgrade Rails gem to version 4.1.9. - Improve error messages for file edit failures diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb index 570447c746c..9a484c109ba 100644 --- a/app/controllers/projects/services_controller.rb +++ b/app/controllers/projects/services_controller.rb @@ -53,7 +53,7 @@ class Projects::ServicesController < Projects::ApplicationController :description, :issues_url, :new_issue_url, :restrict_to_branch, :channel, :colorize_messages, :channels, :push_events, :issues_events, :merge_requests_events, :tag_push_events, - :note_events, :send_from_committer_email, :disable_diffs + :note_events, :send_from_committer_email, :disable_diffs, :external_wiki_url ) end end diff --git a/app/helpers/external_wiki_helper.rb b/app/helpers/external_wiki_helper.rb new file mode 100644 index 00000000000..838b85afdfe --- /dev/null +++ b/app/helpers/external_wiki_helper.rb @@ -0,0 +1,11 @@ +module ExternalWikiHelper + def get_project_wiki_path(project) + external_wiki_service = project.services. + select { |service| service.to_param == 'external_wiki' }.first + if external_wiki_service.present? && external_wiki_service.active? + external_wiki_service.properties['external_wiki_url'] + else + namespace_project_wiki_path(project.namespace, project, :home) + end + end +end diff --git a/app/models/project.rb b/app/models/project.rb index b19606e9635..2d198de6611 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -93,6 +93,7 @@ class Project < ActiveRecord::Base has_one :forked_project_link, dependent: :destroy, foreign_key: "forked_to_project_id" has_one :forked_from_project, through: :forked_project_link + has_one :external_wiki_service, dependent: :destroy # Merge Requests for target project should be removed with it has_many :merge_requests, dependent: :destroy, foreign_key: 'target_project_id' # Merge requests from source project should be kept when source project was removed diff --git a/app/models/project_services/external_wiki_service.rb b/app/models/project_services/external_wiki_service.rb new file mode 100644 index 00000000000..e521186798c --- /dev/null +++ b/app/models/project_services/external_wiki_service.rb @@ -0,0 +1,48 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer not null +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# + +class ExternalWikiService < Service + include HTTParty + + prop_accessor :external_wiki_url + validates :external_wiki_url, + presence: true, + format: { with: URI::regexp }, + if: :activated? + + def title + 'External Wiki' + end + + def description + 'Replaces the link to the internal wiki with a link to an external wiki.' + end + + def to_param + 'external_wiki' + end + + def fields + [ + { type: 'text', name: 'external_wiki_url', placeholder: 'The URL of the external Wiki' }, + ] + end + + def execute(_data) + @response = HTTParty.get(properties['external_wiki_url'], verify: true) rescue nil + if @response !=200 + nil + end + end +end diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index d340ab1796a..91cae2b572c 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -75,7 +75,7 @@ - if project_nav_tab? :wiki = nav_link(controller: :wikis) do - = link_to namespace_project_wiki_path(@project.namespace, @project, :home), title: 'Wiki', class: 'shortcuts-wiki' do + = link_to get_project_wiki_path(@project), title: 'Wiki', class: 'shortcuts-wiki' do %i.fa.fa-book %span Wiki diff --git a/spec/models/external_wiki_service_spec.rb b/spec/models/external_wiki_service_spec.rb new file mode 100644 index 00000000000..78ef687d29c --- /dev/null +++ b/spec/models/external_wiki_service_spec.rb @@ -0,0 +1,39 @@ +require 'spec_helper' + +describe ExternalWikiService do + include ExternalWikiHelper + describe "Associations" do + it { should belong_to :project } + it { should have_one :service_hook } + end + + describe "Validations" do + context "active" do + before do + subject.active = true + end + + it { should validate_presence_of :external_wiki_url } + end + end + + describe 'External wiki' do + let(:project) { create(:project) } + + context 'when it is active' do + before do + properties = { 'external_wiki_url' => 'https://gitlab.com' } + @service = project.create_external_wiki_service(active: true, properties: properties) + end + + after do + @service.destroy! + end + + it 'should replace the wiki url' do + wiki_path = get_project_wiki_path(project) + wiki_path.should match('https://gitlab.com') + end + end + end +end |