bigbluebutton_rails 1.4.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. checksums.yaml +7 -0
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +10 -1
  4. data/CHANGELOG.md +259 -0
  5. data/Gemfile +14 -19
  6. data/Gemfile.lock +194 -188
  7. data/README.md +416 -0
  8. data/Rakefile +12 -12
  9. data/TODO.md +13 -0
  10. data/app/controllers/bigbluebutton/playback_types_controller.rb +44 -0
  11. data/app/controllers/bigbluebutton/recordings_controller.rb +17 -10
  12. data/app/controllers/bigbluebutton/rooms_controller.rb +65 -36
  13. data/app/controllers/bigbluebutton/servers_controller.rb +12 -8
  14. data/app/models/bigbluebutton_metadata.rb +1 -1
  15. data/app/models/bigbluebutton_playback_format.rb +22 -1
  16. data/app/models/bigbluebutton_playback_type.rb +29 -0
  17. data/app/models/bigbluebutton_recording.rb +38 -19
  18. data/app/models/bigbluebutton_room.rb +150 -73
  19. data/app/models/bigbluebutton_room_options.rb +10 -7
  20. data/app/models/bigbluebutton_server.rb +69 -13
  21. data/app/models/bigbluebutton_server_config.rb +49 -0
  22. data/app/views/bigbluebutton/recordings/_form.html.erb +4 -0
  23. data/app/views/bigbluebutton/recordings/_recordings.html.erb +10 -3
  24. data/app/views/bigbluebutton/rooms/_form.html.erb +18 -6
  25. data/app/views/bigbluebutton/rooms/_rooms.html.erb +6 -3
  26. data/app/views/bigbluebutton/rooms/invite.html.erb +5 -5
  27. data/app/views/bigbluebutton/rooms/show.html.erb +18 -6
  28. data/app/views/bigbluebutton/servers/_form.html.erb +1 -1
  29. data/app/views/bigbluebutton/servers/show.html.erb +5 -0
  30. data/app/workers/bigbluebutton_finish_meetings.rb +11 -0
  31. data/app/workers/bigbluebutton_update_recordings.rb +11 -0
  32. data/app/workers/bigbluebutton_update_server_configs.rb +18 -0
  33. data/bigbluebutton_rails.gemspec +8 -7
  34. data/config/locales/en.yml +52 -7
  35. data/config/locales/pt-br.yml +162 -0
  36. data/config/resque/resque.rake +27 -0
  37. data/config/resque/workers_schedule.yml +17 -0
  38. data/lib/bigbluebutton_rails.rb +30 -2
  39. data/lib/bigbluebutton_rails/background_tasks.rb +31 -0
  40. data/lib/bigbluebutton_rails/controller_methods.rb +12 -8
  41. data/lib/bigbluebutton_rails/dial_number.rb +48 -0
  42. data/lib/bigbluebutton_rails/rails/routes.rb +9 -2
  43. data/lib/bigbluebutton_rails/utils.rb +9 -2
  44. data/lib/bigbluebutton_rails/version.rb +1 -1
  45. data/lib/generators/bigbluebutton_rails/install_generator.rb +0 -8
  46. data/lib/generators/bigbluebutton_rails/templates/migration.rb +28 -6
  47. data/lib/generators/bigbluebutton_rails/templates/migration_2_0_0.rb +56 -0
  48. data/lib/tasks/bigbluebutton_rails/meetings.rake +1 -13
  49. data/lib/tasks/bigbluebutton_rails/recordings.rake +1 -12
  50. data/lib/tasks/bigbluebutton_rails/server_configs.rake +10 -0
  51. data/spec/bigbluebutton_rails_spec.rb +0 -13
  52. data/spec/controllers/bigbluebutton/playback_types_controller_spec.rb +76 -0
  53. data/spec/controllers/bigbluebutton/recordings_controller_spec.rb +109 -37
  54. data/spec/controllers/bigbluebutton/rooms_controller_exception_handling_spec.rb +1 -0
  55. data/spec/controllers/bigbluebutton/rooms_controller_json_responses_spec.rb +27 -3
  56. data/spec/controllers/bigbluebutton/rooms_controller_spec.rb +338 -77
  57. data/spec/controllers/bigbluebutton/servers_controller_json_responses_spec.rb +8 -0
  58. data/spec/controllers/bigbluebutton/servers_controller_spec.rb +182 -47
  59. data/spec/factories/bigbluebutton_meeting.rb +2 -2
  60. data/spec/factories/bigbluebutton_playback_format.rb +2 -2
  61. data/spec/factories/bigbluebutton_playback_type.rb +7 -0
  62. data/spec/factories/bigbluebutton_recording.rb +8 -0
  63. data/spec/factories/bigbluebutton_room.rb +10 -3
  64. data/spec/factories/bigbluebutton_server.rb +6 -1
  65. data/spec/factories/bigbluebutton_server_config.rb +6 -0
  66. data/spec/generators/install_generator_spec.rb +0 -16
  67. data/spec/lib/bigbluebutton_rails/background_tasks_spec.rb +61 -0
  68. data/spec/lib/bigbluebutton_rails/dial_number_spec.rb +78 -0
  69. data/spec/lib/bigbluebutton_rails/utils_spec.rb +56 -0
  70. data/spec/lib/tasks/meetings_rake_spec.rb +14 -1
  71. data/spec/lib/tasks/recordings_rake_spec.rb +14 -1
  72. data/spec/models/bigbluebutton_meeting_db_spec.rb +3 -3
  73. data/spec/models/bigbluebutton_meeting_spec.rb +4 -4
  74. data/spec/models/bigbluebutton_playback_format_db_spec.rb +0 -1
  75. data/spec/models/bigbluebutton_playback_format_spec.rb +75 -4
  76. data/spec/models/bigbluebutton_playback_type_db_spec.rb +14 -0
  77. data/spec/models/bigbluebutton_playback_type_spec.rb +76 -0
  78. data/spec/models/bigbluebutton_recording_db_spec.rb +3 -1
  79. data/spec/models/bigbluebutton_recording_spec.rb +234 -58
  80. data/spec/models/bigbluebutton_room_db_spec.rb +8 -6
  81. data/spec/models/bigbluebutton_room_options_db_spec.rb +1 -0
  82. data/spec/models/bigbluebutton_room_options_spec.rb +137 -38
  83. data/spec/models/bigbluebutton_room_spec.rb +540 -153
  84. data/spec/models/bigbluebutton_server_config_spec.rb +115 -0
  85. data/spec/models/bigbluebutton_server_spec.rb +180 -23
  86. data/spec/rails_app/app/controllers/my_playback_types_controller.rb +7 -0
  87. data/spec/rails_app/app/views/frontpage/show.html.erb +1 -0
  88. data/spec/rails_app/app/views/my_playback_types/index.html.erb +33 -0
  89. data/spec/rails_app/config/application.rb +0 -3
  90. data/spec/rails_app/config/database.yml.travis +10 -0
  91. data/spec/rails_app/config/environments/development.rb +1 -6
  92. data/spec/rails_app/config/environments/production.rb +2 -0
  93. data/spec/rails_app/config/environments/test.rb +2 -0
  94. data/spec/rails_app/config/routes.rb +5 -2
  95. data/spec/rails_app/db/seeds.rb +1 -1
  96. data/spec/rails_app/features/config.yml.example +3 -4
  97. data/spec/rails_app/features/join_rooms.feature +14 -14
  98. data/spec/rails_app/features/step_definitions/activity_monitor_servers_step.rb +2 -2
  99. data/spec/rails_app/features/step_definitions/create_rooms_steps.rb +4 -4
  100. data/spec/rails_app/features/step_definitions/destroy_rooms_steps.rb +2 -2
  101. data/spec/rails_app/features/step_definitions/join_rooms_steps.rb +10 -10
  102. data/spec/rails_app/features/step_definitions/web_steps.rb +2 -2
  103. data/spec/rails_app/features/support/configurations.rb +1 -1
  104. data/spec/rails_app/features/support/templates.rb +12 -12
  105. data/spec/rails_app/lib/tasks/db/populate.rake +19 -6
  106. data/spec/routing/bigbluebutton/custom_controllers_routing_spec.rb +1 -1
  107. data/spec/routing/bigbluebutton/recordings_only_routing_spec.rb +2 -2
  108. data/spec/routing/bigbluebutton/recordings_routing_spec.rb +2 -2
  109. data/spec/routing/bigbluebutton/rooms_only_routing_spec.rb +1 -1
  110. data/spec/routing/bigbluebutton/rooms_routing_spec.rb +15 -1
  111. data/spec/routing/bigbluebutton/servers_only_routing_spec.rb +1 -1
  112. data/spec/routing/bigbluebutton/servers_routing_spec.rb +1 -1
  113. data/spec/spec_helper.rb +23 -31
  114. data/spec/support/matchers/delegate_matcher.rb +8 -1
  115. data/spec/support/matchers/shoulda/respond_with_json_matcher.rb +2 -2
  116. data/spec/support/mocked_server.rb +2 -0
  117. data/spec/support/shared_contexts/rake.rb +23 -0
  118. data/spec/workers/bigbluebutton_finish_meetings_spec.rb +14 -0
  119. data/spec/workers/bigbluebutton_update_recordings_spec.rb +14 -0
  120. data/spec/workers/bigbluebutton_update_server_configs_spec.rb +47 -0
  121. metadata +70 -59
  122. data/CHANGELOG.rdoc +0 -111
  123. data/README.rdoc +0 -319
  124. data/TODO.rdoc +0 -16
  125. data/config/schedule.rb +0 -7
