Compare commits

..

9 Commits

Author SHA1 Message Date
bilal
60fc1d467d rebase 2020-06-23 17:36:48 +02:00
bilal
219bc5abd1 add data migration to change zoom user default settings 2020-06-23 17:33:12 +02:00
bilal
f5068a3a7e update zoom user settings after creating zoom user 2020-06-23 17:33: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
59 changed files with 1042 additions and 71 deletions

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

@@ -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

@@ -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,43 @@ 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 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,
: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

@@ -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

@@ -16,6 +16,29 @@ class AppearanceRelease < ApplicationRecord
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]
]
# 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 +94,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

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,85 @@
class MiscRelease < ApplicationRecord
include Contractable
include Notable
include Photoable
include Releasable
include Searchable
include Signable
include Syncable
include PersonName
include GuardianName
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

@@ -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

@@ -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

@@ -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

@@ -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>

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

@@ -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 %>
@@ -74,14 +74,12 @@
<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" %>
<%= form.phone_field :guardian_phone, required: @appearance_release.minor?, 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.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,7 +100,7 @@
<% 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" } %>
</div>

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

@@ -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

@@ -311,8 +311,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 +328,19 @@ en:
person_phone: Phone number
person_title: Title
appearance_release:
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
@@ -740,6 +751,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 +779,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})
@@ -814,6 +827,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!

View File

@@ -115,11 +115,20 @@ es:
helpers:
label:
appearance_release:
guardian_address: Dirección del tutor legal
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

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 ChangeExistingZoomUsersSettings < 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

@@ -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,17 @@ 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
);
@@ -604,7 +614,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 +1009,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 +1037,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 +1946,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 +2271,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 +2795,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 +3110,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 +3526,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 +3775,10 @@ INSERT INTO "schema_migrations" (version) VALUES
('20200610085411'),
('20200610140459'),
('20200612121539'),
('20200615131722');
('20200615131722'),
('20200615133602'),
('20200616124214'),
('20200619081446'),
('20200619085823');

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

@@ -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,47 @@
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
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

@@ -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,6 +65,8 @@ 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
@@ -468,6 +470,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 +502,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

@@ -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

@@ -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) }