From e4f50026f1b0292b2b75dcd33214c59defb9be21 Mon Sep 17 00:00:00 2001
From: farhatahmad <35435341+farhatahmad@users.noreply.github.com>
Date: Tue, 9 Jul 2019 10:56:06 -0400
Subject: [PATCH] Added setting for admin to limit the number of rooms for the
user (#607)
---
app/assets/stylesheets/admins.scss | 9 +++
app/controllers/admins_controller.rb | 8 ++-
app/controllers/rooms_controller.rb | 12 ++++
app/helpers/admins_helper.rb | 4 ++
app/helpers/rooms_helper.rb | 22 +++++++
app/models/setting.rb | 2 +
app/views/rooms/show.html.erb | 64 +++++++++++--------
.../admin_settings/_site_settings.html.erb | 36 ++++++++++-
config/application.rb | 3 +
config/locales/en.yml | 5 ++
config/routes.rb | 1 +
spec/controllers/admins_controller_spec.rb | 18 ++++++
spec/controllers/rooms_controller_spec.rb | 17 ++++-
13 files changed, 171 insertions(+), 30 deletions(-)
diff --git a/app/assets/stylesheets/admins.scss b/app/assets/stylesheets/admins.scss
index 0a5542ff..ee882a5d 100644
--- a/app/assets/stylesheets/admins.scss
+++ b/app/assets/stylesheets/admins.scss
@@ -45,4 +45,13 @@
.authentication-required{
padding-top: 2px;
+}
+
+#site_settings {
+ .colorinput-color {
+ text-align: center;
+ padding-top: 4px;
+ height: 2rem;
+ width: 2rem;
+ }
}
\ No newline at end of file
diff --git a/app/controllers/admins_controller.rb b/app/controllers/admins_controller.rb
index 8f87171e..00ab91bc 100644
--- a/app/controllers/admins_controller.rb
+++ b/app/controllers/admins_controller.rb
@@ -23,7 +23,7 @@ class AdminsController < ApplicationController
manage_users = [:edit_user, :promote, :demote, :ban_user, :unban_user, :approve]
site_settings = [:branding, :coloring, :coloring_lighten, :coloring_darken,
- :registration_method, :room_authentication]
+ :registration_method, :room_authentication, :room_limit]
authorize_resource class: false
before_action :find_user, only: manage_users
@@ -153,6 +153,12 @@ class AdminsController < ApplicationController
end
end
+ # POST /admins/room_limit
+ def room_limit
+ @settings.update_value("Room Limit", params[:limit])
+ redirect_to admins_path, flash: { success: I18n.t("administrator.flash.settings") }
+ end
+
private
def find_user
diff --git a/app/controllers/rooms_controller.rb b/app/controllers/rooms_controller.rb
index b96166da..fde621b1 100644
--- a/app/controllers/rooms_controller.rb
+++ b/app/controllers/rooms_controller.rb
@@ -33,6 +33,8 @@ class RoomsController < ApplicationController
def create
redirect_to(root_path) && return unless current_user
+ return redirect_to current_user.main_room, flash: { alert: I18n.t("room.room_limit") } if room_limit_exceeded
+
@room = Room.new(name: room_params[:name])
@room.owner = current_user
@room.room_settings = create_room_settings_string(room_params[:mute_on_join], room_params[:client])
@@ -279,4 +281,14 @@ class RoomsController < ApplicationController
Setting.find_or_create_by!(provider: user_settings_provider).get_value("Room Authentication") == "true" &&
current_user.nil?
end
+
+ def room_limit_exceeded
+ limit = Setting.find_or_create_by!(provider: user_settings_provider).get_value("Room Limit").to_i
+
+ # Does not apply to admin
+ # 15+ option is used as unlimited
+ return false if current_user&.has_role?(:admin) || limit == 15
+
+ current_user.rooms.count >= limit
+ end
end
diff --git a/app/helpers/admins_helper.rb b/app/helpers/admins_helper.rb
index ab430e71..af23f731 100644
--- a/app/helpers/admins_helper.rb
+++ b/app/helpers/admins_helper.rb
@@ -53,4 +53,8 @@ module AdminsHelper
I18n.t("administrator.site_settings.registration.methods.approval")
end
end
+
+ def room_limit_number
+ Setting.find_or_create_by!(provider: user_settings_provider).get_value("Room Limit").to_i
+ end
end
diff --git a/app/helpers/rooms_helper.rb b/app/helpers/rooms_helper.rb
index e355a8e5..cf0f3dd7 100644
--- a/app/helpers/rooms_helper.rb
+++ b/app/helpers/rooms_helper.rb
@@ -27,4 +27,26 @@ module RoomsHelper
Setting.find_or_create_by!(provider: user_settings_provider).get_value("Room Authentication") == "true" &&
current_user.nil?
end
+
+ def number_of_rooms_allowed
+ Setting.find_or_create_by!(provider: user_settings_provider).get_value("Room Limit").to_i
+ end
+
+ def room_limit_exceeded
+ limit = Setting.find_or_create_by!(provider: user_settings_provider).get_value("Room Limit").to_i
+
+ # Does not apply to admin or users that aren't signed in
+ # 15+ option is used as unlimited
+ return false if !current_user || current_user&.has_role?(:admin) || limit == 15
+
+ current_user.rooms.length >= limit
+ end
+
+ def current_room_exceeds_limit(room)
+ # Get how many rooms need to be deleted to reach allowed room number
+ limit = Setting.find_or_create_by!(provider: user_settings_provider).get_value("Room Limit").to_i
+ @diff = current_user.rooms.count - limit
+
+ @diff.positive? && current_user.rooms.pluck(:id).index(room.id) + 1 > limit
+ end
end
diff --git a/app/models/setting.rb b/app/models/setting.rb
index b4f07ff0..82f395f5 100644
--- a/app/models/setting.rb
+++ b/app/models/setting.rb
@@ -41,6 +41,8 @@ class Setting < ApplicationRecord
Rails.configuration.registration_method_default
when "Room Authentication"
false
+ when "Room Limit"
+ Rails.configuration.number_of_rooms_default
end
end
end
diff --git a/app/views/rooms/show.html.erb b/app/views/rooms/show.html.erb
index 83aa968d..d527be81 100644
--- a/app/views/rooms/show.html.erb
+++ b/app/views/rooms/show.html.erb
@@ -13,6 +13,12 @@
# with BigBlueButton; if not, see