From da8e1874308960b1083bef89d9a08cc43a1b6402 Mon Sep 17 00:00:00 2001 From: Senad Uka Date: Wed, 15 Jul 2020 11:57:21 +0200 Subject: [PATCH] Cast me --- app/controllers/accounts_controller.rb | 2 +- .../casting_call_interviews_controller.rb | 64 +++++++ .../api/medical_releases_controller.rb | 11 -- .../api/misc_releases_controller.rb | 11 -- app/controllers/api/sync_controller.rb | 6 +- app/controllers/approvals_controller.rb | 21 --- .../casting_call_interviews_controller.rb | 28 +++ app/controllers/casting_calls_controller.rb | 76 +++++++++ .../contract_templates_controller.rb | 17 +- .../interview_downloads_controller.rb | 30 ++++ .../casting_call_interviews_controller.rb | 25 +++ .../public/casting_calls_controller.rb | 14 ++ .../stream_notifications_controller.rb | 3 +- app/controllers/task_requests_controller.rb | 2 +- app/helpers/tooltip_helper.rb | 8 - app/jobs/generate_contracts_zip_job.rb | 24 +-- app/jobs/generate_interview_files_zip_job.rb | 43 +++++ app/jobs/submit_hubspot_form_job.rb | 16 +- .../submit_hubspot_task_request_form_job.rb | 18 -- app/models/account.rb | 10 ++ app/models/acquired_media_release.rb | 11 -- app/models/appearance_release.rb | 7 - app/models/casting_call.rb | 18 ++ app/models/casting_call_interview.rb | 22 +++ app/models/concerns/csv_exportable.rb | 56 ------ app/models/contract_template.rb | 9 - app/models/location_release.rb | 7 - app/models/material_release.rb | 17 +- app/models/medical_release.rb | 19 --- app/models/misc_release.rb | 7 - app/models/music_release.rb | 21 +-- app/models/project.rb | 2 + app/models/qr_code.rb | 2 +- app/models/talent_release.rb | 15 -- app/policies/casting_call_interview_policy.rb | 29 ++++ app/policies/casting_call_policy.rb | 25 +++ app/policies/contract_template_policy.rb | 4 +- app/policies/medical_release_policy.rb | 8 - app/policies/project_policy.rb | 4 + .../interview_files_collection_service.rb | 24 +++ app/telemetry/analytics.rb | 18 ++ .../admin/application/_side_nav.html.erb | 3 + .../_casting_call_interview.html.erb | 26 +++ .../casting_call_interviews/_form.html.erb | 15 ++ .../casting_call_interviews/edit.html.erb | 6 + .../casting_call_interviews/index.html.erb | 32 ++++ .../casting_call_interviews/new.html.erb | 6 + app/views/application/_sidebar.html.erb | 6 + app/views/approvals/new.html.erb | 15 -- app/views/broadcasts/splash.html.erb | 2 +- .../_casting_call_interview.html.erb | 27 +++ .../casting_call_interviews/_file.html.erb | 6 + .../casting_call_interviews/index.html.erb | 26 +++ .../casting_call_interviews/show.html.erb | 25 +++ .../casting_calls/_casting_call.html.erb | 28 +++ app/views/casting_calls/_form.html.erb | 22 +++ app/views/casting_calls/create.html.erb | 2 + app/views/casting_calls/edit.html.erb | 6 + app/views/casting_calls/index.html.erb | 37 ++++ app/views/casting_calls/new.html.erb | 6 + app/views/casting_calls/show.html.erb | 38 +++++ .../_contract_template.html.erb | 4 +- app/views/contract_templates/_form.html.erb | 9 - app/views/contract_templates/splash.html.erb | 2 +- app/views/contracts/_for_office_use_only.erb | 13 -- app/views/contracts/pdf.html.erb | 7 - .../_other_pending_downloads.html.erb | 17 ++ .../_medical_release.html.erb | 11 -- app/views/medical_releases/index.html.erb | 1 - app/views/medical_releases/review.html.erb | 15 -- app/views/projects/show.html.erb | 5 + .../acquired_media_releases/new.html.erb | 2 +- .../public/appearance_releases/new.html.erb | 2 +- .../casting_call_interviews/show.html.erb | 51 ++++++ app/views/public/casting_calls/show.html.erb | 38 +++++ .../public/location_releases/new.html.erb | 2 +- .../public/material_releases/new.html.erb | 2 +- .../public/medical_releases/new.html.erb | 2 +- app/views/public/misc_releases/new.html.erb | 6 +- app/views/public/talent_releases/new.html.erb | 2 +- .../shared/_initiate_hubspot_chat.html.erb | 15 ++ app/views/shared/_signature_fields.html.erb | 4 - app/views/task_requests/create.html.erb | 18 +- app/views/videos/splash.html.erb | 4 +- config/locales/en.yml | 100 +++++++---- config/locales/es.yml | 86 ---------- config/routes.rb | 25 ++- ...01_add_duration_to_broadcast_recordings.rb | 18 -- .../20200626044744_create_casting_calls.rb | 17 ++ ...01121237_create_casting_call_interviews.rb | 12 ++ ...200706193123_add_token_to_casting_calls.rb | 6 + ...03_add_token_to_casting_call_interviews.rb | 6 + ...nterviewed_at_to_casting_call_interview.rb | 5 + ...proval_info_columns_to_medical_releases.rb | 7 - ...add_accessibility_to_contract_templates.rb | 5 - ...39_add_duration_to_broadcast_recordings.rb | 5 - db/structure.sql | 161 ++++++++++++++++-- spec/controllers/accounts_controller_spec.rb | 12 +- ...casting_call_interviews_controller_spec.rb | 106 ++++++++++++ .../api/contract_templates_controller_spec.rb | 15 -- .../api/medical_releases_controller_spec.rb | 42 ----- .../api/misc_releases_controller_spec.rb | 42 ----- spec/controllers/api/notes_controller_spec.rb | 8 - spec/controllers/api/sync_controller_spec.rb | 36 ---- spec/controllers/approvals_controller_spec.rb | 36 ---- ...casting_call_interviews_controller_spec.rb | 43 +++++ .../casting_calls_controller_spec.rb | 126 ++++++++++++++ .../interview_downloads_controller_spec.rb | 58 +++++++ .../casting_call_interviews_controller.rb | 44 +++++ .../public/casting_calls_controller_spec.rb | 28 +++ .../task_requests_controller_spec.rb | 2 +- spec/factories/casting_call_interviews.rb | 13 ++ spec/factories/casting_calls.rb | 15 ++ spec/factories/contract_templates.rb | 1 - spec/factories/projects.rb | 8 +- .../user_creates_task_request_spec.rb | 3 +- .../user_manages_contract_templates_spec.rb | 30 +--- ...r_managing_acquired_media_releases_spec.rb | 11 -- .../user_managing_appearance_releases_spec.rb | 11 -- .../user_managing_casiting_calls_spec.rb | 114 +++++++++++++ .../user_managing_location_releases_spec.rb | 11 -- .../user_managing_material_releases_spec.rb | 11 -- .../user_managing_medical_releases_spec.rb | 144 ---------------- .../user_managing_misc_releases_spec.rb | 11 -- .../user_managing_talent_releases_spec.rb | 11 -- spec/jobs/generate_contracts_zip_job_spec.rb | 55 +----- .../generate_interview_files_zip_job_spec.rb | 60 +++++++ spec/jobs/submit_hubspot_form_job_spec.rb | 8 +- ...bmit_hubspot_task_request_form_job_spec.rb | 36 ---- spec/models/account_spec.rb | 4 +- spec/models/casting_call_interview_spec.rb | 12 ++ spec/models/casting_call_spec.rb | 11 ++ spec/models/project_spec.rb | 3 +- spec/policies/casting_call_policy_spec.rb | 91 ++++++++++ .../policies/contract_template_policy_spec.rb | 22 +-- 135 files changed, 1952 insertions(+), 1115 deletions(-) create mode 100644 app/controllers/admin/casting_call_interviews_controller.rb delete mode 100644 app/controllers/api/medical_releases_controller.rb delete mode 100644 app/controllers/api/misc_releases_controller.rb delete mode 100644 app/controllers/approvals_controller.rb create mode 100644 app/controllers/casting_call_interviews_controller.rb create mode 100644 app/controllers/casting_calls_controller.rb create mode 100644 app/controllers/interview_downloads_controller.rb create mode 100644 app/controllers/public/casting_call_interviews_controller.rb create mode 100644 app/controllers/public/casting_calls_controller.rb create mode 100644 app/jobs/generate_interview_files_zip_job.rb delete mode 100644 app/jobs/submit_hubspot_task_request_form_job.rb create mode 100644 app/models/casting_call.rb create mode 100644 app/models/casting_call_interview.rb delete mode 100644 app/models/concerns/csv_exportable.rb create mode 100644 app/policies/casting_call_interview_policy.rb create mode 100644 app/policies/casting_call_policy.rb create mode 100644 app/services/interview_files_collection_service.rb create mode 100644 app/views/admin/casting_call_interviews/_casting_call_interview.html.erb create mode 100644 app/views/admin/casting_call_interviews/_form.html.erb create mode 100644 app/views/admin/casting_call_interviews/edit.html.erb create mode 100644 app/views/admin/casting_call_interviews/index.html.erb create mode 100644 app/views/admin/casting_call_interviews/new.html.erb delete mode 100644 app/views/approvals/new.html.erb create mode 100644 app/views/casting_call_interviews/_casting_call_interview.html.erb create mode 100644 app/views/casting_call_interviews/_file.html.erb create mode 100644 app/views/casting_call_interviews/index.html.erb create mode 100644 app/views/casting_call_interviews/show.html.erb create mode 100644 app/views/casting_calls/_casting_call.html.erb create mode 100644 app/views/casting_calls/_form.html.erb create mode 100644 app/views/casting_calls/create.html.erb create mode 100644 app/views/casting_calls/edit.html.erb create mode 100644 app/views/casting_calls/index.html.erb create mode 100644 app/views/casting_calls/new.html.erb create mode 100644 app/views/casting_calls/show.html.erb delete mode 100644 app/views/contracts/_for_office_use_only.erb create mode 100644 app/views/interview_downloads/_other_pending_downloads.html.erb delete mode 100644 app/views/medical_releases/review.html.erb create mode 100644 app/views/public/casting_call_interviews/show.html.erb create mode 100644 app/views/public/casting_calls/show.html.erb create mode 100644 app/views/shared/_initiate_hubspot_chat.html.erb delete mode 100644 db/data_migrations/20200712192301_add_duration_to_broadcast_recordings.rb create mode 100644 db/migrate/20200626044744_create_casting_calls.rb create mode 100644 db/migrate/20200701121237_create_casting_call_interviews.rb create mode 100644 db/migrate/20200706193123_add_token_to_casting_calls.rb create mode 100644 db/migrate/20200706230803_add_token_to_casting_call_interviews.rb create mode 100644 db/migrate/20200707070522_add_interviewed_at_to_casting_call_interview.rb delete mode 100644 db/migrate/20200707155717_add_approval_info_columns_to_medical_releases.rb delete mode 100644 db/migrate/20200709120630_add_accessibility_to_contract_templates.rb delete mode 100644 db/migrate/20200712181139_add_duration_to_broadcast_recordings.rb create mode 100644 spec/controllers/admin/casting_call_interviews_controller_spec.rb delete mode 100644 spec/controllers/api/medical_releases_controller_spec.rb delete mode 100644 spec/controllers/api/misc_releases_controller_spec.rb delete mode 100644 spec/controllers/approvals_controller_spec.rb create mode 100644 spec/controllers/casting_call_interviews_controller_spec.rb create mode 100644 spec/controllers/casting_calls_controller_spec.rb create mode 100644 spec/controllers/interview_downloads_controller_spec.rb create mode 100644 spec/controllers/public/casting_call_interviews_controller.rb create mode 100644 spec/controllers/public/casting_calls_controller_spec.rb create mode 100644 spec/factories/casting_call_interviews.rb create mode 100644 spec/factories/casting_calls.rb create mode 100644 spec/features/user_managing_casiting_calls_spec.rb create mode 100644 spec/jobs/generate_interview_files_zip_job_spec.rb delete mode 100644 spec/jobs/submit_hubspot_task_request_form_job_spec.rb create mode 100644 spec/models/casting_call_interview_spec.rb create mode 100644 spec/models/casting_call_spec.rb create mode 100644 spec/policies/casting_call_policy_spec.rb 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 @@ + 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 %> +
+ +
+ + + + + + + + + + + + <% if @casting_call_interviews.any? %> + <%= render @casting_call_interviews %> + <% else %> + + + + <% end %> + +
Account NameCasting Call RequestPerfomer's NameInterview Date
<%= t(".empty") %>
+
+ +
+ <%= will_paginate @casting_call_interviews %> +
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 %> +
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] %> -
- " width="90%" height="1200" /> - - <%= bootstrap_form_with model: @medical_release, method: :post, url: medical_release_approvals_path(@medical_release), local: true do |form| %> -
- <%= link_to t("shared.cancel"), [@medical_release.project, :medical_releases], class: "col-3 text-reset" %> -
- <%= form.button t('.actions.approve'), id: "approve_release", class: class_string("btn btn-block btn-success btn-primary"), data: { disable_with: t("shared.disable_with") } %> -
-
- <% end %> -
-
\ 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 @@ +
+ + + + + + + + + + + + <% if @casting_call_interviews.any? %> + <%= render @casting_call_interviews %> + <% else %> + + + + <% end %> + +
Account NameCasting Call RequestPerfomer's NameInterviewed At
<%= t(".empty") %>
+
+ +
+ <%= will_paginate @casting_call_interviews %> +
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:

