Compare commits

...

8 Commits

Author SHA1 Message Date
Bilal
dcb8a95a82 make all fields required 2020-06-24 13:08:39 +02:00
Senad Uka
319cd89b29 Upstream sync 2020-06-24 04:48:12 +02:00
Senad Uka
6b0ea5b7df Upstream sync 2020-06-23 17:10:53 +02:00
Senad Uka
afee9d9bc9 Upstream sync 2020-06-22 20:28:22 +02:00
Senad Uka
072142811f Upstream sync 2020-06-22 14:14:25 +02:00
Senad Uka
b924b99762 Upstream sync 2020-06-19 09:23:07 +02:00
Senad Uka
988ef2beab Upstream sync 2020-06-18 17:51:08 +02:00
Senad Uka
1168bcdfdd Upstream sync 2020-06-18 16:56:11 +02:00
85 changed files with 2109 additions and 106 deletions

View File

@@ -51,10 +51,8 @@ $(document).on("turbolinks:load", function() {
$("[data-behavior=guardian-photo-preview]").each(function(index, element) {
App.PhotoPreview.init(element);
});
$("[data-behavior=take-person-photo]").click(function(e) {
$("[data-ujs-target=person-photo-input]").trigger("click");
});
$("[data-behavior=take-guardian-photo]").click(function(e) {
$("[data-ujs-target=guardian-photo-input]").trigger("click");
$("[data-behavior=trigger-click]").click(function(e) {
const target = $(this).data("target");
$(target).trigger("click");
});
});

View File

@@ -24,8 +24,12 @@ class Api::BroadcastsController < Api::ApiController
def update
file_params.each do |file|
file[:io] = StringIO.new(Base64.decode64(file[:io]))
@broadcast.files.attach(io: file[:io], filename: file[:filename])
if file.is_a?(String)
@broadcast.files.attach(file)
else
file[:io] = StringIO.new(Base64.decode64(file[:io]))
@broadcast.files.attach(file.to_h.symbolize_keys)
end
end
@broadcast.save!

View File

@@ -78,8 +78,8 @@ class AppearanceReleasesController < ApplicationController
end
def appearance_release_params
params.require(:appearance_release).permit(:contract, :guardian_address, :guardian_first_name, :guardian_last_name, :guardian_phone, :guardian_photo, :guardian_email, :minor,
:person_address, :person_first_name, :person_last_name, :person_phone, :person_email, :person_photo,
params.require(:appearance_release).permit(:contract, :guardian_address_street1, :guardian_first_name, :guardian_last_name, :guardian_phone, :guardian_photo, :guardian_email, :minor,
:person_address_street1, :person_first_name, :person_last_name, :person_phone, :person_email, :person_photo,
:applicable_medium_id, :applicable_medium_text,
:territory_id, :territory_text,
:term_id, :term_text, :person_date_of_birth,

View File

@@ -0,0 +1,13 @@
module MiscReleaseContext
extend ActiveSupport::Concern
def misc_releases
policy_scope(MiscRelease)
end
def set_misc_release
misc_release_id = params[:misc_release_id] || params[:id]
@misc_release = authorize misc_releases.find(misc_release_id)
end
end

View File

@@ -66,7 +66,10 @@ class ContractTemplatesController < ApplicationController
: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_9_text, :question_10_text,
:question_11_text, :question_12_text,
:question_13_text, :question_14_text,
:question_15_text)
end
def download_attributes

View File

@@ -48,8 +48,10 @@ class ContractsController < ApplicationController
# Native release contracts must be generated on-the-fly; non-native releases have a contract attachment
if releasable.native?
send_file contract.to_pdf, download_attributes
else
elsif policy(contract).show?
redirect_to releasable.contract.service_url
else
raise Pundit::NotAuthorizedError
end
end
end

View File

@@ -0,0 +1,40 @@
class MiscReleasesController < ApplicationController
include ProjectContext, MiscReleaseContext
before_action :set_project, only: [:index]
before_action :set_misc_release, only: [:destroy]
include ProjectLayout
def index
@misc_releases = filtered_misc_releases.order_by_recent.paginate(page: params[:page])
end
def destroy
@project = @misc_release.project
if @misc_release.destroy
redirect_to [@project, :misc_releases], alert: t(".alert")
end
end
private
def misc_releases
if @project
policy_scope(@project.misc_releases)
else
policy_scope(MiscRelease)
end
end
def filtered_misc_releases
results = misc_releases
if params[:query].present?
results = results.search(params[:query])
end
results
end
end

View File

@@ -60,7 +60,7 @@ class ProjectsController < ApplicationController
end
def features_settings_params
%i(appearance_release location_release material_release acquired_media_release music_release talent_release medical_release video_analysis)
%i(appearance_release location_release material_release acquired_media_release music_release talent_release medical_release misc_release video_analysis)
end
def project_params_with_current_account

View File

@@ -39,11 +39,60 @@ class Public::AppearanceReleasesController < Public::BaseController
authorize appearance_releases.build(params)
end
def person_params
%i[
person_first_name
person_last_name
person_phone
person_email
person_photo
person_address_street1
person_address_street2
person_address_city
person_address_state
person_address_zip
person_address_country
]
end
def guardian_params
%i[
guardian_first_name
guardian_last_name
guardian_phone
guardian_email
guardian_photo
guardian_address_street1
guardian_address_street2
guardian_address_city
guardian_address_state
guardian_address_zip
guardian_address_country
]
end
def second_guardian_params
%i[
guardian_2_first_name
guardian_2_last_name
guardian_2_phone
guardian_2_email
guardian_2_photo
guardian_2_address_street1
guardian_2_address_street2
guardian_2_address_city
guardian_2_address_state
guardian_2_address_zip
guardian_2_address_country
]
end
def appearance_release_params
params.require(:appearance_release).permit(:person_address, :person_first_name, :person_last_name, :person_phone, :person_email, :person_photo,
:guardian_address, :guardian_first_name, :guardian_last_name, :guardian_phone, :guardian_email, :guardian_photo, :minor,
:signature_base64, :person_date_of_birth,
:locale, :contract_template,)
params.require(:appearance_release).permit(person_params, guardian_params,
second_guardian_params,
:minor, :signature_base64,
:person_date_of_birth,
:locale, :contract_template)
end
def appearance_release_params_with_locale

View File

@@ -37,6 +37,10 @@ class Public::BroadcastsController < Public::BaseController
def set_broadcast
@broadcast = Broadcast.find_by_token(params[:token])
unless @broadcast.present?
redirect_to [:new, :session], alert: t(".alert")
end
end
class MultiViewBroadcast

View File

@@ -53,7 +53,9 @@ class Public::MedicalReleasesController < Public::BaseController
:question_5_answer, :question_6_answer,
:question_7_answer, :question_8_answer,
:question_9_answer, :question_10_answer,
photos: [],
:question_11_answer, :question_12_answer,
:question_13_answer, :question_14_answer,
:question_15_answer, photos: [],
)
end

View File

@@ -0,0 +1,99 @@
class Public::MiscReleasesController < Public::BaseController
before_action :set_account, :set_project, :set_contract_template
def new
@misc_release = build_misc_release
end
def create
@misc_release = build_misc_release(misc_release_params_with_locale_and_contract_template)
if @misc_release.save(context: :native)
if @misc_release.contract_template.present?
AttachContractToReleasableJob.perform_later(@misc_release)
end
log_create_analytics
else
render :new
end
end
private
def set_project
@project = @account.projects.find(params[:project_id])
end
def set_account
@account = Account.find_by(slug: params[:account_id])
end
def set_contract_template
@contract_template = @project.contract_templates.find(params[:contract_template_id])
end
def misc_releases
policy_scope(@project.misc_releases)
end
def build_misc_release(params = {})
authorize misc_releases.build(params)
end
def misc_release_params
params
.require(:misc_release)
.permit(
person_params,
guardian_params,
:signature_base64,
:locale,
:contract_template,
photos: [],
)
end
def person_params
[
:person_first_name,
:person_last_name,
:person_phone,
:person_email,
:person_address_street1,
:person_address_street2,
:person_address_city,
:person_address_state,
:person_address_zip,
:person_address_country,
]
end
def guardian_params
[
:guardian_first_name,
:guardian_last_name,
:guardian_phone,
:guardian_email,
:minor,
:guardian_address_street1,
:guardian_address_street2,
:guardian_address_city,
:guardian_address_state,
:guardian_address_zip,
:guardian_address_country,
:guardian_photo
]
end
def misc_release_params_with_locale
misc_release_params.merge(locale: I18n.locale)
end
def misc_release_params_with_locale_and_contract_template
misc_release_params_with_locale.merge(contract_template: @contract_template)
end
def log_create_analytics
TrackAnalyticsJob.perform_later(nil, nil, :track_create_native_release, release_type: MiscRelease.to_s, account: @account, user_agent: request.user_agent, user_ip: request.remote_ip)
end
end

View File

@@ -11,7 +11,9 @@ class ReleaseTemplateImportsController < ApplicationController
templates = []
filtered_contract_templates.each do |contract_template|
next if contract_template.duplicated? || contract_template.project == @project
next if contract_template.duplicated? ||
contract_template.archived? ||
contract_template.project == @project
already_imported = contract_template.duplicates.non_archived.pluck(:project_id).include?(@project.id)
templates << OpenStruct.new(template: contract_template, already_imported?: already_imported)

View File

@@ -2,7 +2,7 @@ module DropzoneHelper
def dropzone_placeholder_message_for(releasable)
case releasable.model_name.param_key
when "acquired_media_release"
"To Add Photos & Videos to the release:<br>Drag & Drop Files<br>or<br>Click or Tap here to browse photos and connect to Camera"
'(Optional) To add the licensed photos or videos ("Property") to this release:<br>Drag & Drop Files<br>or<br>Click or Tap here to browse photos and connect to Camera'
when "material_release"
t 'material_releases.form.photos.dropzone_label'
when "music_release"

View File

@@ -56,6 +56,7 @@ class Account < ApplicationRecord
Broadcast.where(project: projects),
ZoomMeeting.where(project: projects),
MedicalRelease.where(project: projects),
MiscRelease.where(project: projects),
MatchingRequest.where(project: projects),
self
])).sum(:byte_size).to_f

View File

@@ -12,10 +12,46 @@ class AppearanceRelease < ApplicationRecord
include Taggable
include PersonName
include GuardianPhotoable
include SecondGuardianPhotoable
include GuardianName
include SecondGuardianName
has_one_attached :person_photo
composed_of :person_address,
class_name: 'Address',
mapping: [
%w[person_address_street1 street1],
%w[person_address_street2 street2],
%w[person_address_city city],
%w[person_address_state state],
%w[person_address_zip zip],
%w[person_address_country country]
]
composed_of :guardian_address,
class_name: 'Address',
mapping: [
%w[guardian_address_street1 street1],
%w[guardian_address_street2 street2],
%w[guardian_address_city city],
%w[guardian_address_state state],
%w[guardian_address_zip zip],
%w[guardian_address_country country]
]
composed_of :guardian_2_address,
class_name: 'Address',
mapping: [
%w[guardian_2_address_street1 street1],
%w[guardian_2_address_street2 street2],
%w[guardian_2_address_city city],
%w[guardian_2_address_state state],
%w[guardian_2_address_zip zip],
%w[guardian_2_address_country country]
]
# These validations apply to all releases
validates :person_email, email: true, allow_blank: true
validates :person_first_name, :person_last_name, presence: true
@@ -71,7 +107,18 @@ class AppearanceRelease < ApplicationRecord
scope :having_no_person_photo, -> { left_joins(:person_photo_attachment).group(:id).having('COUNT(active_storage_attachments) = 0') }
scope :with_person_name, ->(name) { where('person_first_name ILIKE ? OR person_last_name ILIKE ?', "%#{name}%") }
searchable_on %i[person_first_name person_last_name person_address person_email person_phone]
searchable_on %i[
person_first_name
person_last_name
person_address_street1
person_address_street2
person_address_city
person_address_state
person_address_zip
person_address_country
person_email
person_phone
]
# All releases must respond to the following messages
def name
@@ -98,6 +145,10 @@ class AppearanceRelease < ApplicationRecord
true
end
def second_guardian_present?
self.guardian_2_first_name.present?
end
def contract_file_name
"#{project.name.parameterize}_#{contract_template.release_type}_#{(signed_at || created_at).strftime('%Y.%m.%d')}_#{release_number}_#{filename_suffix.parameterize}"
end

View File

@@ -0,0 +1,20 @@
module SecondGuardianName
extend ActiveSupport::Concern
included do
def guardian_2_name
"#{guardian_2_first_name} #{guardian_2_last_name}".titleize
end
def guardian_2_name=(value)
if value.include?(' ')
split = value.split(" ", 2)
self.guardian_2_first_name = split.first
self.guardian_2_last_name = split.last
else
self.guardian_2_first_name = value
self.guardian_2_last_name = "(Not Given)"
end
end
end
end

