diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb
index a5e17b5..89c1a4b 100644
--- a/app/controllers/accounts_controller.rb
+++ b/app/controllers/accounts_controller.rb
@@ -17,7 +17,7 @@ class AccountsController < ApplicationController
if sign_in(user)
TrackAnalyticsJob.perform_later(user, user.primary_account, :track_guest_sign_up, user_agent: request.user_agent, user_ip: request.remote_ip)
- SubmitHubspotFormJob.perform_later(user.first_name, user.last_name, user.email, account.name, i_m_interested_in: user.interested_product_name)
+ SubmitHubspotFormJob.perform_later(first_name: user.first_name, last_name: user.last_name, email: user.email, company: account.name, i_m_interested_in: user.interested_product_name, form_guid: ENV["HUBSPOT_FORM_GUID"])
redirect_to signed_in_root_path
else
redirect_to new_session_path, alert: t(".notice")
diff --git a/app/controllers/admin/casting_call_interviews_controller.rb b/app/controllers/admin/casting_call_interviews_controller.rb
new file mode 100644
index 0000000..c9f0a92
--- /dev/null
+++ b/app/controllers/admin/casting_call_interviews_controller.rb
@@ -0,0 +1,64 @@
+class Admin::CastingCallInterviewsController < Admin::ApplicationController
+ before_action :set_casting_call_interview, only: [:edit, :update, :show, :complete]
+ before_action :build_casting_call_interview, only: [:new, :create]
+
+ def index
+ @casting_call_interviews = casting_call_interviews.order_by_recent.paginate(page: params[:page])
+ end
+
+ def new
+ @accounts = accounts
+ end
+
+ def create
+ @casting_call_interview.attributes = casting_call_interview_params
+
+ if @casting_call_interview.save
+ redirect_to [:admin, :casting_call_interviews], notice: t(".notice")
+ else
+ render :new
+ end
+ end
+
+ def edit
+ @accounts = accounts
+ end
+
+ def update
+ if @casting_call_interview.update(casting_call_interview_params)
+ redirect_to [:admin, :casting_call_interviews], notice: t(".notice")
+ else
+ render :edit
+ end
+ end
+
+ def complete
+ if @casting_call_interview.update(interviewed_at: Time.zone.now)
+ redirect_to [:admin, :casting_call_interviews], notice: t(".notice")
+ else
+ redirect_to [:admin, :casting_call_interviews], notice: t(".alert")
+ end
+ end
+
+ private
+
+ def casting_call_interview_params
+ params.require(:casting_call_interview).permit(:casting_call_id, :performer_name, :interview_date, :zoom_meeting_url)
+ end
+
+ def casting_call_interviews
+ policy_scope CastingCallInterview
+ end
+
+ def set_casting_call_interview
+ @casting_call_interview = authorize policy_scope(CastingCallInterview).find(params[:id])
+ end
+
+ def accounts
+ policy_scope Account
+ end
+
+ def build_casting_call_interview
+ @casting_call_interview = authorize policy_scope(CastingCallInterview).build
+ end
+end
\ No newline at end of file
diff --git a/app/controllers/api/medical_releases_controller.rb b/app/controllers/api/medical_releases_controller.rb
deleted file mode 100644
index c62b242..0000000
--- a/app/controllers/api/medical_releases_controller.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-class Api::MedicalReleasesController < Api::ReleasesController
- deserializable_resource :medical_release, only: [:create, :update]
-
- def model_name
- "medical_release"
- end
-
- def attributes_for_index
- [:name]
- end
-end
diff --git a/app/controllers/api/misc_releases_controller.rb b/app/controllers/api/misc_releases_controller.rb
deleted file mode 100644
index dea720f..0000000
--- a/app/controllers/api/misc_releases_controller.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-class Api::MiscReleasesController < Api::ReleasesController
- deserializable_resource :misc_release, only: [:create, :update]
-
- def model_name
- "misc_release"
- end
-
- def attributes_for_index
- [:name]
- end
-end
diff --git a/app/controllers/api/sync_controller.rb b/app/controllers/api/sync_controller.rb
index ea7536c..8f51615 100644
--- a/app/controllers/api/sync_controller.rb
+++ b/app/controllers/api/sync_controller.rb
@@ -10,10 +10,8 @@ class Api::SyncController < Api::ApiController
@appearance_releases = (AppearanceRelease.where(project: accessible_projects))
@location_releases = (LocationRelease.where(project: accessible_projects))
@material_releases = (MaterialRelease.where(project: accessible_projects))
- @medical_releases = MedicalRelease.where(project: accessible_projects)
- @misc_releases = MiscRelease.where(project: accessible_projects)
@talent_releases = (TalentRelease.where(project: accessible_projects))
- @notes = notes_query(Note.where(notable: @appearance_releases + @location_releases + @material_releases + @medical_releases + @misc_releases + @talent_releases + @acquired_media_releases ))
+ @notes = notes_query(Note.where(notable: @appearance_releases + @location_releases + @material_releases + @talent_releases + @acquired_media_releases ))
render json: {
data: {
@@ -24,8 +22,6 @@ class Api::SyncController < Api::ApiController
appearance_releases: releases_query(@appearance_releases),
location_releases: releases_query(@location_releases),
material_releases: releases_query(@material_releases),
- medical_releases: releases_query(@medical_releases),
- misc_releases: releases_query(@misc_releases),
talent_releases: releases_query(@talent_releases),
notes: @notes
}
diff --git a/app/controllers/approvals_controller.rb b/app/controllers/approvals_controller.rb
deleted file mode 100644
index ad7bdd9..0000000
--- a/app/controllers/approvals_controller.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-class ApprovalsController < ApplicationController
- include MedicalReleaseContext
-
- before_action :set_medical_release
- before_action :set_project
-
- layout "project"
-
- def create
- @medical_release.approve_by(current_user)
- if @medical_release.save
- redirect_to [@project, :medical_releases], notice: t('.release_approved')
- end
- end
-
- private
-
- def set_project
- @project = @medical_release.project
- end
-end
diff --git a/app/controllers/casting_call_interviews_controller.rb b/app/controllers/casting_call_interviews_controller.rb
new file mode 100644
index 0000000..0bdb9f2
--- /dev/null
+++ b/app/controllers/casting_call_interviews_controller.rb
@@ -0,0 +1,28 @@
+class CastingCallInterviewsController < ApplicationController
+ before_action :set_project
+ before_action :set_casting_call_interview, only: [:show]
+
+ include ProjectLayout
+
+ def index
+ @casting_call_interviews = casting_call_interviews.completed.order_by_recent.paginate(page: params[:page])
+ end
+
+ def show
+ @files = @casting_call_interview.files.paginate(page: params[:page])
+ end
+
+ private
+
+ def set_project
+ @project = policy_scope(Project).find(params[:project_id])
+ end
+
+ def set_casting_call_interview
+ @casting_call_interview = authorize casting_call_interviews.find(params[:id])
+ end
+
+ def casting_call_interviews
+ authorize policy_scope(CastingCallInterview)
+ end
+end
diff --git a/app/controllers/casting_calls_controller.rb b/app/controllers/casting_calls_controller.rb
new file mode 100644
index 0000000..c06d729
--- /dev/null
+++ b/app/controllers/casting_calls_controller.rb
@@ -0,0 +1,76 @@
+class CastingCallsController < ApplicationController
+ layout "project"
+
+ before_action :set_project
+ before_action :build_casting_call, only: [:new, :create]
+ before_action :set_casting_call, only: [:show, :edit, :update, :cancel]
+
+ def index
+ @casting_calls = casting_calls.order_by_recent.paginate(page: params[:page])
+ end
+
+ def new
+ end
+
+ def create
+ @casting_call.attributes = casting_call_params_with_email
+
+ if @casting_call.save
+ log_create_analytics
+ castme_url = url_for([@project, @casting_call])
+ SubmitHubspotFormJob.perform_later(email: @casting_call.user_email, castme_url: castme_url, form_guid: ENV["HUBSPOT_CASTING_CALL_REQUEST_FORM_GUID"])
+ else
+ render :new
+ end
+ end
+
+ def show
+ render layout: 'application'
+ end
+
+ def edit
+ end
+
+ def update
+ if @casting_call.update(casting_call_params)
+ redirect_to [@project, :casting_calls], notice: t(".notice")
+ else
+ render :edit
+ end
+ end
+
+ def cancel
+ @casting_call.update(cancelled_at: Time.zone.now)
+ redirect_to [@project, :casting_calls], notice: t(".notice")
+ end
+
+ private
+
+ def casting_call_params
+ params.require(:casting_call).permit(:title, :description, :project_description, :interview_instructions, :interview_requirements, :questions)
+ end
+
+ def casting_call_params_with_email
+ casting_call_params.merge(user_email: Current.user.email)
+ end
+
+ def set_project
+ @project = policy_scope(Project).find(params[:project_id])
+ end
+
+ def set_casting_call
+ @casting_call = authorize casting_calls.find(params[:id])
+ end
+
+ def casting_calls
+ authorize policy_scope(@project.casting_calls)
+ end
+
+ def build_casting_call
+ @casting_call = authorize @project.casting_calls.build
+ end
+
+ def log_create_analytics
+ TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_casting_call, user_agent: request.user_agent, user_ip: request.remote_ip)
+ end
+end
diff --git a/app/controllers/contract_templates_controller.rb b/app/controllers/contract_templates_controller.rb
index 8e70811..3c15127 100644
--- a/app/controllers/contract_templates_controller.rb
+++ b/app/controllers/contract_templates_controller.rb
@@ -62,19 +62,18 @@ class ContractTemplatesController < ApplicationController
def contract_template_params
params
.require(:contract_template)
- .permit(:name, :release_type, :body, :guardian_clause,
- :signature_legal_text, :fee,
+ .permit(:name, :release_type, :body, :guardian_clause, :fee,
:applicable_medium_id, :applicable_medium_text,
:territory_id, :territory_text,
- :term_id, :term_text, :accessibility,
+ :term_id, :term_text,
:restriction_id, :restriction_text,
- :question_1_text, :question_2_text,
- :question_3_text, :question_4_text,
- :question_5_text, :question_6_text,
- :question_7_text, :question_8_text,
+ :question_1_text, :question_2_text,
+ :question_3_text, :question_4_text,
+ :question_5_text, :question_6_text,
+ :question_7_text, :question_8_text,
:question_9_text, :question_10_text,
- :question_11_text, :question_12_text,
- :question_13_text, :question_14_text,
+ :question_11_text, :question_12_text,
+ :question_13_text, :question_14_text,
:question_15_text)
end
diff --git a/app/controllers/interview_downloads_controller.rb b/app/controllers/interview_downloads_controller.rb
new file mode 100644
index 0000000..46a9b57
--- /dev/null
+++ b/app/controllers/interview_downloads_controller.rb
@@ -0,0 +1,30 @@
+class InterviewDownloadsController < ApplicationController
+ include ProjectContext
+
+ before_action :set_project, only: [:create]
+ before_action :set_casting_call_interview, only: :create
+
+ include ProjectLayout
+
+ def create
+ download = @project.downloads.create!(name: @casting_call_interview.zip_file_name, release_type: "CastingCallInterview")
+
+ other_downloads_in_progress = @project.downloads.unfinished_desc_order.offset(1)
+
+ if other_downloads_in_progress.any?
+ in_progress_downloads_details = render_to_string "_other_pending_downloads", locals: { downloads: other_downloads_in_progress, release_type: "CastingCallInterview" }, :layout => false
+ ProjectsChannel.broadcast_download_generation_update(download, in_progress_downloads_details)
+ else
+ ProjectsChannel.broadcast_download_generation_update(download, I18n.t("interview_downloads.download.pending", release_type: "Casting Call Interview"))
+ end
+
+ GenerateInterviewFilesZipJob.perform_later(@project, download, @casting_call_interview)
+ end
+
+ private
+
+ def set_casting_call_interview
+ authorize(Download)
+ @casting_call_interview = policy_scope(@project.casting_call_interviews).find(params[:casting_call_interview_id])
+ end
+end
diff --git a/app/controllers/public/casting_call_interviews_controller.rb b/app/controllers/public/casting_call_interviews_controller.rb
new file mode 100644
index 0000000..8884ea9
--- /dev/null
+++ b/app/controllers/public/casting_call_interviews_controller.rb
@@ -0,0 +1,25 @@
+class Public::CastingCallInterviewsController < Public::BaseController
+ skip_after_action :verify_authorized
+ before_action :set_casting_call_interview, only: [:show, :update]
+
+ def show
+ end
+
+ def update
+ if @casting_call_interview.update(casting_call_interview_params)
+ redirect_to casting_call_interview_url(token: @casting_call_interview.token), notice: t(".notice")
+ else
+ render :show
+ end
+ end
+
+ private
+
+ def set_casting_call_interview
+ @casting_call_interview = CastingCallInterview.find_by_token(params[:token])
+ end
+
+ def casting_call_interview_params
+ params.require(:casting_call_interview).permit(files: [])
+ end
+end
diff --git a/app/controllers/public/casting_calls_controller.rb b/app/controllers/public/casting_calls_controller.rb
new file mode 100644
index 0000000..66bf280
--- /dev/null
+++ b/app/controllers/public/casting_calls_controller.rb
@@ -0,0 +1,14 @@
+class Public::CastingCallsController < Public::BaseController
+ skip_after_action :verify_authorized
+ before_action :set_casting_call, only: [:show]
+
+ def show
+ render layout: 'application'
+ end
+
+ private
+
+ def set_casting_call
+ @casting_call = CastingCall.find_by_token(params[:token])
+ end
+end
diff --git a/app/controllers/stream_notifications_controller.rb b/app/controllers/stream_notifications_controller.rb
index ce76ff6..12b8ee2 100644
--- a/app/controllers/stream_notifications_controller.rb
+++ b/app/controllers/stream_notifications_controller.rb
@@ -28,9 +28,8 @@ class StreamNotificationsController < ApplicationController
asset_uid = notification.dig(:object, :id)
playback_uid = notification.dig(:data, :playback_ids, 0, :id)
file_name = notification.dig(:data, :static_renditions, :files, -1, :name)
- 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)
recordings = @broadcast.broadcast_recordings.order_by_recent.paginate(page: params[:page])
link = helpers.link_to(recording.broadcast_name.titleize, recording.download_url, target: "_blank")
diff --git a/app/controllers/task_requests_controller.rb b/app/controllers/task_requests_controller.rb
index 81723d0..bc98cdb 100644
--- a/app/controllers/task_requests_controller.rb
+++ b/app/controllers/task_requests_controller.rb
@@ -19,7 +19,7 @@ class TaskRequestsController < ApplicationController
if @task_request.save
log_create_analytics
taskme_url = url_for([:admin, @task_request])
- SubmitHubspotTaskRequestFormJob.perform_later(@task_request.user_email, taskme_url)
+ SubmitHubspotFormJob.perform_later(email: @task_request.user_email, taskme_url: taskme_url, form_guid: ENV["HUBSPOT_TASK_REQUEST_FORM_GUID"])
else
render :new
end
diff --git a/app/helpers/tooltip_helper.rb b/app/helpers/tooltip_helper.rb
index f409b97..77db302 100644
--- a/app/helpers/tooltip_helper.rb
+++ b/app/helpers/tooltip_helper.rb
@@ -5,12 +5,4 @@ module TooltipHelper
concat tag.div(class: "tooltip-inner")
end
end
-
- def get_approval_data_for_medical_release(medical_release)
- if medical_release.approved_by_user_name.present?
- "#{medical_release.approved_by_user_name} [#{medical_release.approved_by_user_email}]"
- else
- medical_release.approved_by_user_email
- end
- end
end
diff --git a/app/jobs/generate_contracts_zip_job.rb b/app/jobs/generate_contracts_zip_job.rb
index 65bc376..1279003 100644
--- a/app/jobs/generate_contracts_zip_job.rb
+++ b/app/jobs/generate_contracts_zip_job.rb
@@ -6,8 +6,8 @@ class GenerateContractsZipJob < ApplicationJob
before_perform do |job|
@project = job.arguments.first
@download = job.arguments.second
- @release_type = job.arguments.third
- @folder_name = "#{@project.name.parameterize}_#{get_release_name(@release_type).gsub('_', '-')}"
+ release_type = job.arguments.third
+ @folder_name = "#{@project.name.parameterize}_#{get_release_name(release_type).gsub('_', '-')}"
@download.update!(name: @folder_name, status: :pending)
end
@@ -20,14 +20,9 @@ class GenerateContractsZipJob < ApplicationJob
files.each do |attachment|
zipfile.add(attachment, File.join("#{dir}/", attachment))
end
-
- if @release_type.constantize.include?(CsvExportable)
- csv_file = generate_csv releases
- zipfile.get_output_stream("#{@folder_name}.csv") { |f| f.puts(csv_file) }
- end
end
- @download.file.attach(io: File.open(zipfile_name), filename: "#{@folder_name}.zip")
+ @download.file.attach(io: File.open(zipfile_name), filename: @folder_name)
end
rescue StandardError => e
Rails.logger.error("Failed to generate download for project (##{project.id}) with release type #{release_type}\n" + e.message)
@@ -48,19 +43,6 @@ class GenerateContractsZipJob < ApplicationJob
private
- def generate_csv(releases)
- release_class = @release_type.constantize
- headers = release_class.csv_headers
-
- CSV.generate(headers: true) do |csv|
- csv << headers
- releases.each do |release|
- csv_row_data = release.to_csv_row
- csv << csv_row_data
- end
- end
- end
-
def get_release_name(release_type)
release_type.constantize.model_name.plural
end
diff --git a/app/jobs/generate_interview_files_zip_job.rb b/app/jobs/generate_interview_files_zip_job.rb
new file mode 100644
index 0000000..a580427
--- /dev/null
+++ b/app/jobs/generate_interview_files_zip_job.rb
@@ -0,0 +1,43 @@
+class GenerateInterviewFilesZipJob < ApplicationJob
+ queue_as :default
+ include Rails.application.routes.url_helpers
+ include ActionView::Helpers::UrlHelper
+
+ before_perform do |job|
+ @project = job.arguments.first
+ @download = job.arguments.second
+ @casting_call_interview = job.arguments.third
+ @download.update!(status: :pending)
+ end
+
+ def perform(project, download, casting_call_interview)
+ ::InterviewFilesCollectionService.new(casting_call_interview.files, @download.name).build do |dir, files|
+ zipfile_name = "#{dir}/#{@download.name}.zip"
+ Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
+ files.each do |attachment|
+ zipfile.add(attachment, File.join("#{dir}/", attachment))
+ end
+ end
+
+ @download.file.attach(io: File.open(zipfile_name), filename: @download.name)
+ end
+ rescue StandardError => e
+ Raven.extra_context(
+ message: "Failed to generate download for project (##{project.id})",
+ release_type: "CastingCallInterview"
+ )
+
+ @download.failure!
+ ProjectsChannel.broadcast_download_generation_update(@download, I18n.t("interview_downloads.download.failure"))
+ end
+
+ after_perform do |job|
+ if @download.pending? && @download.file.attached?
+ @download.success!
+
+ downloads_folder_link = link_to("Files > Downloads", project_downloads_path(I18n.locale, @project))
+ download_button = link_to("Download", rails_blob_path(@download.file, disposition: "attachment", only_path: true), class: "btn btn-success", target: :_blank)
+ ProjectsChannel.broadcast_download_generation_update(@download, I18n.t("interview_downloads.download.success", downloads_folder_link: downloads_folder_link, download_button: download_button, release_type: "Casting Call Interview"))
+ end
+ end
+end
diff --git a/app/jobs/submit_hubspot_form_job.rb b/app/jobs/submit_hubspot_form_job.rb
index 2bdcd43..92ca746 100644
--- a/app/jobs/submit_hubspot_form_job.rb
+++ b/app/jobs/submit_hubspot_form_job.rb
@@ -1,19 +1,11 @@
class SubmitHubspotFormJob < ApplicationJob
queue_as :default
- def perform(first_name, last_name, email, company_name, additional_params = {})
- hubspot_form_guid = ENV["HUBSPOT_FORM_GUID"]
- return unless hubspot_form_guid.present?
+ def perform(params = {})
+ return unless params[:form_guid].present?
- submission_params = {
- first_name: first_name,
- last_name: last_name,
- email: email,
- company: company_name
- }.merge(additional_params)
-
- form = Hubspot::Form.new("guid" => hubspot_form_guid)
- is_form_sumitted = form.submit(submission_params)
+ form = Hubspot::Form.new("guid" => params[:form_guid])
+ is_form_sumitted = form.submit(params.except(:form_guid))
raise StandardError.new "Failed to submit the hubspot form data: #{is_form_sumitted}" unless is_form_sumitted
end
diff --git a/app/jobs/submit_hubspot_task_request_form_job.rb b/app/jobs/submit_hubspot_task_request_form_job.rb
deleted file mode 100644
index 11877cf..0000000
--- a/app/jobs/submit_hubspot_task_request_form_job.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-class SubmitHubspotTaskRequestFormJob < ApplicationJob
- queue_as :default
-
- def perform(user_email, taskme_url)
- hubspot_task_request_form_guid = ENV["HUBSPOT_TASK_REQUEST_FORM_GUID"]
- return unless hubspot_task_request_form_guid.present?
-
- submission_params = {
- email: user_email,
- taskme_url: taskme_url
- }
-
- form = Hubspot::Form.new("guid" => hubspot_task_request_form_guid)
- is_form_sumitted = form.submit(submission_params)
-
- raise StandardError.new "Failed to submit the task request hubspot form data: #{is_form_sumitted}" unless is_form_sumitted
- end
-end
diff --git a/app/models/account.rb b/app/models/account.rb
index de3a812..0a747a3 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -4,6 +4,8 @@ class Account < ApplicationRecord
has_many :account_auths
has_many :users, through: :account_auths
has_many :projects, dependent: :destroy
+ has_many :casting_calls, through: :projects
+ has_many :casting_call_interviews, through: :projects
has_many :videos, through: :projects
has_many :contract_templates, through: :projects
@@ -59,6 +61,8 @@ class Account < ApplicationRecord
MedicalRelease.where(project: projects),
MiscRelease.where(project: projects),
MatchingRequest.where(project: projects),
+ CastingCall.where(project: projects),
+ self.casting_call_interviews,
self
])).sum(:byte_size).to_f
end
@@ -86,6 +90,10 @@ class Account < ApplicationRecord
def taskme_enabled?
ENV["TASKME_ENABLED"] && (plan_uid.to_s == "me_suite" || plan_uid.to_s == "taskme")
end
+
+ def castme_enabled?
+ plan_uid.to_s == "me_suite" || plan_uid.to_s == "castme"
+ end
def plan_name
case plan_uid.to_s
@@ -97,6 +105,8 @@ class Account < ApplicationRecord
"ReleaseME"
when "taskme"
"TaskME"
+ when "castme"
+ "CastME"
when "me_suite"
"ME Suite"
end
diff --git a/app/models/acquired_media_release.rb b/app/models/acquired_media_release.rb
index 8b7a7b0..6a12d35 100644
--- a/app/models/acquired_media_release.rb
+++ b/app/models/acquired_media_release.rb
@@ -9,13 +9,6 @@ class AcquiredMediaRelease < ApplicationRecord
include Signable
include Syncable
include PersonName
- include CsvExportable
-
- class << self
- def custom_csv_exportable_headers
- %i[name file_infos_count]
- end
- end
has_many :file_infos, as: :releasable, dependent: :destroy
@@ -64,8 +57,4 @@ class AcquiredMediaRelease < ApplicationRecord
def uses_edl?
true
end
-
- def file_infos_count
- file_infos.any? ? file_infos.size : I18n.t('acquired_media_releases.acquired_media_release.no_media')
- end
end
diff --git a/app/models/appearance_release.rb b/app/models/appearance_release.rb
index c9bb4c0..9a750a7 100644
--- a/app/models/appearance_release.rb
+++ b/app/models/appearance_release.rb
@@ -15,13 +15,6 @@ class AppearanceRelease < ApplicationRecord
include SecondGuardianPhotoable
include GuardianName
include SecondGuardianName
- include CsvExportable
-
- class << self
- def custom_csv_exportable_headers
- %i[name contact_info]
- end
- end
has_one_attached :person_photo
diff --git a/app/models/casting_call.rb b/app/models/casting_call.rb
new file mode 100644
index 0000000..1ae7d07
--- /dev/null
+++ b/app/models/casting_call.rb
@@ -0,0 +1,18 @@
+class CastingCall < ApplicationRecord
+ belongs_to :project
+ has_many :casting_call_interviews, dependent: :destroy
+
+ has_secure_token
+
+ def status
+ if cancelled?
+ "Cancelled"
+ else
+ "Active"
+ end
+ end
+
+ def cancelled?
+ self.cancelled_at.present?
+ end
+end
diff --git a/app/models/casting_call_interview.rb b/app/models/casting_call_interview.rb
new file mode 100644
index 0000000..3427ed3
--- /dev/null
+++ b/app/models/casting_call_interview.rb
@@ -0,0 +1,22 @@
+class CastingCallInterview < ApplicationRecord
+ belongs_to :casting_call
+ has_many_attached :files
+
+ has_secure_token
+
+ validates :performer_name, presence: true
+
+ scope :completed, -> { where.not(interviewed_at: nil) }
+
+ def join_zoom_meeting_url
+ uri = URI.parse(self.zoom_meeting_url)
+ zoom_meeting_id = uri.path.gsub("/j/", "")
+ zoom_meeting_pwd = uri.query.gsub("pwd=", "")
+
+ "zoommtg://zoom.us/join?confno=#{zoom_meeting_id}&pwd=#{zoom_meeting_pwd}"
+ end
+
+ def zip_file_name
+ "#{self.casting_call.title.parameterize}_#{self.performer_name.parameterize}_#{Time.now.strftime('%Y-%m-%d_%H-%M-%S')}"
+ end
+end
diff --git a/app/models/concerns/csv_exportable.rb b/app/models/concerns/csv_exportable.rb
deleted file mode 100644
index 4619e86..0000000
--- a/app/models/concerns/csv_exportable.rb
+++ /dev/null
@@ -1,56 +0,0 @@
-# frozen_string_literal: true
-
-module CsvExportable
- extend ActiveSupport::Concern
-
- COMMON_HEADERS = %i[notes tags signed_at].freeze
- COMMON_VALUES = %w[clean_notes clean_tags signed_on].freeze
-
- included do
- class << self
- def custom_csv_exportable_headers
- []
- end
-
- def csv_headers
- headers = custom_csv_exportable_headers + COMMON_HEADERS
-
- headers.map do |header|
- I18n.t("#{model_name.plural}.index.table_headers.#{header}")
- end
- end
- end
-
- def to_csv_row
- (self.class.custom_csv_exportable_headers + COMMON_VALUES).map do |function|
- send(function)
- end
- end
-
- private
-
- def contact_info
- contact_info = ''
- contact_info += "#{person_address}; " if person_address.present?
- contact_info += "P: #{person_phone}; " if person_phone.present?
- contact_info += "E: #{person_email}" if person_email.present?
- contact_info.delete_suffix '; '
- end
-
- def clean_notes
- notes = ''
- self.notes.order_by_recent.each do |note|
- notes += "#{note.content}(#{note.email}), "
- end
- notes.delete_suffix ', '
- end
-
- def clean_tags
- tags = ''
- self.tags.each do |tag|
- tags += "#{tag.name}, "
- end
- tags.delete_suffix ', '
- end
- end
-end
diff --git a/app/models/contract_template.rb b/app/models/contract_template.rb
index ba2ce3d..1115123 100644
--- a/app/models/contract_template.rb
+++ b/app/models/contract_template.rb
@@ -21,7 +21,6 @@ class ContractTemplate < ApplicationRecord
monetize :fee_cents
has_rich_text :body
has_rich_text :guardian_clause
- has_rich_text :signature_legal_text
validates :name, presence: true
validates :release_type, presence: true
@@ -43,8 +42,6 @@ class ContractTemplate < ApplicationRecord
scope :non_archived, -> { where(archived_at: nil) }
scope :order_by_name, -> { order(:name) }
- enum accessibility: [:public_template, :private_template]
-
def fee?
!fee.zero?
end
@@ -68,10 +65,4 @@ class ContractTemplate < ApplicationRecord
def has_questionnaire?
(1..NUMBER_OF_CUSTOM_FIELDS).any? { |n| public_send("question_#{n}_text").presence }
end
-
- def attributes
- result = super()
- result[:signature_legal_text] = signature_legal_text.as_json
- result
- end
end
diff --git a/app/models/location_release.rb b/app/models/location_release.rb
index 1e49d73..a5b6a02 100644
--- a/app/models/location_release.rb
+++ b/app/models/location_release.rb
@@ -10,13 +10,6 @@ class LocationRelease < ApplicationRecord
include Syncable
include Taggable
include PersonName
- include CsvExportable
-
- class << self
- def custom_csv_exportable_headers
- %i[name address]
- end
- end
composed_of :address,
mapping: [
diff --git a/app/models/material_release.rb b/app/models/material_release.rb
index dc5380e..56d45ee 100644
--- a/app/models/material_release.rb
+++ b/app/models/material_release.rb
@@ -10,15 +10,8 @@ class MaterialRelease < ApplicationRecord
include Syncable
include Taggable
include PersonName
- include CsvExportable
-
- class << self
- def custom_csv_exportable_headers
- %i[name]
- end
- end
-
- composed_of :person_address,
+
+ composed_of :person_address,
class_name: "Address",
mapping: [
%w(person_address_street1 street1),
@@ -37,15 +30,15 @@ class MaterialRelease < ApplicationRecord
validates :signature, attached: true
end
- searchable_on %i[
- name
+ searchable_on %i[
+ name
person_address_street1 person_address_street2 person_address_city person_address_state person_address_zip person_address_country
]
def contact_person
@contact_person ||= Contact.new(person_name, person_address, person_email, person_phone)
end
-
+
def minor?
false
end
diff --git a/app/models/medical_release.rb b/app/models/medical_release.rb
index e037ef5..5d0692d 100644
--- a/app/models/medical_release.rb
+++ b/app/models/medical_release.rb
@@ -11,13 +11,6 @@ class MedicalRelease < ApplicationRecord
include SecondGuardianPhotoable
include GuardianName
include SecondGuardianName
- include CsvExportable
-
- class << self
- def custom_csv_exportable_headers
- %i[approved? name contact_info]
- end
- end
NUMBER_OF_CUSTOM_FIELDS = 15
@@ -107,18 +100,6 @@ class MedicalRelease < ApplicationRecord
"#{project.name.parameterize}_#{contract_template.release_type}_#{(signed_at || created_at).strftime("%Y.%m.%d")}_#{release_number}_#{filename_suffix.parameterize}"
end
- def approve_by(user)
- return unless approved_at.nil?
-
- self.approved_by_user_name = user.full_name
- self.approved_by_user_email = user.email
- self.approved_at = Time.zone.now
- end
-
- def approved?
- approved_at.present?
- end
-
private
def valid_answers
diff --git a/app/models/misc_release.rb b/app/models/misc_release.rb
index 2679542..f9437dd 100644
--- a/app/models/misc_release.rb
+++ b/app/models/misc_release.rb
@@ -9,13 +9,6 @@ class MiscRelease < ApplicationRecord
include PersonName
include GuardianName
include GuardianPhotoable
- include CsvExportable
-
- class << self
- def custom_csv_exportable_headers
- %i[name contact_info]
- end
- end
NUMBER_OF_CUSTOM_FIELDS = 15
diff --git a/app/models/music_release.rb b/app/models/music_release.rb
index b324b9f..29fd426 100644
--- a/app/models/music_release.rb
+++ b/app/models/music_release.rb
@@ -7,14 +7,7 @@ class MusicRelease < ApplicationRecord
include Searchable
include Taggable
include PersonName
- include CsvExportable
-
- class << self
- def custom_csv_exportable_headers
- %i[name file_infos_count composers_count publishers_count]
- end
- end
-
+
has_many :file_infos, as: :releasable, dependent: :destroy
has_many :composers, dependent: :destroy
has_many :publishers, dependent: :destroy
@@ -79,18 +72,6 @@ class MusicRelease < ApplicationRecord
false
end
- def file_infos_count
- file_infos.size
- end
-
- def composers_count
- composers.size
- end
-
- def publishers_count
- publishers.size
- end
-
private
def publisher_percentages_add_up_to_100
diff --git a/app/models/project.rb b/app/models/project.rb
index b720b32..abdeb18 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -15,6 +15,8 @@ class Project < ApplicationRecord
has_many :talent_releases, dependent: :destroy
has_many :medical_releases, dependent: :destroy
has_many :misc_releases, dependent: :destroy
+ has_many :casting_calls, dependent: :destroy
+ has_many :casting_call_interviews, through: :casting_calls
has_many :videos, dependent: :destroy
has_many :imports, dependent: :destroy
has_many :contract_templates, dependent: :destroy
diff --git a/app/models/qr_code.rb b/app/models/qr_code.rb
index 2dd13de..a38e0df 100644
--- a/app/models/qr_code.rb
+++ b/app/models/qr_code.rb
@@ -10,7 +10,7 @@ class QrCode
url = Rails.application.routes.url_helpers.url_for(route)
filename = [contract_template.project.name, contract_template.name].map(&:parameterize).join("_")
- new(url, "#{filename}.png")
+ new(url, filename)
end
def initialize(url, filename = "qrcode.png")
diff --git a/app/models/talent_release.rb b/app/models/talent_release.rb
index f507ba7..8ca4dbe 100644
--- a/app/models/talent_release.rb
+++ b/app/models/talent_release.rb
@@ -14,13 +14,6 @@ class TalentRelease < ApplicationRecord
include SecondGuardianPhotoable
include GuardianName
include SecondGuardianName
- include CsvExportable
-
- class << self
- def custom_csv_exportable_headers
- %i[name phone email]
- end
- end
composed_of :person_address,
class_name: "Address",
@@ -93,14 +86,6 @@ class TalentRelease < ApplicationRecord
person_name
end
- def phone
- person_phone
- end
-
- def email
- person_email
- end
-
def filename_suffix
"#{person_last_name} #{person_first_name}"
end
diff --git a/app/policies/casting_call_interview_policy.rb b/app/policies/casting_call_interview_policy.rb
new file mode 100644
index 0000000..ac7a232
--- /dev/null
+++ b/app/policies/casting_call_interview_policy.rb
@@ -0,0 +1,29 @@
+class CastingCallInterviewPolicy < ApplicationPolicy
+ def index?
+ true
+ end
+
+ def show?
+ true
+ end
+
+ def create?
+ true
+ end
+
+ def destroy?
+ true
+ end
+
+ def update?
+ true
+ end
+
+ def complete?
+ true
+ end
+
+ def download?
+ true
+ end
+end
diff --git a/app/policies/casting_call_policy.rb b/app/policies/casting_call_policy.rb
new file mode 100644
index 0000000..a2b4596
--- /dev/null
+++ b/app/policies/casting_call_policy.rb
@@ -0,0 +1,25 @@
+class CastingCallPolicy < ApplicationPolicy
+ def index?
+ true
+ end
+
+ def show?
+ true
+ end
+
+ def create?
+ true
+ end
+
+ def destroy?
+ true
+ end
+
+ def update?
+ true
+ end
+
+ def cancel?
+ true
+ end
+end
\ No newline at end of file
diff --git a/app/policies/contract_template_policy.rb b/app/policies/contract_template_policy.rb
index ca439b8..e6bb8d1 100644
--- a/app/policies/contract_template_policy.rb
+++ b/app/policies/contract_template_policy.rb
@@ -3,10 +3,8 @@ class ContractTemplatePolicy < ApplicationPolicy
def resolve
if user.account_manager?
scope.left_outer_joins(:project).where(projects: {account: user.account})
- elsif user.manager?
- scope.left_outer_joins(project: :project_memberships).where(project_memberships: { user_id: user.id })
else
- scope.public_template.left_outer_joins(project: :project_memberships).where(project_memberships: { user_id: user.id })
+ scope.left_outer_joins(project: :project_memberships).where(project_memberships: { user_id: user.id })
end
end
end
diff --git a/app/policies/medical_release_policy.rb b/app/policies/medical_release_policy.rb
index 9ce60ce..8866337 100644
--- a/app/policies/medical_release_policy.rb
+++ b/app/policies/medical_release_policy.rb
@@ -15,14 +15,6 @@ class MedicalReleasePolicy < ReleasePolicy
user.manager? || user.account_manager?
end
- def review?
- user.account_manager?
- end
-
- def approve?
- review?
- end
-
def edit_photos?
true
end
diff --git a/app/policies/project_policy.rb b/app/policies/project_policy.rb
index 32c0c70..0588520 100644
--- a/app/policies/project_policy.rb
+++ b/app/policies/project_policy.rb
@@ -40,4 +40,8 @@ class ProjectPolicy < ApplicationPolicy
def show_task_results?
show?
end
+
+ def show_casting_call_interview_results?
+ show?
+ end
end
diff --git a/app/services/interview_files_collection_service.rb b/app/services/interview_files_collection_service.rb
new file mode 100644
index 0000000..c99a6f8
--- /dev/null
+++ b/app/services/interview_files_collection_service.rb
@@ -0,0 +1,24 @@
+class InterviewFilesCollectionService
+ def initialize(files, folder_name)
+ @files = files
+ @folder_name = folder_name
+ end
+
+ def build
+ Dir.mktmpdir { |dir|
+ files.each do |file|
+ open("#{dir}/#{file.filename}", 'wb') do |tmp_file|
+ tmp_file << open(file.service_url.to_s).read
+ end
+ end
+
+ read_files = Dir.entries("#{dir}/").select { |f| !File.directory? f }
+ raise StandardError.new "Files not found." unless read_files.any?
+ yield(dir, read_files)
+ }
+ end
+
+ private
+
+ attr_reader :files, :folder_name
+end
\ No newline at end of file
diff --git a/app/telemetry/analytics.rb b/app/telemetry/analytics.rb
index 11b2db0..412532e 100644
--- a/app/telemetry/analytics.rb
+++ b/app/telemetry/analytics.rb
@@ -169,6 +169,24 @@ class Analytics
)
end
end
+
+ def track_create_casting_call(user_agent:, user_ip:)
+ if analytics_enabled?
+ identify
+ track(
+ {
+ user_id: user.id,
+ event: "Casting call created",
+ properties: {
+ account: account.try(:name),
+ account_id: account.try(:id),
+ user_agent: user_agent,
+ ip: user_ip,
+ },
+ }
+ )
+ end
+ end
private
diff --git a/app/views/admin/application/_side_nav.html.erb b/app/views/admin/application/_side_nav.html.erb
index 23ca54c..3054bf6 100644
--- a/app/views/admin/application/_side_nav.html.erb
+++ b/app/views/admin/application/_side_nav.html.erb
@@ -10,6 +10,9 @@
<%= link_to fa_icon("tasks fw", text: "Task Requests"), [:admin, :task_requests], class: class_string("nav-link", "active" => controller_name == "task_requests") %>
+
+ <%= link_to fa_icon("video-camera fw", text: "Casting Call Interviews"), [:admin, :casting_call_interviews], class: class_string("nav-link", "active" => controller_name == "casting_call_interviews") %>
+
<%= link_to fa_icon("bug fw", text: "Errors"), "https://sentry.io/bigmedia/", class: "nav-link", target: :_blank %>
diff --git a/app/views/admin/casting_call_interviews/_casting_call_interview.html.erb b/app/views/admin/casting_call_interviews/_casting_call_interview.html.erb
new file mode 100644
index 0000000..697743b
--- /dev/null
+++ b/app/views/admin/casting_call_interviews/_casting_call_interview.html.erb
@@ -0,0 +1,26 @@
+
+ |
+ <%= casting_call_interview.casting_call.project.account.name.titleize %>
+ |
+
+ <%= casting_call_interview.casting_call.title.titleize %>
+ |
+
+ <%= casting_call_interview.performer_name %>
+ |
+
+ <%= casting_call_interview.interview_date %>
+ |
+
+
+ <%= button_tag "Manage", class: "btn btn-light btn-sm dropdown-toggle border", data: { toggle: "dropdown", boundary: "window" }, aria: { haspopup: true, expanded: false } %>
+
+
+ |
+
diff --git a/app/views/admin/casting_call_interviews/_form.html.erb b/app/views/admin/casting_call_interviews/_form.html.erb
new file mode 100644
index 0000000..ffa30fe
--- /dev/null
+++ b/app/views/admin/casting_call_interviews/_form.html.erb
@@ -0,0 +1,15 @@
+<%= errors_summary_for casting_call_interview %>
+
+<%= bootstrap_form_with model: model, local: true do |form| %>
+ <%= form.text_field :performer_name, required: true %>
+ <%= form.grouped_collection_select(:casting_call_id, @accounts, :casting_calls, :name, :id, :title, { prompt: "Select a Casting Call", required: true, class: "form-control custom-select" }) %>
+ <%= form.text_field :interview_date, class: "datepicker-control" %>
+ <%= form.text_field :zoom_meeting_url %>
+
+
+ <%= link_to t("shared.cancel"), [:admin, :casting_call_interviews], class: "col-3 text-reset" %>
+
+ <%= form.submit class: class_string("btn btn-block", ["btn-success", "btn-primary"] => casting_call_interview.new_record?), data: { disable_with: t("shared.disable_with") } %>
+
+
+<% end %>
diff --git a/app/views/admin/casting_call_interviews/edit.html.erb b/app/views/admin/casting_call_interviews/edit.html.erb
new file mode 100644
index 0000000..bc03af7
--- /dev/null
+++ b/app/views/admin/casting_call_interviews/edit.html.erb
@@ -0,0 +1,6 @@
+
+ <%= card_header text: "Edit Casting Call Interview", close_action_path: [:admin, :casting_call_interviews] %>
+
+ <%= render "form", model: [:admin, @casting_call_interview], casting_call_interview: @casting_call_interview %>
+
+
\ No newline at end of file
diff --git a/app/views/admin/casting_call_interviews/index.html.erb b/app/views/admin/casting_call_interviews/index.html.erb
new file mode 100644
index 0000000..84d9d98
--- /dev/null
+++ b/app/views/admin/casting_call_interviews/index.html.erb
@@ -0,0 +1,32 @@
+
+ <% if policy(CastingCall).new? %>
+ <%= link_to fa_icon("plus", text: t(".actions.new")), [:new, :admin, :casting_call_interview], class: "btn btn-primary mb-3" %>
+ <% end %>
+
+
+
+
+
+
+ | Account Name |
+ Casting Call Request |
+ Perfomer's Name |
+ Interview Date |
+ |
+
+
+
+ <% if @casting_call_interviews.any? %>
+ <%= render @casting_call_interviews %>
+ <% else %>
+
+ | <%= t(".empty") %> |
+
+ <% end %>
+
+
+
+
+
diff --git a/app/views/admin/casting_call_interviews/new.html.erb b/app/views/admin/casting_call_interviews/new.html.erb
new file mode 100644
index 0000000..053d0ac
--- /dev/null
+++ b/app/views/admin/casting_call_interviews/new.html.erb
@@ -0,0 +1,6 @@
+
+ <%= card_header text: t(".heading"), close_action_path: [:admin, :casting_call_interviews] %>
+
+ <%= render "form", model: [:admin, @casting_call_interview], casting_call_interview: @casting_call_interview, casting_calls: @casting_calls %>
+
+
diff --git a/app/views/application/_sidebar.html.erb b/app/views/application/_sidebar.html.erb
index b6b0cbf..7c508ff 100644
--- a/app/views/application/_sidebar.html.erb
+++ b/app/views/application/_sidebar.html.erb
@@ -43,6 +43,12 @@
<%= product_wordmark :deliver_me, class: class_string("d-inline-block", "disabled" => !Current.account.deliverme_enabled?) %>
<% end %>
+
+ <%= link_to [project, :casting_calls], class: class_string("nav-link", "active" => controller_name == "casting_calls") do %>
+ <%= lock_icon_for(Current.account, :castme) %>
+ <%= product_wordmark :cast_me, class: class_string("d-inline-block", "disabled" => !Current.account.castme_enabled?) %>
+ <% end %>
+
diff --git a/app/views/approvals/new.html.erb b/app/views/approvals/new.html.erb
deleted file mode 100644
index 688d2ba..0000000
--- a/app/views/approvals/new.html.erb
+++ /dev/null
@@ -1,15 +0,0 @@
-
- <%= card_header text: t(".heading"), close_action_path: [@project, :medical_releases] %>
-
-
-
\ No newline at end of file
diff --git a/app/views/broadcasts/splash.html.erb b/app/views/broadcasts/splash.html.erb
index f679a0d..3cbca32 100644
--- a/app/views/broadcasts/splash.html.erb
+++ b/app/views/broadcasts/splash.html.erb
@@ -18,7 +18,7 @@
diff --git a/app/views/casting_call_interviews/_casting_call_interview.html.erb b/app/views/casting_call_interviews/_casting_call_interview.html.erb
new file mode 100644
index 0000000..ee1ff58
--- /dev/null
+++ b/app/views/casting_call_interviews/_casting_call_interview.html.erb
@@ -0,0 +1,27 @@
+
+ |
+ <%= casting_call_interview.casting_call.project.account.name.titleize %>
+ |
+
+ <%= casting_call_interview.casting_call.title&.titleize %>
+ |
+
+ <%= casting_call_interview.performer_name %>
+ |
+
+ <%= casting_call_interview.interviewed_at %>
+ |
+
+
+ <%= button_tag "Manage", class: "btn btn-light btn-sm dropdown-toggle border", data: { toggle: "dropdown", boundary: "window" }, aria: { haspopup: true, expanded: false } %>
+
+
+ |
+
diff --git a/app/views/casting_call_interviews/_file.html.erb b/app/views/casting_call_interviews/_file.html.erb
new file mode 100644
index 0000000..85fe6bb
--- /dev/null
+++ b/app/views/casting_call_interviews/_file.html.erb
@@ -0,0 +1,6 @@
+
+ | <%= file.filename %> |
+
+ <%= link_to fa_icon("download"), file, target: "_blank" %>
+ |
+
diff --git a/app/views/casting_call_interviews/index.html.erb b/app/views/casting_call_interviews/index.html.erb
new file mode 100644
index 0000000..ef64b1e
--- /dev/null
+++ b/app/views/casting_call_interviews/index.html.erb
@@ -0,0 +1,26 @@
+
+
+
+
+ | Account Name |
+ Casting Call Request |
+ Perfomer's Name |
+ Interviewed At |
+ |
+
+
+
+ <% if @casting_call_interviews.any? %>
+ <%= render @casting_call_interviews %>
+ <% else %>
+
+ | <%= t(".empty") %> |
+
+ <% end %>
+
+
+
+
+
diff --git a/app/views/casting_call_interviews/show.html.erb b/app/views/casting_call_interviews/show.html.erb
new file mode 100644
index 0000000..727d285
--- /dev/null
+++ b/app/views/casting_call_interviews/show.html.erb
@@ -0,0 +1,25 @@
+
+
Files:
+
+
+
+
+ | Filename |
+ |
+
+
+
+ <% if @files.any? %>
+ <%= render partial: "file", collection: @files %>
+ <% else %>
+
+ | <%= t(".empty") %> |
+
+ <% end %>
+
+
+
+ <%= will_paginate @files %>
+
+
+
\ No newline at end of file
diff --git a/app/views/casting_calls/_casting_call.html.erb b/app/views/casting_calls/_casting_call.html.erb
new file mode 100644
index 0000000..d152b28
--- /dev/null
+++ b/app/views/casting_calls/_casting_call.html.erb
@@ -0,0 +1,28 @@
+
+ |
+ <%= casting_call.created_at.strftime('%D') %>
+ |
+
+ <%= casting_call.title %>
+ |
+
+ <%= casting_call.status %>
+ |
+
+
+ <%= button_tag t(".actions.manage"), class: "btn btn-light btn-sm dropdown-toggle border", data: { toggle: "dropdown", boundary: "window" }, aria: { haspopup: true, expanded: false } %>
+
+
+ |
+
diff --git a/app/views/casting_calls/_form.html.erb b/app/views/casting_calls/_form.html.erb
new file mode 100644
index 0000000..b5434dc
--- /dev/null
+++ b/app/views/casting_calls/_form.html.erb
@@ -0,0 +1,22 @@
+<%= errors_summary_for casting_call %>
+
+<%= bootstrap_form_with model: model, url: [@project, @casting_call, show_chat: true], local: true do |form| %>
+
+ <%= fa_icon "info-circle" %>
+ <%= t '.info_message' %>
+
+
+ <%= form.text_field :title, label: t('.labels.title') %>
+ <%= form.text_area :description, label: t('.labels.description') %>
+ <%= form.text_area :project_description, label: t('.labels.project_description') %>
+ <%= form.text_area :interview_instructions, label: t('.labels.interview_instructions') %>
+ <%= form.text_area :interview_requirements, label: t('.labels.interview_requirements') %>
+ <%= form.text_area :questions, label: t('.labels.questions') %>
+
+
+ <%= link_to t("shared.cancel"), [project, :casting_calls], class: "col-3 text-reset" %>
+
+ <%= form.submit class: class_string("btn btn-block", ["btn-success", "btn-primary"] => casting_call.new_record?), data: { disable_with: t("shared.disable_with") } %>
+
+
+<% end %>
\ No newline at end of file
diff --git a/app/views/casting_calls/create.html.erb b/app/views/casting_calls/create.html.erb
new file mode 100644
index 0000000..9a52e24
--- /dev/null
+++ b/app/views/casting_calls/create.html.erb
@@ -0,0 +1,2 @@
+<%= render "shared/initiate_hubspot_chat" %>
+<%= t '.success_message' %>
diff --git a/app/views/casting_calls/edit.html.erb b/app/views/casting_calls/edit.html.erb
new file mode 100644
index 0000000..d09dc0f
--- /dev/null
+++ b/app/views/casting_calls/edit.html.erb
@@ -0,0 +1,6 @@
+
+ <%= card_header text: t(".heading"), close_action_path: [@project, :casting_calls] %>
+
+ <%= render "form", model: [@project, @casting_call], casting_call: @casting_call, project: @project %>
+
+
\ No newline at end of file
diff --git a/app/views/casting_calls/index.html.erb b/app/views/casting_calls/index.html.erb
new file mode 100644
index 0000000..434e2af
--- /dev/null
+++ b/app/views/casting_calls/index.html.erb
@@ -0,0 +1,37 @@
+<%= product_wordmark :cast_me, class: "small mb-3" %>
+
+
+
+
+ <% if policy(CastingCall).new? %>
+ <%= link_to fa_icon("plus", text: t(".actions.new")), [:new, @project, :casting_call], class: "btn btn-primary mb-2" %>
+ <% end %>
+
+
+
+
+
+
+
+
+ | <%= t(".table_headers.casting_call_created_on") %> |
+ <%= t(".table_headers.casting_call_title") %> |
+ <%= t(".table_headers.casting_call_status") %> |
+ |
+
+
+
+ <% if @casting_calls.any? %>
+ <%= render @casting_calls %>
+ <% else %>
+
+ | <%= t(".empty") %> |
+
+ <% end %>
+
+
+
+
+
\ No newline at end of file
diff --git a/app/views/casting_calls/new.html.erb b/app/views/casting_calls/new.html.erb
new file mode 100644
index 0000000..d09dc0f
--- /dev/null
+++ b/app/views/casting_calls/new.html.erb
@@ -0,0 +1,6 @@
+
+ <%= card_header text: t(".heading"), close_action_path: [@project, :casting_calls] %>
+
+ <%= render "form", model: [@project, @casting_call], casting_call: @casting_call, project: @project %>
+
+
\ No newline at end of file
diff --git a/app/views/casting_calls/show.html.erb b/app/views/casting_calls/show.html.erb
new file mode 100644
index 0000000..a56078c
--- /dev/null
+++ b/app/views/casting_calls/show.html.erb
@@ -0,0 +1,38 @@
+<% content_for :header do %>
+
+<% end %>
+
+
+ <%= card_header text: @casting_call.title, close_action_path: [@project, :casting_calls] %>
+
+
+
+
+ <%= description_list_pair_for @casting_call, :title, append: ":" %>
+ <%= description_list_pair_for @casting_call, :description, append: ":" %>
+ <%= description_list_pair_for @casting_call, :project_description, append: ":" %>
+ <%= description_list_pair_for @casting_call, :created_at, append: ":" %>
+
+
+
+
+ <%= description_list_pair_for @casting_call, :status, append: ":" %>
+ <%= description_list_pair_for @casting_call, :interview_instructions, append: ":" %>
+ <%= description_list_pair_for @casting_call, :interview_requirements, append: ":" %>
+ <%= description_list_pair_for @casting_call, :questions, append: ":" %>
+
+
+
+ <% unless @casting_call.cancelled? %>
+
+ <%= link_to "Schedule an Audition", ENV["CASTME_AUDITION_BOOKING_URL"], target: "_blank", class: "btn btn-primary" %>
+
+ <% end %>
+
+
diff --git a/app/views/contract_templates/_contract_template.html.erb b/app/views/contract_templates/_contract_template.html.erb
index e5d2e65..c3813ee 100644
--- a/app/views/contract_templates/_contract_template.html.erb
+++ b/app/views/contract_templates/_contract_template.html.erb
@@ -15,7 +15,7 @@
<%= contract_template.releases.size %>
|
-
+ |
<%= button_tag t(".actions.manage"), class: "btn btn-light btn-sm dropdown-toggle border", data: { toggle: "dropdown", boundary: "window" }, aria: { haspopup: true, expanded: false } %>
diff --git a/app/views/contract_templates/_form.html.erb b/app/views/contract_templates/_form.html.erb
index e2d164c..5b11b31 100644
--- a/app/views/contract_templates/_form.html.erb
+++ b/app/views/contract_templates/_form.html.erb
@@ -4,10 +4,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(appearance talent 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) } }, class: "form-control custom-select" %>
-
- <%= form.radio_button :accessibility, :public_template, label: "Public", wrapper_class: "mr-3" %>
- <%= form.radio_button :accessibility, :private_template, label: "Private" %>
-
<%= form.number_field :fee, min:"0", max:"99999999", step: "0.01", prepend: "$", wrapper_class: "col-sm-6" %>
@@ -29,11 +25,6 @@
<%= form.rich_text_area :guardian_clause %>
<% end %>
-
- <%= form.form_group do %>
- <%= form.rich_text_area :signature_legal_text %>
- <% end %>
-
<% end %>
<%= field_set_tag content_tag(:span, t(".custom_fields.heading"), class: "h6 text-muted text-uppercase"), id: "custom_fields", style: "display: none;" do %>
diff --git a/app/views/contract_templates/splash.html.erb b/app/views/contract_templates/splash.html.erb
index 26f22f9..fb0622e 100644
--- a/app/views/contract_templates/splash.html.erb
+++ b/app/views/contract_templates/splash.html.erb
@@ -18,7 +18,7 @@
diff --git a/app/views/contracts/_for_office_use_only.erb b/app/views/contracts/_for_office_use_only.erb
deleted file mode 100644
index 15abd19..0000000
--- a/app/views/contracts/_for_office_use_only.erb
+++ /dev/null
@@ -1,13 +0,0 @@
-<% if preview %>
- PREVIEW ONLY
-<% end %>
-
-<%= t '.heading' %>
-
-
- <%= description_list_pair t('.description_labels.producer'), releasable.project.account.name %>
- <%= description_list_pair t('.description_labels.production'), releasable.project.name %>
- <%= description_list_pair t('.description_labels.employee_issued_to'), releasable.name %>
- <%= description_list_pair t('.description_labels.issued_by'), releasable.approved_by_user_name %>
- <%= description_list_pair t('.description_labels.date_issued'), releasable.approved_at %>
-
\ No newline at end of file
diff --git a/app/views/contracts/pdf.html.erb b/app/views/contracts/pdf.html.erb
index f9d72f7..b430b4e 100644
--- a/app/views/contracts/pdf.html.erb
+++ b/app/views/contracts/pdf.html.erb
@@ -25,13 +25,6 @@
<%= render "contracts/signature_page", releasable: releasable, contract_template: contract_template, preview: preview %>
-
-<% if releasable.class == MedicalRelease && releasable.approved? %>
-
- <%= render "contracts/for_office_use_only", releasable: releasable, preview: preview %>
-
-<% end %>
-
<% if releasable.class == AcquiredMediaRelease %>
<%= render "contracts/files", release: releasable, preview: preview %>
diff --git a/app/views/interview_downloads/_other_pending_downloads.html.erb b/app/views/interview_downloads/_other_pending_downloads.html.erb
new file mode 100644
index 0000000..d61bafb
--- /dev/null
+++ b/app/views/interview_downloads/_other_pending_downloads.html.erb
@@ -0,0 +1,17 @@
+ Your <%= release_type.titleize %> files are being prepared for download. You will be notified when it's ready.
+
+ The following downloads are also in progress:
+
+ <% downloads.each do |download| %>
+ <% if download.release_type == "reports"%>
+ - <%= download.release_type.titleize %> (as of <%= time_ago_in_words(download.created_at) %> ago)
+
+ <% elsif download.release_type == "CastingCallInterview"%>
+ - <%= download.release_type.titleize %> files (as of <%= time_ago_in_words(download.created_at) %> ago)
+
+ <% else %>
+ - <%= download.release_type.titleize %> contracts (as of <%= time_ago_in_words(download.created_at) %> ago)
+
+ <% end %>
+ <% end %>
+
diff --git a/app/views/medical_releases/_medical_release.html.erb b/app/views/medical_releases/_medical_release.html.erb
index a598998..29c4b73 100644
--- a/app/views/medical_releases/_medical_release.html.erb
+++ b/app/views/medical_releases/_medical_release.html.erb
@@ -1,13 +1,5 @@
| <%= check_box_tag "medical_release_ids[]", medical_release.id, false %> |
-
- <% if medical_release.approved? %>
- <% tooltip_user_data = get_approval_data_for_medical_release(medical_release) %>
-
- <% end %>
- |
<% if medical_release.photo.attached? %>
<%= image_tag medium_variant(medical_release.photo), class: "img-fluid" %>
@@ -45,9 +37,6 @@
<% if policy(medical_release.tags).new? %>
<%= link_to fa_icon("tags fw", text: "Tags"), [:new, medical_release, :acts_as_taggable_on_tag], class: "dropdown-item", remote: true %>
<% end %>
- <% if policy(MedicalRelease).review? %>
- <%= link_to fa_icon("search fw", text: t('.actions.review')), new_medical_release_approvals_path(medical_release), class: "dropdown-item" %>
- <% end %>
<% if policy(MedicalRelease).download_single? && policy(Contract).show? && (medical_release.contract.attached? || medical_release.contract_template.present?) %>
<%= link_to fa_icon("download fw", text: "Download"), [medical_release, :contracts, format: "pdf"], class: "dropdown-item", target: "_blank" %>
<% end %>
diff --git a/app/views/medical_releases/index.html.erb b/app/views/medical_releases/index.html.erb
index abba148..e056d0f 100644
--- a/app/views/medical_releases/index.html.erb
+++ b/app/views/medical_releases/index.html.erb
@@ -22,7 +22,6 @@
| <%= check_box_tag "medical_release_ids[]", false, false %> |
- <%= t '.table_headers.approved'%> |
|
<%= MedicalRelease.human_attribute_name(:person_name) %> |
<%= MedicalRelease.human_attribute_name(:contact_info) %> |
diff --git a/app/views/medical_releases/review.html.erb b/app/views/medical_releases/review.html.erb
deleted file mode 100644
index 8499e7c..0000000
--- a/app/views/medical_releases/review.html.erb
+++ /dev/null
@@ -1,15 +0,0 @@
-
- <%= card_header text: t(".heading"), close_action_path: [@project, :medical_releases] %>
-
-
-
\ No newline at end of file
diff --git a/app/views/projects/show.html.erb b/app/views/projects/show.html.erb
index 86ac532..96be800 100644
--- a/app/views/projects/show.html.erb
+++ b/app/views/projects/show.html.erb
@@ -21,6 +21,11 @@
<%= link_to t("projects.show.tasks"), [@project, :tasks], class: "text-decoration-none text-reset stretched-link" %>
<% end %>
<% end %>
+ <% if policy(Project).show_casting_call_interview_results? %>
+ <%= render "folder_card" do %>
+ <%= link_to t("projects.show.casting_call_interviews"), [@project, :casting_call_interviews], class: "text-decoration-none text-reset stretched-link" %>
+ <% end %>
+ <% end %>
diff --git a/app/views/public/acquired_media_releases/new.html.erb b/app/views/public/acquired_media_releases/new.html.erb
index f8297fc..0f034f1 100644
--- a/app/views/public/acquired_media_releases/new.html.erb
+++ b/app/views/public/acquired_media_releases/new.html.erb
@@ -50,7 +50,7 @@
<%= card_field_set_tag t(".signature.heading") do %>
- <%= render "shared/signature_fields", form: form, signature_legal_text: @contract_template.signature_legal_text %>
+ <%= render "shared/signature_fields", form: form %>
<% end %>
diff --git a/app/views/public/appearance_releases/new.html.erb b/app/views/public/appearance_releases/new.html.erb
index 5b95763..fc80010 100644
--- a/app/views/public/appearance_releases/new.html.erb
+++ b/app/views/public/appearance_releases/new.html.erb
@@ -156,7 +156,7 @@
<% end %>
<%= card_field_set_tag t(".signature.heading") do %>
- <%= render "shared/signature_fields", form: form, signature_legal_text: @contract_template.signature_legal_text %>
+ <%= render "shared/signature_fields", form: form %>
<% end %>
diff --git a/app/views/public/casting_call_interviews/show.html.erb b/app/views/public/casting_call_interviews/show.html.erb
new file mode 100644
index 0000000..a0baedf
--- /dev/null
+++ b/app/views/public/casting_call_interviews/show.html.erb
@@ -0,0 +1,51 @@
+
+ <%= card_header text: "Casting call interview details" %>
+
+
+
+
+ <%= description_list_pair_for @casting_call_interview, :performer_name, append: ":" %>
+ <%= description_list_pair_for @casting_call_interview, :interview_date, append: ":" %>
+
+
+
+ INTERVIEW FILES:
+
+
+
+
+ <%= card_header text: t(".heading") %>
+
+ <%= errors_summary_for @casting_call_interview %>
+ <%= bootstrap_form_with model: @casting_call_interview, url: casting_call_interview_path(token: @casting_call_interview.token), local: true do |form| %>
+
+ <%= form.label :files %>
+ <%= form.file_field :files, disable: true, direct_upload: true, multiple: true, id: "casting_call_interivew_files", hide_label: true %>
+ <% @casting_call_interview.files.each do |file| %>
+ <% unless file.persisted? %>
+ <%= hidden_field_tag "#{@casting_call_interview.model_name.param_key}[files][]", file.signed_id %>
+ <% end %>
+ <% end %>
+
+
+
+
+
+ <%= form.button t(".update"), class: "btn btn-block btn-lg btn-success", data: { disable_with: t("shared.disable_with") } %>
+
+ <% end %>
+
+
+
+
+
+ <%= link_to "Start Interview", @casting_call_interview.join_zoom_meeting_url, target: "_blank", class: "btn btn-primary" %>
+
+
+
diff --git a/app/views/public/casting_calls/show.html.erb b/app/views/public/casting_calls/show.html.erb
new file mode 100644
index 0000000..ae634f7
--- /dev/null
+++ b/app/views/public/casting_calls/show.html.erb
@@ -0,0 +1,38 @@
+<% content_for :header do %>
+
+<% end %>
+
+
+ <%= card_header text: @casting_call.title %>
+
+
+
+
+ <%= description_list_pair_for @casting_call, :title, append: ":" %>
+ <%= description_list_pair_for @casting_call, :description, append: ":" %>
+ <%= description_list_pair_for @casting_call, :project_description, append: ":" %>
+ <%= description_list_pair_for @casting_call, :created_at, append: ":" %>
+
+
+
+
+ <%= description_list_pair_for @casting_call, :status, append: ":" %>
+ <%= description_list_pair_for @casting_call, :interview_instructions, append: ":" %>
+ <%= description_list_pair_for @casting_call, :interview_requirements, append: ":" %>
+ <%= description_list_pair_for @casting_call, :questions, append: ":" %>
+
+
+
+ <% unless @casting_call.cancelled? %>
+
+ <%= link_to "Schedule an Audition", ENV["CASTME_AUDITION_BOOKING_URL"], target: "_blank", class: "btn btn-primary" %>
+
+ <% end %>
+
+
diff --git a/app/views/public/location_releases/new.html.erb b/app/views/public/location_releases/new.html.erb
index 57b6bde..c688ecc 100644
--- a/app/views/public/location_releases/new.html.erb
+++ b/app/views/public/location_releases/new.html.erb
@@ -50,7 +50,7 @@
<% end %>
<%= card_field_set_tag t(".signature.heading") do %>
- <%= render "shared/signature_fields", form: form, instruction: 'An Authorized Signatory', signature_legal_text: @contract_template.signature_legal_text %>
+ <%= render "shared/signature_fields", form: form, instruction: 'An Authorized Signatory' %>
<% end %>
diff --git a/app/views/public/material_releases/new.html.erb b/app/views/public/material_releases/new.html.erb
index 6e756e4..565ac57 100644
--- a/app/views/public/material_releases/new.html.erb
+++ b/app/views/public/material_releases/new.html.erb
@@ -41,7 +41,7 @@
<%= card_field_set_tag t(".signature.heading") do %>
- <%= render "shared/signature_fields", form: form, instruction: 'For Owner or Authorized Signatory', signature_legal_text: @contract_template.signature_legal_text %>
+ <%= render "shared/signature_fields", form: form, instruction: 'For Owner or Authorized Signatory' %>
<% end %>
diff --git a/app/views/public/medical_releases/new.html.erb b/app/views/public/medical_releases/new.html.erb
index 2c031bc..dd58cc3 100644
--- a/app/views/public/medical_releases/new.html.erb
+++ b/app/views/public/medical_releases/new.html.erb
@@ -145,7 +145,7 @@
<% end %>
<%= card_field_set_tag t(".signature.heading") do %>
- <%= render "shared/signature_fields", form: form, signature_legal_text: @contract_template.signature_legal_text %>
+ <%= render "shared/signature_fields", form: form %>
<% end %>
diff --git a/app/views/public/misc_releases/new.html.erb b/app/views/public/misc_releases/new.html.erb
index 96c8743..a2e8c50 100644
--- a/app/views/public/misc_releases/new.html.erb
+++ b/app/views/public/misc_releases/new.html.erb
@@ -39,7 +39,9 @@
<%= form.text_field :person_first_name, required: true, wrapper_class: "col-sm-6" %>
<%= form.text_field :person_last_name, required: true, wrapper_class: "col-sm-6" %>
<%= form.phone_field :person_phone, wrapper_class: "col-sm-6" %>
- <%= form.email_field :person_email, required: true, wrapper_class: "col-sm-6" %>
+
+
+ <%= form.email_field :person_email, wrapper_class: "col-sm-6" %>
<%= render "shared/address_fields", form: form, subject: "person" %>
<% end %>
@@ -95,7 +97,7 @@
<% end %>
<%= card_field_set_tag t(".signature.heading") do %>
- <%= render "shared/signature_fields", form: form, signature_legal_text: @contract_template.signature_legal_text %>
+ <%= render "shared/signature_fields", form: form %>
<% end %>
diff --git a/app/views/public/talent_releases/new.html.erb b/app/views/public/talent_releases/new.html.erb
index e3ba06a..6af7df2 100644
--- a/app/views/public/talent_releases/new.html.erb
+++ b/app/views/public/talent_releases/new.html.erb
@@ -131,7 +131,7 @@
<% end %>
<%= card_field_set_tag t(".signature.heading") do %>
- <%= render "shared/signature_fields", form: form, signature_legal_text: @contract_template.signature_legal_text %>
+ <%= render "shared/signature_fields", form: form %>
<% end %>
diff --git a/app/views/shared/_initiate_hubspot_chat.html.erb b/app/views/shared/_initiate_hubspot_chat.html.erb
new file mode 100644
index 0000000..900ac85
--- /dev/null
+++ b/app/views/shared/_initiate_hubspot_chat.html.erb
@@ -0,0 +1,15 @@
+<% if params[:show_chat] %>
+ <%= javascript_include_tag "//js.hs-scripts.com/7344617.js", defer: "defer", async: true, id: "hs-script-loader" %>
+ <%= javascript_tag nonce: true do %>
+ function onConversationsAPIReady() {
+ window.HubSpotConversations.widget.load({ widgetOpen: true });
+ window.HubSpotConversations.widget.open();
+ }
+ if (window.HubSpotConversations) {
+ onConversationsAPIReady();
+ } else {
+ window.hsConversationsOnReady = [onConversationsAPIReady];
+ }
+ <% end %>
+<% end %>
+
diff --git a/app/views/shared/_signature_fields.html.erb b/app/views/shared/_signature_fields.html.erb
index eb1fc6e..620274a 100644
--- a/app/views/shared/_signature_fields.html.erb
+++ b/app/views/shared/_signature_fields.html.erb
@@ -12,8 +12,4 @@
<%= fa_icon "refresh" %> <%= t "shared.clear" %>
<% end %>
-
-<% if local_assigns[:signature_legal_text] && signature_legal_text.present? %>
- <%= signature_legal_text %>
-<% end %>
\ No newline at end of file
diff --git a/app/views/task_requests/create.html.erb b/app/views/task_requests/create.html.erb
index 3ceb0ad..5867754 100644
--- a/app/views/task_requests/create.html.erb
+++ b/app/views/task_requests/create.html.erb
@@ -1,16 +1,2 @@
-<% if params[:show_chat] %>
- <%= javascript_include_tag "//js.hs-scripts.com/7344617.js", defer: "defer", async: true, id: "hs-script-loader" %>
- <%= javascript_tag nonce: true do %>
- function onConversationsAPIReady() {
- window.HubSpotConversations.widget.load({ widgetOpen: true });
- window.HubSpotConversations.widget.open();
- }
- if (window.HubSpotConversations) {
- onConversationsAPIReady();
- } else {
- window.hsConversationsOnReady = [onConversationsAPIReady];
- }
- <% end %>
-<% end %>
- <%= t '.success_message' %>
-<%= link_to fa_icon("arrow-left", text: "Back"), [@project, :task_requests], class: "btn btn-primary" %>
+<%= render "shared/initiate_hubspot_chat" %>
+ <%= t '.success_message' %>
\ No newline at end of file
diff --git a/app/views/videos/splash.html.erb b/app/views/videos/splash.html.erb
index 0b082bb..c7954da 100644
--- a/app/views/videos/splash.html.erb
+++ b/app/views/videos/splash.html.erb
@@ -6,7 +6,7 @@
<%= link_to t(".actions.book_demo"), 'https://meetings.hubspot.com/bray2', class: "btn btn-primary border align-self-center h-50 ml-auto mr-2 pb-2", target: '_blank' %>
<% if policy(Video).new? %>
- <%= link_to t(".actions.upload_video"), [:landing, @project, :videos], class: "btn btn-success border align-self-center h-50 pb-2" %>
+ <%= link_to t(".actions.upload_video"), [:new, @project, :video], class: "btn btn-success border align-self-center h-50 pb-2" %>
<% end %>
@@ -18,7 +18,7 @@
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 290ef7e..2d8fc99 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -50,7 +50,6 @@ en:
empty: Acquired Media Releases will appear here
table_headers:
file_infos_count: No. Files
- name: Name
notes: Notes
signed_at: Date Signed
tags: Tags
@@ -98,6 +97,22 @@ en:
application:
header:
sign_out: Sign Out
+ casting_call_interviews:
+ complete:
+ notice: The casting call interview has been completed
+ create:
+ notice: The casting call interview has been created
+ index:
+ actions:
+ new: Create Casting Call Interview
+ empty: Casting call interviews will appear here
+ mark_as_completed:
+ alert: Failed to mark casting call interview as completed
+ notice: The casting call interview has been marked as completed
+ new:
+ heading: New Casting Call Interview
+ update:
+ notice: The casting call interview has been updated
task_requests:
index:
empty: Task requests will appear here
@@ -152,8 +167,6 @@ en:
empty: Appearance Releases will appear here
imported_appearance_release_missing_attachment: Person photo or contract missing for imported appearance release
table_headers:
- contact_info: Contact info
- name: Name
notes: Notes
signed_at: Date Signed
tags: Tags
@@ -174,13 +187,6 @@ en:
sidebar:
files: Files
team_member: Team Member
- approvals:
- create:
- release_approved: Medical release has been approved
- new:
- actions:
- approve: Approve
- heading: Review Medical Release
blank_contracts:
new:
number_of_copies_label: Number of copies
@@ -238,6 +244,43 @@ en:
bulk_taggings:
new_bulk_tag_modal:
submit: Add
+ casting_call_interviews:
+ index:
+ empty: Casting Call Interview results will appear here.
+ show:
+ empty: Interview files and recorded meeetings will appear here.
+ casting_calls:
+ cancel:
+ notice: The casting call request has been cancelled successfully
+ casting_call:
+ actions:
+ manage: Manage
+ create:
+ notice: The casting call request has been created
+ success_message: Your casting call request was successfully submitted. Thank you. A chat window will pop up on the lower right in a few seconds.
+ edit:
+ heading: Edit Casting Call
+ form:
+ info_message: After submitting this casting call request, you'll be connected via chat with a ME Suite representative.
+ labels:
+ description: Description
+ interview_instructions: Interview instructions
+ interview_requirements: Interview requirements
+ project_description: Project description
+ questions: Questions
+ title: Title
+ index:
+ actions:
+ new: Create Casting Call
+ empty: Casting calls will appear here
+ table_headers:
+ casting_call_created_on: Created On
+ casting_call_status: Status
+ casting_call_title: Title
+ new:
+ heading: New Casting Call
+ update:
+ notice: The casting call request has been updated
contract_downloads:
download:
failure: Your download could not be generated.
@@ -298,14 +341,6 @@ en:
print_QR_code: Print out release QR codes
releases_automatically_organized: Releases are automatically organized as they’re submitted
contracts:
- for_office_use_only:
- description_labels:
- date_issued: Date Issued
- employee_issued_to: Employee Issued To
- issued_by: Issued By
- producer: Producer
- production: Production
- heading: For Office Use Only
photos:
guardian_2_photo_heading: Second guardian photo
guardian_photo_heading: Guardian photo
@@ -382,7 +417,6 @@ en:
contract_template:
fee: Leave at $0.00 for no-fee
guardian_clause: Leave blank if not required for this contract
- signature_legal_text: Leave blank if not required for this contract
task_request:
time_allowed: Minimum of 2 hours, no partial hours allowed
video:
@@ -719,6 +753,11 @@ en:
cards: Cards
heading: Import Releases
list: List
+ interview_downloads:
+ download:
+ failure: Your download could not be generated.
+ pending: "Your %{release_type} files are being prepared for download. You will be notified when it's ready."
+ success: "Your %{release_type} files are ready. Download now, or retrieve later in the %{downloads_folder_link} folder. %{download_button}"
location_releases:
create:
notice: The location release has been created
@@ -745,7 +784,6 @@ en:
empty: Location Releases will appear here
table_headers:
address: Address
- name: Name
notes: Notes
signed_at: Date Signed
tags: Tags
@@ -780,7 +818,6 @@ en:
search: Search
empty: Material Releases will appear here
table_headers:
- name: Name
notes: Notes
signed_at: Date Signed
tags: Tags
@@ -802,19 +839,12 @@ en:
search: Search
empty: Medical releases will appear here
table_headers:
- approved: Approved
- approved?: Approved
- contact_info: Contact info
- name: Person name
notes: Notes
signed_at: Date Signed
tags: Tags
medical_release:
actions:
manage: Manage
- review: Review
- messages:
- approved_tooltip: Approved by %{user} on %{timestamp}
misc_releases:
destroy:
alert: The misc release has been deleted
@@ -823,8 +853,6 @@ en:
search: Search
empty: Misc Releases will appear here
table_headers:
- contact_info: Contact info
- name: Person name
notes: Notes
signed_at: Date Signed
tags: Tags
@@ -859,7 +887,6 @@ en:
table_headers:
composers_count: No. Composers
file_infos_count: No. Files
- name: Name
notes: Notes
publishers_count: No. Publishers
signed_at: Date Signed
@@ -962,6 +989,7 @@ en:
show:
acquired_media_release: Acquired Media Releases (%{count})
appearance_release: Appearance Releases (%{count})
+ casting_call_interviews: Interviews
downloads: Downloads
location_release: Location Releases (%{count})
material_release: Material Releases (%{count})
@@ -1024,6 +1052,12 @@ en:
broadcasts:
show:
alert: That broadcast is no longer available
+ casting_call_interviews:
+ show:
+ heading: Files
+ update: Upload
+ update:
+ notice: Your files have been uploaded successfully
location_releases:
create:
notice: Your release has been signed. Thank you!
@@ -1200,6 +1234,7 @@ en:
ago: ago
back: Back
cancel: Cancel
+ cast_me: Cast
clear: Clear
close: Close
csv: CSV
@@ -1256,10 +1291,7 @@ en:
search: Search
empty: Talent Releases will appear here
table_headers:
- email: Email
- name: Name
notes: Notes
- phone: Phone
signed_at: Date Signed
tags: Tags
new:
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 8c6711c..636e5f2 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -1,14 +1,4 @@
es:
- acquired_media_releases:
- acquired_media_release:
- no_media: No Media (ES)
- index:
- table_headers:
- file_infos_count: No. Files (ES)
- name: Name (ES)
- notes: Notes (ES)
- signed_at: Date Signed (ES)
- tags: Tags (ES)
activerecord:
attributes:
appearance_release:
@@ -51,12 +41,6 @@ es:
heading: Person Photo (ES)
index:
imported_appearance_release_missing_attachment: Person photo or contract missing for imported appearance release (ES)
- table_headers:
- contact_info: ""
- name: ""
- notes: ""
- signed_at: ""
- tags: ""
shared:
imported_appearance_release_contract_name: Contrato Importado
imported_appearance_release_headshot_name: Retrato Importado
@@ -66,13 +50,6 @@ es:
all_releases: All Releases (ES)
complete_releases: Complete Releases (ES)
incomplete_releases: Incomplete Releases (ES)
- approvals:
- create:
- release_approved: Medical release has been approved (ES)
- new:
- actions:
- approve: Approve (ES)
- heading: Review Medical Release (ES)
blank_contracts:
new:
number_of_copies_label: Number of copies (ES)
@@ -130,14 +107,6 @@ es:
print_QR_code: Print out release QR codes (ES)
releases_automatically_organized: Releases are automatically organized as they’re submitted (ES)
contracts:
- for_office_use_only:
- description_labels:
- date_issued: Date Issued (ES)
- employee_issued_to: Employee Issued To (ES)
- issued_by: Issued By (ES)
- producer: Producer (ES)
- production: Production (ES)
- heading: For Office Use Only (ES)
photos:
guardian_2_photo_heading: Second guardian photo (ES)
guardian_photo_heading: Guardian photo (ES)
@@ -191,7 +160,6 @@ es:
contract_template:
fee: Leave at $0.00 for no-fee (ES)
guardian_clause: Leave blank if not required for this contract (ES)
- signature_legal_text: Leave blank if not required for this contract (ES)
label:
appearance_release:
guardian_2_address_city: Guardian 2 city (ES)
@@ -305,64 +273,18 @@ es:
create: Create Live Stream (ES)
update: Save Changes (ES)
create: 'Crear %{model}'
- medical_release:
- update: Approve (ES)
update: 'Actualizar %{model}'
location_releases:
form:
photos:
dropzone_label: Tap to take a photo of the Property (optional) (ES)
- index:
- table_headers:
- address: Address (ES)
- notes: Notes (ES)
- signed_at: Date Signed (ES)
- tags: Tags (ES)
material_releases:
form:
photos:
dropzone_label: Tap to take a photo of Licensed Material (optional) (ES)
- index:
- table_headers:
- name: Name (ES)
- notes: Notes (ES)
- signed_at: Date Signed (ES)
- tags: Tags (ES)
medical_releases:
custom_validation_errors:
question_answer_is_required: answer is required (ES)
- index:
- table_headers:
- approved: Approved (ES)
- approved?: Approved (ES)
- contact_info: Contact info (ES)
- name: Person name (ES)
- notes: Notes (ES)
- signed_at: Date Signed (ES)
- tags: Tags (ES)
- medical_release:
- actions:
- review: Review (ES)
- messages:
- approved_tooltip: ""
- misc_releases:
- index:
- table_headers:
- contact_info: Contact info (ES)
- name: Person name (ES)
- notes: Notes (ES)
- signed_at: Date Signed (ES)
- tags: Tags (ES)
- music_releases:
- index:
- table_headers:
- composers_count: No. Composers (ES)
- file_infos_count: No. Files (ES)
- name: Name (ES)
- notes: Notes (ES)
- publishers_count: No. Publishers (ES)
- signed_at: Date Signed (ES)
- tags: Tags (ES)
public:
appearance_releases:
create:
@@ -467,14 +389,6 @@ es:
heading: Second Guardian Photo (ES)
guardian_photo:
heading: Guardian Photo (ES)
- index:
- table_headers:
- email: Email (ES)
- name: Name (ES)
- notes: Notes (ES)
- phone: Phone (ES)
- signed_at: Date Signed (ES)
- tags: Tags (ES)
task_requests:
create:
success_message: Your task request was successfully submitted. Thank you. A chat window will pop up on the lower right in a few seconds. (ES)
diff --git a/config/routes.rb b/config/routes.rb
index 4d3aa98..23ee4ad 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -2,7 +2,7 @@ require 'oath/constraints/signed_in'
require 'sidekiq/web'
Rails.application.routes.draw do
- AVAILABLE_LOCALES_REGEX = /#{I18n.available_locales.join("|")}/.freeze
+ AVAILABLE_LOCALES_REGEX = /#{I18n.available_locales.join("|")}/
concern :confirmable do
resources :video_release_confirmations, only: [:new, :create, :destroy]
@@ -32,6 +32,9 @@ Rails.application.routes.draw do
resource :masquerade, only: :create
end
resources :task_requests, only: [:index, :edit, :update, :show]
+ resources :casting_call_interviews do
+ post :complete, on: :member
+ end
root to: "accounts#index", as: :signed_in_root
end
@@ -66,6 +69,7 @@ Rails.application.routes.draw do
resource :contract_downloads, only: [:create]
resources :downloads, only: [:index, :destroy]
resource :report_downloads, only: [:create]
+ resource :interview_downloads, only: [:create]
resources :videos, only: [:index, :new, :create, :edit, :update] do
collection do
get :landing
@@ -105,7 +109,13 @@ Rails.application.routes.draw do
post :cancel
end
end
+ resources :casting_calls, except: :destroy do
+ member do
+ post :cancel
+ end
+ end
resources :tasks, only: :index
+ resources :casting_call_interviews, only: [:index, :show]
end
resource :profile, only: [:show, :update]
resources :videos, only: [] do
@@ -134,20 +144,17 @@ Rails.application.routes.draw do
resources :broadcasts, param: :token, only: [:show, :update] do
resource :zoom_meeting, only: [:show]
end
+ resources :casting_calls, param: :token, only: [:show]
+ resources :casting_call_interviews, param: :token, only: [:show, :update]
end
- RELEASES = [:acquired_media_releases, :appearance_releases, :talent_releases, :material_releases, :medical_releases, :misc_releases, :location_releases].freeze
- ALL_RELEASES = RELEASES + [:music_releases]
+ RELEASES = [:acquired_media_releases, :appearance_releases, :talent_releases, :material_releases, :location_releases]
+ ALL_RELEASES = RELEASES + [:music_releases, :medical_releases, :misc_releases]
ALL_RELEASES.each do |release|
resources release, only: [], concerns: :taggable
end
- # Customization for medical releases
- resources :medical_releases, only: [], concerns: :taggable do
- resource :approvals, only: [:new, :create]
- end
-
resources :bulk_taggings, only: [:new, :create]
namespace :api do
@@ -163,7 +170,7 @@ Rails.application.routes.draw do
resources :contract_templates, only: [:index]
end
resources :contract_templates, only: [:show] do
- (RELEASES - [:misc_releases, :medical_releases]).each do |release|
+ RELEASES.each do |release|
resources release, controller: release, only: [:create]
end
end
diff --git a/db/data_migrations/20200712192301_add_duration_to_broadcast_recordings.rb b/db/data_migrations/20200712192301_add_duration_to_broadcast_recordings.rb
deleted file mode 100644
index 35efee1..0000000
--- a/db/data_migrations/20200712192301_add_duration_to_broadcast_recordings.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-class AddDurationToBroadcastRecordings < ActiveRecord::DataMigration
- def up
- recordings = BroadcastRecording.where(duration: nil)
- client = MuxRuby::AssetsApi.new
-
- recordings.each do |recording|
- begin
- response = client.get_asset(recording.asset_uid)
- duration = response.data.duration
- recording.update(duration: duration)
- rescue MuxRuby::ApiError => e
- Rails.logger.error("Failed to update duration for broadcast recording with id #{recording.id}\n" + e.message)
- end
-
- sleep(1)
- end
- end
-end
\ No newline at end of file
diff --git a/db/migrate/20200626044744_create_casting_calls.rb b/db/migrate/20200626044744_create_casting_calls.rb
new file mode 100644
index 0000000..0642635
--- /dev/null
+++ b/db/migrate/20200626044744_create_casting_calls.rb
@@ -0,0 +1,17 @@
+class CreateCastingCalls < ActiveRecord::Migration[6.0]
+ def change
+ create_table :casting_calls do |t|
+ t.references :project
+ t.string :title
+ t.string :user_email
+ t.text :description
+ t.text :project_description
+ t.text :interview_instructions
+ t.text :interview_requirements
+ t.text :questions
+ t.datetime :cancelled_at
+
+ t.timestamps
+ end
+ end
+end
diff --git a/db/migrate/20200701121237_create_casting_call_interviews.rb b/db/migrate/20200701121237_create_casting_call_interviews.rb
new file mode 100644
index 0000000..fe4f4d7
--- /dev/null
+++ b/db/migrate/20200701121237_create_casting_call_interviews.rb
@@ -0,0 +1,12 @@
+class CreateCastingCallInterviews < ActiveRecord::Migration[6.0]
+ def change
+ create_table :casting_call_interviews do |t|
+ t.references :casting_call, foreign_key: true
+ t.string :performer_name
+ t.string :zoom_meeting_url
+ t.datetime :interview_date
+
+ t.timestamps
+ end
+ end
+end
diff --git a/db/migrate/20200706193123_add_token_to_casting_calls.rb b/db/migrate/20200706193123_add_token_to_casting_calls.rb
new file mode 100644
index 0000000..57e8ea8
--- /dev/null
+++ b/db/migrate/20200706193123_add_token_to_casting_calls.rb
@@ -0,0 +1,6 @@
+class AddTokenToCastingCalls < ActiveRecord::Migration[6.0]
+ def change
+ add_column :casting_calls, :token, :string
+ add_index :casting_calls, :token, unique: true
+ end
+end
diff --git a/db/migrate/20200706230803_add_token_to_casting_call_interviews.rb b/db/migrate/20200706230803_add_token_to_casting_call_interviews.rb
new file mode 100644
index 0000000..9c5689c
--- /dev/null
+++ b/db/migrate/20200706230803_add_token_to_casting_call_interviews.rb
@@ -0,0 +1,6 @@
+class AddTokenToCastingCallInterviews < ActiveRecord::Migration[6.0]
+ def change
+ add_column :casting_call_interviews, :token, :string
+ add_index :casting_call_interviews, :token, unique: true
+ end
+end
diff --git a/db/migrate/20200707070522_add_interviewed_at_to_casting_call_interview.rb b/db/migrate/20200707070522_add_interviewed_at_to_casting_call_interview.rb
new file mode 100644
index 0000000..ab41369
--- /dev/null
+++ b/db/migrate/20200707070522_add_interviewed_at_to_casting_call_interview.rb
@@ -0,0 +1,5 @@
+class AddInterviewedAtToCastingCallInterview < ActiveRecord::Migration[6.0]
+ def change
+ add_column :casting_call_interviews, :interviewed_at, :datetime
+ end
+end
diff --git a/db/migrate/20200707155717_add_approval_info_columns_to_medical_releases.rb b/db/migrate/20200707155717_add_approval_info_columns_to_medical_releases.rb
deleted file mode 100644
index 00fa2c7..0000000
--- a/db/migrate/20200707155717_add_approval_info_columns_to_medical_releases.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-class AddApprovalInfoColumnsToMedicalReleases < ActiveRecord::Migration[6.0]
- def change
- add_column :medical_releases, :approved_by_user_name, :text
- add_column :medical_releases, :approved_by_user_email, :text
- add_column :medical_releases, :approved_at, :timestamp
- end
-end
diff --git a/db/migrate/20200709120630_add_accessibility_to_contract_templates.rb b/db/migrate/20200709120630_add_accessibility_to_contract_templates.rb
deleted file mode 100644
index 9ac3dd7..0000000
--- a/db/migrate/20200709120630_add_accessibility_to_contract_templates.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-class AddAccessibilityToContractTemplates < ActiveRecord::Migration[6.0]
- def change
- add_column :contract_templates, :accessibility, :integer, default: 0
- end
-end
diff --git a/db/migrate/20200712181139_add_duration_to_broadcast_recordings.rb b/db/migrate/20200712181139_add_duration_to_broadcast_recordings.rb
deleted file mode 100644
index d79b21a..0000000
--- a/db/migrate/20200712181139_add_duration_to_broadcast_recordings.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-class AddDurationToBroadcastRecordings < ActiveRecord::Migration[6.0]
- def change
- add_column :broadcast_recordings, :duration, :float
- end
-end
diff --git a/db/structure.sql b/db/structure.sql
index ba4ce52..cb699b9 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -508,8 +508,7 @@ CREATE TABLE public.broadcast_recordings (
asset_playback_uid character varying NOT NULL,
file_name character varying NOT NULL,
created_at timestamp(6) without time zone NOT NULL,
- updated_at timestamp(6) without time zone NOT NULL,
- duration double precision
+ updated_at timestamp(6) without time zone NOT NULL
);
@@ -570,6 +569,82 @@ CREATE SEQUENCE public.broadcasts_id_seq
ALTER SEQUENCE public.broadcasts_id_seq OWNED BY public.broadcasts.id;
+--
+-- Name: casting_call_interviews; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE public.casting_call_interviews (
+ id bigint NOT NULL,
+ casting_call_id bigint,
+ performer_name character varying,
+ zoom_meeting_url character varying,
+ interview_date timestamp without time zone,
+ created_at timestamp(6) without time zone NOT NULL,
+ updated_at timestamp(6) without time zone NOT NULL,
+ token character varying,
+ interviewed_at timestamp without time zone
+);
+
+
+--
+-- Name: casting_call_interviews_id_seq; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE public.casting_call_interviews_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+--
+-- Name: casting_call_interviews_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
+--
+
+ALTER SEQUENCE public.casting_call_interviews_id_seq OWNED BY public.casting_call_interviews.id;
+
+
+--
+-- Name: casting_calls; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE public.casting_calls (
+ id bigint NOT NULL,
+ project_id bigint,
+ title character varying,
+ user_email character varying,
+ description text,
+ project_description text,
+ interview_instructions text,
+ interview_requirements text,
+ questions text,
+ cancelled_at timestamp without time zone,
+ created_at timestamp(6) without time zone NOT NULL,
+ updated_at timestamp(6) without time zone NOT NULL,
+ token character varying
+);
+
+
+--
+-- Name: casting_calls_id_seq; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE public.casting_calls_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+--
+-- Name: casting_calls_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
+--
+
+ALTER SEQUENCE public.casting_calls_id_seq OWNED BY public.casting_calls.id;
+
+
--
-- Name: composers; Type: TABLE; Schema: public; Owner: -
--
@@ -644,8 +719,7 @@ CREATE TABLE public.contract_templates (
question_12_text text,
question_13_text text,
question_14_text text,
- question_15_text text,
- accessibility integer DEFAULT 0
+ question_15_text text
);
@@ -1061,10 +1135,7 @@ CREATE TABLE public.medical_releases (
guardian_2_address_city character varying,
guardian_2_address_state character varying,
guardian_2_address_zip character varying,
- guardian_2_address_country character varying,
- approved_by_user_name text,
- approved_by_user_email text,
- approved_at timestamp without time zone
+ guardian_2_address_country character varying
);
@@ -1982,6 +2053,20 @@ ALTER TABLE ONLY public.broadcast_recordings ALTER COLUMN id SET DEFAULT nextval
ALTER TABLE ONLY public.broadcasts ALTER COLUMN id SET DEFAULT nextval('public.broadcasts_id_seq'::regclass);
+--
+-- Name: casting_call_interviews id; Type: DEFAULT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY public.casting_call_interviews ALTER COLUMN id SET DEFAULT nextval('public.casting_call_interviews_id_seq'::regclass);
+
+
+--
+-- Name: casting_calls id; Type: DEFAULT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY public.casting_calls ALTER COLUMN id SET DEFAULT nextval('public.casting_calls_id_seq'::regclass);
+
+
--
-- Name: composers id; Type: DEFAULT; Schema: public; Owner: -
--
@@ -2303,6 +2388,22 @@ ALTER TABLE ONLY public.broadcasts
ADD CONSTRAINT broadcasts_pkey PRIMARY KEY (id);
+--
+-- Name: casting_call_interviews casting_call_interviews_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY public.casting_call_interviews
+ ADD CONSTRAINT casting_call_interviews_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: casting_calls casting_calls_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY public.casting_calls
+ ADD CONSTRAINT casting_calls_pkey PRIMARY KEY (id);
+
+
--
-- Name: composers composers_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
@@ -2720,6 +2821,34 @@ CREATE INDEX index_broadcasts_on_project_id ON public.broadcasts USING btree (pr
CREATE UNIQUE INDEX index_broadcasts_on_token ON public.broadcasts USING btree (token);
+--
+-- Name: index_casting_call_interviews_on_casting_call_id; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX index_casting_call_interviews_on_casting_call_id ON public.casting_call_interviews USING btree (casting_call_id);
+
+
+--
+-- Name: index_casting_call_interviews_on_token; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE UNIQUE INDEX index_casting_call_interviews_on_token ON public.casting_call_interviews USING btree (token);
+
+
+--
+-- Name: index_casting_calls_on_project_id; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX index_casting_calls_on_project_id ON public.casting_calls USING btree (project_id);
+
+
+--
+-- Name: index_casting_calls_on_token; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE UNIQUE INDEX index_casting_calls_on_token ON public.casting_calls USING btree (token);
+
+
--
-- Name: index_composers_on_music_release_id; Type: INDEX; Schema: public; Owner: -
--
@@ -3317,6 +3446,14 @@ ALTER TABLE ONLY public.bookmarks
ADD CONSTRAINT fk_rails_15735b7db8 FOREIGN KEY (video_id) REFERENCES public.videos(id);
+--
+-- Name: casting_call_interviews fk_rails_1583f69fbb; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY public.casting_call_interviews
+ ADD CONSTRAINT fk_rails_1583f69fbb FOREIGN KEY (casting_call_id) REFERENCES public.casting_calls(id);
+
+
--
-- Name: acquired_media_releases fk_rails_15b450b040; Type: FK CONSTRAINT; Schema: public; Owner: -
--
@@ -3921,9 +4058,11 @@ INSERT INTO "schema_migrations" (version) VALUES
('20200619134853'),
('20200622180507'),
('20200625144713'),
+('20200626044744'),
+('20200701121237'),
('20200702152130'),
-('20200707155717'),
-('20200709120630'),
-('20200712181139');
+('20200706193123'),
+('20200706230803'),
+('20200707070522');
diff --git a/spec/controllers/accounts_controller_spec.rb b/spec/controllers/accounts_controller_spec.rb
index f7ae8d9..a6fba96 100644
--- a/spec/controllers/accounts_controller_spec.rb
+++ b/spec/controllers/accounts_controller_spec.rb
@@ -54,14 +54,16 @@ RSpec.describe AccountsController, type: :controller do
end
it "enqueues hubspot form submission job" do
+ ENV["HUBSPOT_FORM_GUID"] = "form_guid"
expect {
post :create, params: params
}.to have_enqueued_job(SubmitHubspotFormJob).with(
- "John",
- "Doe",
- "test_user+1@test.com",
- "Test Dev account",
- i_m_interested_in: "DirectME"
+ first_name: "John",
+ last_name: "Doe",
+ email: "test_user+1@test.com",
+ company: "Test Dev account",
+ i_m_interested_in: "DirectME",
+ form_guid: "form_guid"
)
end
end
diff --git a/spec/controllers/admin/casting_call_interviews_controller_spec.rb b/spec/controllers/admin/casting_call_interviews_controller_spec.rb
new file mode 100644
index 0000000..d2ff7b2
--- /dev/null
+++ b/spec/controllers/admin/casting_call_interviews_controller_spec.rb
@@ -0,0 +1,106 @@
+require "rails_helper"
+
+RSpec.describe Admin::CastingCallInterviewsController, type: :controller do
+
+ let!(:current_user) { create(:user, :admin) }
+
+ before do
+ sign_in(current_user)
+ end
+
+ describe "#index" do
+ it "returns a successful response" do
+ get :index
+
+ expect(response).to be_successful
+ end
+ end
+
+ describe "#new" do
+ it "returns a successful response" do
+ get :new
+
+ expect(response).to be_successful
+ end
+
+ it "assigns user, accounts" do
+ get :new
+
+ expect(assigns(:casting_call_interview)).not_to be_nil
+ expect(assigns(:accounts)).to eq Account.all
+ end
+ end
+
+ describe "#create" do
+ it "does create a new record" do
+ expect {
+ post :create, params: { casting_call_interview: casting_call_interview_params }
+ }.to change(CastingCallInterview, :count)
+ end
+ end
+
+ describe "#edit" do
+ let(:casting_call_interview) { create(:casting_call_interview) }
+
+ it "returns a successful response" do
+ get :edit, params: { id: casting_call_interview }
+
+ expect(response).to be_successful
+ end
+
+ it "assigns casting call interview" do
+ get :edit, params: { id: casting_call_interview }
+
+ expect(assigns(:casting_call_interview)).to eq casting_call_interview
+ end
+ end
+
+ describe "#update" do
+ let(:casting_call_interview) { create(:casting_call_interview) }
+
+ it "redirects to casting call interviews page" do
+ patch :update, params: { id: casting_call_interview, casting_call_interview: update_params }
+
+ expect(response).to be_redirect
+ expect(response).to redirect_to admin_casting_call_interviews_path
+ end
+
+ it "sets a flash notice" do
+ patch :update, params: { id: casting_call_interview, casting_call_interview: update_params }
+
+ expect(flash.notice).to eq "The casting call interview has been updated"
+ end
+
+ it "updates casting call interview" do
+ patch :update, params: { id: casting_call_interview, casting_call_interview: update_params }
+
+ expect(casting_call_interview.reload.zoom_meeting_url).to eq("new_zoom_meeting_url")
+ end
+ end
+
+ describe "#complete" do
+ let(:casting_call_interview) { create(:casting_call_interview) }
+
+ it "sets interviewed_at on casting call interview" do
+ expect(casting_call_interview.interviewed_at).to be_nil
+
+ post :complete, params: { id: casting_call_interview }
+
+ expect(casting_call_interview.reload.interviewed_at).not_to be_nil
+ end
+ end
+
+ private
+
+ def casting_call_interview_params
+ casting_call = create(:casting_call)
+
+ attributes_for(:casting_call_interview).except(:interviewed_at).merge(casting_call_id: casting_call.id)
+ end
+
+ def update_params
+ {
+ zoom_meeting_url: "new_zoom_meeting_url"
+ }
+ end
+end
diff --git a/spec/controllers/api/contract_templates_controller_spec.rb b/spec/controllers/api/contract_templates_controller_spec.rb
index 161d67f..6124c3b 100644
--- a/spec/controllers/api/contract_templates_controller_spec.rb
+++ b/spec/controllers/api/contract_templates_controller_spec.rb
@@ -30,21 +30,6 @@ RSpec.describe Api::ContractTemplatesController, type: :controller do
expect(response).to be_successful
end
-
- it 'returns electronic signature legal text when present' do
- ct = create(:contract_template, name: 'ct1', project_id: project.id)
- ct.signature_legal_text = "some electronic signature legal text"
- ct.save
-
- sign_in_to_api(current_user)
- get :show, params: { id: ct.id }
-
- expect(response).to be_successful
-
- expect(response.body).to include("signature_legal_text")
- expect(response.body).to include(ct.signature_legal_text.body.as_json)
- end
-
end
private
diff --git a/spec/controllers/api/medical_releases_controller_spec.rb b/spec/controllers/api/medical_releases_controller_spec.rb
deleted file mode 100644
index d6e92ca..0000000
--- a/spec/controllers/api/medical_releases_controller_spec.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-# frozen_string_literal: true
-
-require 'rails_helper'
-
-RSpec.describe Api::MedicalReleasesController, type: :controller do
- let(:current_user) { create(:user) }
- let(:project) { create(:project, name: 'first', account: current_user.primary_account) }
-
- describe '#index' do
- it 'returns a succesful response' do
- create(:medical_release, person_first_name: 'John', person_last_name: 'Lee', project_id: project.id)
- create(:medical_release, person_first_name: 'Jane', person_last_name: 'Lee', project_id: project.id)
-
- sign_in_to_api(current_user)
- get :index, params: { project_id: project.id }
-
- expect(response).to be_successful
- expect(response.body).to include 'John'
- expect(response.body).to include 'Jane'
- end
- end
-
- describe '#show' do
- it 'returns a succesful response' do
- release1 = create(:medical_release, person_first_name: 'John', person_last_name: 'Lee', project_id: project.id)
- release2 = create(:medical_release, person_first_name: 'Jane', person_last_name: 'Lee', project_id: project.id)
-
- sign_in_to_api(current_user)
- get :show, params: { id: release1 }
-
- expect(response).to be_successful
- expect(response.body).to include 'John'
- expect(response.body).not_to include 'Jane'
-
- get :show, params: { id: release2 }
-
- expect(response).to be_successful
- expect(response.body).not_to include 'John'
- expect(response.body).to include 'Jane'
- end
- end
-end
diff --git a/spec/controllers/api/misc_releases_controller_spec.rb b/spec/controllers/api/misc_releases_controller_spec.rb
deleted file mode 100644
index 45cdcf4..0000000
--- a/spec/controllers/api/misc_releases_controller_spec.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-# frozen_string_literal: true
-
-require 'rails_helper'
-
-RSpec.describe Api::MiscReleasesController, type: :controller do
- let(:current_user) { create(:user) }
- let(:project) { create(:project, name: 'first', account: current_user.primary_account) }
-
- describe '#index' do
- it 'returns a succesful response' do
- create(:misc_release, person_first_name: 'John', person_last_name: 'Lee', project_id: project.id)
- create(:misc_release, person_first_name: 'Jane', person_last_name: 'Lee', project_id: project.id)
-
- sign_in_to_api(current_user)
- get :index, params: { project_id: project.id }
-
- expect(response).to be_successful
- expect(response.body).to include 'John'
- expect(response.body).to include 'Jane'
- end
- end
-
- describe '#show' do
- it 'returns a succesful response' do
- release1 = create(:misc_release, person_first_name: 'John', person_last_name: 'Lee', project_id: project.id)
- release2 = create(:misc_release, person_first_name: 'Jane', person_last_name: 'Lee', project_id: project.id)
-
- sign_in_to_api(current_user)
- get :show, params: { id: release1 }
-
- expect(response).to be_successful
- expect(response.body).to include 'John'
- expect(response.body).not_to include 'Jane'
-
- get :show, params: { id: release2 }
-
- expect(response).to be_successful
- expect(response.body).not_to include 'John'
- expect(response.body).to include 'Jane'
- end
- end
-end
diff --git a/spec/controllers/api/notes_controller_spec.rb b/spec/controllers/api/notes_controller_spec.rb
index e27d6fe..72a999e 100644
--- a/spec/controllers/api/notes_controller_spec.rb
+++ b/spec/controllers/api/notes_controller_spec.rb
@@ -18,14 +18,6 @@ releases = [
{
type: :material_release,
obligatory_attribute: :name
- },
- {
- type: :medical_release,
- obligatory_attribute: :person_name
- },
- {
- type: :misc_release,
- obligatory_attribute: :person_name
}
]
diff --git a/spec/controllers/api/sync_controller_spec.rb b/spec/controllers/api/sync_controller_spec.rb
index f34878a..2955a64 100644
--- a/spec/controllers/api/sync_controller_spec.rb
+++ b/spec/controllers/api/sync_controller_spec.rb
@@ -110,33 +110,6 @@ RSpec.describe Api::SyncController, type: :controller do
expect(guardian_photo).to include('id', 'type', 'attributes')
expect(photo_attributes).to include('filename', 'content_type', 'url', 'thumbnail_url')
end
-
- it 'contains misc releases' do
- create_default_data
-
- get :index
-
- misc_releases = attributes_for_type('misc_releases')
-
- expect(misc_releases.first).to include('id')
- end
-
- it 'contains misc releases' do
- create_default_data
-
- get :index
-
- medical_releases = attributes_for_type('medical_releases')
- expect(medical_releases.first).to include('id')
- end
-
- it 'contains signature legal text for contract templates' do
- create_default_data_with_signature_legal_text
- get :index
- contract_templates = attributes_for_type('contract_templates')
- expect(contract_templates.first).to include('signature_legal_text')
- expect(contract_templates.first['signature_legal_text']).to eq ContractTemplate.first.signature_legal_text.as_json
- end
end
private
@@ -147,8 +120,6 @@ RSpec.describe Api::SyncController, type: :controller do
create(:talent_release, project: project)
create(:location_release, project: project)
create(:material_release, project: project)
- create(:medical_release, project: project)
- create(:misc_release, project: project)
end
def create_default_data_with_guardian_info
@@ -156,13 +127,6 @@ RSpec.describe Api::SyncController, type: :controller do
create(:appearance_release, :minor_with_guardian_photo, project: project)
end
- def create_default_data_with_signature_legal_text
- create_default_data
- ct = create(:contract_template, name: "with signature legal text", project: Project.first)
- ct.signature_legal_text = "legal text example"
- ct.save
- end
-
def response_body_json
JSON.parse(response.body)
end
diff --git a/spec/controllers/approvals_controller_spec.rb b/spec/controllers/approvals_controller_spec.rb
deleted file mode 100644
index ad374d1..0000000
--- a/spec/controllers/approvals_controller_spec.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-require "rails_helper"
-
-RSpec.describe ApprovalsController, 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 "#new" do
- let!(:medical_release) { create(:medical_release, project: project) }
-
- it "responds successfully" do
- get :new, params: { medical_release_id: medical_release }
-
- expect(response).to be_successful
- end
- end
-
- describe "#create" do
- it "changes approval status successfully" do
- medical_release = create(:medical_release, project: project)
-
- expect(MedicalRelease.last.approved?).to eq false
-
- post :create, params: { medical_release_id: medical_release }
-
- expect(response).to redirect_to [project, :medical_releases]
- expect(MedicalRelease.last.approved?).to eq true
- end
- end
-end
diff --git a/spec/controllers/casting_call_interviews_controller_spec.rb b/spec/controllers/casting_call_interviews_controller_spec.rb
new file mode 100644
index 0000000..2ac60aa
--- /dev/null
+++ b/spec/controllers/casting_call_interviews_controller_spec.rb
@@ -0,0 +1,43 @@
+require "rails_helper"
+
+RSpec.describe CastingCallInterviewsController, type: :controller do
+ render_views
+
+ let(:user) { create(:user) }
+ let(:account) { user.primary_account }
+ let(:project) { create(:project, account: user.primary_account) }
+ let(:casting_call) { create(:casting_call, project: project, title: "My Interview") }
+
+ before do
+ sign_in(user)
+ end
+
+ describe "#index" do
+ it "returns a successful response" do
+ get :index, params: { project_id: project }
+
+ expect(response).to be_successful
+ end
+
+ it "only shows completed interviews" do
+ create(:casting_call_interview, casting_call: casting_call, interviewed_at: Time.zone.now, performer_name: "John Doe")
+ create(:casting_call_interview, casting_call: casting_call, interviewed_at: nil, performer_name: "Jane Doe")
+
+ get :index, params: { project_id: project }
+
+ expect(response.body).to have_content("John Doe")
+ expect(response.body).not_to have_content("Jane Doe")
+ end
+ end
+
+ describe "#show" do
+ let!(:casting_call_interview) { create(:casting_call_interview, :with_files, casting_call: casting_call, interviewed_at: Time.zone.now, performer_name: "Jane Doe") }
+
+ it "shows files of casting call interview" do
+ get :show, params: { project_id: project, id: casting_call_interview.id }
+
+ expect(response.body).to have_content("Filename")
+ expect(response.body).to have_content("location_photo.png")
+ end
+ end
+end
diff --git a/spec/controllers/casting_calls_controller_spec.rb b/spec/controllers/casting_calls_controller_spec.rb
new file mode 100644
index 0000000..3c23bee
--- /dev/null
+++ b/spec/controllers/casting_calls_controller_spec.rb
@@ -0,0 +1,126 @@
+require 'rails_helper'
+
+RSpec.describe CastingCallsController, 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 "#index" do
+ it "responds successfully" do
+ get :index, params: { project_id: project }
+
+ expect(response).to be_successful
+ end
+
+ it "renders content" do
+ create(:casting_call, project: project)
+
+ get :index, params: { project_id: project }
+
+ expect(response.body).to have_link "Create Casting Call"
+ expect(response.body).to have_content "Active"
+ end
+
+ context "when there are many records" do
+ it "paginates the table" do
+ create_list(:casting_call, 20, project: project)
+
+ get :index, params: { project_id: project }
+
+ expect(response.body).to have_link("2", href: project_casting_calls_path(project, page: 2))
+ end
+ end
+ end
+
+ describe "#new" do
+ it "responds successfully" do
+ get :new, params: { project_id: project }
+
+ expect(response).to be_successful
+ expect(assigns(:casting_call)).to be_a_new(CastingCall)
+ expect(response).to render_template(:new)
+ end
+ end
+
+ describe "#create" do
+ it "does create a new record" do
+ expect {
+ post :create, params: { project_id: project.id, casting_call: casting_call_params }
+ }.to change(CastingCall, :count)
+ end
+
+ it "logs an event" do
+ expect {
+ post :create, params: { project_id: project.id, casting_call: casting_call_params }
+ }.to have_enqueued_job(TrackAnalyticsJob).with(user, account, :track_create_casting_call, user_agent: "Rails Testing", user_ip: "0.0.0.0")
+ end
+
+ it "submits data to hubspot form" do
+ expect {
+ post :create, params: { project_id: project.id, casting_call: casting_call_params }
+ }.to have_enqueued_job(SubmitHubspotFormJob)
+ end
+ end
+
+ describe "#update" do
+ let!(:casting_call) { create(:casting_call, project: project, description: "My description" ) }
+
+ it "updates casting call request" do
+ patch :update, params: { project_id: project.id, id: casting_call.id, casting_call: update_params }
+
+ expect(casting_call.reload.description).to eq("This is updated description")
+ end
+ end
+
+ describe "#show" do
+ let!(:casting_call) { create(:casting_call, project: project, description: "Casting Call Request") }
+
+ it "responds successfully" do
+ get :show, params: { project_id: project.id, id: casting_call.id }
+
+ expect(response).to be_successful
+ expect(assigns(:casting_call)).to eq(casting_call)
+ end
+
+ it "renders content" do
+ get :show, params: { project_id: project.id, id: casting_call.id }
+
+ expect(response.body).to have_content "Casting Call Request"
+ expect(response.body).to have_content "Active"
+ end
+ end
+
+ describe "#cancel" do
+ let!(:casting_call) { create(:casting_call, project: project, description: "Casting Call to be Cancelled") }
+
+ it "responds with redirect" do
+ post :cancel, params: { project_id: project.id, id: casting_call.id }
+
+ expect(response).to be_redirect
+ expect(response).to redirect_to(project_casting_calls_path(project))
+ expect(flash.notice).not_to be_nil
+ end
+
+ it "updates the status to 'Cancelled'" do
+ expect {
+ post :cancel, params: { project_id: project.id, id: casting_call.id }
+ }.to change { casting_call.reload.status }.from("Active").to("Cancelled")
+ end
+ end
+
+ private
+
+ def casting_call_params
+ attributes_for(:casting_call).except(:status, :user_email)
+ end
+
+ def update_params
+ { description: "This is updated description" }
+ end
+end
\ No newline at end of file
diff --git a/spec/controllers/interview_downloads_controller_spec.rb b/spec/controllers/interview_downloads_controller_spec.rb
new file mode 100644
index 0000000..119250f
--- /dev/null
+++ b/spec/controllers/interview_downloads_controller_spec.rb
@@ -0,0 +1,58 @@
+require "rails_helper"
+
+RSpec.describe InterviewDownloadsController, type: :controller do
+ render_views
+
+ let(:current_user) { create(:user) }
+ let(:project) { create(:project, :discovery_client, account: current_user.primary_account) }
+ let(:casting_call) { create(:casting_call, project: project, title: "My Title") }
+ let(:casting_call_interview) { create(:casting_call_interview, casting_call: casting_call, performer_name: "John Doe") }
+
+ before do
+ sign_in current_user
+ end
+
+ describe "#create" do
+ it "enqueues zip file generation job" do
+ expect {
+ post :create, params: { project_id: project.id, casting_call_interview_id: casting_call_interview.id }, format: :js
+ }.to have_enqueued_job(GenerateInterviewFilesZipJob)
+ end
+
+ it "creates a download record with 'not_started' status" do
+ expect {
+ post :create, params: { project_id: project.id, casting_call_interview_id: casting_call_interview.id }, format: :js
+ }.to change(Download, :count).by(1)
+
+ expect(Download.last.status).to eq('not_started')
+ end
+
+ context "When there is no existing job" do
+ it "shows a notification to user" do
+ allow(ProjectsChannel).to receive(:broadcast_download_generation_update).with(be_kind_of(Download), I18n.t("interview_downloads.download.pending", release_type: "Casting Call Interview"))
+
+ post :create, params: { project_id: project.id, casting_call_interview_id: casting_call_interview.id }, format: :js
+
+ expect(ProjectsChannel).to have_received(:broadcast_download_generation_update).with(be_kind_of(Download), I18n.t("interview_downloads.download.pending", release_type: "Casting Call Interview"))
+ end
+ end
+
+ context "When there are existing jobs" do
+ let(:appearance_release_download) { create(:download, project_id: project.id, name: "#{project.name.parameterize}_appearance-releases") }
+ let(:acquired_media_release_download) { create(:download, project_id: project.id, name: "#{project.name.parameterize}_acquired-media-releases", release_type: "AcquiredMediaRelease") }
+
+ before do
+ allow(Download).to receive_message_chain(:unfinished_desc_order, :offset).and_return([acquired_media_release_download, appearance_release_download])
+ allow(ProjectsChannel).to receive(:broadcast_download_generation_update)
+ end
+
+ it "shows names of other contracts in the notification, which are in progress" do
+ broadcast_message = " Your Casting Call Interview files are being prepared for download. You will be notified when it's ready.\n \n The following downloads are also in progress: \n \n - Acquired Media Release contracts (as of less than a minute ago)\n
\n - Appearance Release contracts (as of less than a minute ago)\n
\n \n"
+
+ post :create, params: { project_id: project.id, casting_call_interview_id: casting_call_interview.id }, format: :js
+
+ expect(ProjectsChannel).to have_received(:broadcast_download_generation_update).with(be_kind_of(Download), broadcast_message)
+ end
+ end
+ end
+end
diff --git a/spec/controllers/public/casting_call_interviews_controller.rb b/spec/controllers/public/casting_call_interviews_controller.rb
new file mode 100644
index 0000000..fb08c74
--- /dev/null
+++ b/spec/controllers/public/casting_call_interviews_controller.rb
@@ -0,0 +1,44 @@
+require 'rails_helper'
+
+RSpec.describe Public::CastingCallInterviewsController, type: :controller do
+ render_views
+
+ describe "#show" do
+ let(:casting_call_interview) { create(:casting_call_interview) }
+
+ it "responds successfully" do
+ get :show, params: { token: casting_call_interview.token }
+
+ expect(response).to be_successful
+ expect(assigns(:casting_call_interview)).to eq(casting_call_interview)
+ end
+
+ it "shows casting call interview details" do
+ get :show, params: { token: casting_call_interview.token }
+
+ expect(response.body).to have_content(casting_call_interview.performer_name)
+ expect(response.body).to have_content(casting_call_interview.interview_date)
+ expect(response.body).to have_link("Start Interview")
+ end
+ end
+
+ describe "#update" do
+ let(:casting_call_interview) { create(:casting_call_interview) }
+
+ it "responds successfully" do
+ patch :update, params: { token: casting_call_interview.token, casting_call_interview: casting_call_interview_params }
+
+ expect(response).to redirect_to casting_call_interview_url(token: casting_call_interview.token)
+ expect(flash.notice).to be_present
+ end
+ end
+
+ private
+
+ def casting_call_interview_params
+ path = Rails.root.join("spec", "fixtures", "files", "contract.pdf")
+ file = Rack::Test::UploadedFile.new(path, "application/pdf")
+
+ { files: [file]}
+ end
+end
diff --git a/spec/controllers/public/casting_calls_controller_spec.rb b/spec/controllers/public/casting_calls_controller_spec.rb
new file mode 100644
index 0000000..e7ce2c5
--- /dev/null
+++ b/spec/controllers/public/casting_calls_controller_spec.rb
@@ -0,0 +1,28 @@
+require 'rails_helper'
+
+RSpec.describe Public::CastingCallsController, type: :controller do
+ render_views
+
+ describe "#show" do
+ let(:casting_call) { create(:casting_call) }
+
+ it "responds successfully" do
+ get :show, params: { token: casting_call.token }
+
+ expect(response).to be_successful
+ expect(assigns(:casting_call)).to eq(casting_call)
+ end
+
+ it "shows casting call details" do
+ get :show, params: { token: casting_call.token }
+
+ expect(response.body).to have_content(casting_call.title)
+ expect(response.body).to have_content(casting_call.description)
+ expect(response.body).to have_content(casting_call.project_description)
+ expect(response.body).to have_content(casting_call.interview_instructions)
+ expect(response.body).to have_content(casting_call.interview_requirements)
+ expect(response.body).to have_content(casting_call.questions)
+ expect(response.body).to have_link("Schedule an Audition")
+ end
+ end
+end
diff --git a/spec/controllers/task_requests_controller_spec.rb b/spec/controllers/task_requests_controller_spec.rb
index 22df666..d02f94f 100644
--- a/spec/controllers/task_requests_controller_spec.rb
+++ b/spec/controllers/task_requests_controller_spec.rb
@@ -71,7 +71,7 @@ RSpec.describe TaskRequestsController, type: :controller do
it "submits data to hubspot form" do
expect {
post :create, params: { project_id: project.id, task_request: task_request_params }
- }.to have_enqueued_job(SubmitHubspotTaskRequestFormJob)
+ }.to have_enqueued_job(SubmitHubspotFormJob)
end
end
diff --git a/spec/factories/casting_call_interviews.rb b/spec/factories/casting_call_interviews.rb
new file mode 100644
index 0000000..389bd9d
--- /dev/null
+++ b/spec/factories/casting_call_interviews.rb
@@ -0,0 +1,13 @@
+FactoryBot.define do
+ factory :casting_call_interview do
+ association :casting_call
+ performer_name 'John Doe'
+ zoom_meeting_url 'https://us04web.zoom.us/j/1111111111?pwd=aDZCS1dzZ2lWdDZJcHBhVnNIclB4QT03'
+ interview_date { 10.days.from_now }
+ interviewed_at { nil }
+
+ trait :with_files do
+ files { [Rack::Test::UploadedFile.new('spec/fixtures/files/location_photo.png', 'image/png')] }
+ end
+ end
+end
diff --git a/spec/factories/casting_calls.rb b/spec/factories/casting_calls.rb
new file mode 100644
index 0000000..0db776a
--- /dev/null
+++ b/spec/factories/casting_calls.rb
@@ -0,0 +1,15 @@
+FactoryBot.define do
+ factory :casting_call do
+ association :project
+ user_email 'test@email.com'
+ description "Casting call description"
+ project_description "Casting call project description"
+ interview_instructions "Interview instructions"
+ interview_requirements "Interview requirements"
+ questions "Questions"
+
+ trait :cancelled do
+ cancelled_at { Time.zone.now }
+ end
+ end
+end
diff --git a/spec/factories/contract_templates.rb b/spec/factories/contract_templates.rb
index 22583c4..8d90846 100644
--- a/spec/factories/contract_templates.rb
+++ b/spec/factories/contract_templates.rb
@@ -7,7 +7,6 @@ FactoryBot.define do
body "This is a test contract template."
guardian_clause "Is the signer a minor?"
fee "$0.00"
- accessibility "public_template"
trait :archived do
archived_at Time.zone.now
diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb
index 1e9a73b..2f1b77a 100644
--- a/spec/factories/projects.rb
+++ b/spec/factories/projects.rb
@@ -49,18 +49,12 @@ FactoryBot.define do
predefined_client_name "nat_geo"
end
- factory :project_with_contract_template_public do
+ factory :project_with_contract_template do
after(:build) do |project, _|
project.contract_templates << build(:contract_template, project: nil)
end
end
- factory :project_with_contract_template_private do
- after(:build) do |project, _|
- project.contract_templates << build(:contract_template, project: nil, accessibility: "private_template")
- end
- end
-
factory :project_with_directories do
after(:build) do |project, _|
project.directories << build(:directory, project: nil, name: "Shared")
diff --git a/spec/features/user_creates_task_request_spec.rb b/spec/features/user_creates_task_request_spec.rb
index 7c58ff1..2ecb847 100644
--- a/spec/features/user_creates_task_request_spec.rb
+++ b/spec/features/user_creates_task_request_spec.rb
@@ -21,7 +21,6 @@ RSpec.feature 'User creates task request', type: :feature do
click_on 'Create Task request'
expect(page).to have_content task_created_message
- expect(page).to have_link("Back")
end
scenario 'user can view task request details' do
@@ -90,4 +89,4 @@ RSpec.feature 'User creates task request', type: :feature do
def task_created_message
t 'task_requests.create.success_message'
end
-end
+end
\ No newline at end of file
diff --git a/spec/features/user_manages_contract_templates_spec.rb b/spec/features/user_manages_contract_templates_spec.rb
index c37b3e9..cdba2eb 100644
--- a/spec/features/user_manages_contract_templates_spec.rb
+++ b/spec/features/user_manages_contract_templates_spec.rb
@@ -35,24 +35,6 @@ RSpec.feature 'User manages contract templates', type: :feature do
expect(page).to have_content(create_contract_template_success_message)
end
- scenario 'creating new release template, all release types accept signature legal text' do
- all_release_types = ['Acquired Media', 'Appearance', 'Location', 'Material', 'Medical', 'Misc', 'Talent']
-
- all_release_types.each do |release_type|
- visit new_project_contract_template_path(project)
-
- dropdown_selection = "#{release_type} Release"
- select dropdown_selection, from: 'Release type'
-
- fill_in 'Name', with: "My #{release_type} template"
- fill_in_trix signature_legal_text_field, with: 'LL'
-
- expect do
- click_on 'Create Release Template'
- end.to change(ContractTemplate, :count).by(1)
- end
- end
-
scenario 'medical release template has a guardian clause field' do
visit new_project_contract_template_path(project)
@@ -240,7 +222,7 @@ RSpec.feature 'User manages contract templates', type: :feature do
click_on 'Manage'
accept_alert do
- click_on 'Delete'
+ click_on 'Archive'
end
expect(page).to have_content('The release template has been archived')
@@ -291,7 +273,7 @@ RSpec.feature 'User manages contract templates', type: :feature do
visit project_contract_templates_path(project)
click_on 'Manage'
- expect(page).to have_content('Delete')
+ expect(page).to have_content('Archive')
end
it 'does not show create release button on splash page' do
@@ -328,10 +310,6 @@ RSpec.feature 'User manages contract templates', type: :feature do
'contract_template_guardian_clause_trix_input_contract_template'
end
- def signature_legal_text_field
- 'contract_template_signature_legal_text'
- end
-
def create_contract_template_success_message
'The release template has been created'
end
@@ -351,8 +329,4 @@ RSpec.feature 'User manages contract templates', type: :feature do
def create_release_template
t 'contract_templates.splash.actions.create_template'
end
-
- def signature_legal_text_trix_field
- 'Signature legal text'
- end
end
diff --git a/spec/features/user_managing_acquired_media_releases_spec.rb b/spec/features/user_managing_acquired_media_releases_spec.rb
index 48368d2..267b955 100644
--- a/spec/features/user_managing_acquired_media_releases_spec.rb
+++ b/spec/features/user_managing_acquired_media_releases_spec.rb
@@ -41,13 +41,6 @@ feature "User managing acquired_media releases" do
expect(AcquiredMediaRelease.last.categories).to include("Still Photograph")
expect(page).to have_content("Your release was successfully submitted. Thank you.")
end
-
- scenario "creating a release, if contract template contains signature legal language, it is shown" do
- contract_template = create(:contract_template, project: project, signature_legal_text: dummy_signature_legal_text)
- visit new_account_project_contract_template_acquired_media_release_path(project.account, project, contract_template)
-
- expect(page).to have_content dummy_signature_legal_text
- end
end
context "when signed in" do
@@ -364,8 +357,4 @@ feature "User managing acquired_media releases" do
def destroy_release_alert
t "acquired_media_releases.destroy.alert"
end
-
- def dummy_signature_legal_text
- 'Some signature legal language'
- end
end
diff --git a/spec/features/user_managing_appearance_releases_spec.rb b/spec/features/user_managing_appearance_releases_spec.rb
index 60d739b..986d427 100644
--- a/spec/features/user_managing_appearance_releases_spec.rb
+++ b/spec/features/user_managing_appearance_releases_spec.rb
@@ -137,13 +137,6 @@ feature 'User managing appearance releases' do
expect(page).to have_content(successful_submission_message)
expect(AppearanceRelease.last.guardian_2_first_name).to eq 'Second'
end
-
- scenario "creating a release, if contract template contains signature legal language, it is shown" do
- contract_template = create(:contract_template, project: project, signature_legal_text: dummy_signature_legal_text)
- visit new_account_project_contract_template_appearance_release_path(project.account, project, contract_template)
-
- expect(page).to have_content dummy_signature_legal_text
- end
end
context 'when signed in' do
@@ -713,8 +706,4 @@ feature 'User managing appearance releases' do
def guardian_2_photo_heading
t 'appearance_releases.form.photos.guardian_2_photo.heading'
end
-
- def dummy_signature_legal_text
- 'Some signature legal language'
- end
end
diff --git a/spec/features/user_managing_casiting_calls_spec.rb b/spec/features/user_managing_casiting_calls_spec.rb
new file mode 100644
index 0000000..cd6593d
--- /dev/null
+++ b/spec/features/user_managing_casiting_calls_spec.rb
@@ -0,0 +1,114 @@
+require "rails_helper"
+
+feature "User managing casting calls" do
+ let(:current_user) { create(:user) }
+ let(:project) { create(:project, account: current_user.primary_account) }
+
+ before :each do
+ sign_in current_user
+ end
+
+ scenario "casting calls table is visible" do
+ visit project_casting_calls_path(project)
+
+ expect(page).to have_content "Created On"
+ expect(page).to have_content "Title"
+ expect(page).to have_content "Status"
+ end
+
+ scenario "sees list of casting calls" do
+ visit project_casting_calls_path(project)
+
+ expect(page).to have_content no_casting_calls_label
+
+ casting_call = create(:casting_call, project: project)
+
+ visit project_casting_calls_path(project)
+
+ expect(page).not_to have_content no_casting_calls_label
+
+ expect(page).to have_content casting_call.created_at.try(:strftime, '%D')
+ expect(page).to have_content casting_call.title
+ expect(page).to have_content casting_call.status
+ end
+
+ scenario "can create casting call requests" do
+ visit project_casting_calls_path(project)
+
+ expect(page).to have_content no_casting_calls_label
+ click_on add_new_casting_call_label
+
+ fill_in title_field, with: "Title"
+ fill_in description_field, with: "Description"
+ fill_in project_description_field, with: "Project Description"
+ fill_in interview_instructions_field, with: "Interview instructions"
+ fill_in interview_requirements_field, with: "Interview requirements"
+ fill_in questions_field, with: "Questions"
+
+ click_on "Create Casting call"
+
+ expect(page).to have_content("Your casting call request was successfully submitted. Thank you. A chat window will pop up on the lower right in a few seconds.")
+ end
+
+ scenario "can update casting call requests" do
+ create(:casting_call, title: "Title", project: project)
+ visit project_casting_calls_path(project)
+
+ click_on manage_button
+ click_on "Edit"
+
+ fill_in title_field, with: "New Title"
+
+ click_on "Update Casting call"
+
+ expect(page).to have_content("The casting call request has been updated")
+ end
+
+ scenario "can cancel a casting call request" do
+ create(:casting_call, title: "Title", project: project)
+ visit project_casting_calls_path(project)
+
+ click_on manage_button
+ click_on "Cancel"
+
+ expect(page).to have_content("The casting call request has been cancelled")
+ end
+
+ private
+
+ def no_casting_calls_label
+ "Casting calls will appear here"
+ end
+
+ def manage_button
+ t "casting_calls.casting_call.actions.manage"
+ end
+
+ def add_new_casting_call_label
+ t "casting_calls.index.actions.new"
+ end
+
+ def title_field
+ t "casting_calls.form.labels.title"
+ end
+
+ def description_field
+ t "casting_calls.form.labels.description"
+ end
+
+ def project_description_field
+ t "casting_calls.form.labels.project_description"
+ end
+
+ def interview_instructions_field
+ t "casting_calls.form.labels.interview_instructions"
+ end
+
+ def interview_requirements_field
+ t "casting_calls.form.labels.interview_requirements"
+ end
+
+ def questions_field
+ t "casting_calls.form.labels.questions"
+ end
+end
\ No newline at end of file
diff --git a/spec/features/user_managing_location_releases_spec.rb b/spec/features/user_managing_location_releases_spec.rb
index 7efd0eb..d10bb8e 100644
--- a/spec/features/user_managing_location_releases_spec.rb
+++ b/spec/features/user_managing_location_releases_spec.rb
@@ -71,13 +71,6 @@ feature "User managing location releases" do
expect(page).to have_content("Your release was successfully submitted. Thank you.")
expect(LocationRelease.last.photos.attached?).to eq true
end
-
- scenario "creating a release, if contract template contains signature legal language, it is shown" do
- contract_template = create(:contract_template, project: project, signature_legal_text: dummy_signature_legal_text)
- visit new_account_project_contract_template_location_release_path(project.account, project, contract_template)
-
- expect(page).to have_content dummy_signature_legal_text
- end
end
context "when signed in" do
@@ -382,8 +375,4 @@ feature "User managing location releases" do
select "Other", from: "Restriction"
fill_in "Describe other restrictions", with: "Test"
end
-
- def dummy_signature_legal_text
- 'Some signature legal language'
- end
end
diff --git a/spec/features/user_managing_material_releases_spec.rb b/spec/features/user_managing_material_releases_spec.rb
index b2854ad..1f966b2 100644
--- a/spec/features/user_managing_material_releases_spec.rb
+++ b/spec/features/user_managing_material_releases_spec.rb
@@ -84,13 +84,6 @@ feature "User managing material releases" do
click_button submit_release_button
expect(page).to have_content success_submit_message
end
-
- scenario "creating a release, if contract template contains signature legal language, it is shown" do
- contract_template = create(:contract_template, project: project, signature_legal_text: dummy_signature_legal_text)
- visit new_account_project_contract_template_material_release_path(project.account, project, contract_template)
-
- expect(page).to have_content dummy_signature_legal_text
- end
end
context "when signed in" do
@@ -389,8 +382,4 @@ feature "User managing material releases" do
click_button submit_release_button
expect(page).not_to have_content success_submit_message
end
-
- def dummy_signature_legal_text
- 'Some signature legal language'
- end
end
diff --git a/spec/features/user_managing_medical_releases_spec.rb b/spec/features/user_managing_medical_releases_spec.rb
index 198497e..c65286e 100644
--- a/spec/features/user_managing_medical_releases_spec.rb
+++ b/spec/features/user_managing_medical_releases_spec.rb
@@ -168,13 +168,6 @@ feature "User managing medical releases" do
expect(page).to have_content(successful_submission_message)
end
-
- scenario "creating a release, if contract template contains signature legal language, it is shown" do
- contract_template = create(:contract_template, project: project, signature_legal_text: dummy_signature_legal_text)
- visit new_account_project_contract_template_medical_release_path(project.account, project, contract_template)
-
- expect(page).to have_content dummy_signature_legal_text
- end
end
context "when signed in as account manager" do
@@ -182,18 +175,6 @@ feature "User managing medical releases" do
sign_in current_user
end
- scenario "Approved releases have checkmark and non-approved releases don't have checkmarks" do
- create(:medical_release_with_contract_template, :native, project: project)
-
- visit project_medical_releases_path(project)
- expect(page).to have_css('i.fa.fa-check-circle.fa-2x', count: 0)
-
- create(:medical_release_with_contract_template, :native, project: project, approved_by_user_email: "some@email.com", approved_at: DateTime.now)
- visit project_medical_releases_path(project)
-
- expect(page).to have_css('i.fa.fa-check-circle.fa-2x', count: 1)
- end
-
scenario "Download All is visible" do
create(:medical_release_with_contract_template, :native, project: project)
create(:medical_release_with_contract_template, :non_native, project: project)
@@ -212,15 +193,6 @@ feature "User managing medical releases" do
expect(page).to have_link("Download", exact: true, count: 2)
end
- scenario "Review action in Manage menu is visible" do
- create(:medical_release_with_contract_template, :native, project: project)
- create(:medical_release_with_contract_template, :non_native, project: project)
-
- visit project_medical_releases_path(project)
-
- expect(page).to have_link(review_action, exact: true)
- end
-
scenario "Downloading PDF of native medical release is possible" do
native_release = create(:medical_release_with_contract_template, :native, project: project)
@@ -229,64 +201,6 @@ feature "User managing medical releases" do
click_link *view_release_pdf_link_for(native_release)
expect(content_type).to eq('application/pdf')
end
-
- scenario "Reviewing release" do
- create(:medical_release_with_contract_template, :native, project: project)
-
- visit project_medical_releases_path(project)
-
- click_link review_action
-
- expect(page).to have_content review_page_heading
- expect(page).to have_content approve_button
- end
-
- scenario 'When viewing the contract PDF of approved release there is page for office use only' do
- medical_release = create(:medical_release_with_contract_template,
- :native,
- project: project,
- person_first_name: 'Jane',
- person_last_name: 'Doe',
- approved_by_user_name: "Big Joe",
- approved_by_user_email: "some@email.com",
- approved_at: DateTime.now)
-
- sign_in(current_user)
- visit project_medical_releases_path(project)
- click_link *view_release_pdf_link_for(medical_release)
-
- expect(content_type).to eq('application/pdf')
- expect(content_disposition).to include('inline')
- expect(pdf_body).to have_content for_office_use_only.upcase
- expect(pdf_body).to have_content producer_label
- expect(pdf_body).to have_content production_label
- expect(pdf_body).to have_content employee_issued_to_label
- expect(pdf_body).to have_content issued_by_label
- expect(pdf_body).to have_content date_issued
- expect(pdf_body).to have_content 'Big Joe'
- end
-
- scenario 'When viewing the contract PDF of not approved release there is no page for office use only' do
- medical_release = create(:medical_release_with_contract_template,
- :native,
- project: project,
- person_first_name: 'Jane',
- person_last_name: 'Doe')
-
- sign_in(current_user)
- visit project_medical_releases_path(project)
- click_link *view_release_pdf_link_for(medical_release)
-
- expect(content_type).to eq('application/pdf')
- expect(content_disposition).to include('inline')
- expect(pdf_body).not_to have_content for_office_use_only.upcase
- expect(pdf_body).not_to have_content producer_label
- expect(pdf_body).not_to have_content production_label
- expect(pdf_body).not_to have_content employee_issued_to_label
- expect(pdf_body).not_to have_content issued_by_label
- expect(pdf_body).not_to have_content date_issued
- expect(pdf_body).not_to have_content 'Big Joe'
- end
end
context "when the user is manager(project manager)" do
@@ -314,15 +228,6 @@ feature "User managing medical releases" do
expect(page).to have_link("Download", exact: true, count: 0)
end
- scenario "Review action in Manage menu is not visible" do
- create(:medical_release_with_contract_template, :native, project: project)
- create(:medical_release_with_contract_template, :non_native, project: project)
-
- visit project_medical_releases_path(project)
-
- expect(page).not_to have_link(review_action, exact: true)
- end
-
scenario "Downloading PDF of native medical release is not possible" do
native_release = create(:medical_release_with_contract_template, :native, project: project)
@@ -367,15 +272,6 @@ feature "User managing medical releases" do
expect(page).to have_link("Download", exact: true, count: 0)
end
- scenario "Review action in Manage menu is not visible" do
- create(:medical_release_with_contract_template, :native, project: project)
- create(:medical_release_with_contract_template, :non_native, project: project)
-
- visit project_medical_releases_path(project)
-
- expect(page).not_to have_link(review_action, exact: true)
- end
-
scenario "Downloading PDF of native medical release is not possible" do
native_release = create(:medical_release_with_contract_template, :native, project: project)
@@ -551,44 +447,4 @@ feature "User managing medical releases" do
def answer_field_for_question(number)
"medical_release[question_#{number}_answer]"
end
-
- def dummy_signature_legal_text
- 'Some signature legal language'
- end
-
- def review_action
- t 'medical_releases.medical_release.actions.review'
- end
-
- def review_page_heading
- t 'approvals.new.heading'
- end
-
- def approve_button
- t 'approvals.new.actions.approve'
- end
-
- def for_office_use_only
- t 'contracts.for_office_use_only.heading'
- end
-
- def producer_label
- t 'contracts.for_office_use_only.description_labels.producer'
- end
-
- def production_label
- t 'contracts.for_office_use_only.description_labels.production'
- end
-
- def employee_issued_to_label
- t 'contracts.for_office_use_only.description_labels.employee_issued_to'
- end
-
- def issued_by_label
- t 'contracts.for_office_use_only.description_labels.issued_by'
- end
-
- def date_issued
- t 'contracts.for_office_use_only.description_labels.date_issued'
- end
end
diff --git a/spec/features/user_managing_misc_releases_spec.rb b/spec/features/user_managing_misc_releases_spec.rb
index 42d47d0..2b13e05 100644
--- a/spec/features/user_managing_misc_releases_spec.rb
+++ b/spec/features/user_managing_misc_releases_spec.rb
@@ -48,13 +48,6 @@ feature "User managing misc releases" do
expect(field).to be_visible
end
end
-
- scenario "creating a release, if contract template contains signature legal language, it is shown" do
- contract_template = create(:contract_template, project: project, signature_legal_text: dummy_signature_legal_text)
- visit new_account_project_contract_template_misc_release_path(project.account, project, contract_template)
-
- expect(page).to have_content dummy_signature_legal_text
- end
end
context "when signed in as account manager" do
@@ -206,8 +199,4 @@ feature "User managing misc releases" do
def person_is_minor_checkbox
'misc_release_minor'
end
-
- def dummy_signature_legal_text
- 'Some signature legal language'
- end
end
diff --git a/spec/features/user_managing_talent_releases_spec.rb b/spec/features/user_managing_talent_releases_spec.rb
index f1943c7..df56bb6 100644
--- a/spec/features/user_managing_talent_releases_spec.rb
+++ b/spec/features/user_managing_talent_releases_spec.rb
@@ -126,13 +126,6 @@ feature "User managing talent releases" do
expect(TalentRelease.last.guardian_2_photo.attached?).to eq true
expect(TalentRelease.last.guardian_2_name).to eq "Second Guardian"
end
-
- scenario "creating a release, if contract template contains signature legal language, it is shown" do
- contract_template = create(:contract_template, project: project, signature_legal_text: dummy_signature_legal_text)
- visit new_account_project_contract_template_talent_release_path(project.account, project, contract_template)
-
- expect(page).to have_content dummy_signature_legal_text
- end
end
context "when signed in" do
@@ -562,8 +555,4 @@ feature "User managing talent releases" do
fill_in guardian_address_state_field, with: "NY"
fill_in guardian_address_zip_field, with: '1000'
end
-
- def dummy_signature_legal_text
- 'Some signature legal language'
- end
end
diff --git a/spec/jobs/generate_contracts_zip_job_spec.rb b/spec/jobs/generate_contracts_zip_job_spec.rb
index 3d3ee5f..a438ae4 100644
--- a/spec/jobs/generate_contracts_zip_job_spec.rb
+++ b/spec/jobs/generate_contracts_zip_job_spec.rb
@@ -11,7 +11,7 @@ describe GenerateContractsZipJob do
dir = Rails.root.join("spec", "fixtures", "files")
files = ["contract.pdf", "AppearanceRelease.pdf"]
# Attachments in the test environment do not persist to cloud storage
- # Therefore we want to stub calls to `open` with a cloud storage URL
+ # Therefore we want to stub calls to `open` with a cloud storage URL
allow_any_instance_of(ReleaseContractCollectionService).to receive(:open).and_return(StringIO.new("file data"))
allow_any_instance_of(ReleaseContractCollectionService).to receive(:build).and_yield(dir, files)
end
@@ -35,38 +35,6 @@ describe GenerateContractsZipJob do
expect(download.file).to be_attached
end
- it "generates ZIP containing CSV file with all releases data for all release types" do
- release_types = %w[AcquiredMediaRelease AppearanceRelease LocationRelease MaterialRelease MedicalRelease MiscRelease MusicRelease TalentRelease]
- create_releases_for_all_types
-
- release_types.each do |type|
- lowercase_plural = type.constantize.model_name.plural
- GenerateContractsZipJob.perform_now(project, download, type, project.public_send(lowercase_plural).ids)
-
- generated_zip = download.file.blob.download
- csv_file_name = "#{project.name.parameterize}_#{lowercase_plural.gsub('_', '-')}.csv"
- Zip::InputStream.open(StringIO.new(generated_zip)) do |io|
- while entry = io.get_next_entry
- next unless entry.name == csv_file_name
-
- csv_file = entry.get_input_stream.read
-
- release_class = Object.const_get type
- release_headers = release_class.csv_headers
-
- release_headers.each do |header|
- expect(csv_file).to match header
- end
- end
-
- dummy_zip_file_name = "#{project.name.parameterize}_#{lowercase_plural.gsub('_', '-')}.zip"
- if File.exist?(file_fixture(dummy_zip_file_name))
- File.delete(file_fixture(dummy_zip_file_name))
- end
- end
- end
- end
-
context "When there are errors" do
let(:error) { StandardError.new("Contracts or contract templates not found.") }
@@ -74,10 +42,10 @@ describe GenerateContractsZipJob do
allow(ProjectsChannel).to receive(:broadcast_download_generation_update).with(download, I18n.t("contract_downloads.download.failure"))
allow_any_instance_of(ReleaseContractCollectionService).to receive(:build).and_raise(StandardError, "Contracts or contract templates not found")
end
-
+
it "updates status to 'failure' and sends user a notification" do
GenerateContractsZipJob.perform_now(project, download, "AppearanceRelease", project.appearance_releases.ids)
-
+
expect(download.status).to eq "failure"
expect(ProjectsChannel).to have_received(:broadcast_download_generation_update).with(download, I18n.t("contract_downloads.download.failure"))
end
@@ -88,21 +56,6 @@ describe GenerateContractsZipJob do
# Delete the file created in fixture.
# Or the tests will fail on next run due to already existing files in existing zip.
path = Rails.root.join("spec", "fixtures", "files")
- if File.exists? "#{path}/my-video-project_appearance-releases.zip"
- File.delete("#{path}/my-video-project_appearance-releases.zip")
- end
- end
-
- private
-
- def create_releases_for_all_types
- create(:acquired_media_release_with_contract_template, :native, project: project)
- create(:appearance_release_with_contract_template, :native, project: project, person_name: "John Doe")
- create(:location_release_with_contract_template, :native, project: project)
- create(:material_release_with_contract_template, :native, project: project)
- create(:medical_release_with_contract_template, :native, project: project)
- create(:misc_release_with_contract_template, :native, project: project)
- create(:music_release_with_contract_template, project: project)
- create(:talent_release_with_contract_template, :native, project: project)
+ File.delete("#{path}/my-video-project_appearance-releases.zip") if File.exists? "#{path}/my-video-project_appearance-releases.zip"
end
end
diff --git a/spec/jobs/generate_interview_files_zip_job_spec.rb b/spec/jobs/generate_interview_files_zip_job_spec.rb
new file mode 100644
index 0000000..0cb9eb4
--- /dev/null
+++ b/spec/jobs/generate_interview_files_zip_job_spec.rb
@@ -0,0 +1,60 @@
+require "rails_helper"
+
+describe GenerateInterviewFilesZipJob do
+ let(:project) { create(:project) }
+ let(:download) { create(:download, project: project, release_type: "CastingCallInterview", name: "my-title_john-doe") }
+ let(:casting_call) { create(:casting_call, project: project, title: "My Title") }
+ let(:casting_call_interview) { create(:casting_call_interview, casting_call: casting_call, performer_name: "John Doe") }
+
+ before do
+ dir = Rails.root.join("spec", "fixtures", "files")
+ files = ["contract.pdf", "AppearanceRelease.pdf"]
+ # Attachments in the test environment do not persist to cloud storage
+ # Therefore we want to stub calls to `open` with a cloud storage URL
+ allow_any_instance_of(InterviewFilesCollectionService).to receive(:open).and_return(StringIO.new("file data"))
+ allow_any_instance_of(InterviewFilesCollectionService).to receive(:build).and_yield(dir, files)
+ end
+
+ describe ".perform_later" do
+ it "enqueues a background job for generating zip file" do
+ expect {
+ GenerateInterviewFilesZipJob.perform_later(project, download, casting_call_interview)
+ }.to have_enqueued_job
+ end
+ end
+
+ describe ".perform_now" do
+ it "updates a download record and creates attachment for it" do
+ GenerateInterviewFilesZipJob.perform_now(project, download, casting_call_interview)
+
+ expect(download.project).to eq project
+ expect(download.release_type).to eq "CastingCallInterview"
+ expect(download.name).to eq "my-title_john-doe"
+ expect(download.status).to eq "success"
+ expect(download.file).to be_attached
+ end
+
+ context "When there are errors" do
+ let(:error) { StandardError.new("Casting Call Interview files not found.") }
+
+ before do
+ allow(ProjectsChannel).to receive(:broadcast_download_generation_update).with(download, I18n.t("interview_downloads.download.failure"))
+ allow_any_instance_of(InterviewFilesCollectionService).to receive(:build).and_raise(StandardError, "Casting Call Interview files not found.")
+ end
+
+ it "updates status to 'failure' and sends user a notification" do
+ GenerateInterviewFilesZipJob.perform_now(project, download, casting_call_interview)
+
+ expect(download.status).to eq "failure"
+ expect(ProjectsChannel).to have_received(:broadcast_download_generation_update).with(download, I18n.t("interview_downloads.download.failure"))
+ end
+ end
+ end
+
+ after do
+ # Delete the file created in fixture.
+ # Or the tests will fail on next run due to already existing files in existing zip.
+ path = Rails.root.join("spec", "fixtures", "files")
+ File.delete("#{path}/my-title_john-doe.zip") if File.exists? "#{path}/my-title_john-doe.zip"
+ end
+end
diff --git a/spec/jobs/submit_hubspot_form_job_spec.rb b/spec/jobs/submit_hubspot_form_job_spec.rb
index 80e701c..f367c70 100644
--- a/spec/jobs/submit_hubspot_form_job_spec.rb
+++ b/spec/jobs/submit_hubspot_form_job_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe SubmitHubspotFormJob, type: :job do
allow(Hubspot::Form).to receive(:new).and_return(form)
allow(form).to receive(:submit).and_return(true)
- SubmitHubspotFormJob.perform_now("John", "Doe", "email@test.com", "My Account")
+ SubmitHubspotFormJob.perform_now(first_name: "John", last_name: "Doe", email: "email@test.com", company: "My Account", form_guid: ENV["HUBSPOT_FORM_GUID"])
expect(Hubspot::Form).to have_received(:new).with("guid" => "hubspot_form_guid")
expect(form).to have_received(:submit).with(
@@ -27,7 +27,7 @@ RSpec.describe SubmitHubspotFormJob, type: :job do
allow(Hubspot::Form).to receive(:new).and_return(form)
allow(form).to receive(:submit).and_return(true)
- SubmitHubspotFormJob.perform_now("John", "Doe", "email@test.com", "My Account", additional_param_one: "Foo", additional_param_two: "Bar")
+ SubmitHubspotFormJob.perform_now(first_name: "John", last_name: "Doe", email: "email@test.com", company: "My Account", form_guid: ENV["HUBSPOT_FORM_GUID"], additional_param_one: "Foo", additional_param_two: "Bar")
expect(form).to have_received(:submit).with(
first_name: "John",
@@ -35,7 +35,7 @@ RSpec.describe SubmitHubspotFormJob, type: :job do
email: "email@test.com",
company: "My Account",
additional_param_one: "Foo",
- additional_param_two: "Bar",
+ additional_param_two: "Bar"
)
end
@@ -46,7 +46,7 @@ RSpec.describe SubmitHubspotFormJob, type: :job do
allow(Hubspot::Form).to receive(:new).and_return(form)
allow(form).to receive(:submit)
- SubmitHubspotFormJob.perform_now("John", "Doe", "email@test.com", "My Account")
+ SubmitHubspotFormJob.perform_now(first_name: "John", last_name: "Doe", email: "email@test.com", company: "My Account", form_guid: ENV["HUBSPOT_FORM_GUID"])
expect(form).not_to have_received(:submit)
end
diff --git a/spec/jobs/submit_hubspot_task_request_form_job_spec.rb b/spec/jobs/submit_hubspot_task_request_form_job_spec.rb
deleted file mode 100644
index 8aa269c..0000000
--- a/spec/jobs/submit_hubspot_task_request_form_job_spec.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-require 'rails_helper'
-
-RSpec.describe SubmitHubspotTaskRequestFormJob, type: :job do
- describe '#perform_now' do
- before do
- ENV["HUBSPOT_TASK_REQUEST_FORM_GUID"] = "hubspot_task_request_form_guid"
- end
-
- it 'submits to the Hubspot API with the right params' do
- form = double(:form)
- allow(Hubspot::Form).to receive(:new).and_return(form)
- allow(form).to receive(:submit).and_return(true)
-
- SubmitHubspotTaskRequestFormJob.perform_now("email@test.com", "https://example.com/admin/task_requests/1")
-
- expect(Hubspot::Form).to have_received(:new).with("guid" => "hubspot_task_request_form_guid")
- expect(form).to have_received(:submit).with(
- email: "email@test.com",
- taskme_url: "https://example.com/admin/task_requests/1"
- )
- end
-
- context 'when HUBSPOT_TASK_REQUEST_FORM_GUID is not available' do
- it 'does not submit to the API' do
- ENV["HUBSPOT_TASK_REQUEST_FORM_GUID"] = nil
- form = double(:form)
- allow(Hubspot::Form).to receive(:new).and_return(form)
- allow(form).to receive(:submit)
-
- SubmitHubspotTaskRequestFormJob.perform_now("email@test.com", "https://example.com/admin/task_requests/1")
-
- expect(form).not_to have_received(:submit)
- end
- end
- end
-end
diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb
index 97468b7..d0638bc 100644
--- a/spec/models/account_spec.rb
+++ b/spec/models/account_spec.rb
@@ -135,7 +135,9 @@ RSpec.describe Account do
MedicalRelease,
MiscRelease,
MatchingRequest,
- ActionMailbox::InboundEmail # This is Rails model, we are not using it and it is NOT added to the Account#storage_total calculation
+ ActionMailbox::InboundEmail, # This is Rails model, we are not using it and it is NOT added to the Account#storage_total calculation
+ CastingCall,
+ CastingCallInterview
]
Rails.application.eager_load!
ActiveRecord::Base.descendants.each do |model|
diff --git a/spec/models/casting_call_interview_spec.rb b/spec/models/casting_call_interview_spec.rb
new file mode 100644
index 0000000..8affc14
--- /dev/null
+++ b/spec/models/casting_call_interview_spec.rb
@@ -0,0 +1,12 @@
+require 'rails_helper'
+
+RSpec.describe CastingCallInterview, type: :model do
+ describe "associations" do
+ it { is_expected.to belong_to(:casting_call) }
+ it { is_expected.to have_secure_token(:token) }
+ end
+
+ describe "validations" do
+ it { is_expected.to validate_presence_of(:performer_name) }
+ end
+end
diff --git a/spec/models/casting_call_spec.rb b/spec/models/casting_call_spec.rb
new file mode 100644
index 0000000..c46e97f
--- /dev/null
+++ b/spec/models/casting_call_spec.rb
@@ -0,0 +1,11 @@
+require 'rails_helper'
+
+RSpec.describe CastingCall, type: :model do
+ describe "associations" do
+ it { is_expected.to belong_to(:project) }
+ end
+
+ describe "validations" do
+ it { is_expected.to have_secure_token(:token) }
+ end
+end
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index 5df8155..8214d16 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -19,6 +19,7 @@ RSpec.describe Project, type: :model do
it { is_expected.to have_many(:broadcasts).dependent(:destroy) }
it { is_expected.to have_many(:downloads).dependent(:destroy) }
it { is_expected.to have_many(:zoom_meetings).dependent(:destroy) }
+ it { is_expected.to have_many(:casting_calls).dependent(:destroy) }
end
describe "nested attributes" do
@@ -36,7 +37,7 @@ RSpec.describe Project, type: :model do
describe "#import_contract_templates" do
it "imports contract templates from other projects within the account" do
- existing_project = create(:project_with_contract_template_public)
+ existing_project = create(:project_with_contract_template)
new_project = create(:project, name: "New Project", account: existing_project.account)
expect {
diff --git a/spec/policies/casting_call_policy_spec.rb b/spec/policies/casting_call_policy_spec.rb
new file mode 100644
index 0000000..39aac8e
--- /dev/null
+++ b/spec/policies/casting_call_policy_spec.rb
@@ -0,0 +1,91 @@
+require "rails_helper"
+
+describe CastingCallPolicy do
+ subject { described_class }
+
+ let(:user_context) { build(:user_context, user: user, account: user.primary_account) }
+
+ context "for an associate" do
+ let(:user) { create(:user, :associate, admin: false) }
+
+ permissions :index? do
+ it { is_expected.to permit(user_context, subject) }
+ end
+
+ permissions :create? do
+ it { is_expected.to permit(user_context, subject) }
+ end
+
+ permissions :show? do
+ it { is_expected.to permit(user_context, subject) }
+ end
+
+ permissions :destroy? do
+ it { is_expected.to permit(user_context, subject) }
+ end
+
+ permissions :update? do
+ it { is_expected.to permit(user_context, subject) }
+ end
+
+ permissions :cancel? do
+ it { is_expected.to permit(user_context, subject) }
+ end
+ end
+
+ context "for a project manager" do
+ let(:user) { create(:user, :manager, admin: false) }
+
+ permissions :index? do
+ it { is_expected.to permit(user_context, subject) }
+ end
+
+ permissions :create? do
+ it { is_expected.to permit(user_context, subject) }
+ end
+
+ permissions :show? do
+ it { is_expected.to permit(user_context, subject) }
+ end
+
+ permissions :destroy? do
+ it { is_expected.to permit(user_context, subject) }
+ end
+
+ permissions :update? do
+ it { is_expected.to permit(user_context, subject) }
+ end
+
+ permissions :cancel? do
+ it { is_expected.to permit(user_context, subject) }
+ end
+ end
+
+ context "for account managers" do
+ let(:user) { create(:user, :account_manager, admin: false) }
+
+ permissions :index? do
+ it { is_expected.to permit(user_context, subject) }
+ end
+
+ permissions :create? do
+ it { is_expected.to permit(user_context, subject) }
+ end
+
+ permissions :show? do
+ it { is_expected.to permit(user_context, subject) }
+ end
+
+ permissions :destroy? do
+ it { is_expected.to permit(user_context, subject) }
+ end
+
+ permissions :update? do
+ it { is_expected.to permit(user_context, subject) }
+ end
+
+ permissions :cancel? do
+ it { is_expected.to permit(user_context, subject) }
+ end
+ end
+end
diff --git a/spec/policies/contract_template_policy_spec.rb b/spec/policies/contract_template_policy_spec.rb
index f1055f4..241ca38 100644
--- a/spec/policies/contract_template_policy_spec.rb
+++ b/spec/policies/contract_template_policy_spec.rb
@@ -75,17 +75,14 @@ describe ContractTemplatePolicy do
end
permissions ".scope" do
- let!(:member_project_public_template) do
- create(:project_with_contract_template_public, name: "Member Project Public Template", members: user, account: account)
- end
- let!(:member_project_private_template) do
- create(:project_with_contract_template_private, name: "Member Project Private Template", members: user, account: account)
+ let!(:member_project) do
+ create(:project_with_contract_template, name: "Member Project", members: user, account: account)
end
let!(:non_member_project) do
- create(:project_with_contract_template_public, name: "Non-Member Project", account: account)
+ create(:project_with_contract_template, name: "Non-Member Project", account: account)
end
let!(:outside_project) do
- create(:project_with_contract_template_public, name: "Outside Project", account: build(:account))
+ create(:project_with_contract_template, name: "Outside Project", account: build(:account))
end
let(:account) { build(:account) }
@@ -96,8 +93,7 @@ describe ContractTemplatePolicy do
context "for an account manager" do
let(:user) { create(:user, :account_manager, primary_account: account)}
- it { is_expected.to include(member_project_public_template.contract_templates.first) }
- it { is_expected.to include(member_project_private_template.contract_templates.first) }
+ it { is_expected.to include(member_project.contract_templates.first) }
it { is_expected.to include(non_member_project.contract_templates.first) }
it { is_expected.not_to include(outside_project.contract_templates.first) }
end
@@ -105,17 +101,15 @@ describe ContractTemplatePolicy do
context "for manager" do
let(:user) { create(:user, :manager, primary_account: account) }
- it { is_expected.to include(member_project_public_template.contract_templates.first) }
- it { is_expected.to include(member_project_private_template.contract_templates.first) }
+ it { is_expected.to include(member_project.contract_templates.first) }
it { is_expected.not_to include(non_member_project.contract_templates.first) }
it { is_expected.not_to include(outside_project.contract_templates.first) }
end
context "for associate" do
let(:user) { create(:user, :associate, primary_account: account) }
-
- it { is_expected.to include(member_project_public_template.contract_templates.first) }
- it { is_expected.not_to include(member_project_private_template.contract_templates.first) }
+
+ it { is_expected.to include(member_project.contract_templates.first) }
it { is_expected.not_to include(non_member_project.contract_templates.first) }
it { is_expected.not_to include(outside_project.contract_templates.first) }
end
| |