+
+ + + + + + + + + <% if @files.any? %> + <%= render partial: "file", collection: @files %> + <% else %> + + + + <% end %> + +
Filename
<%= t(".empty") %>
+
+ <%= 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 %> +
+
+
+ +
+ + + + + + + + + + + <% if @casting_calls.any? %> + <%= render @casting_calls %> + <% else %> + + + + <% end %> + +
<%= t(".table_headers.casting_call_created_on") %><%= t(".table_headers.casting_call_title") %><%= t(".table_headers.casting_call_status") %>
<%= t(".empty") %>
+
+ +
+ <%= will_paginate @casting_calls %> +
\ 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 %> +
+
+
+ <%= product_wordmark(:cast_me, class: 'navbar-brand') %> +
+
+
+<% 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 %> - <% 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:

+ 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] %> -
- " width="90%" height="1200" /> - - <%= bootstrap_form_with model: @medical_release, method: :patch, url: [:approve, @medical_release], local: true do |form| %> -
- <%= link_to t("shared.cancel"), [@medical_release.project, :medical_releases], class: "col-3 text-reset" %> -
- <%= form.button t('.actions.approve'), id: "approve_release", class: class_string("btn btn-block btn-success btn-primary"), data: { disable_with: t("shared.disable_with") } %> -
-
- <% end %> -
-
\ 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 %> +
+
+
+ <%= product_wordmark(:cast_me, class: 'navbar-brand') %> +
+
+
+<% 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