View File

@@ -0,0 +1,9 @@
module SecondGuardianPhotoable
extend ActiveSupport::Concern
included do
has_one_attached :guardian_2_photo
validates :guardian_2_photo, content_type: ["image/png", "image/jpeg"]
end
end

View File

@@ -29,6 +29,10 @@ class Contract
}
end
def medical_release?
@releasable.instance_of?(MedicalRelease)
end
private
def contract_template

View File

@@ -14,6 +14,7 @@ class ContractTemplate < ApplicationRecord
has_many :location_releases, dependent: :restrict_with_error
has_many :material_releases, dependent: :restrict_with_error
has_many :medical_releases, dependent: :restrict_with_error
has_many :misc_releases, dependent: :restrict_with_error
monetize :fee_cents
has_rich_text :body
@@ -51,6 +52,10 @@ class ContractTemplate < ApplicationRecord
parent.present?
end
def archived?
archived_at.present?
end
def archive
update(archived_at: Time.zone.now)
end

View File

@@ -8,6 +8,8 @@ class MedicalRelease < ApplicationRecord
include Syncable
include PersonName
NUMBER_OF_CUSTOM_FIELDS = 15
composed_of :person_address,
class_name: "Address",
mapping: [

View File

@@ -0,0 +1,86 @@
class MiscRelease < ApplicationRecord
include Contractable
include Notable
include Photoable
include Releasable
include Searchable
include Signable
include Syncable
include PersonName
include GuardianName
include GuardianPhotoable
composed_of :person_address,
class_name: "Address",
mapping: [
%w(person_address_street1 street1),
%w(person_address_street2 street2),
%w(person_address_city city),
%w(person_address_state state),
%w(person_address_zip zip),
%w(person_address_country country)
]
composed_of :guardian_address,
class_name: "Address",
mapping: [
%w(guardian_address_street1 street1),
%w(guardian_address_street2 street2),
%w(guardian_address_city city),
%w(guardian_address_state state),
%w(guardian_address_zip zip),
%w(guardian_address_country country)
]
def self.face_photo_acceptable_content_types
["image/png", "image/jpeg"]
end
# These validations apply to all releases
validates :person_first_name, :person_last_name, presence: true
validates :person_email, email: true, allow_blank: true
acts_as_taggable_on :internal_tags, :tags
# These validations apply to releases created natively by the system (i.e. not imported from elsewhere)
with_options on: :native do
validates :signature, attached: true
end
# These validations apply to releases imported to the system from an outside source
with_options on: :non_native do
validates :contract, attached: true
end
with_options if: :minor? do
validates :guardian_first_name, :guardian_last_name, presence: true
validates :guardian_phone, presence: true
end
searchable_on %i[
person_first_name person_last_name person_email person_phone
person_address_street1 person_address_street2 person_address_city person_address_state person_address_zip person_address_country
guardian_address_street1 guardian_address_street2 guardian_address_city guardian_address_state guardian_address_zip guardian_address_country
]
# All releases must respond to the following messages
def name
person_name
end
def filename_suffix
"#{person_last_name} #{person_first_name}"
end
def contact_person
@contact_person ||= Contact.new(person_name, person_address, person_email, person_phone)
end
def uses_edl?
false
end
def contract_file_name
"#{project.name.parameterize}_#{contract_template.release_type}_#{(signed_at || created_at).strftime("%Y.%m.%d")}_#{release_number}_#{filename_suffix.parameterize}"
end
end

View File

@@ -3,8 +3,8 @@ class Project < ApplicationRecord
include Filterable
include Syncable
SIGNABLE_RELEASE_TYPES = %w(talent appearance acquired_media location material medical)
AVAILABLE_RELEASE_TYPES = %w(appearance location material acquired_media talent music medical)
SIGNABLE_RELEASE_TYPES = %w(talent appearance acquired_media location material medical misc)
AVAILABLE_RELEASE_TYPES = %w(appearance location material acquired_media talent music medical misc)
belongs_to :account
has_many :acquired_media_releases, dependent: :destroy
@@ -14,6 +14,7 @@ class Project < ApplicationRecord
has_many :music_releases, dependent: :destroy
has_many :talent_releases, dependent: :destroy
has_many :medical_releases, dependent: :destroy
has_many :misc_releases, dependent: :destroy
has_many :videos, dependent: :destroy
has_many :imports, dependent: :destroy
has_many :contract_templates, dependent: :destroy
@@ -35,6 +36,7 @@ class Project < ApplicationRecord
music_release: false,
talent_release: false,
medical_release: false,
misc_release: false,
video_analysis: false,
}
end
@@ -68,6 +70,7 @@ class Project < ApplicationRecord
music_release: true,
talent_release: true,
medical_release: true,
misc_release: true,
video_analysis: true,
}
when "nat_geo"
@@ -80,6 +83,7 @@ class Project < ApplicationRecord
music_release: true,
talent_release: true,
medical_release: true,
misc_release: true,
video_analysis: true,
}
else

View File

@@ -1,5 +1,5 @@
class ReleasableParam
TYPES = %w(talent appearance location material acquired_media music medical)
TYPES = %w(talent appearance location material acquired_media music medical misc)
def initialize(params)
@params = params

View File

@@ -8,7 +8,12 @@ class SampleAppearanceRelease < AppearanceRelease
def default_attrs
{
person_address: "Street Address, City, State Zipcode",
person_address_street1: "Street Address",
person_address_street2: "St2",
person_address_city: "City",
person_address_state: "State",
person_address_zip: "ZIP",
person_address_country: "Country",
person_first_name: "Some",
person_last_name: "Person",
person_phone: "555-555-5555",

View File

@@ -1,5 +1,9 @@
class ContractPolicy < ApplicationPolicy
def show?
user.manager? || user.account_manager?
if record.respond_to?(:medical_release?) && record.medical_release?
user.account_manager?
else
user.manager? || user.account_manager?
end
end
end

View File

@@ -31,7 +31,11 @@ class MedicalReleasePolicy < ReleasePolicy
true
end
def download_single?
user.account_manager?
end
def download_multiple?
true
download_single?
end
end

View File

@@ -0,0 +1,41 @@
class MiscReleasePolicy < ReleasePolicy
def create?
true
end
def show?
true
end
def update?
!record.native?
end
def destroy?
true
end
def edit_photos?
true
end
def index?
true
end
def update_photos?
edit_photos?
end
def tag_multiple?
true
end
def download_single?
true
end
def download_multiple?
download_single?
end
end

View File

@@ -13,7 +13,7 @@
<div class="form-row">
<%= form.email_field :person_email, wrapper_class: "col-sm-6" %>
<%= form.date_field :person_date_of_birth, wrapper_class: "col-sm-6", placeholder: Date.current %>
<%= form.text_field :person_address, wrapper_class: "col-sm-6" %>
<%= form.text_field :person_address_street1, wrapper_class: "col-sm-6" %>
</div>
<div class="<%= class_string("collapse" => !appearance_release.minor?) %>" data-ujs-target="guardian-fields">
@@ -23,7 +23,10 @@
<%= form.phone_field :guardian_phone, wrapper_class: "col-sm-6" %>
</div>
<div class="form-row">
<%= form.text_field :guardian_address, wrapper_class: "col-sm-6" %>
<%= form.text_field :guardian_email, wrapper_class: "col-sm-6" %>
</div>
<div class="form-row">
<%= form.text_field :guardian_address_street1, wrapper_class: "col-sm-6" %>
</div>
</div>
<% end %>

View File

@@ -1,4 +1,4 @@
<%= bootstrap_form_for model, layout: :inline, remote: true do |form| %>
<%= form.file_field :files, direct_upload: true, multiple: true, accept: "*", hide_label: true, wrapper_class: "w-65 mr-2", id: "broadcast_files_#{token}" %>
<%= form.file_field :files, direct_upload: true, multiple: true, accept: "*", hide_label: true, required: true, wrapper_class: "w-65 mr-2", id: "broadcast_files_#{token}" %>
<%= form.button fa_icon("upload", text: "Add File"), class: "btn btn-primary", type: :submit, data: { disable_with: fa_icon("spinner", text: "Adding File") } %>
<% end %>

View File

@@ -2,7 +2,7 @@
<%= field_set_tag content_tag(:span, t(".release_info.heading"), class: "h6 text-muted text-uppercase") do %>
<div class="form-row">
<%= 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), "#fee_field": %w(appearance talent location material acquired_media), "#exploitable_rights_fields": %w(appearance talent location material acquired_media), "#custom_fields": %w(medical) } }, class: "form-control custom-select" %>
<%= form.select :release_type, options_for_release_type_select(project, @release_type), { wrapper_class: "col-sm-6" }, data: { toggle: "collapse-select", target_show_values_mapping: { "#guardian_clause": %w(appearance talent misc), "#fee_field": %w(appearance talent location material acquired_media), "#exploitable_rights_fields": %w(appearance talent location material acquired_media), "#custom_fields": %w(medical) } }, class: "form-control custom-select" %>
</div>
<div class="form-row" id="fee_field">
<%= form.number_field :fee, min:"0", max:"99999999", step: "0.01", prepend: "$", help: "Leave at $0.00 for no-fee", wrapper_class: "col-sm-6" %>

View File

@@ -5,6 +5,9 @@
<% if release.respond_to? :guardian_photo %>
<% @total_photos_count += release.guardian_photo.attached? ? 1 : 0 %>
<% end %>
<% if release.respond_to? :guardian_2_photo %>
<% @total_photos_count += release.guardian_2_photo.attached? ? 1 : 0 %>
<% end %>
<p class="heading"><strong><u><%= t '.heading', count: @total_photos_count %></u></strong></p>
<ul>
@@ -29,6 +32,14 @@
<%= release.guardian_photo.filename.to_s %>
</li>
<% end %>
<% if release.respond_to?(:guardian_2_photo) && release.guardian_2_photo.attached? %>
<br>
<p class="heading"><strong><%= t '.guardian_2_photo_heading' %></strong></p>
<li>
<%= image_tag release.guardian_2_photo.variant(auto_orient: true, resize: "200x200") %><br />
<%= release.guardian_2_photo.filename.to_s %>
</li>
<% end %>
<% end %>
</ul>

View File

@@ -40,7 +40,7 @@
</dl>
<% if releasable.model_name == "MedicalRelease" %>
<% (1..10).each do |n| %>
<% (1..MedicalRelease::NUMBER_OF_CUSTOM_FIELDS).each do |n| %>
<% if contract_template.public_send("question_#{n}_text").present? %>
<p><strong><%= contract_template.public_send("question_#{n}_text") %></strong></p>
<p><%= releasable.public_send("question_#{n}_answer") %></p>
@@ -69,4 +69,19 @@
<%= description_list_pair_for releasable, :signed_on, append: ":" %>
</dl>
<% if releasable.respond_to?(:second_guardian_present?) && releasable.second_guardian_present? %>
<br/>
<p class="text-left"><strong>Second guardian Information</strong></p>
<% # Second guardian information %>
<dl>
<%= description_list_pair_for releasable, :guardian_2_name, append: ":" %>
<%= description_list_pair_for releasable, :guardian_2_address, append: ":" %>
<%= description_list_pair_for releasable, :guardian_2_phone, append: ":" %>
<%= description_list_pair_for releasable, :guardian_2_email, append: ":" %>
</dl>
<% end %>
<% end %>

View File

@@ -37,7 +37,7 @@
<% 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(Contract).show? && (medical_release.contract.attached? || medical_release.contract_template.present?) %>
<% 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 %>
<% if policy(medical_release).destroy? %>

View File

@@ -0,0 +1,48 @@
<tr id="<%= dom_id(misc_release) %>">
<td data-behavior="select"><%= check_box_tag "misc_release_ids[]", misc_release.id, false %></td>
<td>
<% if misc_release.photo.attached? %>
<%= image_tag medium_variant(misc_release.photo), class: "img-fluid" %>
<% end %>
</td>
<td>
<%= misc_release.name %>
</td>
<td>
<%= contact_info(
address: misc_release.person_address,
phone: misc_release.person_phone,
email: misc_release.person_email
) %>
</td>
<td>
<%= notes_preview misc_release.notes.order_by_recent %>
</td>
<td id="<%= dom_id misc_release, "tags_preview" %>">
<%= tags_preview misc_release, misc_release.tags %>
</td>
<td>
<%= misc_release.signed_on %>
</td>
<td class="text-right">
<div class="btn-group">
<%= button_tag t(".actions.manage"), class: "btn btn-light btn-sm dropdown-toggle border", data: { toggle: "dropdown", boundary: "window" }, aria: { haspopup: true, expanded: false } %>
<div class="dropdown-menu dropdown-menu-right">
<% if policy(Note).new? %>
<%= link_to fa_icon("sticky-note fw", text: "Notes"), [:new, misc_release, :note], class: "dropdown-item", remote: true %>
<% end %>
<% if policy(misc_release.tags).new? %>
<%= link_to fa_icon("tags fw", text: "Tags"), [:new, misc_release, :acts_as_taggable_on_tag], class: "dropdown-item", remote: true %>
<% end %>
<% if policy(MedicalRelease).download_single? && policy(Contract).show? && (misc_release.contract.attached? || misc_release.contract_template.present?) %>
<%= link_to fa_icon("download fw", text: "Download"), [misc_release, :contracts, format: "pdf"], class: "dropdown-item", target: "_blank" %>
<% end %>
<% if policy(misc_release).destroy? %>
<%= link_to fa_icon("trash fw", text: "Delete"), misc_release, class: "dropdown-item", method: :delete, data: { confirm: "Are you sure?" } %>
<% end %>
</div>
</div>
</td>
</tr>

View File

@@ -0,0 +1,48 @@
<div class="row">
<div class="col-md-12">
<div class="d-md-flex d-sm-flex flex-sm-column flex-md-row flex-md-wrap mb-3">
<% if @misc_releases.any? && policy(MiscRelease).tag_multiple? %>
<%= button_to_bulk_tagging(@project) %>
<% end %>
<% if @misc_releases.any? && policy(MiscRelease).download_multiple? %>
<%= link_to "Download All", [@project, :contract_downloads, release_type: @misc_releases.name], method: :post, remote: true, class: "btn btn-light border ml-auto mr-2 mb-2", data: {
disable_with: "Please wait..." } %>
<% end %>
<%= bootstrap_form_with url: [@project, :misc_releases], method: :get, remote: true, layout: :inline, id: "search" do |form| %>
<%= form.search_field :query, hide_label: true, placeholder: t(".actions.search"), class: "rounded-pill-right", value: params[:query], prepend: form.button(fa_icon("search"), class: "btn btn-light border mb-2 rounded-pill-left") %>
<% end %>
</div>
</div>
</div>
<div class="border bg-white rounded shadow-sm pb-3 table-responsive">
<table class="table table-striped tr-px-4 align-all-middle">
<thead class="thead-light">
<tr>
<th data-behavior="all-selectable"><%= check_box_tag "misc_release_ids[]", false, false %></th>
<th></th>
<th><%= MiscRelease.human_attribute_name(:person_name) %></th>
<th><%= MiscRelease.human_attribute_name(:contact_info) %></th>
<th><%= t(".table_headers.notes") %></th>
<th><%= t(".table_headers.tags") %></th>
<th><%= t(".table_headers.signed_at") %></th>
<th></th>
</tr>
</thead>
<tbody id="misc_releases">
<% if @misc_releases.any? %>
<%= render @misc_releases %>
<% else %>
<tr>
<td colspan="12" class="py-4 text-center text-muted"><%= t(".empty") %></td>
</tr>
<% end %>
</tbody>
</table>
</div>
<div id="misc_releases_pagination" class="mt-3">
<%= will_paginate @misc_releases %>
</div>

View File

@@ -0,0 +1,3 @@
$("#misc_releases").html("<%= j render(@misc_releases) %>");
$("form input[type='search']").val("<%= params[:query] %>");
$("#misc_releases_pagination").html("<%= j will_paginate(@misc_releases) %>");

View File

@@ -44,10 +44,6 @@
<hr>
<%= card_field_set_tag t(".files.heading") do %>
<div class="alert alert-warning text-center text-md-left">
<%= fa_icon "warning" %>
<strong>For optimal accuracy, please ensure video file names and photo file names match the source file name in the editing sequence.</strong>
</div>
<%= render "shared/file_infos_dropzone", form: form, releasable: @acquired_media_release %>
<% end %>

View File

@@ -30,13 +30,13 @@
<div class="form-row">
<%= 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.phone_field :person_phone, required: true, wrapper_class: "col-sm-6" %>
</div>
<div class="form-row">
<%= form.email_field :person_email, wrapper_class: "col-sm-6" %>
<%= form.date_field :person_date_of_birth, wrapper_class: "col-sm-6", placeholder: Date.current %>
<%= form.text_field :person_address, wrapper_class: "col-sm-6" %>
<%= form.email_field :person_email, required: true, wrapper_class: "col-sm-6" %>
<%= form.date_field :person_date_of_birth, required: true, wrapper_class: "col-sm-6", placeholder: Date.current %>
</div>
<%= render "shared/address_fields", form: form, subject: "person", required: true %>
<% end %>
<%= card_field_set_tag t(".photo.heading") do %>
@@ -57,7 +57,7 @@
<%= form.hidden_field :person_photo, value: form.object.person_photo.signed_id if @appearance_release.person_photo.attached? %>
<%= form.file_field :person_photo, hide_label: true, data: { ujs_target: "person-photo-input" }, accept: @appearance_release.class.face_photo_acceptable_content_types.join(","), direct_upload: true %>
</div>
<%= button_tag t(".photo.take_photo"), type: "button", class: "btn btn-lg btn-primary take-photo-button", data: { behavior: "take-person-photo" } %>
<%= button_tag t(".photo.take_photo"), type: "button", class: "btn btn-lg btn-primary take-photo-button", data: { behavior: "trigger-click", target: "[data-ujs-target=person-photo-input]" } %>
</div>
<p class="p-2 font-weight-bold">
<%= fa_icon "arrow-up", text: t(".photo.camera_instructions_html") %><br>
@@ -74,14 +74,10 @@
<div class="form-row">
<%= form.text_field :guardian_first_name, required: @appearance_release.minor?, wrapper_class: "col-sm-3" %>
<%= form.text_field :guardian_last_name, required: @appearance_release.minor?, wrapper_class: "col-sm-3" %>
<%= form.phone_field :guardian_phone, wrapper_class: "col-sm-6" %>
</div>
<div class="form-row">
<%= form.text_field :guardian_email, wrapper_class: "col-sm-6" %>
</div>
<div class="form-row">
<%= form.text_field :guardian_address, wrapper_class: "col-sm-6" %>
<%= form.phone_field :guardian_phone, required: @appearance_release.minor?, wrapper_class: "col-sm-6" %>
<%= form.text_field :guardian_email, required: @appearance_release.minor?, wrapper_class: "col-sm-6" %>
</div>
<%= render "shared/address_fields", form: form, subject: "guardian", required: @appearance_release.minor? %>
<% end %>
<hr>
@@ -102,9 +98,50 @@
<% end %>
<div class="hidden-file-input">
<%= form.hidden_field :guardian_photo, value: form.object.guardian_photo.signed_id if @appearance_release.guardian_photo.attached? %>
<%= form.file_field :guardian_photo, hide_label: true, data: { ujs_target: "guardian-photo-input" }, accept: @appearance_release.class.face_photo_acceptable_content_types.join(","), direct_upload: true %>
<%= form.file_field :guardian_photo, required: @appearance_release.minor?, hide_label: true, data: { ujs_target: "guardian-photo-input" }, accept: @appearance_release.class.face_photo_acceptable_content_types.join(","), direct_upload: true %>
</div>
<%= button_tag t(".photo.take_photo"), type: "button", class: "btn btn-lg btn-primary take-photo-button", data: { behavior: "take-guardian-photo" } %>
<%= button_tag t(".photo.take_photo"), type: "button", class: "btn btn-lg btn-primary take-photo-button", data: { behavior: "trigger-click", target: "[data-ujs-target=guardian-photo-input]" } %>
</div>
<p class="p-2 font-weight-bold">
<%= fa_icon "arrow-up", text: t(".photo.camera_instructions_html") %><br>
<small class="text-muted"><%= t ".photo.warning" %></small>
</p>
</div>
<% end %>
<hr>
<%= card_field_set_tag t(".guardian_2_info.heading") do %>
<div class="form-row">
<%= form.text_field :guardian_2_first_name, wrapper_class: "col-sm-3" %>
<%= form.text_field :guardian_2_last_name, wrapper_class: "col-sm-3" %>
<%= form.phone_field :guardian_2_phone, wrapper_class: "col-sm-6" %>
<%= form.text_field :guardian_2_email, wrapper_class: "col-sm-6" %>
</div>
<%= render "shared/address_fields", form: form, subject: "guardian_2" %>
<% end %>
<hr>
<%= card_field_set_tag t(".guardian_2_photo.heading") do %>
<div class="alert alert-warning font-weight-bold"><%= t ".guardian_2_photo.instructions" %></div>
<div class="text-center">
<div class="d-inline-block mb-2" data-behavior="guardian-photo-preview" data-file-input="[data-ujs-target=guardian-2-photo-input]">
<div class="align-items-center d-flex photo-preview img-thumbnail justify-content-center">
<span><%= t ".photo.no_photo" %></span>
</div>
</div>
<div class="d-inline-block text-left">
<% if @appearance_release.guardian_2_photo.attached? %>
<%= javascript_tag nonce: true do %>
App.PhotoPreview.set("[data-behavior=guardian-photo-preview]", "<%= url_for(@appearance_release.guardian_2_photo.variant(auto_orient: true, resize: '200x200')) %>");
<% end %>
<% end %>
<div class="hidden-file-input">
<%= form.hidden_field :guardian_2_photo, value: form.object.guardian_2_photo.signed_id if @appearance_release.guardian_2_photo.attached? %>
<%= form.file_field :guardian_2_photo, hide_label: true, data: { ujs_target: "guardian-2-photo-input" }, accept: @appearance_release.class.face_photo_acceptable_content_types.join(","), direct_upload: true %>
</div>
<%= button_tag t(".photo.take_photo"), type: "button", class: "btn btn-lg btn-primary take-photo-button", data: { behavior: "trigger-click", target: "[data-ujs-target=guardian-2-photo-input]" } %>
</div>
<p class="p-2 font-weight-bold">
<%= fa_icon "arrow-up", text: t(".photo.camera_instructions_html") %><br>

View File

@@ -1,4 +1,4 @@
<%= bootstrap_form_for model, url: broadcast_url(token: token), layout: :inline, remote: true do |form| %>
<%= form.file_field :files, direct_upload: true, multiple: true, accept: "*", hide_label: true, wrapper_class: "w-65 mr-2", id: "broadcast_files_#{token}" %>
<%= form.file_field :files, direct_upload: true, multiple: true, accept: "*", hide_label: true, required: true, wrapper_class: "w-65 mr-2", id: "broadcast_files_#{token}" %>
<%= form.button fa_icon("upload", text: "Add File"), class: "btn btn-primary", type: :submit, data: { disable_with: fa_icon("spinner", text: "Adding File") } %>
<% end %>

View File

@@ -18,20 +18,20 @@
<%= form.text_field :name, required: true, wrapper_class: "col-12" %>
</div>
<div class="form-row">
<%= form.text_area :description, placeholder: true, wrapper_class: "col-sm-12", rows: 6 %>
<%= form.text_area :description, required: true, placeholder: true, wrapper_class: "col-sm-12", rows: 6 %>
</div>
<% end %>
<%= card_field_set_tag t(".contact_info.heading") do %>
<div class="form-row">
<%= form.text_field :person_first_name, wrapper_class: "col-sm-6" %>
<%= form.text_field :person_last_name, wrapper_class: "col-sm-6" %>
<%= form.phone_field :person_phone, wrapper_class: "col-sm-6" %>
<%= form.email_field :person_email, wrapper_class: "col-sm-6" %>
<%= form.text_field :person_company, wrapper_class: "col-sm-6" %>
<%= form.text_field :person_title, wrapper_class: "col-sm-6" %>
<%= 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, required: true, wrapper_class: "col-sm-6" %>
<%= form.email_field :person_email, required: true, wrapper_class: "col-sm-6" %>
<%= form.text_field :person_company, required: true, wrapper_class: "col-sm-6" %>
<%= form.text_field :person_title, required: true, wrapper_class: "col-sm-6" %>
</div>
<%= render "shared/address_fields", form: form, subject: "person" %>
<%= render "shared/address_fields", form: form, subject: "person", required: true %>
<% end %>
<%= card_field_set_tag t(".photo.heading") do %>

View File

@@ -14,9 +14,9 @@
<hr>
<% if (1..10).map {|n| @contract_template.public_send("question_#{n}_text").presence }.compact.any? %>
<% if (1..MedicalRelease::NUMBER_OF_CUSTOM_FIELDS).map {|n| @contract_template.public_send("question_#{n}_text").presence }.compact.any? %>
<%= card_field_set_tag t(".questionnaire.heading") do %>
<% (1..10).each do |n| %>
<% (1..MedicalRelease::NUMBER_OF_CUSTOM_FIELDS).each do |n| %>
<% if @contract_template.public_send("question_#{n}_text").present? %>
<div class="form-row">
<%= form.text_area "question_#{n}_answer", wrapper_class: "col-sm-12", label: @contract_template.public_send("question_#{n}_text") %>

View File

@@ -0,0 +1 @@
<p class="alert alert-success p-3 lead text-center">Your release was successfully submitted. Thank you.</p>

View File

@@ -0,0 +1,97 @@
<div class="card shadow-sm">
<div class="card-body">
<%= errors_summary_for @misc_release %>
<%= bootstrap_form_with model: [@account, @project, @contract_template, @misc_release], local: true, validation_context: :native do |form| %>
<div class="alert alert-warning font-weight-bold"><%= t ".instructions_html", name: @project.name %></div>
<%= card_field_set_tag t(".legal.heading") do %>
<p><%= @contract_template.body %></p>
<% end %>
<hr>
<% unless @contract_template.guardian_clause.blank? %>
<%= form.form_group :minor do %>
<%= form.check_box :minor, label: t("helpers.label.appearance_release.minor"), data: { target: "[data-ujs-target=guardian-fields]", toggle: "collapse" } %>
<% end %>
<%= card_field_set_tag t(".guardian_clause.heading") do %>
<p><%= @contract_template.guardian_clause %></p>
<% end %>
<hr>
<% end %>
<%= card_field_set_tag t(".personal_info.heading") do %>
<div class="alert alert-warning font-weight-bold"><%= t ".personal_info.instructions" %></div>
<div class="form-row">
<%= 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" %>
</div>
<div class="form-row">
<%= form.email_field :person_email, wrapper_class: "col-sm-6" %>
</div>
<%= render "shared/address_fields", form: form, subject: "person" %>
<% end %>
<hr>
<%= card_field_set_tag t(".photo.heading") do %>
<%= render "shared/photos_dropzone_fields", form: form, release: @misc_release %>
<% end %>
<% unless @contract_template.guardian_clause.blank? %>
<div class="<%= class_string("collapse" => !@misc_release.minor?) %>" data-ujs-target="guardian-fields">
<%= card_field_set_tag t(".guardian_info.heading") do %>
<div class="form-row">
<%= form.text_field :guardian_first_name, required: @misc_release.minor?, wrapper_class: "col-sm-3" %>
<%= form.text_field :guardian_last_name, required: @misc_release.minor?, wrapper_class: "col-sm-3" %>
<%= form.phone_field :guardian_phone, wrapper_class: "col-sm-6" %>
</div>
<div class="form-row">
<%= form.text_field :guardian_email, wrapper_class: "col-sm-6" %>
</div>
<%= render "shared/address_fields", form: form, subject: "guardian" %>
<% end %>
<hr>
<%= card_field_set_tag t(".guardian_photo.heading") do %>
<div class="alert alert-warning font-weight-bold"><%= t ".guardian_photo.instructions" %></div>
<div class="text-center">
<div class="d-inline-block mb-2" data-behavior="guardian-photo-preview" data-file-input="[data-ujs-target=guardian-photo-input]">
<div class="align-items-center d-flex photo-preview img-thumbnail justify-content-center">
<span><%= t ".guardian_photo.no_photo" %></span>
</div>
</div>
<div class="d-inline-block text-left">
<% if @misc_release.guardian_photo.attached? %>
<%= javascript_tag nonce: true do %>
App.PhotoPreview.set("[data-behavior=guardian-photo-preview]", "<%= url_for(@misc_release.guardian_photo.variant(auto_orient: true, resize: '200x200')) %>");
<% end %>
<% end %>
<div class="hidden-file-input">
<%= form.hidden_field :guardian_photo, value: form.object.guardian_photo.signed_id if @misc_release.guardian_photo.attached? %>
<%= form.file_field :guardian_photo, hide_label: true, data: { ujs_target: "guardian-photo-input" }, accept: @misc_release.class.face_photo_acceptable_content_types.join(","), direct_upload: true %>
</div>
<%= button_tag t(".guardian_photo.take_photo"), type: "button", class: "btn btn-lg btn-primary take-photo-button", data: { behavior: "take-guardian-photo" } %>
</div>
<p class="p-2 font-weight-bold">
<%= fa_icon "arrow-up", text: t(".guardian_photo.camera_instructions_html") %><br>
<small class="text-muted"><%= t ".guardian_photo.warning" %></small>
</p>
</div>
<% end %>
</div>
<hr>
<% end %>
<%= card_field_set_tag t(".signature.heading") do %>
<%= render "shared/signature_fields", form: form %>
<% end %>
<div class="mt-5">
<%= form.button t("shared.submit_release_long"), class: "btn btn-block btn-lg btn-success", data: { disable_with: t("shared.disable_with") } %>
</div>
<% end %>
</div>
</div>

View File

@@ -78,7 +78,7 @@
<%= form.hidden_field :guardian_photo, value: form.object.guardian_photo.signed_id if @talent_release.guardian_photo.attached? %>
<%= form.file_field :guardian_photo, hide_label: true, data: { ujs_target: "guardian-photo-input" }, accept: @talent_release.class.face_photo_acceptable_content_types.join(","), direct_upload: true %>
</div>
<%= button_tag t(".guardian_photo.take_photo"), type: "button", class: "btn btn-lg btn-primary take-photo-button", data: { behavior: "take-guardian-photo" } %>
<%= button_tag t(".guardian_photo.take_photo"), type: "button", class: "btn btn-lg btn-primary take-photo-button", data: { behavior: "trigger-click", target: "[data-ujs-target=guardian-photo-input]" } %>
</div>
<p class="p-2 font-weight-bold">
<%= fa_icon "arrow-up", text: t(".guardian_photo.camera_instructions_html") %><br>

View File

@@ -1,13 +1,14 @@
<% field_name_prefix = subject.present? ? "#{subject}_" : "" %>
<% required = required || false %>
<div class="form-row">
<%= form.text_field "#{field_name_prefix}address_street1", wrapper_class: "col-sm-6" %>
<%= form.text_field "#{field_name_prefix}address_street1", required: required, wrapper_class: "col-sm-6" %>
<%= form.text_field "#{field_name_prefix}address_street2", wrapper_class: "col-sm-6" %>
</div>
<div class="form-row">
<%= form.text_field "#{field_name_prefix}address_city", wrapper_class: "col-sm-6" %>
<%= form.text_field "#{field_name_prefix}address_state", wrapper_class: "col-sm-3" %>
<%= form.text_field "#{field_name_prefix}address_zip", wrapper_class: "col-sm-3" %>
<%= form.text_field "#{field_name_prefix}address_city", required: required, wrapper_class: "col-sm-6" %>
<%= form.text_field "#{field_name_prefix}address_state", required: required, wrapper_class: "col-sm-3" %>
<%= form.text_field "#{field_name_prefix}address_zip", required: required, wrapper_class: "col-sm-3" %>
</div>
<%= form.form_group "#{field_name_prefix}address_country" do %>
<%= form.label "#{field_name_prefix}address_country" %>

View File

@@ -1,4 +1,4 @@
<% (1..10).each do |n| %>
<% (1..MedicalRelease::NUMBER_OF_CUSTOM_FIELDS).each do |n| %>
<div class="form-row">
<%= form.text_area "question_#{n}_text", wrapper_class: "col-sm-12" %>
</div>

View File

@@ -60,6 +60,10 @@ en:
activerecord:
attributes:
appearance_release:
guardian_2_address: Guardian 2 address
guardian_2_email: Guardian 2 email
guardian_2_name: Guardian 2 name
guardian_2_phone: Guardian 2 phone
person_address: Address
person_email: Email
person_name: Name
@@ -237,6 +241,7 @@ en:
heading: New Release Template
contracts:
photos:
guardian_2_photo_heading: Second guardian photo
guardian_photo_heading: Guardian photo
heading:
one: Photo
@@ -311,8 +316,8 @@ en:
graphics_only_edl_file: If you do not upload a Graphics Only EDL, the software will not generate a Graphics Cue List.
label:
acquired_media_release:
description: Description of licensed property
name: Name of licensed property
description: Description of property
name: Name of property
person_address: Address
person_address_city: City
person_address_country: Country
@@ -328,8 +333,29 @@ en:
person_phone: Phone number
person_title: Title
appearance_release:
guardian_2_address_city: Guardian 2 city
guardian_2_address_country: Guardian 2 country
guardian_2_address_state: Guardian 2 state
guardian_2_address_street1: Guardian 2 address
guardian_2_address_street2: Guardian 2 address (Line 2)
guardian_2_address_zip: Guardian 2 zip code
guardian_2_email: Guardian 2 email
guardian_2_first_name: Guardian 2 first name
guardian_2_last_name: Guardian 2 last name
guardian_2_phone: Guardian 2 phone
guardian_address_city: Guardian city
guardian_address_country: Guardian country
guardian_address_state: Guardian state
guardian_address_street1: Guardian address
guardian_address_street2: Guardian address (Line 2)
guardian_address_zip: Guardian zip code
minor: Is the person a minor?
person_address: Address
person_address_city: City
person_address_country: Country
person_address_state: State
person_address_street1: Address
person_address_street2: Address (Line 2)
person_address_zip: Zip code
person_date_of_birth: Date of birth
person_email: Email address
person_first_name: First name
@@ -634,6 +660,20 @@ en:
medical_release:
actions:
manage: Manage
misc_releases:
destroy:
alert: The misc release has been deleted
index:
actions:
search: Search
empty: Misc Releases will appear here
table_headers:
notes: Notes
signed_at: Date Signed
tags: Tags
misc_release:
actions:
manage: Manage
music_releases:
create:
notice: The music release has been created
@@ -740,6 +780,7 @@ en:
location_release: Location Releases
material_release: Material Releases (Products / Logos)
medical_release: Medical Releases
misc_release: Misc Releases
music_release: Music Releases (Original Music)
talent_release: Talent Releases
index:
@@ -767,6 +808,7 @@ en:
location_release: Location Releases (%{count})
material_release: Material Releases (%{count})
medical_release: Medical Releases (%{count})
misc_release: Misc Releases (%{count})
music_release: Music Releases (%{count})
report: Reports
talent_release: Talent Releases (%{count})
@@ -789,6 +831,12 @@ en:
notice: Your release has been signed. Thank you!
new:
cancel: Cancel
guardian_2_info:
heading: Second Guardian Information (if company requires)
guardian_2_photo:
heading: Second Guardian Photo
instructions: >
Lastly, it's time for second guardian to take a selfie photo! Please remove your hat and sunglasses (regular eyewear is ok), make sure that you are the only person in the photo, look straight into the camera, and say Cheese!
guardian_clause:
heading: Guardian Clause
guardian_info:
@@ -814,6 +862,9 @@ en:
warning: If your photo appears sideways, it will be autocorrected when you submit your release.
signature:
heading: Sign Below
broadcasts:
show:
alert: That broadcast is no longer available
location_releases:
create:
notice: Your release has been signed. Thank you!
@@ -864,6 +915,34 @@ en:
heading: Questionnaire
signature:
heading: Signature
misc_releases:
create:
notice: Your release has been signed. Thank you!
new:
cancel: Cancel
guardian_clause:
heading: Guardian Clause
guardian_info:
heading: Guardian Information
guardian_photo:
camera_instructions_html: Click <em>Take Photo</em> to Turn ON Camera
heading: Guardian Photo
instructions: >
Lastly, it's time for guardian to take a selfie photo! Please remove your hat and sunglasses (regular eyewear is ok), make sure that you are the only person in the photo, look straight into the camera, and say Cheese!
no_photo: No photo yet
take_photo: Take Photo
warning: If your photo appears sideways, it will be autocorrected when you submit your release.
instructions_html: >
Below is the misc release form. After scrolling down and reading the misc release form, please enter your personal information, take a photo, and press the "Submit Release" button.
legal:
heading: Legal
personal_info:
heading: Personal Information
instructions: Now, enter your personal information.
photo:
heading: Photos
signature:
heading: Signature
talent_releases:
create:
notice: Your release has been signed. Thank you!

View File

@@ -66,6 +66,7 @@ es:
heading: Release Info (ES)
contracts:
photos:
guardian_2_photo_heading: Second guardian photo (ES)
guardian_photo_heading: Guardian photo (ES)
heading:
one: Photo (ES)
@@ -115,11 +116,30 @@ es:
helpers:
label:
appearance_release:
guardian_address: Dirección del tutor legal
guardian_2_address_city: Second guardian city (ES)
guardian_2_address_country: Second guardian country (ES)
guardian_2_address_state: Second guardian state (ES)
guardian_2_address_street1: Second guardian address (ES)
guardian_2_address_street2: Second guardian address (Line 2) (ES)
guardian_2_address_zip: Second guardian zip code (ES)
guardian_2_email: Second guardian email (ES)
guardian_2_first_name: Second guardian first name (ES)
guardian_2_last_name: Second guardian last name (ES)
guardian_2_phone: Second guardian phone (ES)
guardian_address_city: Guardian city (ES)
guardian_address_country: Guardian country (ES)
guardian_address_state: Guardian state (ES)
guardian_address_street1: Dirección del tutor legal
guardian_address_street2: Dirección del tutor legal (Línea 2)
guardian_address_zip: Guardian zip code (ES)
guardian_name: Nómbre del tutor legal
guardian_phone: Número de teléfono del tutor legal
minor: El firmante es un menor
person_address: Dirección
person_address_city: City (ES)
person_address_country: Country (ES)
person_address_state: State (ES)
person_address_street1: Address (ES)
person_address_street2: Address (Line 2) (ES)
person_email: Dirección de correo electrónico
person_name: Nómbre
person_phone: Número de teléfono
@@ -158,6 +178,12 @@ es:
notice: La autorización está firmada. ¡Gracias!
new:
cancel: Cancelar
guardian_2_info:
heading: Second Guardian Information (ES)
guardian_2_photo:
heading: Second Guardian Photo (ES)
instructions: >
(ES) Lastly, it's time for second guardian to take a selfie photo! Please remove your hat and sunglasses (regular eyewear is ok), make sure that you are the only person in the photo, look straight into the camera, and say Cheese! (ES)
guardian_clause:
heading: Guardian Clause (ES)
guardian_photo:

View File

@@ -54,6 +54,7 @@ Rails.application.routes.draw do
resources :music_releases, except: [:show], concerns: [:contractable, :notable]
resources :talent_releases, except: [:show], concerns: [:contractable, :notable, :photoable]
resources :medical_releases, except: [:show], concerns: [:contractable, :notable, :photoable]
resources :misc_releases, except: [:show], concerns: [:contractable, :notable, :photoable]
resources :contract_templates, only: [:index, :new, :create, :destroy] do
resource :qr_codes, only: [:show], controller: "contract_templates/qr_codes"
resource :blank_contracts, only: [:show, :new, :create], controller: "contract_templates/blank_contracts"
@@ -119,6 +120,7 @@ Rails.application.routes.draw do
resources :location_releases, only: [:new, :create]
resources :material_releases, only: [:new, :create]
resources :medical_releases, only: [:new, :create]
resources :misc_releases, only: [:new, :create]
end
end
end
@@ -128,7 +130,7 @@ Rails.application.routes.draw do
end
RELEASES = [:acquired_media_releases, :appearance_releases, :talent_releases, :material_releases, :location_releases]
ALL_RELEASES = RELEASES + [:music_releases, :medical_releases]
ALL_RELEASES = RELEASES + [:music_releases, :medical_releases, :misc_releases]
ALL_RELEASES.each do |release|
resources release, only: [], concerns: :taggable

View File

@@ -0,0 +1,9 @@
class ChangeExistingZoomUserSettings < ActiveRecord::DataMigration
def up
gateway = ZoomGateway.new
ZoomUser.find_each do |zu|
gateway.update_user_settings zu.api_id
end
end
end

View File

@@ -0,0 +1,10 @@
class DestructurePersonAddressColumnInAppearanceReleases < ActiveRecord::Migration[6.0]
def change
rename_column :appearance_releases, :person_address, :person_address_street1
add_column :appearance_releases, :person_address_street2, :string
add_column :appearance_releases, :person_address_city, :string
add_column :appearance_releases, :person_address_state, :string
add_column :appearance_releases, :person_address_zip, :string
add_column :appearance_releases, :person_address_country, :string
end
end

View File

@@ -0,0 +1,10 @@
class DestructureGuardianAddressColumnInAppearanceReleases < ActiveRecord::Migration[6.0]
def change
rename_column :appearance_releases, :guardian_address, :guardian_address_street1
add_column :appearance_releases, :guardian_address_street2, :string
add_column :appearance_releases, :guardian_address_city, :string
add_column :appearance_releases, :guardian_address_state, :string
add_column :appearance_releases, :guardian_address_zip, :string
add_column :appearance_releases, :guardian_address_country, :string
end
end

View File

@@ -0,0 +1,15 @@
class AddMoreQuestionsAndAnswersToMedicalReleases < ActiveRecord::Migration[6.0]
def change
add_column :contract_templates, :question_11_text, :text
add_column :contract_templates, :question_12_text, :text
add_column :contract_templates, :question_13_text, :text
add_column :contract_templates, :question_14_text, :text
add_column :contract_templates, :question_15_text, :text
add_column :medical_releases, :question_11_answer, :text
add_column :medical_releases, :question_12_answer, :text
add_column :medical_releases, :question_13_answer, :text
add_column :medical_releases, :question_14_answer, :text
add_column :medical_releases, :question_15_answer, :text
end
end

View File

@@ -0,0 +1,34 @@
class CreateMiscReleases < ActiveRecord::Migration[6.0]
def change
create_table :misc_releases do |t|
t.belongs_to :project, foreign_key: true
t.belongs_to :contract_template, foreign_key: true
t.string :person_first_name
t.string :person_last_name
t.string :person_address_street1
t.string :person_address_street2
t.string :person_address_city
t.string :person_address_state
t.string :person_address_zip
t.string :person_address_country
t.string :person_phone
t.string :person_email
t.string :guardian_first_name
t.string :guardian_last_name
t.string :guardian_address_street1
t.string :guardian_address_street2
t.string :guardian_address_city
t.string :guardian_address_state
t.string :guardian_address_zip
t.string :guardian_address_country
t.string :guardian_phone
t.string :guardian_email
t.string :locale
t.text :notes
t.datetime :signed_at
t.boolean :minor, default: false
t.timestamps
end
end
end

View File

@@ -0,0 +1,14 @@
class AddSecondGuardianFieldsToAppearanceReleases < ActiveRecord::Migration[6.0]
def change
add_column :appearance_releases, :guardian_2_first_name, :string
add_column :appearance_releases, :guardian_2_last_name, :string
add_column :appearance_releases, :guardian_2_email, :string
add_column :appearance_releases, :guardian_2_phone, :string
add_column :appearance_releases, :guardian_2_address_street1, :string
add_column :appearance_releases, :guardian_2_address_street2, :string
add_column :appearance_releases, :guardian_2_address_city, :string
add_column :appearance_releases, :guardian_2_address_state, :string
add_column :appearance_releases, :guardian_2_address_zip, :string
add_column :appearance_releases, :guardian_2_address_country, :string
end
end

View File

@@ -290,13 +290,13 @@ ALTER SEQUENCE public.active_storage_blobs_id_seq OWNED BY public.active_storage
CREATE TABLE public.appearance_releases (
id bigint NOT NULL,
person_name_old character varying,
person_address character varying,
person_address_street1 character varying,
person_phone character varying,
project_id bigint,
created_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL,
minor boolean DEFAULT false,
guardian_address character varying,
guardian_address_street1 character varying,
guardian_name_old character varying,
guardian_phone character varying,
person_email character varying,
@@ -318,7 +318,27 @@ CREATE TABLE public.appearance_releases (
guardian_first_name character varying,
guardian_last_name character varying,
identifier character varying,
guardian_email character varying
guardian_email character varying,
person_address_street2 character varying,
person_address_city character varying,
person_address_state character varying,
person_address_zip character varying,
person_address_country character varying,
guardian_address_street2 character varying,
guardian_address_city character varying,
guardian_address_state character varying,
guardian_address_zip character varying,
guardian_address_country character varying,
guardian_2_first_name character varying,
guardian_2_last_name character varying,
guardian_2_email character varying,
guardian_2_phone character varying,
guardian_2_address_street1 character varying,
guardian_2_address_street2 character varying,
guardian_2_address_city character varying,
guardian_2_address_state character varying,
guardian_2_address_zip character varying,
guardian_2_address_country character varying
);
@@ -604,7 +624,12 @@ CREATE TABLE public.contract_templates (
question_7_text text,
question_8_text text,
question_9_text text,
question_10_text text
question_10_text text,
question_11_text text,
question_12_text text,
question_13_text text,
question_14_text text,
question_15_text text
);
@@ -994,7 +1019,12 @@ CREATE TABLE public.medical_releases (
question_7_answer text,
question_8_answer text,
question_9_answer text,
question_10_answer text
question_10_answer text,
question_11_answer text,
question_12_answer text,
question_13_answer text,
question_14_answer text,
question_15_answer text
);
@@ -1017,6 +1047,62 @@ CREATE SEQUENCE public.medical_releases_id_seq
ALTER SEQUENCE public.medical_releases_id_seq OWNED BY public.medical_releases.id;
--
-- Name: misc_releases; Type: TABLE; Schema: public; Owner: -
--
CREATE TABLE public.misc_releases (
id bigint NOT NULL,
project_id bigint,
contract_template_id bigint,
person_first_name character varying,
person_last_name character varying,
person_address_street1 character varying,
person_address_street2 character varying,
person_address_city character varying,
person_address_state character varying,
person_address_zip character varying,
person_address_country character varying,
person_phone character varying,
person_email character varying,
guardian_first_name character varying,
guardian_last_name character varying,
guardian_address_street1 character varying,
guardian_address_street2 character varying,
guardian_address_city character varying,
guardian_address_state character varying,
guardian_address_zip character varying,
guardian_address_country character varying,
guardian_phone character varying,
guardian_email character varying,
locale character varying,
notes text,
signed_at timestamp without time zone,
minor boolean DEFAULT false,
created_at timestamp(6) without time zone NOT NULL,
updated_at timestamp(6) without time zone NOT NULL
);
--
-- Name: misc_releases_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--
CREATE SEQUENCE public.misc_releases_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
--
-- Name: misc_releases_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
--
ALTER SEQUENCE public.misc_releases_id_seq OWNED BY public.misc_releases.id;
--
-- Name: music_releases; Type: TABLE; Schema: public; Owner: -
--
@@ -1870,6 +1956,13 @@ ALTER TABLE ONLY public.material_releases ALTER COLUMN id SET DEFAULT nextval('p
ALTER TABLE ONLY public.medical_releases ALTER COLUMN id SET DEFAULT nextval('public.medical_releases_id_seq'::regclass);
--
-- Name: misc_releases id; Type: DEFAULT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.misc_releases ALTER COLUMN id SET DEFAULT nextval('public.misc_releases_id_seq'::regclass);
--
-- Name: music_releases id; Type: DEFAULT; Schema: public; Owner: -
--
@@ -2188,6 +2281,14 @@ ALTER TABLE ONLY public.medical_releases
ADD CONSTRAINT medical_releases_pkey PRIMARY KEY (id);
--
-- Name: misc_releases misc_releases_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.misc_releases
ADD CONSTRAINT misc_releases_pkey PRIMARY KEY (id);
--
-- Name: music_releases music_releases_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
@@ -2704,6 +2805,20 @@ CREATE INDEX index_medical_releases_on_contract_template_id ON public.medical_re
CREATE INDEX index_medical_releases_on_project_id ON public.medical_releases USING btree (project_id);
--
-- Name: index_misc_releases_on_contract_template_id; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_misc_releases_on_contract_template_id ON public.misc_releases USING btree (contract_template_id);
--
-- Name: index_misc_releases_on_project_id; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX index_misc_releases_on_project_id ON public.misc_releases USING btree (project_id);
--
-- Name: index_music_releases_on_applicable_medium_id; Type: INDEX; Schema: public; Owner: -
--
@@ -3005,6 +3120,14 @@ CREATE UNIQUE INDEX taggings_idx ON public.taggings USING btree (tag_id, taggabl
CREATE INDEX taggings_idy ON public.taggings USING btree (taggable_id, taggable_type, tagger_id, context);
--
-- Name: misc_releases fk_rails_0222652fcd; Type: FK CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.misc_releases
ADD CONSTRAINT fk_rails_0222652fcd FOREIGN KEY (project_id) REFERENCES public.projects(id);
--
-- Name: unreleased_appearances fk_rails_0393a349dd; Type: FK CONSTRAINT; Schema: public; Owner: -
--
@@ -3413,6 +3536,14 @@ ALTER TABLE ONLY public.active_storage_attachments
ADD CONSTRAINT fk_rails_c3b3935057 FOREIGN KEY (blob_id) REFERENCES public.active_storage_blobs(id);
--
-- Name: misc_releases fk_rails_c664291b9b; Type: FK CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public.misc_releases
ADD CONSTRAINT fk_rails_c664291b9b FOREIGN KEY (contract_template_id) REFERENCES public.contract_templates(id);
--
-- Name: location_releases fk_rails_c7458d662e; Type: FK CONSTRAINT; Schema: public; Owner: -
--
@@ -3654,6 +3785,11 @@ INSERT INTO "schema_migrations" (version) VALUES
('20200610085411'),
('20200610140459'),
('20200612121539'),
('20200615131722');
('20200615131722'),
('20200615133602'),
('20200616124214'),
('20200619081446'),
('20200619085823'),
('20200619134853');

View File

@@ -33,6 +33,8 @@ if Rails.env.development? || Rails.env.test? || Rails.env.review?
material_release: true,
music_release: true,
talent_release: true,
medical_release: true,
misc_release: true,
video_analysis: true,
})

View File

@@ -1,3 +1,7 @@
# frozen_string_literal: true
require './lib/zoom_wrapper_monkeypatch'
class ZoomGateway
class AuthenticationError < StandardError; end
class MeetingExpired < StandardError; end
@@ -65,6 +69,23 @@ class ZoomGateway
parse_zoom_error(e)
end
# Update user with custom settings
def update_user_settings(user_id)
custom_defaults = {
id: user_id,
in_meeting: {
auto_saving_chat: true,
co_host: true,
non_verbal_feedback: true,
breakout_room: true,
group_hd: true,
far_end_camera_control: true,
allow_live_streaming: true
}
}
@client.user_settings_update custom_defaults
end
def create_host(host_email)
# Find role
host_role = @client.roles_list["roles"].try(:select) { |r| r["name"] == self.class.HOST_ROLE }.try(:first)
@@ -82,6 +103,8 @@ class ZoomGateway
type: self.class.USER_TYPE
})
update_user_settings(host_user["id"])
# Assign role to user
@client.roles_assign role_id: host_role["id"], members: [{id: host_user["id"]}]

