Compare commits
4 Commits
API-can-fe
...
add-amendm
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a1b45ce85a | ||
|
|
1134424e37 | ||
|
|
ee710d7cd1 | ||
|
|
8214ba9e67 |
@@ -16,9 +16,10 @@ REDIS_URL=
|
|||||||
# Required for Zoom.us integration
|
# Required for Zoom.us integration
|
||||||
ZOOM_API_KEY=
|
ZOOM_API_KEY=
|
||||||
ZOOM_API_SECRET=
|
ZOOM_API_SECRET=
|
||||||
|
ZOOM_ACCOUNT_NUMBER=
|
||||||
ZOOM_PRO_USERS_LIMIT= # defaults to 3
|
ZOOM_PRO_USERS_LIMIT= # defaults to 3
|
||||||
ZOOM_USER_TYPE= # 'pro' / 'basic'
|
ZOOM_USER_TYPE= # 'pro' / 'basic'
|
||||||
ZOOM_ENABLE_RECORDINGS=0 # 0 / 1
|
ZOOM_ENABLE_RECORDINGS= # true / false (default: false)
|
||||||
# Token for webhooks authorization
|
# Token for webhooks authorization
|
||||||
ZOOM_VERIFICATION_TOKEN=
|
ZOOM_VERIFICATION_TOKEN=
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ class Admin::AccountsController < Admin::ApplicationController
|
|||||||
|
|
||||||
def show
|
def show
|
||||||
@videos = filtered_account_videos.order(created_at: :desc, project_id: :desc).paginate(page: params[:page])
|
@videos = filtered_account_videos.order(created_at: :desc, project_id: :desc).paginate(page: params[:page])
|
||||||
|
@broadcasts = account_broadcasts.order(created_at: :desc, project_id: :desc).paginate(page: params[:page])
|
||||||
end
|
end
|
||||||
|
|
||||||
def edit
|
def edit
|
||||||
@@ -70,4 +71,8 @@ class Admin::AccountsController < Admin::ApplicationController
|
|||||||
@account.videos
|
@account.videos
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def account_broadcasts
|
||||||
|
@account.broadcasts
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
24
app/controllers/admin/broadcasts_controller.rb
Normal file
24
app/controllers/admin/broadcasts_controller.rb
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
class Admin::BroadcastsController < Admin::ApplicationController
|
||||||
|
before_action :set_broadcast, only: [:edit, :update]
|
||||||
|
|
||||||
|
def edit
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
if @broadcast.update(broadcast_update_params)
|
||||||
|
redirect_to [:admin, @broadcast.project.account], notice: t(".notice")
|
||||||
|
else
|
||||||
|
render :edit
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_broadcast
|
||||||
|
@broadcast = authorize policy_scope(Broadcast).find(params[:id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def broadcast_update_params
|
||||||
|
params.require(:broadcast).permit(:stream_url_override, :stream_key_override, :director_mode_video_embed)
|
||||||
|
end
|
||||||
|
end
|
||||||
26
app/controllers/broadcast_recordings_controller.rb
Normal file
26
app/controllers/broadcast_recordings_controller.rb
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
class BroadcastRecordingsController < ApplicationController
|
||||||
|
layout "project"
|
||||||
|
|
||||||
|
before_action :set_project
|
||||||
|
before_action :set_broadcast
|
||||||
|
before_action :set_recording
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
@recording.update(hidden: true)
|
||||||
|
@recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page])
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_project
|
||||||
|
@project = policy_scope(Project).find(params[:project_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_broadcast
|
||||||
|
@broadcast = authorize policy_scope(@project.broadcasts).find(params[:broadcast_id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_recording
|
||||||
|
@recording = authorize policy_scope(@broadcast.broadcast_recordings).find(params[:id])
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -27,7 +27,7 @@ class BroadcastsController < ApplicationController
|
|||||||
|
|
||||||
def show
|
def show
|
||||||
@conference_url = url_for [@broadcast.project, @broadcast, :zoom_meeting]
|
@conference_url = url_for [@broadcast.project, @broadcast, :zoom_meeting]
|
||||||
@recordings = @broadcast.broadcast_recordings.order_by_recent.paginate(page: params[:page])
|
@recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page])
|
||||||
@files = @broadcast.files.order("created_at DESC").paginate(page: params[:files_page])
|
@files = @broadcast.files.order("created_at DESC").paginate(page: params[:files_page])
|
||||||
render layout: 'application'
|
render layout: 'application'
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ class Public::BroadcastsController < Public::BaseController
|
|||||||
def show
|
def show
|
||||||
@conference_url = broadcast_zoom_meeting_url(@broadcast.token)
|
@conference_url = broadcast_zoom_meeting_url(@broadcast.token)
|
||||||
@multi_view_broadcasts = multi_view_broadcasts
|
@multi_view_broadcasts = multi_view_broadcasts
|
||||||
@recordings = @broadcast.broadcast_recordings.order_by_recent.paginate(page: params[:page])
|
@recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page])
|
||||||
@files = @broadcast.files.order("created_at DESC").paginate(page: params[:files_page])
|
@files = @broadcast.files.order("created_at DESC").paginate(page: params[:files_page])
|
||||||
|
|
||||||
render 'broadcasts/show'
|
render 'broadcasts/show'
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ class StreamNotificationsController < ApplicationController
|
|||||||
duration = notification.dig(:data, :duration)
|
duration = notification.dig(:data, :duration)
|
||||||
|
|
||||||
recording = @broadcast.broadcast_recordings.create!(asset_uid: asset_uid, asset_playback_uid: playback_uid, file_name: file_name, duration: duration)
|
recording = @broadcast.broadcast_recordings.create!(asset_uid: asset_uid, asset_playback_uid: playback_uid, file_name: file_name, duration: duration)
|
||||||
recordings = @broadcast.broadcast_recordings.order_by_recent.paginate(page: params[:page])
|
recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page])
|
||||||
|
|
||||||
link = helpers.link_to(recording.broadcast_name.titleize, recording.download_url, target: "_blank")
|
link = helpers.link_to(recording.broadcast_name.titleize, recording.download_url, target: "_blank")
|
||||||
message = "Your recent live stream has been recorded and is available for download here: #{link}"
|
message = "Your recent live stream has been recorded and is available for download here: #{link}"
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ class Account < ApplicationRecord
|
|||||||
has_many :users, through: :account_auths
|
has_many :users, through: :account_auths
|
||||||
has_many :projects, dependent: :destroy
|
has_many :projects, dependent: :destroy
|
||||||
has_many :videos, through: :projects
|
has_many :videos, through: :projects
|
||||||
|
has_many :broadcasts, through: :projects
|
||||||
has_many :contract_templates, through: :projects
|
has_many :contract_templates, through: :projects
|
||||||
|
|
||||||
validates :name, presence: true
|
validates :name, presence: true
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ class AppearanceRelease < ApplicationRecord
|
|||||||
include SecondGuardianName
|
include SecondGuardianName
|
||||||
include CsvExportable
|
include CsvExportable
|
||||||
include Approvable
|
include Approvable
|
||||||
|
include Amendmenable
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
def custom_csv_exportable_headers
|
def custom_csv_exportable_headers
|
||||||
|
|||||||
@@ -35,7 +35,11 @@ class Broadcast < ApplicationRecord
|
|||||||
end
|
end
|
||||||
|
|
||||||
def stream_server_url
|
def stream_server_url
|
||||||
ENV['MUX_BROADCAST_SERVER_URL']
|
stream_url_override.presence || ENV["MUX_BROADCAST_SERVER_URL"]
|
||||||
|
end
|
||||||
|
|
||||||
|
def stream_server_key
|
||||||
|
stream_key_override.presence || stream_key
|
||||||
end
|
end
|
||||||
|
|
||||||
def zoom_meeting_url
|
def zoom_meeting_url
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ class BroadcastRecording < ApplicationRecord
|
|||||||
|
|
||||||
validates :asset_uid, uniqueness: true
|
validates :asset_uid, uniqueness: true
|
||||||
|
|
||||||
|
scope :visible, -> { where(hidden: false) }
|
||||||
|
|
||||||
def download_url
|
def download_url
|
||||||
"https://stream.mux.com/#{asset_playback_uid}/#{file_name}?download=#{download_file_name}"
|
"https://stream.mux.com/#{asset_playback_uid}/#{file_name}?download=#{download_file_name}"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -34,4 +34,8 @@ class AppearanceReleasePolicy < ReleasePolicy
|
|||||||
def approve?
|
def approve?
|
||||||
review?
|
review?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def sign_amendment?
|
||||||
|
user.manager? || user.account_manager?
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
9
app/policies/broadcast_recording_policy.rb
Normal file
9
app/policies/broadcast_recording_policy.rb
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
class BroadcastRecordingPolicy < ApplicationPolicy
|
||||||
|
def destroy?
|
||||||
|
if user.nil? || user.user.nil?
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
user.manager? || user.account_manager?
|
||||||
|
end
|
||||||
|
end
|
||||||
13
app/views/admin/accounts/_broadcast.html.erb
Normal file
13
app/views/admin/accounts/_broadcast.html.erb
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<tr>
|
||||||
|
<td><%= broadcast.project.name %></td>
|
||||||
|
<td><%= broadcast.name %></td>
|
||||||
|
<td class="text-right">
|
||||||
|
<div class="btn-group">
|
||||||
|
<%= button_tag "Manage", class: "btn btn-light btn-sm dropdown-toggle border", data: { toggle: "dropdown", boundary: "window" }, aria: { haspopup: true, expanded: false } %>
|
||||||
|
<div class="dropdown-menu dropdown-menu-right">
|
||||||
|
<%= link_to "View on Mux", "#{ENV['MUX_LIVE_STREAM_DASHBOARD_URL']}/#{broadcast.stream_uid}", class: "dropdown-item", target: "_blank" %>
|
||||||
|
<%= link_to "Edit", [:edit, :admin, broadcast, locale: I18n.locale], class: "dropdown-item" %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
@@ -34,5 +34,25 @@
|
|||||||
<%= will_paginate @videos %>
|
<%= will_paginate @videos %>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
<hr>
|
||||||
|
<%= card_field_set_tag "Broadcasts" do %>
|
||||||
|
<div class="table-responsive-sm">
|
||||||
|
<table class="table table-striped tr-px-4 align-all-middle">
|
||||||
|
<thead class="thead-light">
|
||||||
|
<tr>
|
||||||
|
<th>Project</th>
|
||||||
|
<th>Name</th>
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody id="broadcasts">
|
||||||
|
<%= render partial: "admin/accounts/broadcast", collection: @broadcasts %>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div id="broadcasts_pagination">
|
||||||
|
<%= will_paginate @broadcasts %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
14
app/views/admin/broadcasts/_form.html.erb
Normal file
14
app/views/admin/broadcasts/_form.html.erb
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<%= errors_summary_for broadcast %>
|
||||||
|
|
||||||
|
<%= bootstrap_form_with model: model, local: true do |form| %>
|
||||||
|
<%= form.text_field :stream_url_override %>
|
||||||
|
<%= form.text_field :stream_key_override %>
|
||||||
|
<%= form.text_area :director_mode_video_embed %>
|
||||||
|
|
||||||
|
<div class="row align-items-center text-center mt-4">
|
||||||
|
<%= link_to t("shared.cancel"), [:admin, broadcast.project.account], class: "col-3 text-reset" %>
|
||||||
|
<div class="col-9">
|
||||||
|
<%= form.submit class: class_string("btn btn-block", ["btn-success", "btn-primary"] => broadcast.new_record?), data: { disable_with: t("shared.disable_with") } %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
6
app/views/admin/broadcasts/edit.html.erb
Normal file
6
app/views/admin/broadcasts/edit.html.erb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<div class="card shadow-sm">
|
||||||
|
<%= card_header text: t(".heading"), close_action_path: [:admin, @broadcast.project.account] %>
|
||||||
|
<div class="card-body">
|
||||||
|
<%= render "form", model: [:admin, @broadcast], broadcast: @broadcast %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -34,6 +34,17 @@
|
|||||||
<td>
|
<td>
|
||||||
<%= appearance_release.signed_on %>
|
<%= appearance_release.signed_on %>
|
||||||
</td>
|
</td>
|
||||||
|
<td class="text-center">
|
||||||
|
<% if appearance_release.amendment_signed? %>
|
||||||
|
<i class="fa fa-check-square-o text-dark"
|
||||||
|
data-toggle="tooltip"
|
||||||
|
title="<%= t '.messages.amendment_signed_tooltip' %>"></i>
|
||||||
|
<% elsif appearance_release.amendment_signable? %>
|
||||||
|
<i class="fa fa-square-o"
|
||||||
|
data-toggle="tooltip"
|
||||||
|
title="<%= t '.messages.amendment_not_signed_tooltip' %>"></i>
|
||||||
|
<% end %>
|
||||||
|
</td>
|
||||||
<td class="text-right">
|
<td class="text-right">
|
||||||
<div class="btn-group">
|
<div class="btn-group">
|
||||||
<%= button_tag t(".actions.manage"), class: "btn btn-light btn-sm dropdown-toggle border", data: { toggle: "dropdown", boundary: "window" }, aria: { haspopup: true, expanded: false } %>
|
<%= button_tag t(".actions.manage"), class: "btn btn-light btn-sm dropdown-toggle border", data: { toggle: "dropdown", boundary: "window" }, aria: { haspopup: true, expanded: false } %>
|
||||||
@@ -44,6 +55,9 @@
|
|||||||
<% if policy(appearance_release.tags).new? %>
|
<% if policy(appearance_release.tags).new? %>
|
||||||
<%= link_to fa_icon("tags fw", text: "Tags"), [:new, appearance_release, :acts_as_taggable_on_tag], class: "dropdown-item", remote: true %>
|
<%= link_to fa_icon("tags fw", text: "Tags"), [:new, appearance_release, :acts_as_taggable_on_tag], class: "dropdown-item", remote: true %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
<% if policy(appearance_release).sign_amendment? && appearance_release.amendment_signable? && !appearance_release.amendment_signed? %>
|
||||||
|
<%= link_to fa_icon("file-text fw", text: t('.actions.sign_amendment')), [:new, appearance_release.project.account, appearance_release.project, appearance_release.contract_template, appearance_release, :amendment], class: "dropdown-item", target: "_blank" %>
|
||||||
|
<% end %>
|
||||||
<% if policy(Contract).show? && (appearance_release.contract.attached? || appearance_release.contract_template.present?) %>
|
<% if policy(Contract).show? && (appearance_release.contract.attached? || appearance_release.contract_template.present?) %>
|
||||||
<%= link_to fa_icon("download fw", text: "Download"), [appearance_release, :contracts, format: "pdf"], class: "dropdown-item", target: "_blank" %>
|
<%= link_to fa_icon("download fw", text: "Download"), [appearance_release, :contracts, format: "pdf"], class: "dropdown-item", target: "_blank" %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -51,6 +51,7 @@
|
|||||||
<th><%= t(".table_headers.notes") %></th>
|
<th><%= t(".table_headers.notes") %></th>
|
||||||
<th><%= t(".table_headers.tags") %></th>
|
<th><%= t(".table_headers.tags") %></th>
|
||||||
<th><%= t(".table_headers.signed_at") %></th>
|
<th><%= t(".table_headers.signed_at") %></th>
|
||||||
|
<th><%= t '.table_headers.amendment_signed' %></th>
|
||||||
<th></th>
|
<th></th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
|||||||
6
app/views/broadcast_recordings/destroy.js.erb
Normal file
6
app/views/broadcast_recordings/destroy.js.erb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
var dom_id = "<%= dom_id(@recording) %>"
|
||||||
|
$('[data-id="' + dom_id + '"]').remove();
|
||||||
|
<% if @recordings.empty? %>
|
||||||
|
$("#broadcast_recordings_nav").append('<p class="dropdown-item text-muted">Recordings will appear here</p>')
|
||||||
|
<% end %>
|
||||||
|
$("#broadcast_recordings").html("<%= j render(partial: 'broadcasts/broadcast_recordings', locals: { recordings: @recordings, broadcast: @broadcast }) %>");
|
||||||
@@ -16,8 +16,8 @@
|
|||||||
<div class="btn-group">
|
<div class="btn-group">
|
||||||
<%= button_tag t(".actions.manage"), class: "btn btn-light btn-sm dropdown-toggle border", data: { toggle: "dropdown", boundary: "window" }, aria: { haspopup: true, expanded: false } %>
|
<%= button_tag t(".actions.manage"), class: "btn btn-light btn-sm dropdown-toggle border", data: { toggle: "dropdown", boundary: "window" }, aria: { haspopup: true, expanded: false } %>
|
||||||
<div class="dropdown-menu dropdown-menu-right">
|
<div class="dropdown-menu dropdown-menu-right">
|
||||||
<%= link_to fa_icon("link fw", text: "Copy Stream URL"), ENV['MUX_BROADCAST_SERVER_URL'], class: "dropdown-item", data: { behavior: "clipboard" } %>
|
<%= link_to fa_icon("link fw", text: "Copy Stream URL"), broadcast.stream_server_url, class: "dropdown-item", data: { behavior: "clipboard" } %>
|
||||||
<%= link_to fa_icon("key fw", text: "Copy Stream Key"), broadcast.stream_key, class: "dropdown-item", data: { behavior: "clipboard" } %>
|
<%= link_to fa_icon("key fw", text: "Copy Stream Key"), broadcast.stream_server_key, class: "dropdown-item", data: { behavior: "clipboard" } %>
|
||||||
<% if policy(broadcast).show? %>
|
<% if policy(broadcast).show? %>
|
||||||
<%= link_to fa_icon("file-video-o fw", text: "View"), [broadcast.project, broadcast], class: "dropdown-item", target: '_blank' %>
|
<%= link_to fa_icon("file-video-o fw", text: "View"), [broadcast.project, broadcast], class: "dropdown-item", target: '_blank' %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -1,2 +1,3 @@
|
|||||||
<%= link_to broadcast_recording.download_file_name, "javascript:void(0);", class: "dropdown-item", data: { behavior: "play_recording", playback_url: broadcast_recording.playback_url } %>
|
<%= link_to broadcast_recording.download_file_name, "javascript:void(0);", class: "dropdown-item", data: { behavior: "play_recording", playback_url: broadcast_recording.playback_url, id: dom_id(broadcast_recording) } %>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,12 @@
|
|||||||
<p>Click below to download the recordings of the live stream.</p>
|
<p>Click below to download the recordings of the live stream.</p>
|
||||||
<ul class="mt-2">
|
<ul class="mt-2">
|
||||||
<% recordings.each do |recording| %>
|
<% recordings.each do |recording| %>
|
||||||
<li><%= link_to(recording.download_file_name, recording.download_url, target: "_blank") %></li>
|
<li>
|
||||||
|
<%= link_to(recording.download_file_name, recording.download_url, target: "_blank") %>
|
||||||
|
<% if (controller.class.module_parent.to_s != "Public" && policy(BroadcastRecording).destroy?) %>
|
||||||
|
<%= link_to "Hide", [broadcast.project, broadcast, recording], class: "btn-sm btn-primary ml-1 text-decoration-none", remote: true, method: :delete, data: { confirm: t('.confirm_hide') } %>
|
||||||
|
<% end %>
|
||||||
|
</li>
|
||||||
<% end %>
|
<% end %>
|
||||||
</ul>
|
</ul>
|
||||||
<div id="recordings_pagination" class="row mt-5 justify-content-center">
|
<div id="recordings_pagination" class="row mt-5 justify-content-center">
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
<% if broadcast.streamer_recording? && broadcast.active? %>
|
<% if broadcast.streamer_recording? && broadcast.active? %>
|
||||||
<div id="broadcast_video" class="embed-responsive-item" data-video-type="stream"></div>
|
<div id="broadcast_video" class="embed-responsive-item" data-video-type="stream"></div>
|
||||||
|
<% elsif broadcast.director_mode_video_embed.present? && params[:director_mode] == "true" %>
|
||||||
|
<div class="embed-responsive-item" data-video-type="stream">
|
||||||
|
<%= raw broadcast.director_mode_video_embed %>
|
||||||
|
</div>
|
||||||
<% else %>
|
<% else %>
|
||||||
<div id="broadcast_video" class="embed-responsive-item" data-video-type="stream">
|
<div id="broadcast_video" class="embed-responsive-item" data-video-type="stream">
|
||||||
<table class="w-100 h-100 bg-secondary">
|
<table class="w-100 h-100 bg-secondary">
|
||||||
|
|||||||
@@ -39,6 +39,15 @@
|
|||||||
<%= link_to broadcast.name.titleize, broadcast.url, data: { behavior: "play_stream"}, class: class_string("dropdown-item", "active" => @broadcast.id == broadcast.id) %>
|
<%= link_to broadcast.name.titleize, broadcast.url, data: { behavior: "play_stream"}, class: class_string("dropdown-item", "active" => @broadcast.id == broadcast.id) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
<% if @broadcast.director_mode_video_embed.present? %>
|
||||||
|
<h5 class="dropdown-header">Director Mode</h5>
|
||||||
|
<% unless params[:director_mode] %>
|
||||||
|
<%= link_to "Enable Director Mode", url_for(params.permit!.merge(director_mode: true)), class: "dropdown-item" %>
|
||||||
|
<% else %>
|
||||||
|
<%= link_to "Disable Director Mode", url_for(params.permit!.except(:director_mode)), class: "dropdown-item" %>
|
||||||
|
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
<h5 class="dropdown-header">Previous Sessions</h5>
|
<h5 class="dropdown-header">Previous Sessions</h5>
|
||||||
<div id="broadcast_recordings_nav">
|
<div id="broadcast_recordings_nav">
|
||||||
<% if @recordings.any? %>
|
<% if @recordings.any? %>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<%= field_set_tag content_tag(:span, t(".release_info.heading"), class: "h6 text-muted text-uppercase") do %>
|
<%= field_set_tag content_tag(:span, t(".release_info.heading"), class: "h6 text-muted text-uppercase") do %>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<%= form.text_field :name, wrapper_class: "col-sm-6" %>
|
<%= form.text_field :name, wrapper_class: "col-sm-6" %>
|
||||||
<%= form.select :release_type, options_for_release_type_select(project, @release_type), { wrapper_class: "col-sm-6" }, data: { toggle: "collapse-select", target_show_values_mapping: { "#guardian_clause": %w(acquired_media appearance talent material misc medical), "#fee_field": %w(appearance talent location material acquired_media), "#exploitable_rights_fields": %w(appearance talent location material acquired_media), "#custom_fields": %w(medical misc), "#amendment_clause": %w(location) } }, class: "form-control custom-select" %>
|
<%= form.select :release_type, options_for_release_type_select(project, @release_type), { wrapper_class: "col-sm-6" }, data: { toggle: "collapse-select", target_show_values_mapping: { "#guardian_clause": %w(acquired_media appearance talent material misc medical), "#fee_field": %w(appearance talent location material acquired_media), "#exploitable_rights_fields": %w(appearance talent location material acquired_media), "#custom_fields": %w(medical misc), "#amendment_clause": %w(appearance location) } }, class: "form-control custom-select" %>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row mb-3">
|
<div class="form-row mb-3">
|
||||||
<%= form.radio_button :accessibility, :public_template, label: "Public", wrapper_class: "mr-3" %>
|
<%= form.radio_button :accessibility, :public_template, label: "Public", wrapper_class: "mr-3" %>
|
||||||
|
|||||||
@@ -16,10 +16,10 @@
|
|||||||
<% end %>
|
<% end %>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<%= location_release.name %>
|
<%= contact_info(name: location_release.name, address: location_release.address) %>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<%= contact_info address: location_release.address %>
|
<%= contact_info_for(location_release.contact_person) %>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<%= notes_preview location_release.notes.order_by_recent %>
|
<%= notes_preview location_release.notes.order_by_recent %>
|
||||||
|
|||||||
@@ -28,8 +28,8 @@
|
|||||||
<th data-behavior="all-selectable"><%= check_box_tag "location_release_ids[]", false, false %></th>
|
<th data-behavior="all-selectable"><%= check_box_tag "location_release_ids[]", false, false %></th>
|
||||||
<th><%= t '.table_headers.approved'%></th>
|
<th><%= t '.table_headers.approved'%></th>
|
||||||
<th></th>
|
<th></th>
|
||||||
<th><%= t(".table_headers.name") %></th>
|
<th><%= t(".table_headers.location_info") %></th>
|
||||||
<th><%= t(".table_headers.address") %>
|
<th><%= t(".table_headers.owner_info") %>
|
||||||
<th><%= t(".table_headers.notes") %></th>
|
<th><%= t(".table_headers.notes") %></th>
|
||||||
<th><%= t(".table_headers.tags") %></th>
|
<th><%= t(".table_headers.tags") %></th>
|
||||||
<th><%= t(".table_headers.signed_at") %></th>
|
<th><%= t(".table_headers.signed_at") %></th>
|
||||||
|
|||||||
@@ -8,6 +8,10 @@
|
|||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<%= errors_summary_for @release %>
|
<%= errors_summary_for @release %>
|
||||||
<%= bootstrap_form_with model: @release, method: :post, url: public_send("account_project_contract_template_#{@contract_template.release_type}_release_amendments_path"), local: true do |form| %>
|
<%= bootstrap_form_with model: @release, method: :post, url: public_send("account_project_contract_template_#{@contract_template.release_type}_release_amendments_path"), local: true do |form| %>
|
||||||
|
<%= card_field_set_tag t('.signed_contract_preview') do %>
|
||||||
|
<embed class="embeded-contract-preview" type="application/pdf" src="<%= url_for([@release, :contracts, format: "pdf"]) %>" width="80%" height="1200" />
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<%= card_field_set_tag t(".amendment.heading") do %>
|
<%= card_field_set_tag t(".amendment.heading") do %>
|
||||||
<p><%= @contract_template.amendment_clause %></p>
|
<p><%= @contract_template.amendment_clause %></p>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -111,6 +111,11 @@ en:
|
|||||||
application:
|
application:
|
||||||
header:
|
header:
|
||||||
sign_out: Sign Out
|
sign_out: Sign Out
|
||||||
|
broadcasts:
|
||||||
|
edit:
|
||||||
|
heading: Edit Broadcast
|
||||||
|
update:
|
||||||
|
notice: The broadcast has been updated
|
||||||
task_requests:
|
task_requests:
|
||||||
index:
|
index:
|
||||||
empty: Task requests will appear here
|
empty: Task requests will appear here
|
||||||
@@ -135,7 +140,10 @@ en:
|
|||||||
actions:
|
actions:
|
||||||
manage: Manage
|
manage: Manage
|
||||||
review: Review
|
review: Review
|
||||||
|
sign_amendment: Sign Additional Clause
|
||||||
messages:
|
messages:
|
||||||
|
amendment_not_signed_tooltip: Secondary Clause Not Yet Signed
|
||||||
|
amendment_signed_tooltip: Secondary Clause Signed
|
||||||
approved_tooltip: Approved by %{user} on %{timestamp}
|
approved_tooltip: Approved by %{user} on %{timestamp}
|
||||||
no_photos: Needs Photo
|
no_photos: Needs Photo
|
||||||
create:
|
create:
|
||||||
@@ -168,6 +176,7 @@ en:
|
|||||||
empty: Appearance Releases will appear here
|
empty: Appearance Releases will appear here
|
||||||
imported_appearance_release_missing_attachment: Person photo or contract missing for imported appearance release
|
imported_appearance_release_missing_attachment: Person photo or contract missing for imported appearance release
|
||||||
table_headers:
|
table_headers:
|
||||||
|
amendment_signed: Additional Clause
|
||||||
approved: Approved
|
approved: Approved
|
||||||
contact_info: Contact info
|
contact_info: Contact info
|
||||||
name: Name
|
name: Name
|
||||||
@@ -218,6 +227,8 @@ en:
|
|||||||
broadcast:
|
broadcast:
|
||||||
actions:
|
actions:
|
||||||
manage: Manage
|
manage: Manage
|
||||||
|
broadcast_recordings:
|
||||||
|
confirm_hide: Are you sure you want to hide this recording from everyone?
|
||||||
create:
|
create:
|
||||||
notice: A live stream has been created
|
notice: A live stream has been created
|
||||||
destroy:
|
destroy:
|
||||||
@@ -342,7 +353,7 @@ en:
|
|||||||
amendment_clause: Amendment Clause
|
amendment_clause: Amendment Clause
|
||||||
amendment_signature: Amendment Signature
|
amendment_signature: Amendment Signature
|
||||||
amendment_signer_name: Amendment Signer Name
|
amendment_signer_name: Amendment Signer Name
|
||||||
heading: Amendment
|
heading: Secondary Clause
|
||||||
for_office_use_only:
|
for_office_use_only:
|
||||||
description_labels:
|
description_labels:
|
||||||
date_issued: Date Issued
|
date_issued: Date Issued
|
||||||
@@ -511,6 +522,8 @@ en:
|
|||||||
person_last_name: Last name
|
person_last_name: Last name
|
||||||
person_name: Name
|
person_name: Name
|
||||||
person_phone: Phone number
|
person_phone: Phone number
|
||||||
|
contract_template:
|
||||||
|
amendment_clause: Secondary Clause
|
||||||
location_release:
|
location_release:
|
||||||
address_city: City
|
address_city: City
|
||||||
address_country: Country
|
address_country: Country
|
||||||
@@ -841,11 +854,11 @@ en:
|
|||||||
search: Search
|
search: Search
|
||||||
empty: Location Releases will appear here
|
empty: Location Releases will appear here
|
||||||
table_headers:
|
table_headers:
|
||||||
address: Address
|
|
||||||
amendment_signed: Amendment
|
amendment_signed: Amendment
|
||||||
approved: Approved
|
approved: Approved
|
||||||
name: Location Name
|
location_info: Location Info
|
||||||
notes: Notes
|
notes: Notes
|
||||||
|
owner_info: Owner Info
|
||||||
signed_at: Date Signed
|
signed_at: Date Signed
|
||||||
tags: Tags
|
tags: Tags
|
||||||
location_release:
|
location_release:
|
||||||
@@ -1138,6 +1151,7 @@ en:
|
|||||||
copy_url: Copy sign amendment URL
|
copy_url: Copy sign amendment URL
|
||||||
signature:
|
signature:
|
||||||
heading: Signature
|
heading: Signature
|
||||||
|
signed_contract_preview: Signed Contract Preview
|
||||||
appearance_releases:
|
appearance_releases:
|
||||||
create:
|
create:
|
||||||
notice: Your release has been signed. Thank you!
|
notice: Your release has been signed. Thank you!
|
||||||
|
|||||||
@@ -45,6 +45,13 @@ es:
|
|||||||
models:
|
models:
|
||||||
appearance_release: Autorización de Aparacimiento
|
appearance_release: Autorización de Aparacimiento
|
||||||
appearance_releases:
|
appearance_releases:
|
||||||
|
appearance_release:
|
||||||
|
actions:
|
||||||
|
sign_amendment: Sign Additional Clause (ES)
|
||||||
|
manage: Manage (ES)
|
||||||
|
messages:
|
||||||
|
amendment_not_signed_tooltip: Amendment not yet signed (ES)
|
||||||
|
amendment_signed_tooltip: Amendment signed (ES)
|
||||||
create:
|
create:
|
||||||
failed_import: Failed to create appearance release for files listed below (ES)
|
failed_import: Failed to create appearance release for files listed below (ES)
|
||||||
matching_started: Matching started (ES)
|
matching_started: Matching started (ES)
|
||||||
@@ -64,6 +71,7 @@ es:
|
|||||||
index:
|
index:
|
||||||
imported_appearance_release_missing_attachment: Person photo or contract missing for imported appearance release (ES)
|
imported_appearance_release_missing_attachment: Person photo or contract missing for imported appearance release (ES)
|
||||||
table_headers:
|
table_headers:
|
||||||
|
amendment_signed: Additional Clause (ES)
|
||||||
contact_info: ""
|
contact_info: ""
|
||||||
name: ""
|
name: ""
|
||||||
notes: ""
|
notes: ""
|
||||||
@@ -169,7 +177,7 @@ es:
|
|||||||
amendment_clause: Amendment Clause (ES)
|
amendment_clause: Amendment Clause (ES)
|
||||||
amendment_signature: Amendment Signature (ES)
|
amendment_signature: Amendment Signature (ES)
|
||||||
amendment_signer_name: Amendment Signer Name (ES)
|
amendment_signer_name: Amendment Signer Name (ES)
|
||||||
heading: Amendment (ES)
|
heading: Secondary Clause (ES)
|
||||||
for_office_use_only:
|
for_office_use_only:
|
||||||
description_labels:
|
description_labels:
|
||||||
date_issued: Date Issued (ES)
|
date_issued: Date Issued (ES)
|
||||||
@@ -504,6 +512,7 @@ es:
|
|||||||
copy_url: Copy sign amendment URL (ES)
|
copy_url: Copy sign amendment URL (ES)
|
||||||
signature:
|
signature:
|
||||||
heading: Signature (ES)
|
heading: Signature (ES)
|
||||||
|
signed_contract_preview: Signed Contract Preview (ES)
|
||||||
appearance_releases:
|
appearance_releases:
|
||||||
create:
|
create:
|
||||||
notice: La autorización está firmada. ¡Gracias!
|
notice: La autorización está firmada. ¡Gracias!
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ Rails.application.routes.draw do
|
|||||||
resource :masquerade, only: :create
|
resource :masquerade, only: :create
|
||||||
end
|
end
|
||||||
resources :task_requests, only: [:index, :edit, :update, :show]
|
resources :task_requests, only: [:index, :edit, :update, :show]
|
||||||
|
resources :broadcasts, only: [:edit, :update]
|
||||||
|
|
||||||
root to: "accounts#index", as: :signed_in_root
|
root to: "accounts#index", as: :signed_in_root
|
||||||
end
|
end
|
||||||
@@ -100,6 +101,7 @@ Rails.application.routes.draw do
|
|||||||
delete :destroy_file
|
delete :destroy_file
|
||||||
end
|
end
|
||||||
resource :zoom_meeting, only: [:show]
|
resource :zoom_meeting, only: [:show]
|
||||||
|
resources :broadcast_recordings, only: :destroy
|
||||||
end
|
end
|
||||||
resources :directories, except: [:index] do
|
resources :directories, except: [:index] do
|
||||||
member do
|
member do
|
||||||
@@ -129,7 +131,9 @@ Rails.application.routes.draw do
|
|||||||
resources :projects, only: [] do
|
resources :projects, only: [] do
|
||||||
resources :contract_templates, only: [:index] do
|
resources :contract_templates, only: [:index] do
|
||||||
resources :talent_releases, only: [:new, :create]
|
resources :talent_releases, only: [:new, :create]
|
||||||
resources :appearance_releases, only: [:new, :create]
|
resources :appearance_releases, only: [:new, :create] do
|
||||||
|
resources :amendments, only: [:new, :create]
|
||||||
|
end
|
||||||
resources :acquired_media_releases, only: [:new, :create]
|
resources :acquired_media_releases, only: [:new, :create]
|
||||||
resources :location_releases, only: [:new, :create] do
|
resources :location_releases, only: [:new, :create] do
|
||||||
resources :amendments, only: [:new, :create]
|
resources :amendments, only: [:new, :create]
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
class AddHiddenFieldToBroadcastRecordings < ActiveRecord::Migration[6.0]
|
||||||
|
def change
|
||||||
|
add_column :broadcast_recordings, :hidden, :boolean, default: false
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
class AddStreamAndKeyOverrideToBroadcasts < ActiveRecord::Migration[6.0]
|
||||||
|
def change
|
||||||
|
add_column :broadcasts, :stream_url_override, :string
|
||||||
|
add_column :broadcasts, :stream_key_override, :string
|
||||||
|
add_column :broadcasts, :youtube_uid, :string
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
class RemoveYoutubeUidFromBroadcasts < ActiveRecord::Migration[6.0]
|
||||||
|
def change
|
||||||
|
remove_column :broadcasts, :youtube_uid, :string
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
class AddDirectorModeVideoEmbedToBroadcasts < ActiveRecord::Migration[6.0]
|
||||||
|
def change
|
||||||
|
add_column :broadcasts, :director_mode_video_embed, :text
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
class AddAmendmentSignerDetailsToAppearanceReleases < ActiveRecord::Migration[6.0]
|
||||||
|
def change
|
||||||
|
add_column :appearance_releases, :amendment_signer_name, :string
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -9,20 +9,6 @@ SET xmloption = content;
|
|||||||
SET client_min_messages = warning;
|
SET client_min_messages = warning;
|
||||||
SET row_security = off;
|
SET row_security = off;
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
|
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Name: fuzzystrmatch; Type: EXTENSION; Schema: -; Owner: -
|
-- Name: fuzzystrmatch; Type: EXTENSION; Schema: -; Owner: -
|
||||||
--
|
--
|
||||||
@@ -379,7 +365,8 @@ CREATE TABLE public.appearance_releases (
|
|||||||
guardian_2_address_country character varying,
|
guardian_2_address_country character varying,
|
||||||
approved_by_user_name text,
|
approved_by_user_name text,
|
||||||
approved_by_user_email text,
|
approved_by_user_email text,
|
||||||
approved_at timestamp without time zone
|
approved_at timestamp without time zone,
|
||||||
|
amendment_signer_name character varying
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
@@ -536,7 +523,8 @@ CREATE TABLE public.broadcast_recordings (
|
|||||||
file_name character varying NOT NULL,
|
file_name character varying NOT NULL,
|
||||||
created_at timestamp(6) without time zone NOT NULL,
|
created_at timestamp(6) without time zone NOT NULL,
|
||||||
updated_at timestamp(6) without time zone NOT NULL,
|
updated_at timestamp(6) without time zone NOT NULL,
|
||||||
duration double precision
|
duration double precision,
|
||||||
|
hidden boolean DEFAULT false
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
@@ -576,7 +564,10 @@ CREATE TABLE public.broadcasts (
|
|||||||
token character varying,
|
token character varying,
|
||||||
streamer_status integer DEFAULT 0,
|
streamer_status integer DEFAULT 0,
|
||||||
shoot_location_time_zone character varying DEFAULT 'UTC'::character varying,
|
shoot_location_time_zone character varying DEFAULT 'UTC'::character varying,
|
||||||
full_live_stream_playback_uid character varying
|
full_live_stream_playback_uid character varying,
|
||||||
|
stream_url_override character varying,
|
||||||
|
stream_key_override character varying,
|
||||||
|
director_mode_video_embed text
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
@@ -1475,6 +1466,7 @@ CREATE TABLE public.settings (
|
|||||||
--
|
--
|
||||||
|
|
||||||
CREATE SEQUENCE public.settings_id_seq
|
CREATE SEQUENCE public.settings_id_seq
|
||||||
|
AS integer
|
||||||
START WITH 1
|
START WITH 1
|
||||||
INCREMENT BY 1
|
INCREMENT BY 1
|
||||||
NO MINVALUE
|
NO MINVALUE
|
||||||
@@ -1510,6 +1502,7 @@ CREATE TABLE public.taggings (
|
|||||||
--
|
--
|
||||||
|
|
||||||
CREATE SEQUENCE public.taggings_id_seq
|
CREATE SEQUENCE public.taggings_id_seq
|
||||||
|
AS integer
|
||||||
START WITH 1
|
START WITH 1
|
||||||
INCREMENT BY 1
|
INCREMENT BY 1
|
||||||
NO MINVALUE
|
NO MINVALUE
|
||||||
@@ -1540,6 +1533,7 @@ CREATE TABLE public.tags (
|
|||||||
--
|
--
|
||||||
|
|
||||||
CREATE SEQUENCE public.tags_id_seq
|
CREATE SEQUENCE public.tags_id_seq
|
||||||
|
AS integer
|
||||||
START WITH 1
|
START WITH 1
|
||||||
INCREMENT BY 1
|
INCREMENT BY 1
|
||||||
NO MINVALUE
|
NO MINVALUE
|
||||||
@@ -3998,7 +3992,12 @@ INSERT INTO "schema_migrations" (version) VALUES
|
|||||||
('20200720051634'),
|
('20200720051634'),
|
||||||
('20200720131309'),
|
('20200720131309'),
|
||||||
('20200721140821'),
|
('20200721140821'),
|
||||||
|
('20200724084722'),
|
||||||
('20200725231419'),
|
('20200725231419'),
|
||||||
('20200727143209');
|
('20200727143209'),
|
||||||
|
('20200730050903'),
|
||||||
|
('20200803145912'),
|
||||||
|
('20200803150138'),
|
||||||
|
('20200804093409');
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ RSpec.describe BroadcastsChannel, type: :channel do
|
|||||||
describe '#stream_recording_ready' do
|
describe '#stream_recording_ready' do
|
||||||
it 'broadcasts to the channel with the right data' do
|
it 'broadcasts to the channel with the right data' do
|
||||||
create_list(:broadcast_recording, 1, broadcast: broadcast)
|
create_list(:broadcast_recording, 1, broadcast: broadcast)
|
||||||
recordings = broadcast.broadcast_recordings.paginate(page: 1)
|
recordings = broadcast.broadcast_recordings.visible.paginate(page: 1)
|
||||||
flash_message = OpenStruct.new(notice: 'Hello world', alert: nil)
|
flash_message = OpenStruct.new(notice: 'Hello world', alert: nil)
|
||||||
flash_content = ApplicationController.render partial: 'application/flash', locals: { flash: flash_message }
|
flash_content = ApplicationController.render partial: 'application/flash', locals: { flash: flash_message }
|
||||||
recordings_content = ApplicationController.render partial: 'broadcasts/broadcast_recordings', locals: { recordings: recordings, broadcast: broadcast }
|
recordings_content = ApplicationController.render partial: 'broadcasts/broadcast_recordings', locals: { recordings: recordings, broadcast: broadcast }
|
||||||
|
|||||||
@@ -116,6 +116,16 @@ RSpec.describe Admin::AccountsController, type: :controller do
|
|||||||
expect(response.body).to have_link("2", href: admin_account_path(current_user.primary_account, page: 2))
|
expect(response.body).to have_link("2", href: admin_account_path(current_user.primary_account, page: 2))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "paginates the broadcast list" do
|
||||||
|
allow(MuxLiveStream).to receive(:new).and_return(double(id: "id", key: "key", playback_id: "playback_id"))
|
||||||
|
project = create(:project, account: current_user.primary_account)
|
||||||
|
create_list(:broadcast, 20, project: project )
|
||||||
|
|
||||||
|
get :show, params: { id: current_user.primary_account }
|
||||||
|
|
||||||
|
expect(response.body).to have_link("2", href: admin_account_path(current_user.primary_account, page: 2))
|
||||||
|
end
|
||||||
|
|
||||||
it "filters the videos by a query param" do
|
it "filters the videos by a query param" do
|
||||||
project = create(:project, account: current_user.primary_account)
|
project = create(:project, account: current_user.primary_account)
|
||||||
create(:video, project: project, name: "First video")
|
create(:video, project: project, name: "First video")
|
||||||
|
|||||||
77
spec/controllers/admin/broadcasts_controller_spec.rb
Normal file
77
spec/controllers/admin/broadcasts_controller_spec.rb
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
require "rails_helper"
|
||||||
|
|
||||||
|
RSpec.describe Admin::BroadcastsController, type: :controller do
|
||||||
|
render_views
|
||||||
|
|
||||||
|
let!(:current_user) { create(:user, :admin) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
sign_in(current_user)
|
||||||
|
allow(MuxLiveStream).to receive(:new).and_return(double(id: "id", key: "key", playback_id: "playback_id"))
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#edit" do
|
||||||
|
let(:broadcast) { create(:broadcast) }
|
||||||
|
|
||||||
|
it "returns a successful response" do
|
||||||
|
get :edit, params: { id: broadcast }
|
||||||
|
|
||||||
|
expect(response).to be_successful
|
||||||
|
end
|
||||||
|
|
||||||
|
it "assigns broadcast" do
|
||||||
|
get :edit, params: { id: broadcast }
|
||||||
|
|
||||||
|
expect(assigns(:broadcast)).to eq broadcast
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#update" do
|
||||||
|
let(:broadcast) { create(:broadcast) }
|
||||||
|
|
||||||
|
it "redirects to broadcasts page" do
|
||||||
|
patch :update, params: { id: broadcast, broadcast: broadcast_update_params }
|
||||||
|
|
||||||
|
expect(response).to be_redirect
|
||||||
|
expect(response).to redirect_to [:admin, broadcast.project.account]
|
||||||
|
end
|
||||||
|
|
||||||
|
it "sets a flash notice" do
|
||||||
|
patch :update, params: { id: broadcast, broadcast: broadcast_update_params }
|
||||||
|
|
||||||
|
expect(flash.notice).to eq "The broadcast has been updated"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "updates the broadcast record" do
|
||||||
|
patch :update, params: { id: broadcast, broadcast: broadcast_update_params }
|
||||||
|
|
||||||
|
expect(assigns(:broadcast)).to have_attributes(
|
||||||
|
stream_url_override: "https://example.com/streams/abcd",
|
||||||
|
stream_key_override: "abcdef",
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when record cannot be saved" do
|
||||||
|
before do
|
||||||
|
allow_any_instance_of(Broadcast).to receive(:update).and_return(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "re-displays the form" do
|
||||||
|
patch :update, params: { id: broadcast, broadcast: broadcast_update_params }
|
||||||
|
|
||||||
|
expect(response).to be_successful
|
||||||
|
expect(flash.notice).to be_nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def broadcast_update_params
|
||||||
|
{
|
||||||
|
stream_url_override: "https://example.com/streams/abcd",
|
||||||
|
stream_key_override: "abcdef",
|
||||||
|
director_mode_video_embed: "<iframe>Video player</iframe>",
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
30
spec/controllers/broadcast_recordings_controller_spec.rb
Normal file
30
spec/controllers/broadcast_recordings_controller_spec.rb
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe BroadcastRecordingsController, type: :controller do
|
||||||
|
render_views
|
||||||
|
|
||||||
|
let(:user) { create(:user) }
|
||||||
|
let(:account) { user.primary_account }
|
||||||
|
let(:project) { create(:project, account: user.primary_account) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
sign_in user
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#destroy" do
|
||||||
|
let(:broadcast) { create(:broadcast, project: project, name: "New Broadcast") }
|
||||||
|
let(:recording) { create(:broadcast_recording, broadcast: broadcast) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
allow(MuxLiveStream).to receive(:new).and_return(double(id: "id", key: "key", playback_id: "playback_id"))
|
||||||
|
end
|
||||||
|
|
||||||
|
it "hides the broadcast recording" do
|
||||||
|
expect(recording.hidden).to be false
|
||||||
|
|
||||||
|
post :destroy, params: { project_id: project, broadcast_id: broadcast, id: recording }, xhr: true
|
||||||
|
|
||||||
|
expect(recording.reload.hidden).to be true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -184,6 +184,35 @@ RSpec.describe BroadcastsController, type: :controller do
|
|||||||
expect(response.body).to have_selector(".dropdown-menu a.dropdown-item", text: recording.download_file_name)
|
expect(response.body).to have_selector(".dropdown-menu a.dropdown-item", text: recording.download_file_name)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "when virtual director video embed is available" do
|
||||||
|
let(:broadcast) { create(:broadcast, project: project, name: "Another Broadcast",
|
||||||
|
director_mode_video_embed: "<iframe>video player</iframe>") }
|
||||||
|
|
||||||
|
it "renders the view dropdown with a director mode enable option" do
|
||||||
|
get :show, params: { project_id: project, id: broadcast }
|
||||||
|
|
||||||
|
expect(response.body).to have_content "Switch View"
|
||||||
|
expect(response.body).to have_selector(".dropdown-menu h5.dropdown-header", text: "Director Mode")
|
||||||
|
expect(response.body).to have_selector(".dropdown-menu a.dropdown-item", text: "Enable Director Mode")
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when director mode is enabled" do
|
||||||
|
it "shows the video embed" do
|
||||||
|
get :show, params: { project_id: project, id: broadcast, director_mode: true }
|
||||||
|
|
||||||
|
expect(response.body).to have_selector("iframe", text: "video player")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "renders the view dropdown with a director mode disable option" do
|
||||||
|
get :show, params: { project_id: project, id: broadcast, director_mode: true }
|
||||||
|
|
||||||
|
expect(response.body).to have_content "Switch View"
|
||||||
|
expect(response.body).to have_selector(".dropdown-menu h5.dropdown-header", text: "Director Mode")
|
||||||
|
expect(response.body).to have_selector(".dropdown-menu a.dropdown-item", text: "Disable Director Mode")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "#update" do
|
describe "#update" do
|
||||||
|
|||||||
@@ -4,96 +4,108 @@ RSpec.describe Public::AmendmentsController, type: :controller do
|
|||||||
let(:user) { create(:user) }
|
let(:user) { create(:user) }
|
||||||
let(:account) { user.primary_account }
|
let(:account) { user.primary_account }
|
||||||
let(:project) { create(:project, account: account) }
|
let(:project) { create(:project, account: account) }
|
||||||
let(:contract_template) { create(:location_release_contract_template, :with_amendment_clause, project: project) }
|
|
||||||
let(:location_release) { create(:location_release, contract_template: contract_template, project: project) }
|
|
||||||
|
|
||||||
render_views
|
render_views
|
||||||
|
|
||||||
describe "#new" do
|
shared_examples "amendments signing controller" do
|
||||||
it "shows amendment signing form for non-signed amendment of a release" do
|
describe "#new" do
|
||||||
expect(location_release.amendment_signed?).to be_falsey
|
it "shows amendment signing form for non-signed amendment of a release" do
|
||||||
|
expect(subject.amendment_signed?).to be_falsey
|
||||||
|
|
||||||
get :new, params: {
|
get :new, params: {
|
||||||
account_id: account,
|
account_id: account,
|
||||||
project_id: project,
|
project_id: project,
|
||||||
contract_template_id: location_release.contract_template,
|
contract_template_id: subject.contract_template,
|
||||||
location_release_id: location_release
|
"#{subject.model_name.param_key}_id": subject
|
||||||
}
|
}
|
||||||
|
|
||||||
expect(response).to be_successful
|
expect(response).to be_successful
|
||||||
|
|
||||||
body = CGI.unescape_html(response.body)
|
body = CGI.unescape_html(response.body)
|
||||||
expect(body).not_to match already_signed_message
|
expect(body).not_to match already_signed_message
|
||||||
|
end
|
||||||
|
|
||||||
|
it "shows already signed message for signed amendment of a release" do
|
||||||
|
expect(signed_release.amendment_signed?).to be_truthy
|
||||||
|
|
||||||
|
get :new, params: {
|
||||||
|
account_id: account,
|
||||||
|
project_id: project,
|
||||||
|
contract_template_id: signed_release.contract_template,
|
||||||
|
"#{signed_release.model_name.param_key}_id": signed_release
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(response).to be_successful
|
||||||
|
|
||||||
|
body = CGI.unescape_html(response.body)
|
||||||
|
expect(body).to match already_signed_message
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it "shows already signed message for signed amendment of a release" do
|
describe "#create" do
|
||||||
signed_release = create(:location_release, :amendment_signed, contract_template: contract_template, project: project)
|
it "signs amendment" do
|
||||||
|
expect(subject.amendment_signed?).to be_falsey
|
||||||
|
|
||||||
expect(signed_release.amendment_signed?).to be_truthy
|
post :create, params: {
|
||||||
|
account_id: account,
|
||||||
|
project_id: project,
|
||||||
|
contract_template_id: subject.contract_template,
|
||||||
|
"#{subject.model_name.param_key}_id": subject,
|
||||||
|
"#{subject.model_name.param_key}": {
|
||||||
|
amendment_signer_name: "Signer Name",
|
||||||
|
amendment_signature_base64: signature_base64
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
get :new, params: {
|
expect(response).to be_successful
|
||||||
account_id: account,
|
|
||||||
project_id: project,
|
|
||||||
contract_template_id: location_release.contract_template,
|
|
||||||
location_release_id: signed_release
|
|
||||||
}
|
|
||||||
|
|
||||||
expect(response).to be_successful
|
body = CGI.unescape_html(response.body)
|
||||||
|
expect(body).not_to match already_signed_message
|
||||||
|
expect(body).to match signed_successfully_message
|
||||||
|
|
||||||
body = CGI.unescape_html(response.body)
|
expect(subject.class.last.amendment_signed?).to be_truthy
|
||||||
expect(body).to match already_signed_message
|
expect(subject.class.last.amendment_signer_name).to eq "Signer Name"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "shows already signed message for signed amendment of a release" do
|
||||||
|
expect(signed_release.amendment_signed?).to be_truthy
|
||||||
|
|
||||||
|
post :create, params: {
|
||||||
|
account_id: account,
|
||||||
|
project_id: project,
|
||||||
|
contract_template_id: signed_release.contract_template,
|
||||||
|
"#{signed_release.model_name.param_key}_id": signed_release,
|
||||||
|
"#{signed_release.model_name.param_key}": {
|
||||||
|
amendment_signer_name: "Signer Who",
|
||||||
|
amendment_signature_base64: signature_base64
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(response).to be_successful
|
||||||
|
|
||||||
|
body = CGI.unescape_html(response.body)
|
||||||
|
expect(body).to match already_signed_message
|
||||||
|
|
||||||
|
expect(signed_release.amendment_signed?).to be_truthy
|
||||||
|
expect(signed_release.amendment_signer_name).to eq "Amendment Signer"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "#create" do
|
context "for location release" do
|
||||||
it "signs amendment" do
|
let(:contract_template) { create(:location_release_contract_template, :with_amendment_clause, project: project) }
|
||||||
expect(location_release.amendment_signed?).to be_falsey
|
let(:signed_release) { create(:location_release, :amendment_signed, contract_template: contract_template, project: project) }
|
||||||
|
subject { create(:location_release, contract_template: contract_template, project: project) }
|
||||||
|
|
||||||
post :create, params: {
|
it_behaves_like "amendments signing controller"
|
||||||
account_id: account,
|
end
|
||||||
project_id: project,
|
|
||||||
contract_template_id: location_release.contract_template,
|
|
||||||
location_release_id: location_release,
|
|
||||||
location_release: {
|
|
||||||
amendment_signer_name: "Signer Name",
|
|
||||||
amendment_signature_base64: signature_base64
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
expect(response).to be_successful
|
context "for location release" do
|
||||||
|
let(:contract_template) { create(:appearance_release_contract_template, :with_amendment_clause, project: project) }
|
||||||
|
let(:signed_release) { create(:appearance_release, :amendment_signed, contract_template: contract_template, project: project) }
|
||||||
|
subject { create(:appearance_release, contract_template: contract_template, project: project) }
|
||||||
|
|
||||||
body = CGI.unescape_html(response.body)
|
it_behaves_like "amendments signing controller"
|
||||||
expect(body).not_to match already_signed_message
|
|
||||||
expect(body).to match signed_successfully_message
|
|
||||||
|
|
||||||
expect(LocationRelease.last.amendment_signed?).to be_truthy
|
|
||||||
expect(LocationRelease.last.amendment_signer_name).to eq "Signer Name"
|
|
||||||
end
|
|
||||||
|
|
||||||
it "shows already signed message for signed amendment of a release" do
|
|
||||||
signed_release = create(:location_release, :amendment_signed, name: "Test Loc", amendment_signer_name: "Big Signer", contract_template: contract_template, project: project)
|
|
||||||
|
|
||||||
expect(signed_release.amendment_signed?).to be_truthy
|
|
||||||
|
|
||||||
post :create, params: {
|
|
||||||
account_id: account,
|
|
||||||
project_id: project,
|
|
||||||
contract_template_id: location_release.contract_template,
|
|
||||||
location_release_id: signed_release,
|
|
||||||
location_release: {
|
|
||||||
amendment_signer_name: "Signer Who",
|
|
||||||
amendment_signature_base64: signature_base64
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
expect(response).to be_successful
|
|
||||||
|
|
||||||
body = CGI.unescape_html(response.body)
|
|
||||||
expect(body).to match already_signed_message
|
|
||||||
|
|
||||||
expect(signed_release.amendment_signed?).to be_truthy
|
|
||||||
expect(signed_release.amendment_signer_name).to eq "Big Signer"
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|||||||
@@ -32,6 +32,14 @@ FactoryBot.define do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
trait :amendment_signed do
|
||||||
|
amendment_signature do
|
||||||
|
path = Rails.root.join("spec", "fixtures", "files", "signature.png")
|
||||||
|
Rack::Test::UploadedFile.new(path, "image/png")
|
||||||
|
end
|
||||||
|
amendment_signer_name "Amendment Signer"
|
||||||
|
end
|
||||||
|
|
||||||
trait :minor do
|
trait :minor do
|
||||||
minor true
|
minor true
|
||||||
guardian_first_name "Jamie"
|
guardian_first_name "Jamie"
|
||||||
|
|||||||
@@ -4,5 +4,6 @@ FactoryBot.define do
|
|||||||
file_name "high.mp4"
|
file_name "high.mp4"
|
||||||
asset_uid "asset_uid"
|
asset_uid "asset_uid"
|
||||||
asset_playback_uid "asset_playback_uid"
|
asset_playback_uid "asset_playback_uid"
|
||||||
|
hidden { false }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -16,6 +16,17 @@ FactoryBot.define do
|
|||||||
streamer_status "idle"
|
streamer_status "idle"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
trait :with_overriden_stream do
|
||||||
|
stream_uid "mux_stream"
|
||||||
|
stream_key "mux_key"
|
||||||
|
stream_playback_uid "mux_playback_id"
|
||||||
|
full_live_stream_playback_uid "full_live_stream_playback_uid"
|
||||||
|
status "created"
|
||||||
|
streamer_status "idle"
|
||||||
|
stream_url_override "overriden_stream_url"
|
||||||
|
stream_key_override "overriden_stream_key"
|
||||||
|
end
|
||||||
|
|
||||||
trait :with_files do
|
trait :with_files do
|
||||||
files do
|
files do
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -66,6 +66,18 @@ RSpec.feature 'User manages contract templates', type: :feature do
|
|||||||
expect(ContractTemplate.last.amendment_clause.body.to_s).to match /Amendment clause text/
|
expect(ContractTemplate.last.amendment_clause.body.to_s).to match /Amendment clause text/
|
||||||
end
|
end
|
||||||
|
|
||||||
|
scenario 'appearance release template has a amendment clause field' do
|
||||||
|
visit new_project_contract_template_path(project)
|
||||||
|
|
||||||
|
fill_in 'Name', with: 'My Release Template'
|
||||||
|
select 'Appearance Release', from: 'Release type'
|
||||||
|
fill_hidden amendment_clause_field, with: 'Amendment clause text'
|
||||||
|
click_on create_release_template_button
|
||||||
|
|
||||||
|
expect(page).to have_content(create_contract_template_success_message)
|
||||||
|
expect(ContractTemplate.last.amendment_clause.body.to_s).to match /Amendment clause text/
|
||||||
|
end
|
||||||
|
|
||||||
scenario 'medical release template has a guardian clause field' do
|
scenario 'medical release template has a guardian clause field' do
|
||||||
visit new_project_contract_template_path(project)
|
visit new_project_contract_template_path(project)
|
||||||
|
|
||||||
|
|||||||
@@ -144,6 +144,49 @@ feature 'User managing appearance releases' do
|
|||||||
|
|
||||||
expect(page).to have_content dummy_signature_legal_text
|
expect(page).to have_content dummy_signature_legal_text
|
||||||
end
|
end
|
||||||
|
|
||||||
|
scenario "signing amendment for a not-signed amendment release", js: true do
|
||||||
|
contract_template = create(:appearance_release_contract_template, :with_amendment_clause, project: project)
|
||||||
|
release = create(:appearance_release, contract_template: contract_template, project: project)
|
||||||
|
|
||||||
|
expect(release.amendment_signed?).to be_falsey
|
||||||
|
|
||||||
|
visit new_account_project_contract_template_appearance_release_amendment_path(project.account, project, contract_template, release)
|
||||||
|
|
||||||
|
expect(page).to have_content amendments_heading
|
||||||
|
|
||||||
|
fill_in amendment_signer_name_field, with: 'Big Signer'
|
||||||
|
draw_signature file_fixture("signature.png"), amendment_signature_field
|
||||||
|
|
||||||
|
click_button sign_amendment_button
|
||||||
|
|
||||||
|
expect(page).to have_content signed_successfully_message
|
||||||
|
expect(AppearanceRelease.find(release.id).amendment_signed?).to be_truthy
|
||||||
|
end
|
||||||
|
|
||||||
|
scenario "opening signing amendment page for a signed amendment release shows already signed message", js: true do
|
||||||
|
contract_template = create(:appearance_release_contract_template, :with_amendment_clause, project: project)
|
||||||
|
release = create(:appearance_release, :amendment_signed, contract_template: contract_template, project: project)
|
||||||
|
|
||||||
|
expect(release.amendment_signed?).to be_truthy
|
||||||
|
|
||||||
|
visit new_account_project_contract_template_appearance_release_amendment_path(project.account, project, contract_template, release)
|
||||||
|
|
||||||
|
expect(page).not_to have_content amendments_heading
|
||||||
|
expect(page).not_to have_content signed_successfully_message
|
||||||
|
expect(page).to have_content already_signed_message
|
||||||
|
end
|
||||||
|
|
||||||
|
scenario "amendment signing form has copy URL button" do
|
||||||
|
contract_template = create(:appearance_release_contract_template, :with_amendment_clause, project: project)
|
||||||
|
release = create(:appearance_release, contract_template: contract_template, project: project)
|
||||||
|
|
||||||
|
visit new_account_project_contract_template_appearance_release_amendment_path(project.account, project, contract_template, release)
|
||||||
|
|
||||||
|
expect(page).to have_content copy_url_button
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when signed in' do
|
context 'when signed in' do
|
||||||
@@ -292,7 +335,81 @@ feature 'User managing appearance releases' do
|
|||||||
expect(page).to have_content('New Name')
|
expect(page).to have_content('New Name')
|
||||||
end
|
end
|
||||||
|
|
||||||
scenario 'viewing the contract PDF' do
|
scenario "signing amendment for a not-signed amendment release", js: true do
|
||||||
|
contract_template = create(:appearance_release_contract_template, :with_amendment_clause, project: project)
|
||||||
|
release = create(:appearance_release, person_first_name: "First", contract_template: contract_template, project: project)
|
||||||
|
|
||||||
|
expect(release.amendment_signed?).to be_falsey
|
||||||
|
|
||||||
|
visit project_appearance_releases_path(project)
|
||||||
|
|
||||||
|
expect(page).to have_content "First"
|
||||||
|
|
||||||
|
click_on manage_button
|
||||||
|
|
||||||
|
expect(page).to have_link sign_amendment_link
|
||||||
|
|
||||||
|
new_window = window_opened_by { click_link sign_amendment_link }
|
||||||
|
within_window new_window do
|
||||||
|
expect(page).to have_content amendments_heading
|
||||||
|
|
||||||
|
fill_in amendment_signer_name_field, with: 'Big Signer'
|
||||||
|
draw_signature file_fixture("signature.png"), amendment_signature_field
|
||||||
|
|
||||||
|
click_button sign_amendment_button
|
||||||
|
|
||||||
|
expect(page).to have_content signed_successfully_message
|
||||||
|
expect(AppearanceRelease.find(release.id).amendment_signed?).to be_truthy
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
scenario "signed amendment release does not have sign amendment option in manage dropdown", js: true do
|
||||||
|
contract_template = create(:appearance_release_contract_template, :with_amendment_clause, project: project)
|
||||||
|
release = create(:appearance_release, :amendment_signed, person_first_name: "Firstn", contract_template: contract_template, project: project)
|
||||||
|
|
||||||
|
expect(release.amendment_signed?).to be_truthy
|
||||||
|
|
||||||
|
visit project_appearance_releases_path(project)
|
||||||
|
|
||||||
|
expect(page).to have_content "Firstn"
|
||||||
|
|
||||||
|
click_on manage_button
|
||||||
|
|
||||||
|
expect(page).not_to have_link sign_amendment_link
|
||||||
|
end
|
||||||
|
|
||||||
|
scenario "signed amendment release have checked box in appearance releases index table", js: true do
|
||||||
|
contract_template = create(:appearance_release_contract_template, :with_amendment_clause, project: project)
|
||||||
|
not_signed_release = create(:appearance_release, person_first_name: "Firstn", contract_template: contract_template, project: project)
|
||||||
|
expect(not_signed_release.amendment_signed?).to be_falsey
|
||||||
|
|
||||||
|
visit project_appearance_releases_path(project)
|
||||||
|
|
||||||
|
expect(page).to have_content "Firstn"
|
||||||
|
expect(page).to have_css('i.fa.fa-square-o', count: 1)
|
||||||
|
expect(page).to have_css('i.fa.fa-check-square', count: 0)
|
||||||
|
|
||||||
|
signed_release = create(:appearance_release, :amendment_signed, person_first_name: "Signedn", contract_template: contract_template, project: project)
|
||||||
|
expect(signed_release.amendment_signed?).to be_truthy
|
||||||
|
|
||||||
|
visit project_appearance_releases_path(project)
|
||||||
|
|
||||||
|
expect(page).to have_content "Signedn"
|
||||||
|
|
||||||
|
expect(page).to have_css('i.fa.fa-square-o', count: 1)
|
||||||
|
expect(page).to have_css('i.fa.fa-check-square-o', count: 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
scenario "amendment signing form has copy URL button when user is signed in", js: true do
|
||||||
|
contract_template = create(:appearance_release_contract_template, :with_amendment_clause, project: project)
|
||||||
|
release = create(:appearance_release, contract_template: contract_template, project: project)
|
||||||
|
|
||||||
|
visit new_account_project_contract_template_appearance_release_amendment_path(project.account, project, contract_template, release)
|
||||||
|
|
||||||
|
expect(page).to have_content copy_url_button
|
||||||
|
end
|
||||||
|
|
||||||
|
scenario 'viewing the contract PDF when amendment is not yet signed' do
|
||||||
appearance_release = create(:appearance_release_with_contract_template,
|
appearance_release = create(:appearance_release_with_contract_template,
|
||||||
:native,
|
:native,
|
||||||
project: project,
|
project: project,
|
||||||
@@ -319,6 +436,7 @@ feature 'User managing appearance releases' do
|
|||||||
expect(content_type).to eq('application/pdf')
|
expect(content_type).to eq('application/pdf')
|
||||||
expect(content_disposition).to include('inline')
|
expect(content_disposition).to include('inline')
|
||||||
expect(pdf_filename).to include('doe-jane')
|
expect(pdf_filename).to include('doe-jane')
|
||||||
|
expect(pdf_body).not_to have_content amendment_page_heading
|
||||||
expect(pdf_body).to have_content('Jane Doe')
|
expect(pdf_body).to have_content('Jane Doe')
|
||||||
expect(pdf_body).to have_content('NOTES')
|
expect(pdf_body).to have_content('NOTES')
|
||||||
expect(pdf_body).to have_content('Note 1')
|
expect(pdf_body).to have_content('Note 1')
|
||||||
@@ -333,6 +451,35 @@ feature 'User managing appearance releases' do
|
|||||||
expect(pdf_body).not_to have_content('Guardian Email')
|
expect(pdf_body).not_to have_content('Guardian Email')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
scenario "viewing the contract PDF when amendment is signed" do
|
||||||
|
contract_template = create(:appearance_release_contract_template, :with_amendment_clause, project: project)
|
||||||
|
appearance_release = create(:appearance_release,
|
||||||
|
:amendment_signed,
|
||||||
|
:native,
|
||||||
|
contract_template: contract_template,
|
||||||
|
project: project,
|
||||||
|
person_first_name: "John",
|
||||||
|
person_last_name: "Doe")
|
||||||
|
|
||||||
|
sign_in(current_user)
|
||||||
|
visit project_appearance_releases_path(project)
|
||||||
|
click_link *view_release_pdf_link_for(appearance_release)
|
||||||
|
|
||||||
|
expect(content_type).to eq("application/pdf")
|
||||||
|
expect(content_disposition).to include("inline")
|
||||||
|
expect(pdf_filename).to include("doe-john")
|
||||||
|
|
||||||
|
expect(pdf_body).to have_content("John Doe")
|
||||||
|
|
||||||
|
expect(pdf_body).to have_content amendment_page_heading.upcase
|
||||||
|
expect(pdf_body).to have_content amendment_clause_label
|
||||||
|
expect(pdf_body).to have_content amendment_signer_name_label
|
||||||
|
expect(pdf_body).to have_content amendment_signature_label
|
||||||
|
|
||||||
|
expect(pdf_body).to have_content contract_template.amendment_clause.to_plain_text
|
||||||
|
expect(pdf_body).to have_content appearance_release.amendment_signer_name
|
||||||
|
end
|
||||||
|
|
||||||
scenario 'viewing contract PDF for a minor without guardian photo' do
|
scenario 'viewing contract PDF for a minor without guardian photo' do
|
||||||
appearance_release = create(:appearance_release_with_contract_template, :native, :minor, project: project)
|
appearance_release = create(:appearance_release_with_contract_template, :native, :minor, project: project)
|
||||||
|
|
||||||
@@ -373,7 +520,7 @@ feature 'User managing appearance releases' do
|
|||||||
|
|
||||||
visit project_appearance_releases_path(project)
|
visit project_appearance_releases_path(project)
|
||||||
|
|
||||||
click_on 'Manage'
|
click_on manage_button
|
||||||
accept_alert do
|
accept_alert do
|
||||||
click_link *destroy_link_for(appearance_release)
|
click_link *destroy_link_for(appearance_release)
|
||||||
end
|
end
|
||||||
@@ -576,7 +723,7 @@ feature 'User managing appearance releases' do
|
|||||||
create(:appearance_release_with_contract_template, :native, project: project)
|
create(:appearance_release_with_contract_template, :native, project: project)
|
||||||
|
|
||||||
visit project_appearance_releases_path(project)
|
visit project_appearance_releases_path(project)
|
||||||
click_on "Manage"
|
click_on manage_button
|
||||||
|
|
||||||
expect(page).not_to have_link(review_action, exact: true)
|
expect(page).not_to have_link(review_action, exact: true)
|
||||||
end
|
end
|
||||||
@@ -594,7 +741,7 @@ feature 'User managing appearance releases' do
|
|||||||
|
|
||||||
visit project_appearance_releases_path(project)
|
visit project_appearance_releases_path(project)
|
||||||
|
|
||||||
click_on 'Manage'
|
click_on manage_button
|
||||||
expect(page).not_to have_link('Download', exact: true)
|
expect(page).not_to have_link('Download', exact: true)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -602,7 +749,7 @@ feature 'User managing appearance releases' do
|
|||||||
create(:appearance_release_with_contract_template, :native, project: project)
|
create(:appearance_release_with_contract_template, :native, project: project)
|
||||||
|
|
||||||
visit project_appearance_releases_path(project)
|
visit project_appearance_releases_path(project)
|
||||||
click_on "Manage"
|
click_on manage_button
|
||||||
|
|
||||||
expect(page).not_to have_link(review_action, exact: true)
|
expect(page).not_to have_link(review_action, exact: true)
|
||||||
end
|
end
|
||||||
@@ -866,4 +1013,56 @@ feature 'User managing appearance releases' do
|
|||||||
def date_issued
|
def date_issued
|
||||||
t 'contracts.for_office_use_only.description_labels.date_issued'
|
t 'contracts.for_office_use_only.description_labels.date_issued'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def amendments_heading
|
||||||
|
t 'public.amendments.new.amendment.heading'
|
||||||
|
end
|
||||||
|
|
||||||
|
def amendment_signer_name_field
|
||||||
|
'appearance_release[amendment_signer_name]'
|
||||||
|
end
|
||||||
|
|
||||||
|
def amendment_signature_field
|
||||||
|
'appearance_release_amendment_signature_base64'
|
||||||
|
end
|
||||||
|
|
||||||
|
def sign_amendment_button
|
||||||
|
t 'shared.submit_release_long'
|
||||||
|
end
|
||||||
|
|
||||||
|
def already_signed_message
|
||||||
|
t 'public.amendments.create.amendment_already_signed_message'
|
||||||
|
end
|
||||||
|
|
||||||
|
def signed_successfully_message
|
||||||
|
t 'public.amendments.create.amendment_signed_message'
|
||||||
|
end
|
||||||
|
|
||||||
|
def manage_button
|
||||||
|
t 'appearance_releases.appearance_release.actions.manage'
|
||||||
|
end
|
||||||
|
|
||||||
|
def sign_amendment_link
|
||||||
|
t 'appearance_releases.appearance_release.actions.sign_amendment'
|
||||||
|
end
|
||||||
|
|
||||||
|
def copy_url_button
|
||||||
|
t 'public.amendments.new.copy_url'
|
||||||
|
end
|
||||||
|
|
||||||
|
def amendment_page_heading
|
||||||
|
t 'contracts.amendment_page.heading'
|
||||||
|
end
|
||||||
|
|
||||||
|
def amendment_signer_name_label
|
||||||
|
t 'contracts.amendment_page.description_labels.amendment_signer_name'
|
||||||
|
end
|
||||||
|
|
||||||
|
def amendment_clause_label
|
||||||
|
t 'contracts.amendment_page.description_labels.amendment_clause'
|
||||||
|
end
|
||||||
|
|
||||||
|
def amendment_signature_label
|
||||||
|
t 'contracts.amendment_page.description_labels.amendment_signature'
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
feature 'User managing broadcasts' do
|
feature 'User managing broadcasts' do
|
||||||
|
|
||||||
let(:current_user) { create(:user, :manager) }
|
let(:current_user) { create(:user, :manager) }
|
||||||
let(:project) { create(:project, members: current_user, account: current_user.primary_account) }
|
let(:project) { create(:project, members: current_user, account: current_user.primary_account) }
|
||||||
|
|
||||||
@@ -50,7 +51,7 @@ feature 'User managing broadcasts' do
|
|||||||
|
|
||||||
scenario 'visit show page of broadcast', js: true do
|
scenario 'visit show page of broadcast', js: true do
|
||||||
broadcast = create(:broadcast, :with_stream, :with_files, project: project)
|
broadcast = create(:broadcast, :with_stream, :with_files, project: project)
|
||||||
recording = create(:broadcast_recording, broadcast: broadcast)
|
recording = create(:broadcast_recording, broadcast: broadcast, asset_uid: "asset_uid_1")
|
||||||
|
|
||||||
visit project_broadcast_path(project, broadcast)
|
visit project_broadcast_path(project, broadcast)
|
||||||
|
|
||||||
@@ -204,6 +205,24 @@ feature 'User managing broadcasts' do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
scenario 'project manager can hide broadcast recordings', js: true do
|
||||||
|
broadcast = create(:broadcast, :with_stream, :with_files, project: project)
|
||||||
|
recording = create(:broadcast_recording, broadcast: broadcast, asset_uid: "another_asset_uid")
|
||||||
|
|
||||||
|
visit project_broadcast_path(project, broadcast)
|
||||||
|
|
||||||
|
click_on 'Previous Sessions'
|
||||||
|
expect(page).to have_content(recording.download_file_name)
|
||||||
|
expect(page).to have_content('Hide')
|
||||||
|
|
||||||
|
accept_alert do
|
||||||
|
click_link "Hide"
|
||||||
|
end
|
||||||
|
|
||||||
|
expect(page).not_to have_content(recording.download_file_name)
|
||||||
|
expect(page).to have_content("Recording of the live stream will appear here")
|
||||||
|
end
|
||||||
|
|
||||||
context 'When the user is associate' do
|
context 'When the user is associate' do
|
||||||
let(:current_user) { create(:user, :associate) }
|
let(:current_user) { create(:user, :associate) }
|
||||||
|
|
||||||
@@ -221,6 +240,17 @@ feature 'User managing broadcasts' do
|
|||||||
|
|
||||||
expect(page).to have_content delete_file_button, count: 0
|
expect(page).to have_content delete_file_button, count: 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
scenario 'associate does not see hide button in front of recording' do
|
||||||
|
broadcast = create(:broadcast, :with_stream, :with_files, project: project)
|
||||||
|
recording = create(:broadcast_recording, broadcast: broadcast, asset_uid: "another_asset_uid")
|
||||||
|
|
||||||
|
visit project_broadcast_path(project, broadcast)
|
||||||
|
|
||||||
|
click_on 'Previous Sessions'
|
||||||
|
expect(page).to have_content(recording.download_file_name)
|
||||||
|
expect(page).not_to have_content('Hide')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'When the user is account manager' do
|
context 'When the user is account manager' do
|
||||||
@@ -247,6 +277,24 @@ feature 'User managing broadcasts' do
|
|||||||
expect(page).to have_content delete_file_button, count: 2
|
expect(page).to have_content delete_file_button, count: 2
|
||||||
expect(Broadcast.find(broadcast.id).files.count).to eq 2
|
expect(Broadcast.find(broadcast.id).files.count).to eq 2
|
||||||
end
|
end
|
||||||
|
|
||||||
|
scenario 'account manager can hide broadcast recordings', js: true do
|
||||||
|
broadcast = create(:broadcast, :with_stream, :with_files, project: project)
|
||||||
|
recording = create(:broadcast_recording, broadcast: broadcast, asset_uid: "another_asset_uid")
|
||||||
|
|
||||||
|
visit project_broadcast_path(project, broadcast)
|
||||||
|
|
||||||
|
click_on 'Previous Sessions'
|
||||||
|
expect(page).to have_content(recording.download_file_name)
|
||||||
|
expect(page).to have_content('Hide')
|
||||||
|
|
||||||
|
accept_alert do
|
||||||
|
click_link "Hide"
|
||||||
|
end
|
||||||
|
|
||||||
|
expect(page).not_to have_content(recording.download_file_name)
|
||||||
|
expect(page).to have_content("Recording of the live stream will appear here")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -251,6 +251,9 @@ feature "User managing location releases" do
|
|||||||
new_window = window_opened_by { click_link sign_amendment_link }
|
new_window = window_opened_by { click_link sign_amendment_link }
|
||||||
within_window new_window do
|
within_window new_window do
|
||||||
expect(page).to have_content amendments_heading
|
expect(page).to have_content amendments_heading
|
||||||
|
expect(page).to have_content signed_contract_preview.upcase
|
||||||
|
|
||||||
|
expect(page).to have_selector 'embed'
|
||||||
|
|
||||||
fill_in amendment_signer_name_field, with: 'Big Signer'
|
fill_in amendment_signer_name_field, with: 'Big Signer'
|
||||||
draw_signature file_fixture("signature.png"), amendment_signature_field
|
draw_signature file_fixture("signature.png"), amendment_signature_field
|
||||||
@@ -373,7 +376,7 @@ feature "User managing location releases" do
|
|||||||
|
|
||||||
expect(pdf_body).to have_content("Test Loc")
|
expect(pdf_body).to have_content("Test Loc")
|
||||||
|
|
||||||
expect(pdf_body).to have_content amendment_page_heading
|
expect(pdf_body).to have_content amendment_page_heading.upcase
|
||||||
expect(pdf_body).to have_content amendment_clause_label
|
expect(pdf_body).to have_content amendment_clause_label
|
||||||
expect(pdf_body).to have_content amendment_signer_name_label
|
expect(pdf_body).to have_content amendment_signer_name_label
|
||||||
expect(pdf_body).to have_content amendment_signature_label
|
expect(pdf_body).to have_content amendment_signature_label
|
||||||
@@ -690,6 +693,10 @@ feature "User managing location releases" do
|
|||||||
t 'public.amendments.new.amendment.heading'
|
t 'public.amendments.new.amendment.heading'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def signed_contract_preview
|
||||||
|
t 'public.amendments.new.signed_contract_preview'
|
||||||
|
end
|
||||||
|
|
||||||
def amendment_signer_name_field
|
def amendment_signer_name_field
|
||||||
'location_release[amendment_signer_name]'
|
'location_release[amendment_signer_name]'
|
||||||
end
|
end
|
||||||
@@ -741,8 +748,8 @@ feature "User managing location releases" do
|
|||||||
def table_headers
|
def table_headers
|
||||||
[
|
[
|
||||||
t('location_releases.index.table_headers.approved'),
|
t('location_releases.index.table_headers.approved'),
|
||||||
t('location_releases.index.table_headers.name'),
|
t('location_releases.index.table_headers.location_info'),
|
||||||
t('location_releases.index.table_headers.address'),
|
t('location_releases.index.table_headers.owner_info'),
|
||||||
t('location_releases.index.table_headers.notes'),
|
t('location_releases.index.table_headers.notes'),
|
||||||
t('location_releases.index.table_headers.tags'),
|
t('location_releases.index.table_headers.tags'),
|
||||||
t('location_releases.index.table_headers.signed_at'),
|
t('location_releases.index.table_headers.signed_at'),
|
||||||
|
|||||||
@@ -49,6 +49,36 @@ RSpec.describe Broadcast, type: :model do
|
|||||||
expect(broadcast).to have_received(:destroy_mux_live_stream)
|
expect(broadcast).to have_received(:destroy_mux_live_stream)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "#stream_server_url" do
|
||||||
|
it "returns mux stream url when overriden stream url is absent" do
|
||||||
|
ENV["MUX_BROADCAST_SERVER_URL"] = "mux_stream"
|
||||||
|
broadcast = create(:broadcast, :with_stream, skip_create_callback: true, name: "My Broadcast")
|
||||||
|
|
||||||
|
expect(broadcast.stream_server_url).to eq("mux_stream")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns overriden stream url when it is present" do
|
||||||
|
ENV["MUX_BROADCAST_SERVER_URL"] = "mux_stream"
|
||||||
|
broadcast = create(:broadcast, :with_overriden_stream, skip_create_callback: true, name: "My Broadcast")
|
||||||
|
|
||||||
|
expect(broadcast.stream_server_url).to eq("overriden_stream_url")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "#stream_server_key" do
|
||||||
|
it "returns mux stream key when overriden stream key is absent" do
|
||||||
|
broadcast = create(:broadcast, :with_stream, skip_create_callback: true, name: "My Broadcast")
|
||||||
|
|
||||||
|
expect(broadcast.stream_server_key).to eq("mux_key")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns overriden stream key when it is present" do
|
||||||
|
broadcast = create(:broadcast, :with_overriden_stream, skip_create_callback: true, name: "My Broadcast")
|
||||||
|
|
||||||
|
expect(broadcast.stream_server_key).to eq("overriden_stream_key")
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "#zoom_meeting_url" do
|
describe "#zoom_meeting_url" do
|
||||||
|
|||||||
Reference in New Issue
Block a user