Commit 9e222d6d authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Merge branch 'app-settings' into 'master'

Dynamic application settings in database

See merge request !1378
parents d02a22ba 08c9cb4c
class Admin::ApplicationSettingsController < Admin::ApplicationController
before_filter :set_application_setting
def show
end
def update
if @application_setting.update_attributes(application_setting_params)
redirect_to admin_application_settings_path,
notice: 'Application settings saved successfully'
else
render :show
end
end
private
def set_application_setting
@application_setting = ApplicationSetting.current
end
def application_setting_params
params.require(:application_setting).permit(
:default_projects_limit,
:signup_enabled,
:signin_enabled,
:gravatar_enabled,
:sign_in_text,
)
end
end
require 'gon' require 'gon'
class ApplicationController < ActionController::Base class ApplicationController < ActionController::Base
include Gitlab::CurrentSettings
before_filter :authenticate_user_from_token! before_filter :authenticate_user_from_token!
before_filter :authenticate_user! before_filter :authenticate_user!
before_filter :reject_blocked! before_filter :reject_blocked!
...@@ -13,7 +15,7 @@ class ApplicationController < ActionController::Base ...@@ -13,7 +15,7 @@ class ApplicationController < ActionController::Base
protect_from_forgery with: :exception protect_from_forgery with: :exception
helper_method :abilities, :can? helper_method :abilities, :can?, :current_application_settings
rescue_from Encoding::CompatibilityError do |exception| rescue_from Encoding::CompatibilityError do |exception|
log_exception(exception) log_exception(exception)
......
...@@ -26,7 +26,9 @@ class RegistrationsController < Devise::RegistrationsController ...@@ -26,7 +26,9 @@ class RegistrationsController < Devise::RegistrationsController
private private
def signup_enabled? def signup_enabled?
redirect_to new_user_session_path unless Gitlab.config.gitlab.signup_enabled unless current_application_settings.signup_enabled?
redirect_to(new_user_session_path)
end
end end
def sign_up_params def sign_up_params
......
class SessionsController < Devise::SessionsController class SessionsController < Devise::SessionsController
def new def new
redirect_path = if request.referer.present? && (params['redirect_to_referer'] == 'yes') redirect_path =
referer_uri = URI(request.referer) if request.referer.present? && (params['redirect_to_referer'] == 'yes')
if referer_uri.host == Gitlab.config.gitlab.host referer_uri = URI(request.referer)
referer_uri.path if referer_uri.host == Gitlab.config.gitlab.host
else referer_uri.path
request.fullpath else
end request.fullpath
else end
request.fullpath else
end request.fullpath
end
# Prevent a 'you are already signed in' message directly after signing: # Prevent a 'you are already signed in' message directly after signing:
# we should never redirect to '/users/sign_in' after signing in successfully. # we should never redirect to '/users/sign_in' after signing in successfully.
......
module ApplicationSettingsHelper
def gravatar_enabled?
current_application_settings.gravatar_enabled?
end
def signup_enabled?
current_application_settings.signup_enabled?
end
def signin_enabled?
current_application_settings.signin_enabled?
end
def extra_sign_in_text
current_application_settings.sign_in_text
end
end
...@@ -14,6 +14,6 @@ module ProfileHelper ...@@ -14,6 +14,6 @@ module ProfileHelper
end end
def show_profile_remove_tab? def show_profile_remove_tab?
gitlab_config.signup_enabled signup_enabled?
end end
end end
class ApplicationSetting < ActiveRecord::Base
def self.current
ApplicationSetting.last
end
def self.create_from_defaults
create(
default_projects_limit: Settings.gitlab['default_projects_limit'],
signup_enabled: Settings.gitlab['signup_enabled'],
signin_enabled: Settings.gitlab['signin_enabled'],
gravatar_enabled: Settings.gravatar['enabled'],
sign_in_text: Settings.extra['sign_in_text'],
)
end
end
...@@ -51,14 +51,15 @@ require 'file_size_validator' ...@@ -51,14 +51,15 @@ require 'file_size_validator'
class User < ActiveRecord::Base class User < ActiveRecord::Base
include Gitlab::ConfigHelper include Gitlab::ConfigHelper
extend Gitlab::ConfigHelper
include TokenAuthenticatable include TokenAuthenticatable
extend Gitlab::ConfigHelper
extend Gitlab::CurrentSettings
default_value_for :admin, false default_value_for :admin, false
default_value_for :can_create_group, gitlab_config.default_can_create_group default_value_for :can_create_group, gitlab_config.default_can_create_group
default_value_for :can_create_team, false default_value_for :can_create_team, false
default_value_for :hide_no_ssh_key, false default_value_for :hide_no_ssh_key, false
default_value_for :projects_limit, gitlab_config.default_projects_limit default_value_for :projects_limit, current_application_settings.default_projects_limit
default_value_for :theme_id, gitlab_config.default_theme default_value_for :theme_id, gitlab_config.default_theme
devise :database_authenticatable, :lockable, :async, devise :database_authenticatable, :lockable, :async,
......
class BaseService class BaseService
include Gitlab::CurrentSettings
attr_accessor :project, :current_user, :params attr_accessor :project, :current_user, :params
def initialize(project, user, params = {}) def initialize(project, user, params = {})
...@@ -29,6 +31,10 @@ class BaseService ...@@ -29,6 +31,10 @@ class BaseService
SystemHooksService.new SystemHooksService.new
end end
def current_application_settings
ApplicationSetting.current
end
private private
def error(message) def error(message)
......
class GravatarService class GravatarService
include Gitlab::CurrentSettings
def execute(email, size = nil) def execute(email, size = nil)
if gravatar_config.enabled && email.present? if current_application_settings.gravatar_enabled? && email.present?
size = 40 if size.nil? || size <= 0 size = 40 if size.nil? || size <= 0
sprintf gravatar_url, sprintf gravatar_url,
......
= form_for @application_setting, url: admin_application_settings_path, html: { class: 'form-horizontal fieldset-form' } do |f|
- if @application_setting.errors.any?
#error_explanation
.alert.alert-danger
- @application_setting.errors.full_messages.each do |msg|
%p= msg
%fieldset
%legend Features
.form-group
= f.label :signup_enabled, class: 'control-label'
.col-sm-10
= f.check_box :signup_enabled, class: 'checkbox'
.form-group
= f.label :signin_enabled, class: 'control-label'
.col-sm-10
= f.check_box :signin_enabled, class: 'checkbox'
.form-group
= f.label :gravatar_enabled, class: 'control-label'
.col-sm-10
= f.check_box :gravatar_enabled, class: 'checkbox'
%fieldset
%legend Misc
.form-group
= f.label :default_projects_limit, class: 'control-label'
.col-sm-10
= f.number_field :default_projects_limit, class: 'form-control'
.form-group
= f.label :sign_in_text, class: 'control-label'
.col-sm-10
= f.text_area :sign_in_text, class: 'form-control'
.form-actions
= f.submit 'Save', class: 'btn btn-primary'
%h3.page-title Application settings
%hr
= render 'form'
...@@ -104,7 +104,7 @@ ...@@ -104,7 +104,7 @@
%p %p
Sign up Sign up
%span.light.pull-right %span.light.pull-right
= boolean_to_icon gitlab_config.signup_enabled = boolean_to_icon signup_enabled?
%p %p
LDAP LDAP
%span.light.pull-right %span.light.pull-right
...@@ -112,7 +112,7 @@ ...@@ -112,7 +112,7 @@
%p %p
Gravatar Gravatar
%span.light.pull-right %span.light.pull-right
= boolean_to_icon Gitlab.config.gravatar.enabled = boolean_to_icon gravatar_enabled?
%p %p
OmniAuth OmniAuth
%span.light.pull-right %span.light.pull-right
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
.prepend-top-20 .prepend-top-20
= render 'devise/shared/oauth_box' = render 'devise/shared/oauth_box'
- if gitlab_config.signup_enabled - if signup_enabled?
.prepend-top-20 .prepend-top-20
= render 'devise/shared/signup_box' = render 'devise/shared/signup_box'
......
...@@ -7,18 +7,18 @@ ...@@ -7,18 +7,18 @@
- @ldap_servers.each_with_index do |server, i| - @ldap_servers.each_with_index do |server, i|
%li{class: (:active if i.zero?)} %li{class: (:active if i.zero?)}
= link_to server['label'], "#tab-#{server['provider_name']}", 'data-toggle' => 'tab' = link_to server['label'], "#tab-#{server['provider_name']}", 'data-toggle' => 'tab'
- if gitlab_config.signin_enabled - if signin_enabled?
%li %li
= link_to 'Standard', '#tab-signin', 'data-toggle' => 'tab' = link_to 'Standard', '#tab-signin', 'data-toggle' => 'tab'
.tab-content .tab-content
- @ldap_servers.each_with_index do |server, i| - @ldap_servers.each_with_index do |server, i|
%div.tab-pane{id: "tab-#{server['provider_name']}", class: (:active if i.zero?)} %div.tab-pane{id: "tab-#{server['provider_name']}", class: (:active if i.zero?)}
= render 'devise/sessions/new_ldap', provider: server['provider_name'] = render 'devise/sessions/new_ldap', provider: server['provider_name']
- if gitlab_config.signin_enabled - if signin_enabled?
%div#tab-signin.tab-pane %div#tab-signin.tab-pane
= render 'devise/sessions/new_base' = render 'devise/sessions/new_base'
- elsif gitlab_config.signin_enabled - elsif signin_enabled?
= render 'devise/sessions/new_base' = render 'devise/sessions/new_base'
- else - else
%div %div
......
...@@ -25,8 +25,8 @@ ...@@ -25,8 +25,8 @@
Perform code reviews and enhance collaboration with merge requests. Perform code reviews and enhance collaboration with merge requests.
Each project can also have an issue tracker and a wiki. Each project can also have an issue tracker and a wiki.
- if extra_config.has_key?('sign_in_text') - if extra_sign_in_text.present?
= markdown(extra_config.sign_in_text) = markdown(extra_sign_in_text)
%hr %hr
.container .container
......
...@@ -40,3 +40,8 @@ ...@@ -40,3 +40,8 @@
%span %span
Background Jobs Background Jobs
= nav_link(controller: :application_settings) do
= link_to admin_application_settings_path do
%i.fa.fa-cogs
%span
Settings
...@@ -109,6 +109,8 @@ Gitlab::Application.routes.draw do ...@@ -109,6 +109,8 @@ Gitlab::Application.routes.draw do
end end
end end
resource :application_settings, only: [:show, :update]
root to: "dashboard#index" root to: "dashboard#index"
end end
......
class CreateApplicationSettings < ActiveRecord::Migration
def change
create_table :application_settings do |t|
t.integer :default_projects_limit
t.boolean :signup_enabled
t.boolean :signin_enabled
t.boolean :gravatar_enabled
t.text :sign_in_text
t.timestamps
end
end
end
...@@ -11,11 +11,21 @@ ...@@ -11,11 +11,21 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20141226080412) do ActiveRecord::Schema.define(version: 20150108073740) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
create_table "application_settings", force: true do |t|
t.integer "default_projects_limit"
t.boolean "signup_enabled"
t.boolean "signin_enabled"
t.boolean "gravatar_enabled"
t.text "sign_in_text"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "broadcast_messages", force: true do |t| create_table "broadcast_messages", force: true do |t|
t.text "message", null: false t.text "message", null: false
t.datetime "starts_at" t.datetime "starts_at"
......
@admin
Feature: Admin Settings
Background:
Given I sign in as an admin
And I visit admin settings page
Scenario: Change application settings
When I disable gravatars and save form
Then I should be see gravatar disabled
class Spinach::Features::AdminSettings < Spinach::FeatureSteps
include SharedAuthentication
include SharedPaths
include SharedAdmin
include Gitlab::CurrentSettings
step 'I disable gravatars and save form' do
uncheck 'Gravatar enabled'
click_button 'Save'
end
step 'I should be see gravatar disabled' do
current_application_settings.gravatar_enabled.should be_false
page.should have_content 'Application settings saved successfully'
end
end
...@@ -167,6 +167,10 @@ module SharedPaths ...@@ -167,6 +167,10 @@ module SharedPaths
visit admin_teams_path visit admin_teams_path
end end
step 'I visit admin settings page' do
visit admin_application_settings_path
end
# ---------------------------------------- # ----------------------------------------
# Generic Project # Generic Project
# ---------------------------------------- # ----------------------------------------
......
module Gitlab
module CurrentSettings
def current_application_settings
if ActiveRecord::Base.connection.table_exists?('application_settings')
ApplicationSetting.current ||
ApplicationSetting.create_from_defaults
else
fake_application_settings
end
end
def fake_application_settings
OpenStruct.new(
default_projects_limit: Settings.gitlab['default_projects_limit'],
signup_enabled: Settings.gitlab['signup_enabled'],
signin_enabled: Settings.gitlab['signin_enabled'],
gravatar_enabled: Settings.gravatar['enabled'],
sign_in_text: Settings.extra['sign_in_text'],
)
end
end
end
...@@ -9,7 +9,7 @@ describe "Profile account page", feature: true do ...@@ -9,7 +9,7 @@ describe "Profile account page", feature: true do
describe "when signup is enabled" do describe "when signup is enabled" do
before do before do
Gitlab.config.gitlab.stub(:signup_enabled).and_return(true) ApplicationSetting.any_instance.stub(signup_enabled?: true)
visit profile_account_path visit profile_account_path
end end
...@@ -23,7 +23,7 @@ describe "Profile account page", feature: true do ...@@ -23,7 +23,7 @@ describe "Profile account page", feature: true do
describe "when signup is disabled" do describe "when signup is disabled" do
before do before do
Gitlab.config.gitlab.stub(:signup_enabled).and_return(false) ApplicationSetting.any_instance.stub(signup_enabled?: false)
visit profile_account_path visit profile_account_path
end end
......
...@@ -3,7 +3,7 @@ require 'spec_helper' ...@@ -3,7 +3,7 @@ require 'spec_helper'
describe 'Users', feature: true do describe 'Users', feature: true do
describe "GET /users/sign_up" do describe "GET /users/sign_up" do
before do before do
Gitlab.config.gitlab.stub(:signup_enabled).and_return(true) ApplicationSetting.any_instance.stub(signup_enabled?: true)
end end
it "should create a new user account" do it "should create a new user account" do
......
...@@ -87,7 +87,7 @@ describe ApplicationHelper do ...@@ -87,7 +87,7 @@ describe ApplicationHelper do
let(:user_email) { 'user@email.com' } let(:user_email) { 'user@email.com' }
it "should return a generic avatar path when Gravatar is disabled" do it "should return a generic avatar path when Gravatar is disabled" do
Gitlab.config.gravatar.stub(:enabled).and_return(false) ApplicationSetting.any_instance.stub(gravatar_enabled?: false)
gravatar_icon(user_email).should match('no_avatar.png') gravatar_icon(user_email).should match('no_avatar.png')
end end
......
require 'spec_helper'
describe ApplicationSetting, models: true do
it { ApplicationSetting.create_from_defaults.should be_valid }
end
...@@ -186,7 +186,7 @@ describe API::API, api: true do ...@@ -186,7 +186,7 @@ describe API::API, api: true do
describe "GET /users/sign_up" do describe "GET /users/sign_up" do
context 'enabled' do context 'enabled' do
before do before do
Gitlab.config.gitlab.stub(:signup_enabled).and_return(true) ApplicationSetting.any_instance.stub(signup_enabled?: true)
end end
it "should return sign up page if signup is enabled" do it "should return sign up page if signup is enabled" do
...@@ -197,7 +197,7 @@ describe API::API, api: true do ...@@ -197,7 +197,7 @@ describe API::API, api: true do
context 'disabled' do context 'disabled' do
before do before do
Gitlab.config.gitlab.stub(:signup_enabled).and_return(false) ApplicationSetting.any_instance.stub(signup_enabled?: false)
end end
it "should redirect to sign in page if signup is disabled" do it "should redirect to sign in page if signup is disabled" do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment