diff --git a/app/controllers/admin/debates_controller.rb b/app/controllers/admin/debates_controller.rb
index 2bb0cb8fd..0b0b31b8b 100644
--- a/app/controllers/admin/debates_controller.rb
+++ b/app/controllers/admin/debates_controller.rb
@@ -1,4 +1,8 @@
class Admin::DebatesController < Admin::BaseController
+ include FeatureFlags
+
+ feature_flag :debates
+
has_filters %w{without_confirmed_hide all with_confirmed_hide}, only: :index
before_action :load_debate, only: [:confirm_hide, :restore]
diff --git a/app/controllers/concerns/feature_flags.rb b/app/controllers/concerns/feature_flags.rb
new file mode 100644
index 000000000..9c96db96e
--- /dev/null
+++ b/app/controllers/concerns/feature_flags.rb
@@ -0,0 +1,25 @@
+module FeatureFlags
+ extend ActiveSupport::Concern
+
+ class_methods do
+ def feature_flag(name, *options)
+ before_filter(*options) do
+ check_feature_flag(name)
+ end
+ end
+ end
+
+ def check_feature_flag(name)
+ raise FeatureDisabled, name unless Setting["feature.#{name}"]
+ end
+
+ class FeatureDisabled < Exception
+ def initialize(name)
+ @name = name
+ end
+
+ def message
+ "Feature disabled: #{@name}"
+ end
+ end
+end
diff --git a/app/controllers/debates_controller.rb b/app/controllers/debates_controller.rb
index 824118c8d..086403e1b 100644
--- a/app/controllers/debates_controller.rb
+++ b/app/controllers/debates_controller.rb
@@ -1,4 +1,5 @@
class DebatesController < ApplicationController
+ include FeatureFlags
include CommentableActions
include FlagActions
@@ -7,6 +8,8 @@ class DebatesController < ApplicationController
before_action :set_search_order, only: :index
before_action :authenticate_user!, except: [:index, :show]
+ feature_flag :debates
+
has_orders %w{hot_score confidence_score created_at relevance}, only: :index
has_orders %w{most_voted newest oldest}, only: :show
diff --git a/app/controllers/moderation/debates_controller.rb b/app/controllers/moderation/debates_controller.rb
index e2a6ba2a0..aaa3d9f89 100644
--- a/app/controllers/moderation/debates_controller.rb
+++ b/app/controllers/moderation/debates_controller.rb
@@ -1,9 +1,12 @@
class Moderation::DebatesController < Moderation::BaseController
include ModerateActions
+ include FeatureFlags
has_filters %w{pending_flag_review all with_ignored_flag}, only: :index
has_orders %w{flags created_at}, only: :index
+ feature_flag :debates
+
before_action :load_resources, only: [:index, :moderate]
load_and_authorize_resource
diff --git a/app/helpers/feature_flags_helper.rb b/app/helpers/feature_flags_helper.rb
new file mode 100644
index 000000000..1e74c016b
--- /dev/null
+++ b/app/helpers/feature_flags_helper.rb
@@ -0,0 +1,5 @@
+module FeatureFlagsHelper
+ def feature?(name)
+ !!Setting["feature.#{name}"]
+ end
+end
diff --git a/app/models/setting.rb b/app/models/setting.rb
index 9cf6fa3a2..b8b29a645 100644
--- a/app/models/setting.rb
+++ b/app/models/setting.rb
@@ -11,6 +11,7 @@ class Setting < ActiveRecord::Base
def []=(key, value)
setting = where(key: key).first || new(key: key)
setting.value = value
+ setting.value = nil if setting.value == false
setting.save!
value
end
diff --git a/app/views/admin/_menu.html.erb b/app/views/admin/_menu.html.erb
index b075755da..495ec3647 100644
--- a/app/views/admin/_menu.html.erb
+++ b/app/views/admin/_menu.html.erb
@@ -18,12 +18,14 @@
<% end %>
-
>
- <%= link_to admin_debates_path do %>
-
- <%= t("admin.menu.hidden_debates") %>
- <% end %>
-
+ <% if feature?(:debates) %>
+ >
+ <%= link_to admin_debates_path do %>
+
+ <%= t("admin.menu.hidden_debates") %>
+ <% end %>
+
+ <% end %>
>
<%= link_to admin_comments_path do %>
diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb
index 75e41c192..467007958 100644
--- a/app/views/layouts/_header.html.erb
+++ b/app/views/layouts/_header.html.erb
@@ -35,7 +35,9 @@
- <%= link_to t("layouts.header.debates"), debates_path, class: ("active" if controller_name == "debates") %>
+ <% if feature?(:debates) %>
+ <%= link_to t("layouts.header.debates"), debates_path, class: ("active" if controller_name == "debates") %>
+ <% end %>
<%= link_to t("layouts.header.proposals"), proposals_path, class: ("active" if controller_name == "proposals") %>
<%= link_to t("layouts.header.spending_proposals"), spending_proposals_path, class: ("active" if controller_name == "spending_proposals") %>
<%= link_to t("layouts.header.more_information"), page_path('more_information'), class: ("active" if current_page?("/more_information")) %>
diff --git a/app/views/moderation/_menu.html.erb b/app/views/moderation/_menu.html.erb
index 577b66342..b7b4b2b0d 100644
--- a/app/views/moderation/_menu.html.erb
+++ b/app/views/moderation/_menu.html.erb
@@ -11,12 +11,14 @@
<% end %>
-
>
- <%= link_to moderation_debates_path do %>
-
- <%= t('moderation.menu.flagged_debates') %>
- <% end %>
-
+ <% if feature?(:debates) %>
+ >
+ <%= link_to moderation_debates_path do %>
+
+ <%= t('moderation.menu.flagged_debates') %>
+ <% end %>
+
+ <% end %>
>
<%= link_to moderation_comments_path do %>
diff --git a/app/views/users/_activity_page.html.erb b/app/views/users/_activity_page.html.erb
index 296f7e5c2..e90b8ce93 100644
--- a/app/views/users/_activity_page.html.erb
+++ b/app/views/users/_activity_page.html.erb
@@ -1,3 +1,3 @@
<%= render "proposals" if @proposals.present? %>
-<%= render "debates" if @debates.present? %>
+<%= render "debates" if @debates.present? && feature?(:debates) %>
<%= render "comments" if @comments.present? %>
diff --git a/db/seeds.rb b/db/seeds.rb
index c8c0351de..82cb4c67a 100644
--- a/db/seeds.rb
+++ b/db/seeds.rb
@@ -49,3 +49,6 @@ Setting["org_name"] = "Consul"
# Consul installation place name (City, Country...)
Setting["place_name"] = "Consul-land"
+
+# Feature flags
+Setting['feature.debates'] = true
diff --git a/spec/features/admin/debates_spec.rb b/spec/features/admin/debates_spec.rb
index f529b4a8f..43d12b081 100644
--- a/spec/features/admin/debates_spec.rb
+++ b/spec/features/admin/debates_spec.rb
@@ -2,6 +2,14 @@ require 'rails_helper'
feature 'Admin debates' do
+ scenario 'Disabled with a feature flag' do
+ Setting['feature.debates'] = nil
+ admin = create(:administrator)
+ login_as(admin.user)
+
+ expect{ visit admin_debates_path }.to raise_exception(FeatureFlags::FeatureDisabled)
+ end
+
background do
admin = create(:administrator)
login_as(admin.user)
diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb
index db3e721b4..5876c3089 100644
--- a/spec/features/debates_spec.rb
+++ b/spec/features/debates_spec.rb
@@ -3,6 +3,11 @@ require 'rails_helper'
feature 'Debates' do
+ scenario 'Disabled with a feature flag' do
+ Setting['feature.debates'] = nil
+ expect{ visit debates_path }.to raise_exception(FeatureFlags::FeatureDisabled)
+ end
+
scenario 'Index' do
debates = [create(:debate), create(:debate), create(:debate)]
diff --git a/spec/features/moderation/debates_spec.rb b/spec/features/moderation/debates_spec.rb
index 1f68ee80a..87a8b4d7d 100644
--- a/spec/features/moderation/debates_spec.rb
+++ b/spec/features/moderation/debates_spec.rb
@@ -2,6 +2,14 @@ require 'rails_helper'
feature 'Moderate debates' do
+ scenario 'Disabled with a feature flag' do
+ Setting['feature.debates'] = nil
+ moderator = create(:moderator)
+ login_as(moderator.user)
+
+ expect{ visit moderation_debates_path }.to raise_exception(FeatureFlags::FeatureDisabled)
+ end
+
scenario 'Hide', :js do
citizen = create(:user)
moderator = create(:moderator)