data/TODO.md ADDED
@@ -0,0 +1,13 @@
1
+ TODO:
2
+ * Pre-upload of slides
3
+ * Options 'redirectClient' and 'clientURL' on 'create'
4
+ * Option 'avatarURL' on 'join'
5
+ * 'getDefaultConfigXML' and 'setConfigXML'. They are already used when a
6
+ user joins a meeting, to set the custom options configured in the target
7
+ room. But these API methods cannot be called individually yet.
8
+
9
+
10
+ See:
11
+ * http://docs.bigbluebutton.org/dev/api.html
12
+ * http://groups.google.com/group/bigbluebutton-dev/browse_thread/thread/c214
13
+ cbe9bdb2268a?pli=1
@@ -0,0 +1,44 @@
1
+ class Bigbluebutton::PlaybackTypesController < ApplicationController
2
+ include BigbluebuttonRails::InternalControllerMethods
3
+
4
+ respond_to :html
5
+ respond_to :json
6
+ before_filter :find_playback_type, only: [:update]
7
+
8
+ def update
9
+ respond_with @playback_type do |format|
10
+ if @playback_type.update_attributes(playback_type_params)
11
+ format.html {
12
+ message = t('bigbluebutton_rails.playback_types.notice.update.success')
13
+ redirect_to_using_params request.referer, :notice => message
14
+ }
15
+ format.json { render :json => true, :status => :ok }
16
+ else
17
+ format.html {
18
+ flash[:error] = @playback_type.errors.full_messages.join(", ")
19
+ redirect_to_using_params request.referer
20
+ }
21
+ format.json { render :json => @playback_type.errors.full_messages, :status => :unprocessable_entity }
22
+ end
23
+ end
24
+ end
25
+
26
+ protected
27
+
28
+ def find_playback_type
29
+ @playback_type ||= BigbluebuttonPlaybackType.find(params[:id])
30
+ end
31
+
32
+ def playback_type_params
33
+ unless params[:bigbluebutton_playback_type].nil?
34
+ params[:bigbluebutton_playback_type].permit(*playback_type_allowed_params)
35
+ else
36
+ {}
37
+ end
38
+ end
39
+
40
+ def playback_type_allowed_params
41
+ [ :visible, :default ]
42
+ end
43
+
44
+ end
@@ -5,9 +5,11 @@ class Bigbluebutton::RecordingsController < ApplicationController
5
5
  respond_to :json, :only => [:index, :show, :update, :destroy, :publish, :unpublish]
6
6
  before_filter :find_recording, :except => [:index]
7
7
  before_filter :check_for_server, :only => [:publish, :unpublish]
8
+ before_filter :find_playback, :only => [:play]
8
9
 
9
10
  def index
10
- respond_with(@recordings = BigbluebuttonRecording.all)
11
+ @recordings ||= BigbluebuttonRecording.all
12
+ respond_with(@recordings)
11
13
  end
12
14
 
13
15
  def show
@@ -69,15 +71,10 @@ class Bigbluebutton::RecordingsController < ApplicationController
69
71
  end
70
72
 
71
73
  def play
72
- if params[:type]
73
- playback = @recording.playback_formats.where(:format_type => params[:type]).first
74
- else
75
- playback = @recording.playback_formats.first
76
- end
77
74
  respond_with do |format|
78
75
  format.html {
79
- if playback
80
- redirect_to playback.url
76
+ if @playback
77
+ redirect_to @playback.url
81
78
  else
82
79
  flash[:error] = t('bigbluebutton_rails.recordings.errors.play.no_format')
83
80
  redirect_to_using_params bigbluebutton_recording_url(@recording)
@@ -97,7 +94,7 @@ class Bigbluebutton::RecordingsController < ApplicationController
97
94
  protected
98
95
 
99
96
  def find_recording
100
- @recording = BigbluebuttonRecording.find_by_recordid(params[:id])
97
+ @recording ||= BigbluebuttonRecording.find_by_recordid(params[:id])
101
98
  end
102
99
 
103
100
  def check_for_server
@@ -146,7 +143,7 @@ class Bigbluebutton::RecordingsController < ApplicationController
146
143
  unless params[:bigbluebutton_recording].nil?
147
144
  params[:bigbluebutton_recording].permit(*recording_allowed_params)
148
145
  else
149
- []
146
+ {}
150
147
  end
151
148
  end
152
149
 
@@ -154,4 +151,14 @@ class Bigbluebutton::RecordingsController < ApplicationController
154
151
  [ :recordid, :meetingid, :name, :published, :start_time, :end_time, :available, :description ]
155
152
  end
156
153
 
154
+ protected
155
+
156
+ def find_playback
157
+ if params[:type]
158
+ @playback = @recording.playback_formats.where(:playback_type_id => BigbluebuttonPlaybackType.find_by_identifier(params[:type])).first
159
+ else
160
+ @playback = @recording.default_playback_format || @recording.playback_formats.first
161
+ end
162
+ end
163
+
157
164
  end
@@ -18,7 +18,8 @@ class Bigbluebutton::RoomsController < ApplicationController
18
18
  respond_to :json, :only => [:running, :show, :new, :index, :create, :update]
19
19
 
20
20
  def index
21
- respond_with(@rooms = BigbluebuttonRoom.all)
21
+ @rooms ||= BigbluebuttonRoom.all
22
+ respond_with(@rooms)
22
23
  end
23
24
 
24
25
  def show
@@ -26,7 +27,8 @@ class Bigbluebutton::RoomsController < ApplicationController
26
27
  end
27
28
 
28
29
  def new
29
- respond_with(@room = BigbluebuttonRoom.new)
30
+ @room ||= BigbluebuttonRoom.new
31
+ respond_with(@room)
30
32
  end
31
33
 
32
34
  def edit
@@ -34,7 +36,7 @@ class Bigbluebutton::RoomsController < ApplicationController
34
36
  end
35
37
 
36
38
  def create
37
- @room = BigbluebuttonRoom.new(room_params)
39
+ @room ||= BigbluebuttonRoom.new(room_params)
38
40
 
39
41
  if params[:bigbluebutton_room] and
40
42
  (not params[:bigbluebutton_room].has_key?(:meetingid) or
@@ -214,13 +216,34 @@ class Bigbluebutton::RoomsController < ApplicationController
214
216
  end
215
217
 
216
218
  def recordings
217
- respond_with(@recordings = @room.recordings)
219
+ @recordings ||= @room.recordings
220
+ respond_with(@recordings)
221
+ end
222
+
223
+ def generate_dial_number
224
+ pattern = params[:pattern].blank? ? nil : params[:pattern]
225
+ if @room.generate_dial_number!(pattern)
226
+ message = t('bigbluebutton_rails.rooms.notice.generate_dial_number.success')
227
+ respond_with do |format|
228
+ format.html { redirect_to_using_params :back, notice: message }
229
+ format.json { render json: true, status: :ok }
230
+ end
231
+ else
232
+ message = t('bigbluebutton_rails.rooms.errors.generate_dial_number.not_unique')
233
+ respond_with do |format|
234
+ format.html {
235
+ flash[:error] = message
236
+ redirect_to_using_params :back
237
+ }
238
+ format.json { render json: { message: message }, status: :error }
239
+ end
240
+ end
218
241
  end
219
242
 
220
243
  protected
221
244
 
222
245
  def find_room
223
- @room = BigbluebuttonRoom.find_by_param(params[:id])
246
+ @room ||= BigbluebuttonRoom.find_by_param(params[:id])
224
247
  end
225
248
 
226
249
  def set_request_headers
@@ -230,7 +253,7 @@ class Bigbluebutton::RoomsController < ApplicationController
230
253
  end
231
254
 
232
255
  def join_check_room
233
- @room = BigbluebuttonRoom.find_by_param(params[:id]) unless params[:id].blank?
256
+ @room ||= BigbluebuttonRoom.find_by_param(params[:id]) unless params[:id].blank?
234
257
  if @room.nil?
235
258
  message = t('bigbluebutton_rails.rooms.errors.join.wrong_params')
236
259
  redirect_to :back, :notice => message
@@ -250,12 +273,12 @@ class Bigbluebutton::RoomsController < ApplicationController
250
273
  @user_id = bigbluebutton_user.id
251
274
  end
252
275
 
253
- # the role: nil means access denied, :password means check the room
254
- # password, otherwise just use it
276
+ # the role: nil means access denied, :key means check the room
277
+ # key, otherwise just use it
255
278
  @user_role = bigbluebutton_role(@room)
256
279
  if @user_role.nil?
257
280
  raise BigbluebuttonRails::RoomAccessDenied.new
258
- elsif @user_role == :password
281
+ elsif @user_role == :key
259
282
  @user_role = @room.user_role(params[:user])
260
283
  end
261
284
 
@@ -268,37 +291,34 @@ class Bigbluebutton::RoomsController < ApplicationController
268
291
  # Aborts and redirects to an error if the user can't create a meeting in
269
292
  # the room and it needs to be created.
270
293
  def join_check_can_create
271
- begin
272
- unless @room.fetch_is_running?
273
- unless bigbluebutton_can_create?(@room, @user_role)
274
- flash[:error] = t('bigbluebutton_rails.rooms.errors.join.cannot_create')
275
- redirect_to_on_join_error
276
- end
294
+ unless @room.fetch_is_running?
295
+ unless bigbluebutton_can_create?(@room, @user_role)
296
+ flash[:error] = t('bigbluebutton_rails.rooms.errors.join.cannot_create')
297
+ redirect_to_on_join_error
277
298
  end
278
- rescue BigBlueButton::BigBlueButtonException => e
279
- flash[:error] = e.to_s[0..200]
280
- redirect_to_on_join_error
281
299
  end
300
+ rescue BigBlueButton::BigBlueButtonException => e
301
+ flash[:error] = e.to_s[0..200]
302
+ redirect_to_on_join_error
282
303
  end
283
304
 
284
305
  # If the user called the join from a mobile device, he will be redirected to
285
306
  # an intermediary page with information about the mobile client. A few flags set
286
307
  # in the params can override this behavior and skip this intermediary page.
287
308
  def join_check_redirect_to_mobile
288
- if browser.mobile? &&
289
- !BigbluebuttonRails::value_to_boolean(params[:auto_join]) &&
290
- !BigbluebuttonRails::value_to_boolean(params[:desktop])
309
+ return if !BigbluebuttonRails.use_mobile_client?(browser) ||
310
+ BigbluebuttonRails.value_to_boolean(params[:auto_join]) ||
311
+ BigbluebuttonRails.value_to_boolean(params[:desktop])
291
312
 
292
- # since we're redirecting to an intermediary page, we set in the params the params
293
- # we received, including the referer, so we can go back to the previous page if needed
294
- filtered_params = select_params_for_join_mobile(params.clone)
295
- begin
296
- filtered_params[:redir_url] = Addressable::URI.parse(request.env["HTTP_REFERER"]).path
297
- rescue
298
- end
299
-
300
- redirect_to join_mobile_bigbluebutton_room_path(@room, filtered_params)
313
+ # since we're redirecting to an intermediary page, we set in the params the params
314
+ # we received, including the referer, so we can go back to the previous page if needed
315
+ filtered_params = select_params_for_join_mobile(params.clone)
316
+ begin
317
+ filtered_params[:redir_url] = Addressable::URI.parse(request.env["HTTP_REFERER"]).path
318
+ rescue
301
319
  end
320
+
321
+ redirect_to join_mobile_bigbluebutton_room_path(@room, filtered_params)
302
322
  end
303
323
 
304
324
  # Selects the params from `params` that should be passed in a redirect to `join_mobile` and
@@ -319,7 +339,9 @@ class Bigbluebutton::RoomsController < ApplicationController
319
339
  unless @room.fetch_is_running?
320
340
  if bigbluebutton_can_create?(@room, role)
321
341
  user_opts = bigbluebutton_create_options(@room)
322
- @room.create_meeting(bigbluebutton_user, request, user_opts)
342
+ if @room.create_meeting(bigbluebutton_user, request, user_opts)
343
+ logger.info "Meeting created: id: #{@room.meetingid}, name: #{@room.name}, created_by: #{bigbluebutton_user.username}, time: #{Time.now.iso8601}"
344
+ end
323
345
  else
324
346
  flash[:error] = t('bigbluebutton_rails.rooms.errors.join.cannot_create')
325
347
  redirect_to_on_join_error
@@ -331,12 +353,17 @@ class Bigbluebutton::RoomsController < ApplicationController
331
353
  token = @room.fetch_new_token
332
354
  options = if token.nil? then {} else { :configToken => token } end
333
355
 
356
+ # set the create time and the user id, if they exist
357
+ options.merge!({ createTime: @room.create_time }) unless @room.create_time.blank?
358
+ options.merge!({ userID: id }) unless id.blank?
359
+
334
360
  # room created and running, try to join it
335
361
  url = @room.join_url(username, role, nil, options)
336
362
  unless url.nil?
337
363
 
338
364
  # change the protocol to join with a mobile device
339
- if browser.mobile? && !BigbluebuttonRails::value_to_boolean(params[:desktop])
365
+ if BigbluebuttonRails.use_mobile_client?(browser) &&
366
+ !BigbluebuttonRails.value_to_boolean(params[:desktop])
340
367
  url.gsub!(/^[^:]*:\/\//i, "bigbluebutton://")
341
368
  end
342
369
 
@@ -361,14 +388,16 @@ class Bigbluebutton::RoomsController < ApplicationController
361
388
  unless params[:bigbluebutton_room].nil?
362
389
  params[:bigbluebutton_room].permit(*room_allowed_params)
363
390
  else
364
- []
391
+ {}
365
392
  end
366
393
  end
367
394
 
368
395
  def room_allowed_params
369
- [ :name, :server_id, :meetingid, :attendee_password, :moderator_password, :welcome_msg,
396
+ [ :name, :server_id, :meetingid, :attendee_key, :moderator_key, :welcome_msg,
370
397
  :private, :logout_url, :dial_number, :voice_bridge, :max_participants, :owner_id,
371
- :owner_type, :external, :param, :record, :duration, :default_layout, :presenter_share_only,
372
- :auto_start_video, :auto_start_audio, :metadata_attributes => [ :id, :name, :content, :_destroy, :owner_id ] ]
398
+ :owner_type, :external, :param, :record_meeting, :duration, :default_layout, :presenter_share_only,
399
+ :auto_start_video, :auto_start_audio, :background,
400
+ :moderator_only_message, :auto_start_recording, :allow_start_stop_recording,
401
+ :metadata_attributes => [ :id, :name, :content, :_destroy, :owner_id ] ]
373
402
  end
374
403
  end
@@ -6,7 +6,8 @@ class Bigbluebutton::ServersController < ApplicationController
6
6
  before_filter :find_server, :except => [:index, :new, :create]
7
7
 
8
8
  def index
9
- respond_with(@servers = BigbluebuttonServer.all)
9
+ @servers ||= BigbluebuttonServer.all
10
+ respond_with(@servers)
10
11
  end
11
12
 
12
13
  def show
@@ -14,7 +15,8 @@ class Bigbluebutton::ServersController < ApplicationController
14
15
  end
15
16
 
16
17
  def new
17
- respond_with(@server = BigbluebuttonServer.new)
18
+ @server ||= BigbluebuttonServer.new
19
+ respond_with(@server)
18
20
  end
19
21
 
20
22
  def edit
@@ -58,7 +60,7 @@ class Bigbluebutton::ServersController < ApplicationController
58
60
  end
59
61
 
60
62
  def create
61
- @server = BigbluebuttonServer.new(server_params)
63
+ @server ||= BigbluebuttonServer.new(server_params)
62
64
 
63
65
  respond_with @server do |format|
64
66
  if @server.save
@@ -100,11 +102,13 @@ class Bigbluebutton::ServersController < ApplicationController
100
102
  end
101
103
 
102
104
  def recordings
103
- respond_with(@recordings = @server.recordings)
105
+ @recordings ||= @server.recordings
106
+ respond_with(@recordings)
104
107
  end
105
108
 
106
109
  def rooms
107
- respond_with(@rooms = @server.rooms)
110
+ @rooms ||= @server.rooms
111
+ respond_with(@rooms)
108
112
  end
109
113
 
110
114
  def publish_recordings
@@ -156,7 +160,7 @@ class Bigbluebutton::ServersController < ApplicationController
156
160
  protected
157
161
 
158
162
  def find_server
159
- @server = BigbluebuttonServer.find_by_param(params[:id])
163
+ @server ||= BigbluebuttonServer.find_by_param(params[:id])
160
164
  end
161
165
 
162
166
  def publish_unpublish(ids, publish)
@@ -188,12 +192,12 @@ class Bigbluebutton::ServersController < ApplicationController
188
192
  unless params[:bigbluebutton_server].nil?
189
193
  params[:bigbluebutton_server].permit(*server_allowed_params)
190
194
  else
191
- []
195
+ {}
192
196
  end
193
197
  end
194
198
 
195
199
  def server_allowed_params
196
- [ :name, :url, :version, :salt, :param ]
200
+ [ :name, :url, :salt, :param ]
197
201
  end
198
202
 
199
203
  end
@@ -8,7 +8,7 @@ class BigbluebuttonMetadata < ActiveRecord::Base
8
8
 
9
9
  validates :name, :presence => true
10
10
  validates :name, :format => {
11
- :with => /^[a-zA-Z]+[a-zA-Z\d-]*$/,
11
+ :with => /\A[a-zA-Z]+[a-zA-Z\d-]*\z/,
12
12
  :message => I18n.t('bigbluebutton_rails.metadata.errors.name_format')
13
13
  }
14
14
  validates :name,
@@ -2,8 +2,29 @@ class BigbluebuttonPlaybackFormat < ActiveRecord::Base
2
2
  include ActiveModel::ForbiddenAttributesProtection
3
3
 
4
4
  belongs_to :recording, :class_name => 'BigbluebuttonRecording'
5
+ belongs_to :playback_type, :class_name => 'BigbluebuttonPlaybackType'
6
+
7
+ delegate :name, :identifier, :visible, :visible?, :default, :default?, :description,
8
+ to: :playback_type, allow_nil: true
9
+ alias_attribute :format_type, :identifier
5
10
 
6
11
  validates :recording_id, :presence => true
7
12
 
8
- validates :format_type, :presence => true
13
+ scope :ordered, -> {
14
+ default = joins(:playback_type).where("bigbluebutton_playback_types.default = ?", true)
15
+ if default.pluck(:id).empty?
16
+ others = all
17
+ else
18
+ others = where("id NOT IN (?)", default.pluck(:id))
19
+ end
20
+ default.concat others
21
+ }
22
+
23
+ def length_in_secs
24
+ if self.length.blank? || self.length < 0
25
+ 0
26
+ else
27
+ self.length * 60
28
+ end
29
+ end
9
30
  end
@@ -0,0 +1,29 @@
1
+ class BigbluebuttonPlaybackType < ActiveRecord::Base
2
+ include ActiveModel::ForbiddenAttributesProtection
3
+
4
+ validates :identifier, :presence => true
5
+
6
+ has_many :playback_formats,
7
+ :class_name => 'BigbluebuttonPlaybackFormat',
8
+ :foreign_key => 'playback_type_id',
9
+ :dependent => :nullify
10
+
11
+ # Ensure there will be 0 or 1 (no more) records with default=true.
12
+ # Setting a record with default=true will automatically set all others to default=false.
13
+ before_save :ensure_default_uniqueness
14
+ def ensure_default_uniqueness
15
+ if default_changed? && default?
16
+ self.class.where('id != ?', self.id).update_all(default: false)
17
+ end
18
+ end
19
+
20
+ def name
21
+ default = self.identifier.gsub("_", " ").titleize
22
+ I18n.t("bigbluebutton_rails.playback_types.#{self.identifier}.name", default: default)
23
+ end
24
+
25
+ def description
26
+ default = self.identifier.gsub("_", " ").titleize
27
+ I18n.t("bigbluebutton_rails.playback_types.#{self.identifier}.tip", default: default)
28
+ end
29
+ end