View File

@@ -0,0 +1,25 @@
# frozen_string_literal: true
module Zoom
module Actions
module User
def user_settings_update(*args)
params = Zoom::Params.new(Utils.extract_options!(args))
permitted_in_meeting_params = %i[
auto_saving_chat
co_host
non_verbal_feedback
breakout_room
group_hd
far_end_camera_control
allow_live_streaming
]
permitted_params = { in_meeting: permitted_in_meeting_params }
params.require(:id).permit permitted_params
request_body = params.except(:id).to_json
resp = self.class.patch("/users/#{params[:id]}/settings", body: request_body, headers: request_headers)
Utils.parse_response resp
end
end
end
end

View File

@@ -128,6 +128,26 @@ RSpec.describe Api::BroadcastsController, type: :controller do
expect(included.first.dig("id")).to eq broadcast.files.first.id.to_s
expect(included.first.dig("type")).to eq 'active_storage_attachment'
end
context "when files param contains a signed_id string" do
it "adds that file to the broadcast" do
project = create(:project, name: 'first', account_id: current_user.primary_account.id)
broadcast = create(:broadcast, :with_stream, skip_create_callback: true, project: project, status: 'created')
blob = ActiveStorage::Blob.create_after_upload!(io: StringIO.new("Hello"), filename: "hello.txt", content_type: "text/plain")
sign_in_to_api(current_user)
patch :update, params: { project_id: project, id: broadcast, broadcast: { files: [blob.signed_id] } }
relationships = JSON.parse(response.body).dig('data', 'relationships')
included = JSON.parse(response.body).dig('included')
expect(relationships.keys).to include('files')
expect(included.size).to eq 1
expect(included.first.dig("id")).to eq broadcast.files.first.id.to_s
expect(included.first.dig("type")).to eq 'active_storage_attachment'
expect(included.first.dig("attributes", "filename")).to eq 'hello.txt'
end
end
end
after do

View File

@@ -265,6 +265,9 @@ RSpec.describe AppearanceReleasesController, tye: :controller do
def minor_appearance_release_params
attributes_for(:appearance_release, :non_native, :minor_with_guardian_photo)
.except(:contract)
.except(:guardian_address_street2).except(:guardian_address_city)
.except(:guardian_address_state).except(:guardian_address_zip)
.except(:guardian_address_country)
.merge(contract_param, exploitable_rights_params)
end

View File

@@ -63,4 +63,55 @@ RSpec.describe ContractsController, type: :controller do
it_behaves_like "a contracts controller"
end
context "for medical releases" do
let(:native_releasable) { create(:medical_release_with_contract_template, :native) }
let(:non_native_releasable) { create(:medical_release_with_contract_template, :non_native) }
describe "#show when user is account manager" do
it_behaves_like "a contracts controller"
end
shared_examples "a medical contracts controller for non-authorized users" do
describe "#show" do
context "for a native release" do
it "responds with not authorized error" do
pdf_body = Tempfile.new
allow_any_instance_of(Contract).to receive(:to_pdf).and_return(pdf_body)
expect {
get :show, params: { format: :pdf, "#{native_releasable.model_name.singular}_id" => native_releasable }
}.to raise_exception(Pundit::NotAuthorizedError)
end
end
context "for a non-native release" do
it "responds with the attached contract" do
contract = double(:contract, service_url: "http://example.org/contract.pdf")
allow_any_instance_of(non_native_releasable.class).to receive(:contract).and_return(contract)
expect {
get :show, params: { format: :pdf, "#{non_native_releasable.model_name.singular}_id" => non_native_releasable }
}.to raise_exception(Pundit::NotAuthorizedError)
end
end
end
end
describe "#show when user is project manager" do
let(:manager_user) { create(:user, :manager) }
before do
sign_in manager_user
end
it_behaves_like "a medical contracts controller for non-authorized users"
end
describe "#show when user is associate" do
let(:associate_user) { create(:user, :associate) }
before do
sign_in associate_user
end
it_behaves_like "a medical contracts controller for non-authorized users"
end
end
end

View File

@@ -0,0 +1,116 @@
require "rails_helper"
RSpec.describe MiscReleasesController, 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
release = create(:misc_release, project: project,
person_first_name: "My",
person_last_name: "Release",
person_phone: "5551234567",
person_email: "jane.doe@test.com")
create(:note, notable: release, content: "Some notes here")
get :index, params: { project_id: project }
expect(response.body).to have_content "My Release"
expect(response.body).to have_content "P: 5551234567"
expect(response.body).to have_content "jane.doe@test.com"
expect(response.body).to have_content "Some notes here"
expect(response.body).to have_content "Manage"
end
context "when there are no misc releases" do
it "renders an empty message" do
get :index, params: { project_id: project }
expect(response.body).to have_content("Misc Releases will appear here")
end
end
context "when there are many records" do
it "paginates the table" do
create_list(:misc_release, 20, project: project)
get :index, params: { project_id: project }
expect(response.body).to have_link("2", href: project_misc_releases_path(project, page: 2))
end
end
context "for xhr request" do
it "filters the releases by a query param" do
misc_releases = [
create(:misc_release, person_name: "Adam Sandler", project: project),
create(:misc_release, person_name: "Zoe Perry", project: project),
]
get :index, params: { project_id: project, query: "Zoe" }, xhr: true
expect(response.body).not_to have_content("Adam Sandler")
expect(response.body).to have_content("Zoe Perry")
end
end
end
describe "#destroy" do
let!(:misc_release) { create(:misc_release, project: project) }
it "responds with redirect" do
delete :destroy, params: { project_id: project, id: misc_release }
expect(response).to be_redirect
expect(response).to redirect_to [project, :misc_releases]
end
it "sets the flash" do
delete :destroy, params: { project_id: project, id: misc_release }
expect(flash.alert).not_to be_nil
end
it "destroys the record" do
expect {
delete :destroy, params: { project_id: project, id: misc_release }
}.to change(MiscRelease, :count).by(-1)
end
end
private
def misc_release_params
attributes_for(:misc_release).merge(exploitable_rights_params)
end
def minor_misc_release_params
attributes_for(:misc_release, :minor_with_guardian_photo).merge(exploitable_rights_params)
end
def exploitable_rights_params
{
applicable_medium_id: ApplicableMedium.last.id,
applicable_medium_text: "applicable_media",
territory_id: Territory.last.id,
territory_text: "territory",
term_id: Term.last.id,
term_text: "term",
restriction_id: Restriction.last.id,
restriction_text: "restrictions",
}
end
end

View File

@@ -31,7 +31,7 @@ describe Public::AppearanceReleasesController do
contract_template = create(:contract_template, project: project)
sign_in(user)
post :create, params: { account_id: user.primary_account.to_param, project_id: project, contract_template_id: contract_template, appearance_release: { person_address: "Albuquerque" } }
post :create, params: { account_id: user.primary_account.to_param, project_id: project, contract_template_id: contract_template, appearance_release: { person_email: "email@email.com" } }
body = CGI.unescape_html(response.body)
expect(body).to match /Person first name can't be blank/
expect(body).to match /Person last name can't be blank/
@@ -120,7 +120,19 @@ describe Public::AppearanceReleasesController do
def minor_appearance_release_params(with_guardian_photo = true)
minor_type = with_guardian_photo ? :minor_with_guardian_photo : :minor
attributes_for(:appearance_release, minor_type).merge(signature_param)
attributes_for(:appearance_release, minor_type)
.merge(signature_param, guardian_address_params)
end
def guardian_address_params
{
guardian_address_street1: "St1",
guardian_address_street2: "St2",
guardian_address_city: "City",
guardian_address_state: "State",
guardian_address_zip: "ZIP",
guardian_address_country: "Country"
}
end
def signature_param

View File

@@ -11,7 +11,12 @@ FactoryBot.define do
end
trait :native do
person_address "100 Test Lane, New York, NY 10001"
person_address_street1 "St1"
person_address_street2 "St2"
person_address_city "City"
person_address_state "State"
person_address_zip "ZIP"
person_address_country "Country"
person_phone "123-555-6789"
signature do
@@ -31,7 +36,12 @@ FactoryBot.define do
minor true
guardian_first_name "Jamie"
guardian_last_name "Doe"
guardian_address "100 Test Lane, New York, 10001"
guardian_address_street1 "St1"
guardian_address_street2 "St2"
guardian_address_city "City"
guardian_address_state "State"
guardian_address_zip "ZIP"
guardian_address_country "Country"
guardian_phone "123-555-1234"
guardian_email "guardian@galaxy.all"
end
@@ -40,9 +50,14 @@ FactoryBot.define do
minor true
guardian_first_name "Jamie"
guardian_last_name "Doe"
guardian_address "100 Test Lane, New York, 10001"
guardian_phone "123-555-1234"
guardian_email "guardian@galaxy.all"
guardian_address_street1 "St1"
guardian_address_street2 "St2"
guardian_address_city "City"
guardian_address_state "State"
guardian_address_zip "ZIP"
guardian_address_country "Country"
guardian_photo do
path = Rails.root.join("spec", "fixtures", "files", "pratt.jpg")
Rack::Test::UploadedFile.new(path, "image/jpeg")

View File

@@ -8,6 +8,10 @@ FactoryBot.define do
guardian_clause "Is the signer a minor?"
fee "$0.00"
trait :archived do
archived_at Time.zone.now
end
factory :appearance_release_contract_template do
release_type "appearance"
end
@@ -24,6 +28,10 @@ FactoryBot.define do
release_type "material"
end
factory :misc_release_contract_template do
release_type "misc"
end
factory :location_release_contract_template do
release_type "location"
end

View File

@@ -0,0 +1,58 @@
FactoryBot.define do
factory :misc_release do
association :project
person_first_name "Jane"
person_last_name "Doe"
photos [Rack::Test::UploadedFile.new(Rails.root.join("spec", "fixtures", "files", "person_photo.png"), "image/png")]
trait :native do
person_phone "123-555-6789"
signature do
path = Rails.root.join("spec", "fixtures", "files", "signature.png")
Rack::Test::UploadedFile.new(path, "image/png")
end
end
trait :minor do
minor true
guardian_first_name "Jamie"
guardian_last_name "Doe"
guardian_phone "123-555-1234"
end
trait :minor_with_guardian_photo do
minor true
guardian_first_name "Jamie"
guardian_last_name "Doe"
guardian_phone "123-555-1234"
guardian_photo do
path = Rails.root.join("spec", "fixtures", "files", "pratt.jpg")
Rack::Test::UploadedFile.new(path, "image/jpeg")
end
end
factory :misc_release_with_contract_template do
after(:build) do |misc_release, _|
misc_release.contract_template = build(:misc_release_contract_template)
end
end
factory :misc_release_with_contract_template_and_photos do
after(:build) do |misc_release, _|
misc_release.contract_template = build(:misc_release_contract_template)
path = Rails.root.join("spec", "fixtures", "files", "person_photo.png")
misc_release.photos.attach Rack::Test::UploadedFile.new(path, "image/png")
end
end
factory :misc_release_with_photo do
after(:build) do |misc_release, _|
path = Rails.root.join("spec", "fixtures", "files", "person_photo.png")
misc_release.photos.attach Rack::Test::UploadedFile.new(path, "image/png")
end
end
end
end

View File

@@ -109,4 +109,10 @@ feature "User creates notes" do
it_behaves_like "a notable collection UI"
end
context "for misc releases" do
subject! { create(:misc_release, project: project, notes: []) }
it_behaves_like "a notable collection UI"
end
end

View File

@@ -92,4 +92,10 @@ feature "User creates tags" do
it_behaves_like "a taggable collection UI"
end
context "for misc releases" do
subject! { create(:misc_release, project: project, tags: []) }
it_behaves_like "a taggable collection UI"
end
end

View File

@@ -5,6 +5,7 @@ require 'rails_helper'
RSpec.feature 'User manages contract templates', type: :feature do
let(:current_user) { create(:user, :manager) }
let(:project) { create(:project, members: current_user, account: current_user.primary_account) }
let(:project2) { create(:project, members: current_user, account: current_user.primary_account, name: 'New project') }
before do
sign_in(current_user)
@@ -191,6 +192,21 @@ RSpec.feature 'User manages contract templates', type: :feature do
expect(page).not_to have_content('Test template')
end
scenario 'archived contract templates from other projects are not shown when importing contract templates' do
create(:contract_template, :archived, project: project2, name: 'Archived template')
create(:contract_template, project: project2, name: 'Active template')
create(:contract_template, project: project)
visit project_contract_templates_path(project)
expect(page).to have_content('Test template')
click_on import_template_button
expect(page).not_to have_content('Test template')
expect(page).not_to have_content('Archived template')
expect(page).to have_content('Active template')
end
context 'When the user is associate' do
let(:current_user) { create(:user, :associate) }
@@ -198,7 +214,7 @@ RSpec.feature 'User manages contract templates', type: :feature do
visit project_contract_templates_path(project)
expect(page).not_to have_content('Create New Release Template')
expect(page).not_to have_content('Import Release Template')
expect(page).not_to have_content(import_template_button)
expect(page).not_to have_content('Delete')
end
end
@@ -218,6 +234,14 @@ RSpec.feature 'User manages contract templates', type: :feature do
private
def import_template_button
t 'contract_templates.index.actions.import'
end
def import_selected_templates_button
t 'release_template_imports.new.actions.import'
end
def preview_heading
t 'blank_contracts.new.preview_heading'
end

View File

@@ -19,7 +19,7 @@ feature 'User managing appearance releases' do
fill_in person_first_name_field, with: 'Jane'
fill_in person_last_name_field, with: 'Doe'
fill_in person_address_field, with: '123 Test Lane, New York, NY 10000'
fill_in_person_address_fields
fill_in person_phone_field, with: '555-555-5555'
fill_in person_email_field, with: 'jane.doe@test.com'
fill_in person_date_of_birth, with: '01/01/1999'
@@ -52,7 +52,7 @@ feature 'User managing appearance releases' do
fill_in guardian_phone_field, with: '001101'
fill_in person_first_name_field, with: 'Jane'
fill_in person_last_name_field, with: 'Doe'
fill_in person_address_field, with: '123 Test Lane, New York, NY 10000'
fill_in_person_address_fields
fill_in person_phone_field, with: '555-555-5555'
fill_in person_email_field, with: 'jane.doe@test.com'
fill_in person_date_of_birth, with: '01/01/1999'
@@ -65,11 +65,68 @@ feature 'User managing appearance releases' do
expect(page).to have_content('Guardian email is not an email')
fill_in guardian_email_field, with: 'valid@email.com'
fill_in_guardian_address_fields
attach_file guardian_photo_field, file_fixture('hemsworth.jpeg'), visible: :all
draw_signature file_fixture('signature.png'), 'appearance_release_signature_base64'
click_button submit_release_button
expect(page).to have_content(successful_submission_message)
end
scenario 'creating a release for a minor with two guardians', js: true do
allow(BrayniacAI::Validation).to receive(:create).and_return(double(:validation, valid: true))
project = create(:project, members: current_user, account: current_user.primary_account)
contract_template = create(:contract_template, project: project)
visit new_account_project_contract_template_appearance_release_path(project.account, project, contract_template)
expect(page).to have_photo_button
expect(page).not_to have_content('SECOND GUARDIAN INFORMATION')
expect(page).not_to have_content('SECOND GUARDIAN PHOTO')
page.check person_is_minor_checkbox
expect(page).to have_content('GUARDIAN INFORMATION')
expect(page).to have_content('GUARDIAN PHOTO')
expect(page).to have_content 'Guardian Email'
expect(page).to have_content 'SECOND GUARDIAN INFORMATION'
expect(page).to have_content 'SECOND GUARDIAN PHOTO'
expect(page).to have_content 'Guardian 2 Email'
expect(page).to have_content 'Guardian 2 Phone'
expect(page).to have_content 'Guardian 2 Address'
fill_in guardian_first_name_field, with: 'Guardian'
fill_in guardian_last_name_field, with: 'Name'
fill_in guardian_phone_field, with: '001101'
fill_in person_first_name_field, with: 'Jane'
fill_in person_last_name_field, with: 'Doe'
fill_in_person_address_fields
fill_in person_phone_field, with: '555-555-5555'
fill_in person_email_field, with: 'jane.doe@test.com'
fill_in person_date_of_birth, with: '01/01/1999'
attach_file person_photo_field, file_fixture('person_photo.png'), visible: :all
attach_file guardian_photo_field, file_fixture('hemsworth.jpeg'), visible: :all
draw_signature file_fixture('signature.png'), 'appearance_release_signature_base64'
fill_in guardian_email_field, with: 'invalid@email'
click_button submit_release_button
expect(page).to have_content('Guardian email is not an email')
fill_in guardian_email_field, with: 'valid@email.com'
fill_in_guardian_address_fields
attach_file guardian_photo_field, file_fixture('hemsworth.jpeg'), visible: :all
draw_signature file_fixture('signature.png'), 'appearance_release_signature_base64'
fill_in guardian_2_first_name_field, with: 'Second'
fill_in guardian_2_last_name_field, with: 'Guardian'
fill_in guardian_2_phone_field, with: '999'
click_button submit_release_button
expect(page).to have_content(successful_submission_message)
expect(AppearanceRelease.last.guardian_2_first_name).to eq 'Second'
end
end
context 'when signed in' do
@@ -452,6 +509,18 @@ feature 'User managing appearance releases' do
'appearance_release_minor'
end
def guardian_2_first_name_field
'Guardian 2 first name'
end
def guardian_2_last_name_field
'Guardian 2 last name'
end
def guardian_2_phone_field
'Guardian 2 phone'
end
def guardian_first_name_field
'Guardian first name'
end
@@ -468,6 +537,22 @@ feature 'User managing appearance releases' do
'Guardian email'
end
def guardian_address_street1_field
t('helpers.label.appearance_release.guardian_address_street1')
end
def guardian_address_city_field
t('helpers.label.appearance_release.guardian_address_city')
end
def guardian_address_state_field
t('helpers.label.appearance_release.guardian_address_state')
end
def guardian_address_zip_field
t('helpers.label.appearance_release.guardian_address_zip')
end
def guardian_photo_field
'appearance_release[guardian_photo]'
end
@@ -484,8 +569,34 @@ feature 'User managing appearance releases' do
t('helpers.label.appearance_release.person_last_name')
end
def person_address_field
t('helpers.label.appearance_release.person_address')
def fill_in_person_address_fields
fill_in person_address_street1_field, with: "123 Test Lane"
fill_in person_address_city_field, with: "New York"
fill_in person_address_state_field, with: "NY"
fill_in person_address_zip_field, with: '1000'
end
def fill_in_guardian_address_fields
fill_in guardian_address_street1_field, with: "124 Test Lane"
fill_in guardian_address_city_field, with: "New York"
fill_in guardian_address_state_field, with: "NY"
fill_in guardian_address_zip_field, with: '1000'
end
def person_address_street1_field
t('helpers.label.appearance_release.person_address_street1')
end
def person_address_city_field
t('helpers.label.appearance_release.person_address_city')
end
def person_address_state_field
t('helpers.label.appearance_release.person_address_state')
end
def person_address_zip_field
t('helpers.label.appearance_release.person_address_zip')
end
def person_email_field

View File

@@ -40,12 +40,12 @@ feature "User managing broadcasts" do
scenario "visit show page of broadcast", js: true do
broadcast = create(:broadcast, :with_stream, :with_files, project: project)
recording = create(:broadcast_recording, broadcast: broadcast)
visit project_broadcast_path(project, broadcast)
expect(page).to have_content("Live stream is waiting to begin.")
expect(page).to have_content("Copy URL")
within "#files" do
expect(page).to have_content("contract.pdf")
end
@@ -54,6 +54,17 @@ feature "User managing broadcasts" do
expect(page).to have_content(recording.download_file_name)
end
scenario "form will not submit if user clicks Add files without selected files", js: true do
broadcast = create(:broadcast, :with_stream, :with_files, project: project)
visit project_broadcast_path(project, broadcast)
expect(page).to have_content("Live stream is waiting to begin.")
expect(page).to have_content add_file_button
click_on add_file_button
end
scenario "visit multi-view broadcast page", js: true do
broadcast_one = create(:broadcast, :with_stream, :with_files, name: "Broadcast 1", project: project)
broadcast_two = create(:broadcast, :with_stream, :with_files, name: "Broadcast 2", project: project)
@@ -80,8 +91,13 @@ feature "User managing broadcasts" do
end
end
private
def add_file_button
'Add File'
end
def broadcast_name_field
"broadcast[name]"
end

View File

@@ -17,16 +17,12 @@ feature "User managing material releases" do
visit new_account_project_contract_template_material_release_path(project.account, project, contract_template)
by "filling out the form" do
fill_in material_name_field, with: "Pepsi Logo"
fill_in person_first_name_field, with: "Jane"
fill_in person_last_name_field, with: "Doe"
draw_signature file_fixture("signature.png"), "material_release_signature_base64"
end
fill_all_fields
draw_signature file_fixture("signature.png"), "material_release_signature_base64"
click_button submit_release_button
expect(page).to have_content("Your release was successfully submitted. Thank you.")
expect(page).to have_content success_submit_message
end
scenario "creating a release with photos", js: true do
@@ -34,17 +30,60 @@ feature "User managing material releases" do
visit new_account_project_contract_template_material_release_path(project.account, project, contract_template)
fill_in material_name_field, with: "Pepsi Logo"
fill_in person_first_name_field, with: "Jane"
fill_in person_last_name_field, with: "Doe"
fill_all_fields
draw_signature file_fixture("signature.png"), "material_release_signature_base64"
drop_file Rails.root.join(file_fixture("material_photo.png")), type: :dropzone
click_button submit_release_button
expect(page).to have_content("Your release was successfully submitted. Thank you.")
expect(page).to have_content success_submit_message
expect(MaterialRelease.last.photos.attached?).to eq true
end
scenario "creating release is possible only after filling all fields", js: true do
contract_template = create(:contract_template, project: project)
visit new_account_project_contract_template_material_release_path(project.account, project, contract_template)
fill_in material_name_field, with: "Pepsi Logo"
expect_failed_client_side_validation
fill_in material_description_field, with: "Description text"
expect_failed_client_side_validation
fill_in person_first_name_field, with: "Jane"
expect_failed_client_side_validation
fill_in person_last_name_field, with: "Doe"
expect_failed_client_side_validation
fill_in person_phone_field, with: "2229929229"
expect_failed_client_side_validation
fill_in person_email_field, with: "mail@mail.com"
expect_failed_client_side_validation
fill_in person_company_field, with: "Company"
expect_failed_client_side_validation
fill_in person_title_field, with: "Mr."
expect_failed_client_side_validation
fill_in person_address_street1_field, with: "Street 1 address"
expect_failed_client_side_validation
fill_in person_city_field, with: "City"
expect_failed_client_side_validation
fill_in person_state_field, with: "State"
expect_failed_client_side_validation
fill_in person_zip_field, with: "ZIP"
draw_signature file_fixture("signature.png"), "material_release_signature_base64"
click_button submit_release_button
expect(page).to have_content success_submit_message
end
end
context "when signed in" do
@@ -216,6 +255,10 @@ feature "User managing material releases" do
"material_release[name]"
end
def material_description_field
"material_release[description]"
end
def person_first_name_field
"material_release[person_first_name]"
end
@@ -224,6 +267,38 @@ feature "User managing material releases" do
"material_release[person_last_name]"
end
def person_phone_field
"material_release[person_phone]"
end
def person_email_field
"material_release[person_email]"
end
def person_company_field
"material_release[person_company]"
end
def person_title_field
"material_release[person_title]"
end
def person_address_street1_field
"material_release[person_address_street1]"
end
def person_city_field
"material_release[person_address_city]"
end
def person_state_field
"material_release[person_address_state]"
end
def person_zip_field
"material_release[person_address_zip]"
end
def have_photo(filename)
have_selector("img[src*='#{filename}']")
end
@@ -282,4 +357,29 @@ feature "User managing material releases" do
select "Other", from: "Restriction"
fill_in "Describe other restrictions", with: "Test"
end
def fill_all_fields
fill_in material_name_field, with: "Pepsi Logo"
fill_in material_description_field, with: "Description text"
fill_in person_first_name_field, with: "Jane"
fill_in person_last_name_field, with: "Doe"
fill_in person_phone_field, with: "2229929229"
fill_in person_email_field, with: "mail@mail.com"
fill_in person_company_field, with: "Company"
fill_in person_title_field, with: "Mr."
fill_in person_address_street1_field, with: "Street 1 address"
fill_in person_city_field, with: "City"
fill_in person_state_field, with: "State"
fill_in person_zip_field, with: "ZIP"
end
def success_submit_message
'Your release was successfully submitted. Thank you.'
end
def expect_failed_client_side_validation
draw_signature file_fixture("signature.png"), "material_release_signature_base64"
click_button submit_release_button
expect(page).not_to have_content success_submit_message
end
end

View File

@@ -0,0 +1,145 @@
require "rails_helper"
feature "User managing medical releases" do
let(:current_user) { create(:user) }
let(:project) { create(:project, members: current_user, account: current_user.primary_account) }
context "when signed in as account manager" do
before do
sign_in current_user
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)
visit project_medical_releases_path(project)
expect(page).to have_content download_all_button
end
scenario "Download 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("Download", exact: true, count: 2)
end
scenario "Downloading PDF of native medical release is possible" do
native_release = create(:medical_release_with_contract_template, :native, project: project)
visit project_medical_releases_path(project)
click_link *view_release_pdf_link_for(native_release)
expect(content_type).to eq('application/pdf')
end
end
context "when the user is manager(project manager)" do
let(:current_user) { create(:user, :manager) }
before do
sign_in current_user
end
scenario "Download All 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_content download_all_button
end
scenario "Download 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).to have_link("Download", exact: true, count: 0)
end
scenario "Downloading PDF of native medical release is not possible" do
native_release = create(:medical_release_with_contract_template, :native, project: project)
visit project_medical_releases_path(project)
link = medical_release_contracts_path(native_release, format: 'pdf')
expect { visit link }.to raise_exception Pundit::NotAuthorizedError
end
scenario "Downloading PDF of non native medical release is not possible" do
non_native_release = create(:medical_release_with_contract_template, :non_native, project: project)
visit project_medical_releases_path(project)
link = medical_release_contracts_path(non_native_release, format: 'pdf')
expect { visit link }.to raise_exception Pundit::NotAuthorizedError
end
end
context "when the user is associate" do
let(:current_user) { create(:user, :associate) }
before do
sign_in current_user
end
scenario "Download All 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_content download_all_button
end
scenario "Download 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).to have_link("Download", exact: true, count: 0)
end
scenario "Downloading PDF of native medical release is not possible" do
native_release = create(:medical_release_with_contract_template, :native, project: project)
visit project_medical_releases_path(project)
link = medical_release_contracts_path(native_release, format: 'pdf')
expect { visit link }.to raise_exception Pundit::NotAuthorizedError
end
scenario "Downloading PDF of non native medical release is not possible" do
non_native_release = create(:medical_release_with_contract_template, :non_native, project: project)
visit project_medical_releases_path(project)
link = medical_release_contracts_path(non_native_release, format: 'pdf')
expect { visit link }.to raise_exception Pundit::NotAuthorizedError
end
end
private
def download_all_button
'Download All'
end
def download_action
'Download'
end
def manage_button
t 'medical_releases.medical_release.actions.manage'
end
def view_release_pdf_link_for(release)
['Download', href: medical_release_contracts_path(release, format: 'pdf')]
end
end

View File

@@ -0,0 +1,55 @@
require "rails_helper"
feature "User managing misc releases" do
let(:current_user) { create(:user) }
let(:project) { create(:project, members: current_user, account: current_user.primary_account) }
context "when signed in as account manager" do
before do
sign_in current_user
end
scenario "Download All is visible" do
create(:misc_release_with_contract_template, :native, project: project)
visit project_misc_releases_path(project)
expect(page).to have_content download_all_button
end
scenario "Downloading PDF of native misc release is possible" do
native_release = create(:misc_release_with_contract_template, :native, project: project)
visit project_misc_releases_path(project)
click_link *view_release_pdf_link_for(native_release)
expect(content_type).to eq('application/pdf')
end
end
context "when the user is manager(project manager)" do
let(:current_user) { create(:user, :manager) }
before do
sign_in current_user
end
scenario "Download action in Manage menu is not visible" do
create(:misc_release_with_contract_template, :native, project: project)
visit project_misc_releases_path(project)
expect(page).to have_link("Download", exact: true, count: 0)
end
end
private
def download_all_button
'Download All'
end
def view_release_pdf_link_for(release)
['Download', href: misc_release_contracts_path(release, format: 'pdf')]
end
end

View File

@@ -5,6 +5,7 @@ RSpec.describe ZoomGateway do
let(:host_user_hash) { {"email" => "user1@directme", "id" => "host_user_id"} }
let(:roles_members_response) { {"members" => [host_user_hash]} }
let(:user_create_response) { {"id" => "new_host_id"} }
let(:user_settings_update_response) { "User settings updated" }
let(:roles_assign_response) { {"ids" => ["new_host_id"]} }
let(:meeting_hash) { {"id" => "meeting_id", "start_url" => "https://start_url", "join_url" => "https://join_url"} }
let(:gateway) { ZoomGateway.new }
@@ -121,7 +122,9 @@ RSpec.describe ZoomGateway do
it "returns new host id" do
allow_any_instance_of(Zoom.new.class).to receive(:user_create).and_return(user_create_response)
allow_any_instance_of(Zoom.new.class).to receive(:roles_assign).and_return(roles_assign_response)
allow_any_instance_of(Zoom.new.class).to receive(:user_settings_update).and_return(user_settings_update_response)
expect_any_instance_of(Zoom.new.class).to receive(:user_settings_update)
expect(gateway.create_host("host-email@address")).to eq("new_host_id")
end

View File

@@ -0,0 +1,60 @@
require 'rails_helper'
RSpec.describe Zoom::Actions::User do
let(:wrapper) { Zoom.new }
describe '.update_user_settings' do
it 'raises exception if id param is missing' do
params = {
in_meeting: {
not_allowed_param: 1
}
}
expect do
wrapper.user_settings_update(params)
end.to raise_exception(Zoom::ParameterMissing)
end
it 'raises exception if not allowed param is present' do
params = {
id: 'dw3-3sd33',
in_meeting: {
not_allowed_param: 1
}
}
expect do
wrapper.user_settings_update(params)
end.to raise_exception(Zoom::ParameterNotPermitted)
end
it 'sends PATCH request to the Zoom API endpoint' do
params = {
id: 'zoom-120-id',
in_meeting: {
auto_saving_chat: true,
co_host: true,
non_verbal_feedback: true,
breakout_room: true,
group_hd: true,
far_end_camera_control: true,
allow_live_streaming: true
}
}
allow(Zoom::Utils).to receive(:parse_response).and_return 'Success!'
path = "/users/#{params[:id]}/settings"
body_params = { body: params.except(:id).to_json }
allow(wrapper.class)
.to receive(:patch)
.with(path, hash_including(body_params))
.and_return({})
mock_response = wrapper.user_settings_update params
expect(mock_response).to eq 'Success!'
end
end
end

View File

@@ -132,6 +132,7 @@ RSpec.describe Account do
Account,
ZoomMeeting,
MedicalRelease,
MiscRelease,
MatchingRequest
]
Rails.application.eager_load!

View File

@@ -50,11 +50,19 @@ describe ContractTemplatePreview do
'id' => nil,
'person_first_name' => 'Dummy',
'person_last_name' => 'Person',
'person_address' => 'Street 1, Street 2, City, State 12345, Country',
'person_address_street1' => 'Street 1',
'person_address_street2' => 'Street 2',
'person_address_city' => 'City',
'person_address_state' => 'State',
'person_address_zip' => '12345',
'person_phone' => '00 111 222 333 4444',
'updated_at' => nil,
'minor' => true,
'guardian_address' => 'Street 3, Street 4, City-2, State-2 112233, Country-2',
'guardian_address_street1' => 'Street 3',
'guardian_address_street2' => 'Street 4',
'guardian_address_city' => 'City-2',
'guardian_address_state' => 'State-2',
'guardian_address_zip' => '112233',
"guardian_first_name" => nil,
"guardian_last_name" => nil,
"guardian_name_old" => nil,

View File

@@ -14,6 +14,7 @@ describe ContractTemplate do
it { is_expected.to have_many(:location_releases).dependent(:restrict_with_error) }
it { is_expected.to have_many(:material_releases).dependent(:restrict_with_error) }
it { is_expected.to have_many(:medical_releases).dependent(:restrict_with_error) }
it { is_expected.to have_many(:misc_releases).dependent(:restrict_with_error) }
end
describe 'validations' do

View File

@@ -29,7 +29,7 @@ module ExcelReports
restriction: Restriction.last,
person_first_name: "John",
person_last_name: "Doe",
person_address: "123 Main Street, New York, NY 10000")
person_address_street1: "123 Main Street, New York, NY 10000")
)
)
allow(sheet).to receive(:add_row)

View File

@@ -0,0 +1,53 @@
require 'rails_helper'
RSpec.describe MiscRelease, type: :model do
it_behaves_like "a contractable"
it_behaves_like "a notable"
it_behaves_like "a photoable"
it_behaves_like "a releasable"
describe "validations" do
it { is_expected.to validate_presence_of(:person_first_name) }
it { is_expected.to validate_presence_of(:person_last_name) }
context "for #person_email" do
it { is_expected.to allow_value("test@test.com", nil).for(:person_email) }
it { is_expected.not_to allow_values("foo", "test@foo", "N/A").for(:person_email) }
end
context "for native releases" do
it { is_expected.to validate_attachment_of(:signature).on(:native) }
end
context "for non-native releases" do
it { is_expected.to validate_attachment_of(:contract).on(:non_native) }
end
end
describe "attachments" do
it { is_expected.to respond_to(:signature) }
end
describe "#uses_edl?" do
it { is_expected.not_to be_uses_edl }
end
describe "#contract_file_name" do
it "includes project name, signed at date, release type, release number and person name" do
release = create(:misc_release_with_contract_template, id: 100, signed_at: Date.new(2020, 2, 10), person_first_name: "John", person_last_name: "Doe")
expect(release.contract_file_name).to eq("my-video-project_misc_2020.02.10_1_doe-john")
end
context "when signed at is nil" do
it "uses the created at date" do
release = create(:misc_release_with_contract_template,
signed_at: nil,
created_at: DateTime.new(2020, 2, 10, 12, 0, 0),
person_first_name: "John", person_last_name: "Doe")
expect(release.contract_file_name).to eq("my-video-project_misc_2020.02.10_1_doe-john")
end
end
end
end

View File

@@ -10,6 +10,7 @@ RSpec.describe Project, type: :model do
it { is_expected.to have_many(:music_releases).dependent(:destroy) }
it { is_expected.to have_many(:talent_releases).dependent(:destroy) }
it { is_expected.to have_many(:medical_releases).dependent(:destroy) }
it { is_expected.to have_many(:misc_releases).dependent(:destroy) }
it { is_expected.to have_many(:videos).dependent(:destroy) }
it { is_expected.to have_many(:contract_templates).dependent(:destroy) }
it { is_expected.to have_many(:project_memberships).dependent(:destroy) }

View File

@@ -0,0 +1,33 @@
require "rails_helper"
describe MiscReleasePolicy do
let(:user_context) { build(:user_context) }
subject { described_class }
permissions :create? do
it { is_expected.to permit(:create) }
end
permissions :show? do
it { is_expected.to permit(:show) }
end
permissions :update? do
context "for a native release" do
it { is_expected.not_to permit(user_context, build(:misc_release, :native)) }
end
end
permissions :destroy? do
it { is_expected.to permit(:destroy) }
end
permissions :edit_photos? do
it { is_expected.to permit(:edit_photos) }
end
permissions :update_photos? do
it { is_expected.to permit(:update_photos) }
end
end