Compare commits
5 Commits
API-can-fe
...
big-admin-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ee873a2cbe | ||
|
|
f99d607a69 | ||
|
|
88836e937e | ||
|
|
e3d4d22a34 | ||
|
|
3690268f83 |
@@ -17,7 +17,6 @@ $(document).on "turbolinks:load", ->
|
||||
switch data.event
|
||||
when "broadcast_stream_update" then @refreshBroadcastVideo(data)
|
||||
when "stream_recording_ready" then @showBroadcastRecordings(data)
|
||||
when "file_upload_update" then @refreshFilesTab(data)
|
||||
|
||||
refreshBroadcastVideo: (data) ->
|
||||
$("#broadcast_updates").html data.status_content
|
||||
@@ -38,8 +37,3 @@ $(document).on "turbolinks:load", ->
|
||||
$(".flash-message").html data.flash_content
|
||||
$("#broadcast_recordings").html data.recordings_content
|
||||
$("#broadcast_recordings_nav").html data.recordings_nav_content
|
||||
|
||||
refreshFilesTab: (data) ->
|
||||
$("#broadcast_file_list").html data.files_content
|
||||
$("#broadcast_files_pagination").html data.pagination_content
|
||||
|
||||
@@ -16,7 +16,6 @@ $(document).on "turbolinks:load", ->
|
||||
switch data.event
|
||||
when "video_status_update" then @showVideoStatusUpdate(data.content)
|
||||
when "download_status_update" then @showDownloadStatusUpdate(data.content)
|
||||
when "conference_recording_ready" then @showDownloadStatusUpdate(data.content)
|
||||
|
||||
showVideoStatusUpdate: (content) ->
|
||||
$("[data-ujs-target='video-analysis-msg']").replaceWith content
|
||||
|
||||
@@ -28,20 +28,10 @@ class BroadcastsChannel < ApplicationCable::Channel
|
||||
recordings_content = ApplicationController.render partial: "broadcasts/broadcast_recordings", locals: { recordings: recordings, broadcast: broadcast }
|
||||
recordings_nav_content = ApplicationController.render partial: "broadcasts/broadcast_recording_nav", collection: recordings, as: :broadcast_recording
|
||||
|
||||
broadcast_to broadcast,
|
||||
event: :stream_recording_ready,
|
||||
flash_content: flash_content,
|
||||
broadcast_to broadcast,
|
||||
event: :stream_recording_ready,
|
||||
flash_content: flash_content,
|
||||
recordings_content: recordings_content,
|
||||
recordings_nav_content: recordings_nav_content
|
||||
end
|
||||
|
||||
def self.file_upload_updates(broadcast, files, pagination_content)
|
||||
files_content = ApplicationController.render partial: "broadcasts/file", collection: files
|
||||
|
||||
broadcast_to broadcast, {
|
||||
event: :file_upload_update,
|
||||
files_content: files_content,
|
||||
pagination_content: pagination_content
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
class ProjectsChannel < ApplicationCable::Channel
|
||||
|
||||
|
||||
def subscribed
|
||||
# TODO: How can we get the current account in this context
|
||||
project = current_user.accessible_projects_for(current_user.primary_account).find(params[:id])
|
||||
@@ -25,12 +25,4 @@ class ProjectsChannel < ApplicationCable::Channel
|
||||
content = ApplicationController.render partial: "application/flash", locals: { flash: flash }
|
||||
broadcast_to download.project, event: :download_status_update, content: content
|
||||
end
|
||||
|
||||
def self.conference_recording_ready(project, recording)
|
||||
link = ApplicationController.helpers.link_to('Download here.', recording.service_url, target: '_blank', class: 'alert-link')
|
||||
notification = "A recording of your video conference is now available. #{link}"
|
||||
flash = OpenStruct.new(notice: notification)
|
||||
content = ApplicationController.render partial: 'application/flash', locals: { flash: flash }
|
||||
broadcast_to project, event: :conference_recording_ready, content: content
|
||||
end
|
||||
end
|
||||
|
||||
32
app/controllers/admin/task_requests_controller.rb
Normal file
32
app/controllers/admin/task_requests_controller.rb
Normal file
@@ -0,0 +1,32 @@
|
||||
class Admin::TaskRequestsController < Admin::ApplicationController
|
||||
before_action :set_task_request, only: [:edit, :update, :show]
|
||||
|
||||
def index
|
||||
@task_requests = task_requests.order_by_recent.paginate(page: params[:page])
|
||||
end
|
||||
|
||||
def edit
|
||||
end
|
||||
|
||||
def update
|
||||
if @task_request.update(task_request_params)
|
||||
redirect_to [:admin, :task_requests], notice: t(".notice")
|
||||
else
|
||||
render :edit
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def task_request_params
|
||||
params.require(:task_request).permit(:status, :deliverable_url)
|
||||
end
|
||||
|
||||
def task_requests
|
||||
policy_scope TaskRequest
|
||||
end
|
||||
|
||||
def set_task_request
|
||||
@task_request = authorize policy_scope(TaskRequest).find(params[:id])
|
||||
end
|
||||
end
|
||||
@@ -27,9 +27,6 @@ class BroadcastsController < ApplicationController
|
||||
def update
|
||||
@broadcast.update(broadcast_params)
|
||||
@files = @broadcast.files.order("created_at DESC").paginate(page: 1)
|
||||
|
||||
pagination_content = ApplicationController.render html: helpers.will_paginate(@files, params: { active_tab: params[:active_tab] })
|
||||
BroadcastsChannel.file_upload_updates(@broadcast, @files, pagination_content)
|
||||
end
|
||||
|
||||
def show
|
||||
|
||||
@@ -18,7 +18,6 @@ class PasswordResetsController < ApplicationController
|
||||
end
|
||||
|
||||
def edit
|
||||
redirect_to new_session_path, notice: t(".notice") if @user.nil?
|
||||
end
|
||||
|
||||
def update
|
||||
|
||||
@@ -14,9 +14,6 @@ class Public::BroadcastsController < Public::BaseController
|
||||
def update
|
||||
@broadcast.update(broadcast_params)
|
||||
@files = @broadcast.files.order("created_at DESC").paginate(page: 1)
|
||||
|
||||
pagination_content = ApplicationController.render html: helpers.will_paginate(@files, params: { active_tab: params[:active_tab] })
|
||||
BroadcastsChannel.file_upload_updates(@broadcast, @files, pagination_content)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
74
app/controllers/task_requests_controller.rb
Normal file
74
app/controllers/task_requests_controller.rb
Normal file
@@ -0,0 +1,74 @@
|
||||
class TaskRequestsController < ApplicationController
|
||||
layout "project"
|
||||
|
||||
before_action :set_project
|
||||
before_action :build_task_request, only: [:new, :create]
|
||||
before_action :set_task_request, only: [:show, :edit, :update, :cancel]
|
||||
|
||||
def index
|
||||
if params[:completed_only]
|
||||
@task_requests = task_requests.completed.order_by_recent.paginate(page: params[:page])
|
||||
else
|
||||
@task_requests = task_requests.order_by_recent.paginate(page: params[:page])
|
||||
end
|
||||
end
|
||||
|
||||
def new
|
||||
end
|
||||
|
||||
def create
|
||||
@task_request.attributes = task_request_params
|
||||
|
||||
if @task_request.save
|
||||
log_create_analytics
|
||||
redirect_to [@project, :task_requests], notice: t(".notice")
|
||||
else
|
||||
render :new
|
||||
end
|
||||
end
|
||||
|
||||
def show
|
||||
end
|
||||
|
||||
def edit
|
||||
end
|
||||
|
||||
def update
|
||||
if @task_request.update(task_request_params)
|
||||
redirect_to [@project, :task_requests], notice: t(".notice")
|
||||
else
|
||||
render :edit
|
||||
end
|
||||
end
|
||||
|
||||
def cancel
|
||||
@task_request.cancelled!
|
||||
redirect_to [@project, :task_requests], notice: t(".notice")
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def task_request_params
|
||||
params.require(:task_request).permit(:description, :deadline, :time_allowed, :additional_notes, files: [])
|
||||
end
|
||||
|
||||
def set_project
|
||||
@project = policy_scope(Project).find(params[:project_id])
|
||||
end
|
||||
|
||||
def set_task_request
|
||||
@task_request = authorize policy_scope(TaskRequest).find(params[:id])
|
||||
end
|
||||
|
||||
def task_requests
|
||||
authorize policy_scope(@project.task_requests)
|
||||
end
|
||||
|
||||
def build_task_request
|
||||
@task_request = authorize @project.task_requests.build
|
||||
end
|
||||
|
||||
def log_create_analytics
|
||||
TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_task_request, user_agent: request.user_agent, user_ip: request.remote_ip)
|
||||
end
|
||||
end
|
||||
@@ -13,11 +13,8 @@ class ZoomNotificationsController < ApplicationController
|
||||
@zoom_meeting.started!
|
||||
when 'meeting.ended'
|
||||
@zoom_meeting.ended!
|
||||
when 'recording.completed'
|
||||
recording = notification.dig(:payload, :object, :recording_files).first
|
||||
AttachRecordingToZoomMeetingJob.perform_later(@zoom_meeting, recording, notification['download_token'])
|
||||
else
|
||||
Rails.logger.info notification_event
|
||||
Rails.logger.info notification_type
|
||||
Rails.logger.info notification
|
||||
end
|
||||
|
||||
@@ -26,20 +23,16 @@ class ZoomNotificationsController < ApplicationController
|
||||
|
||||
private
|
||||
|
||||
def notification
|
||||
params.to_unsafe_h
|
||||
end
|
||||
|
||||
def notification_event
|
||||
notification.dig(:event)
|
||||
params.dig(:event)
|
||||
end
|
||||
|
||||
def notification_meeting_id
|
||||
notification.dig(:payload, :object, :id)
|
||||
params.dig(:payload, :object, :id)
|
||||
end
|
||||
|
||||
def notification_host_id
|
||||
notification.dig(:payload, :object, :host_id)
|
||||
params.dig(:payload, :object, :host_id)
|
||||
end
|
||||
|
||||
def set_zoom_meeting
|
||||
|
||||
@@ -41,7 +41,7 @@ module ContactInfoHelper
|
||||
end
|
||||
|
||||
def email_abbr(email)
|
||||
content_tag(:abbr, "E: ", title: "Email") + mail_to(email)
|
||||
content_tag(:abbr, "E: ", title: "Email") + email
|
||||
end
|
||||
|
||||
def phone_abbr(phone)
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
require 'zoom_gateway'
|
||||
class AttachRecordingToZoomMeetingJob < ApplicationJob
|
||||
queue_as :default
|
||||
|
||||
def perform(zoom_meeting, recording_hash, download_token)
|
||||
download_url = "#{recording_hash['download_url']}?access_token=#{download_token}"
|
||||
file = URI.open(download_url)
|
||||
if zoom_meeting.recording.attach(io: file, filename: file_name(zoom_meeting, recording_hash), content_type: 'video/mp4')
|
||||
# Temorarily disabling notifications
|
||||
# if zoom_meeting.project.present?
|
||||
# ProjectsChannel.conference_recording_ready(zoom_meeting.project, zoom_meeting.recording)
|
||||
# end
|
||||
|
||||
gateway = ZoomGateway.new
|
||||
gateway.delete_recording(zoom_meeting.api_meeting_id, recording_hash['id'])
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def file_name(zoom_meeting, recording_hash)
|
||||
start = recording_hash['recording_start'].to_datetime
|
||||
prefix = zoom_meeting.project.present? ? "#{zoom_meeting.project.name}_" : ''
|
||||
"#{prefix}video_conference_date#{start.strftime("%Y-%m-%d")}_Time_#{start.strftime("%T")}.mp4"
|
||||
end
|
||||
end
|
||||
@@ -54,7 +54,7 @@ class Account < ApplicationRecord
|
||||
Download.where(project: projects),
|
||||
User.joins(:project_memberships).where(project_memberships: { project: projects }),
|
||||
Broadcast.where(project: projects),
|
||||
ZoomMeeting.where(project: projects),
|
||||
TaskRequest.where(project: projects),
|
||||
self
|
||||
])).sum(:byte_size).to_f
|
||||
end
|
||||
@@ -79,6 +79,10 @@ class Account < ApplicationRecord
|
||||
plan_uid.to_s == "me_suite" || plan_uid.to_s == "releaseme"
|
||||
end
|
||||
|
||||
def assistme_enabled?
|
||||
plan_uid.to_s == "me_suite" || plan_uid.to_s == "assistme"
|
||||
end
|
||||
|
||||
def plan_name
|
||||
case plan_uid.to_s
|
||||
when "deliverme"
|
||||
@@ -87,6 +91,8 @@ class Account < ApplicationRecord
|
||||
"DirectME"
|
||||
when "releaseme"
|
||||
"ReleaseME"
|
||||
when "assistme"
|
||||
"AssistME"
|
||||
when "me_suite"
|
||||
"ME Suite"
|
||||
end
|
||||
|
||||
@@ -7,6 +7,8 @@ class Broadcast < ApplicationRecord
|
||||
|
||||
has_secure_token
|
||||
|
||||
scope :order_by_recent, -> { order(created_at: :desc) }
|
||||
|
||||
validates :name, presence: true
|
||||
|
||||
enum status: [:created, :active, :idle]
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
class BroadcastRecording < ApplicationRecord
|
||||
belongs_to :broadcast
|
||||
|
||||
scope :order_by_recent, -> { order(created_at: :desc) }
|
||||
|
||||
delegate :name, to: :broadcast, prefix: :broadcast
|
||||
|
||||
validates :asset_uid, uniqueness: true
|
||||
|
||||
@@ -6,6 +6,8 @@ module Releasable
|
||||
included do
|
||||
belongs_to :project, touch: true
|
||||
belongs_to :contract_template, optional: true
|
||||
|
||||
scope :order_by_recent, -> { order(created_at: :desc) }
|
||||
end
|
||||
|
||||
def release_number
|
||||
|
||||
@@ -5,7 +5,7 @@ class HeadshotCollection
|
||||
def self.for_project(project)
|
||||
appearance_releases_with_photo = project.appearance_releases.with_person_photo
|
||||
|
||||
new(project.headshot_collection_uid, appearance_releases_with_photo + project.talent_releases)
|
||||
new(project.id, appearance_releases_with_photo + project.talent_releases)
|
||||
end
|
||||
|
||||
def initialize(collection_uid, releasables)
|
||||
@@ -23,7 +23,7 @@ class HeadshotCollection
|
||||
collection_uid: collection_uid.to_s,
|
||||
bucket_name: aws_bucket_name,
|
||||
ids_to_images: map_ids_to_images,
|
||||
}.reject { |_, v| v.blank? }
|
||||
}
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -4,4 +4,6 @@ class Note < ApplicationRecord
|
||||
belongs_to :notable, polymorphic: true
|
||||
|
||||
validates :content, presence: true
|
||||
|
||||
scope :order_by_recent, -> { order(created_at: :desc) }
|
||||
end
|
||||
|
||||
@@ -22,6 +22,7 @@ class Project < ApplicationRecord
|
||||
has_many :downloads, dependent: :destroy
|
||||
has_many :broadcasts, dependent: :destroy
|
||||
has_many :zoom_meetings, dependent: :destroy
|
||||
has_many :task_requests, dependent: :destroy
|
||||
|
||||
accepts_nested_attributes_for :project_memberships
|
||||
|
||||
|
||||
8
app/models/task_request.rb
Normal file
8
app/models/task_request.rb
Normal file
@@ -0,0 +1,8 @@
|
||||
class TaskRequest < ApplicationRecord
|
||||
belongs_to :project
|
||||
has_many_attached :files
|
||||
|
||||
enum status: [:pending, :completed, :cancelled]
|
||||
|
||||
scope :order_by_recent, -> { order(created_at: :desc) }
|
||||
end
|
||||
@@ -4,9 +4,6 @@ class ZoomMeeting < ApplicationRecord
|
||||
belongs_to :project, optional: true
|
||||
belongs_to :zoom_user
|
||||
|
||||
has_one_attached :recording
|
||||
validates :recording, content_type: ['video/mp4']
|
||||
|
||||
enum status: [:created, :started, :ended]
|
||||
|
||||
after_create :create_api_meeting, if: -> { api_meeting_id.nil? }
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
require 'zoom_gateway'
|
||||
class ZoomUser < ApplicationRecord
|
||||
has_many :zoom_meetings, dependent: :nullify
|
||||
|
||||
|
||||
@@ -3,8 +3,10 @@ class ContractTemplatePolicy < ApplicationPolicy
|
||||
def resolve
|
||||
if user.account_manager?
|
||||
scope.left_outer_joins(:project).where(projects: {account: user.account})
|
||||
else
|
||||
elsif user.manager?
|
||||
scope.left_outer_joins(project: :project_memberships).where(project_memberships: { user_id: user.id })
|
||||
else
|
||||
scope.none
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -12,9 +14,8 @@ class ContractTemplatePolicy < ApplicationPolicy
|
||||
def create?
|
||||
user.manager? || user.account_manager?
|
||||
end
|
||||
|
||||
def show?
|
||||
true
|
||||
create?
|
||||
end
|
||||
|
||||
def destroy?
|
||||
|
||||
@@ -36,4 +36,8 @@ class ProjectPolicy < ApplicationPolicy
|
||||
def show_downloads?
|
||||
show?
|
||||
end
|
||||
|
||||
def show_task_results?
|
||||
show?
|
||||
end
|
||||
end
|
||||
|
||||
25
app/policies/task_request_policy.rb
Normal file
25
app/policies/task_request_policy.rb
Normal file
@@ -0,0 +1,25 @@
|
||||
class TaskRequestPolicy < ApplicationPolicy
|
||||
def index?
|
||||
true
|
||||
end
|
||||
|
||||
def show?
|
||||
true
|
||||
end
|
||||
|
||||
def create?
|
||||
true
|
||||
end
|
||||
|
||||
def destroy?
|
||||
true
|
||||
end
|
||||
|
||||
def update?
|
||||
true
|
||||
end
|
||||
|
||||
def cancel?
|
||||
true
|
||||
end
|
||||
end
|
||||
@@ -151,6 +151,24 @@ class Analytics
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
def track_create_task_request(user_agent:, user_ip:)
|
||||
if analytics_enabled?
|
||||
identify
|
||||
track(
|
||||
{
|
||||
user_id: user.id,
|
||||
event: "Task request created",
|
||||
properties: {
|
||||
account: account.try(:name),
|
||||
account_id: account.try(:id),
|
||||
user_agent: user_agent,
|
||||
ip: user_ip,
|
||||
},
|
||||
}
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
|
||||
@@ -7,6 +7,9 @@
|
||||
<li class="nav-item">
|
||||
<%= link_to fa_icon("users fw", text: "Users"), [:admin, :users], class: class_string("nav-link", "active" => controller_name == "users") %>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<%= link_to fa_icon("tasks fw", text: "Task Requests"), [:admin, :task_requests], class: class_string("nav-link", "active" => controller_name == "task_requests") %>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<%= link_to fa_icon("bug fw", text: "Errors"), "https://sentry.io/bigmedia/", class: "nav-link", target: :_blank %>
|
||||
</li>
|
||||
|
||||
13
app/views/admin/task_requests/_form.html.erb
Normal file
13
app/views/admin/task_requests/_form.html.erb
Normal file
@@ -0,0 +1,13 @@
|
||||
<%= errors_summary_for task_request %>
|
||||
|
||||
<%= bootstrap_form_with model: model, local: true do |form| %>
|
||||
<%= form.select :status, options_for_select(TaskRequest.statuses.except(:cancelled).keys, task_request.status), { class: "form-control" } %>
|
||||
<%= form.text_field :deliverable_url %>
|
||||
|
||||
<div class="row align-items-center text-center mt-4">
|
||||
<%= link_to t("shared.cancel"), [:admin, :task_requests], class: "col-3 text-reset" %>
|
||||
<div class="col-9">
|
||||
<%= form.submit class: class_string("btn btn-block", ["btn-success", "btn-primary"] => task_request.new_record?), data: { disable_with: t("shared.disable_with") } %>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
26
app/views/admin/task_requests/_task_request.html.erb
Normal file
26
app/views/admin/task_requests/_task_request.html.erb
Normal file
@@ -0,0 +1,26 @@
|
||||
<tr id="<%= dom_id(task_request) %>">
|
||||
<td>
|
||||
<%= task_request.id %>
|
||||
</td>
|
||||
<td>
|
||||
<%= task_request.created_at.strftime("%D") %>
|
||||
</td>
|
||||
<td>
|
||||
<%= task_request.deadline.try(:strftime, '%D') %>
|
||||
</td>
|
||||
<td>
|
||||
<%= task_request.time_allowed %>
|
||||
</td>
|
||||
<td>
|
||||
<%= task_request.status.titleize %>
|
||||
</td>
|
||||
<td class="text-right">
|
||||
<div class="btn-group">
|
||||
<%= button_tag "Manage", class: "btn btn-light btn-sm dropdown-toggle border", data: { toggle: "dropdown", boundary: "window" }, aria: { haspopup: true, expanded: false } %>
|
||||
<div class="dropdown-menu dropdown-menu-right">
|
||||
<%= link_to fa_icon("tasks", text: "View"), [:admin, task_request], class: "dropdown-item", target: '_blank' %>
|
||||
<%= link_to fa_icon("pencil", text: "Edit"), [:edit, :admin, task_request], class: "dropdown-item" %>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
6
app/views/admin/task_requests/edit.html.erb
Normal file
6
app/views/admin/task_requests/edit.html.erb
Normal file
@@ -0,0 +1,6 @@
|
||||
<div class="card shadow-sm">
|
||||
<%= card_header text: "Edit Task Request", close_action_path: [:admin, :task_requests] %>
|
||||
<div class="card-body">
|
||||
<%= render "form", model: [:admin, @task_request], task_request: @task_request %>
|
||||
</div>
|
||||
</div>
|
||||
23
app/views/admin/task_requests/index.html.erb
Normal file
23
app/views/admin/task_requests/index.html.erb
Normal file
@@ -0,0 +1,23 @@
|
||||
<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>Task ID</th>
|
||||
<th>Created On</th>
|
||||
<th>Deadline</th>
|
||||
<th>Time Allowed</th>
|
||||
<th>Status</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="users">
|
||||
<% if @task_requests.any? %>
|
||||
<%= render @task_requests %>
|
||||
<% else %>
|
||||
<tr>
|
||||
<td colspan="6" class="py-4 text-center text-muted"><%= t(".empty") %></td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
18
app/views/admin/task_requests/show.html.erb
Normal file
18
app/views/admin/task_requests/show.html.erb
Normal file
@@ -0,0 +1,18 @@
|
||||
<dl>
|
||||
<%= description_list_pair_for @task_request, :description, append: ":" %>
|
||||
<%= description_list_pair_for @task_request, :created_at, append: ":" %>
|
||||
<%= description_list_pair_for @task_request, :deadline, append: ":" %>
|
||||
<%= description_list_pair_for @task_request, :time_allowed, append: ":" %>
|
||||
<%= description_list_pair_for @task_request, :additional_notes, append: ":" %>
|
||||
<%= description_list_pair_for @task_request, :status, append: ":" %>
|
||||
<dt>Files:</dt>
|
||||
<dd>
|
||||
<% if @task_request.files.present? %>
|
||||
<% @task_request.files.each do |file| %>
|
||||
<%= link_to file.filename, rails_blob_path(file, disposition: 'attachment'), class: "btn btn-link" %><br/>
|
||||
<% end %>
|
||||
<% else %>
|
||||
No files attached
|
||||
<% end %>
|
||||
</dd>
|
||||
</dl>
|
||||
@@ -2,7 +2,7 @@
|
||||
<td data-behavior="select"><%= check_box_tag "appearance_release_ids[]", appearance_release.id, false %></td>
|
||||
<td>
|
||||
<% if appearance_release.photo.attached? %>
|
||||
<%= image_tag medium_variant(appearance_release.photo) %>
|
||||
<%= image_tag medium_variant(appearance_release.photo), class: "img-fluid" %>
|
||||
<% else %>
|
||||
<%= fa_icon("warning", text: t(".no_photos"), class: "text-danger") %>
|
||||
<% end %>
|
||||
@@ -11,11 +11,10 @@
|
||||
<%= appearance_release.name %>
|
||||
</td>
|
||||
<td>
|
||||
<%= contact_info(
|
||||
address: appearance_release.person_address,
|
||||
phone: appearance_release.person_phone,
|
||||
email: appearance_release.person_email
|
||||
) %>
|
||||
<%= number_to_phone appearance_release.person_phone %>
|
||||
</td>
|
||||
<td>
|
||||
<%= mail_to appearance_release.person_email %>
|
||||
</td>
|
||||
<td>
|
||||
<%= notes_preview appearance_release.notes.order_by_recent %>
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
<% end %>
|
||||
<div class="d-inline-block">
|
||||
<%= 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" }, help: "PNG or JPG only", accept: appearance_release.class.face_photo_acceptable_content_types.join(",") %>
|
||||
<%= form.file_field :person_photo, wrapper_class: "required", hide_label: true, required: !appearance_release.person_photo.attached?, data: { ujs_target: "person-photo-input" }, help: "PNG or JPG only", accept: appearance_release.class.face_photo_acceptable_content_types.join(",") %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -46,7 +46,8 @@
|
||||
<th data-behavior="all-selectable"><%= check_box_tag "appearance_release_ids[]", false, false %></th>
|
||||
<th></th>
|
||||
<th><%= AppearanceRelease.human_attribute_name(:person_name) %></th>
|
||||
<th><%= AppearanceRelease.human_attribute_name(:contact_info) %></th>
|
||||
<th><%= AppearanceRelease.human_attribute_name(:person_phone) %></th>
|
||||
<th><%= AppearanceRelease.human_attribute_name(:person_email) %></th>
|
||||
<th><%= t(".table_headers.notes") %></th>
|
||||
<th><%= t(".table_headers.tags") %></th>
|
||||
<th><%= t(".table_headers.signed_at") %></th>
|
||||
|
||||
@@ -35,6 +35,12 @@
|
||||
<%= product_wordmark :deliver_me, class: class_string("d-inline-block", "disabled" => !Current.account.deliverme_enabled?) %>
|
||||
<% end %>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<%= link_to [project, :task_requests], class: class_string("nav-link", "active" => controller_name == "task_requests") do %>
|
||||
<%= lock_icon_for(Current.account, :assistme) %>
|
||||
<%= product_wordmark :assist_me, class: class_string("d-inline-block", "disabled" => !Current.account.assistme_enabled?) %>
|
||||
<% end %>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
<hr class="divider-light mx-n4">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<li class="my-2" id="<%= dom_id(file) %>">
|
||||
<li class="my-2">
|
||||
<% if file.variable? %>
|
||||
<%= link_to image_tag(file.variant(resize_and_pad: [300, 300, background: "#F7F8F9"]), class: "bg-light img-thumbnail img-fluid"), file, target: "_blank" %>
|
||||
<% else %>
|
||||
|
||||
@@ -126,6 +126,7 @@
|
||||
<%= render partial: "broadcasts/file_form", locals: { model: [@project, @broadcast] } %>
|
||||
<% end %>
|
||||
</div>
|
||||
<p class="alert alert-info mt-2"><%= fa_icon("warning", text: "You may need to refresh the page to see new files uploaded by other team members") %></p>
|
||||
<div class="overflow-auto mh-30">
|
||||
<ul class="list-unstyled d-flex flex-column align-items-center text-center" id="broadcast_file_list">
|
||||
<% if @files.present? %>
|
||||
@@ -137,7 +138,7 @@
|
||||
<% end %>
|
||||
</ul>
|
||||
<div class="d-flex mt-2 justify-content-center" id="broadcast_files_pagination">
|
||||
<%= will_paginate(@files, params: { active_tab: 'files' }) if @files.present? %>
|
||||
<%= will_paginate(@files, params: { active_tab: 'files' }) if @files.present? %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
$("#broadcast_file_form").html("<%= j render(partial: "broadcasts/file_form", locals: { model: [@project, @broadcast] }) %>");
|
||||
|
||||
var file_id = "#<%= dom_id(@files.first) %>"
|
||||
if ($("#broadcast_file_list").has(file_id).length == 0) {
|
||||
$("#broadcast_file_list").html("<%= j render(partial: "broadcasts/file", collection: @files) %>");
|
||||
$("#broadcast_files_pagination").html("<%= j will_paginate(@files) %>");
|
||||
}
|
||||
$("#broadcast_file_list").html("<%= j render(partial: "broadcasts/file", collection: @files) %>");
|
||||
$("#broadcast_files_pagination").html("<%= j will_paginate(@files) %>");
|
||||
|
||||
bsCustomFileInput.init();
|
||||
@@ -16,6 +16,11 @@
|
||||
<%= link_to t("projects.show.downloads"), [@project, :downloads], class: "text-decoration-none text-reset stretched-link" %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% if policy(Project).show_task_results? %>
|
||||
<%= render "folder_card" do %>
|
||||
<%= link_to t("projects.show.task_requests"), [@project, :task_requests, completed_only: true], class: "text-decoration-none text-reset stretched-link" %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
<hr/>
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
$("#broadcast_file_form").html("<%= j render(partial: "public/broadcasts/file_form", locals: { model: [@project, @broadcast], token: @broadcast.token }) %>");
|
||||
|
||||
var file_id = "#<%= dom_id(@files.first) %>"
|
||||
if ($("#broadcast_file_list").has(file_id).length == 0) {
|
||||
$("#broadcast_file_list").html("<%= j render(partial: "broadcasts/file", collection: @files) %>");
|
||||
$("#broadcast_files_pagination").html("<%= j will_paginate(@files) %>");
|
||||
}
|
||||
$("#broadcast_file_list").html("<%= j render(partial: "broadcasts/file", collection: @files) %>");
|
||||
$("#broadcast_files_pagination").html("<%= j will_paginate(@files) %>");
|
||||
|
||||
bsCustomFileInput.init();
|
||||
34
app/views/task_requests/_form.html.erb
Normal file
34
app/views/task_requests/_form.html.erb
Normal file
@@ -0,0 +1,34 @@
|
||||
<%= errors_summary_for task_request %>
|
||||
|
||||
<%= bootstrap_form_with model: model, local: true do |form| %>
|
||||
<%= form.text_area :description %>
|
||||
<%= form.text_field :deadline, class: "datepicker-control" %>
|
||||
<%= form.text_field :time_allowed %>
|
||||
<%= form.text_area :additional_notes %>
|
||||
<%= field_set_tag content_tag(:span, "Files", class: "h6 text-muted text-uppercase") do %>
|
||||
<div class="field d-none">
|
||||
<%= form.label :files %>
|
||||
<%= form.file_field :files, disable: true, direct_upload: true, multiple: true, id: "task_request_files", hide_label: true %>
|
||||
<% task_request.files.each do |file| %>
|
||||
<% unless file.persisted? %>
|
||||
<%= hidden_field_tag "#{task_request.model_name.param_key}[files][]", file.signed_id %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
<div class="dropzone field border-dashed"
|
||||
data-accepted-files="audio/*,image/*,video/*,application/*"
|
||||
data-behavior="dropzone"
|
||||
data-file-input-id="task_request_files"
|
||||
data-existing-files="<%= mock_photos_json(task_request.files) %>"
|
||||
data-placeholder="<%= dropzone_placeholder_message_for(task_request) %>"
|
||||
data-submit-button="#submit_folder"></div>
|
||||
<% end %>
|
||||
|
||||
<div class="row align-items-center text-center mt-4">
|
||||
<%= link_to t("shared.cancel"), [project, :task_requests], class: "col-3 text-reset" %>
|
||||
<div class="col-9">
|
||||
<%= form.submit class: class_string("btn btn-block", ["btn-success", "btn-primary"] => task_request.new_record?), data: { disable_with: t("shared.disable_with") } %>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
35
app/views/task_requests/_task_request.html.erb
Normal file
35
app/views/task_requests/_task_request.html.erb
Normal file
@@ -0,0 +1,35 @@
|
||||
<tr>
|
||||
<td>
|
||||
<%= task_request.created_at.strftime('%D') %>
|
||||
</td>
|
||||
<td>
|
||||
<%= task_request.deadline.try(:strftime, '%D') %>
|
||||
</td>
|
||||
<td>
|
||||
<%= task_request.time_allowed %>
|
||||
</td>
|
||||
<td>
|
||||
<%= task_request.status.titleize %>
|
||||
</td>
|
||||
<% if params[:completed_only] %>
|
||||
<td>
|
||||
<%= task_request.deliverable_url %>
|
||||
</td>
|
||||
<% end %>
|
||||
<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(task_request).show? %>
|
||||
<%= link_to fa_icon("tasks fw", text: "View"), [task_request.project, task_request], class: "dropdown-item", target: '_blank' %>
|
||||
<% end %>
|
||||
<% if policy(task_request).edit? %>
|
||||
<%= link_to fa_icon("pencil fw", text: "Edit"), [:edit, task_request.project, task_request], class: "dropdown-item" %>
|
||||
<% end %>
|
||||
<% if policy(task_request).cancel? && !task_request.cancelled? %>
|
||||
<%= link_to fa_icon("ban fw", text: "Cancel"), [:cancel, task_request.project, task_request], class: "dropdown-item", method: :post %>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
6
app/views/task_requests/edit.html.erb
Normal file
6
app/views/task_requests/edit.html.erb
Normal file
@@ -0,0 +1,6 @@
|
||||
<div class="card shadow-sm">
|
||||
<%= card_header text: t(".heading"), close_action_path: [@project, :task_requests] %>
|
||||
<div class="card-body">
|
||||
<%= render "form", model: [@project, @task_request], task_request: @task_request, project: @project %>
|
||||
</div>
|
||||
</div>
|
||||
41
app/views/task_requests/index.html.erb
Normal file
41
app/views/task_requests/index.html.erb
Normal file
@@ -0,0 +1,41 @@
|
||||
<%= product_wordmark :assist_me, class: "small mb-3" %>
|
||||
|
||||
<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 policy(TaskRequest).new? %>
|
||||
<%= link_to fa_icon("plus", text: t(".actions.new")), [:new, @project, :task_request], class: "btn btn-primary mb-2" %>
|
||||
<% 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><%= t(".table_headers.task_request_created_on") %></th>
|
||||
<th><%= t(".table_headers.task_request_deadline") %></th>
|
||||
<th><%= t(".table_headers.task_request_time_allowed") %></th>
|
||||
<th><%= t(".table_headers.task_request_status") %></th>
|
||||
<% if params[:completed_only] %>
|
||||
<th><%= t(".table_headers.task_request_results") %></th>
|
||||
<% end %>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="task_requests">
|
||||
<% if @task_requests.any? %>
|
||||
<%= render @task_requests %>
|
||||
<% else %>
|
||||
<tr>
|
||||
<td colspan="5" class="py-4 text-center text-muted"><%= t(".empty") %></td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div id="task_requests_pagination" class="mt-3">
|
||||
<%= will_paginate @task_requests %>
|
||||
</div>
|
||||
6
app/views/task_requests/new.html.erb
Normal file
6
app/views/task_requests/new.html.erb
Normal file
@@ -0,0 +1,6 @@
|
||||
<div class="card shadow-sm">
|
||||
<%= card_header text: t(".heading"), close_action_path: [@project, :task_requests] %>
|
||||
<div class="card-body">
|
||||
<%= render "form", model: [@project, @task_request], task_request: @task_request, project: @project %>
|
||||
</div>
|
||||
</div>
|
||||
18
app/views/task_requests/show.html.erb
Normal file
18
app/views/task_requests/show.html.erb
Normal file
@@ -0,0 +1,18 @@
|
||||
<dl>
|
||||
<%= description_list_pair_for @task_request, :description, append: ":" %>
|
||||
<%= description_list_pair_for @task_request, :created_at, append: ":" %>
|
||||
<%= description_list_pair_for @task_request, :deadline, append: ":" %>
|
||||
<%= description_list_pair_for @task_request, :time_allowed, append: ":" %>
|
||||
<%= description_list_pair_for @task_request, :additional_notes, append: ":" %>
|
||||
<%= description_list_pair_for @task_request, :status, append: ":" %>
|
||||
<dt>Files:</dt>
|
||||
<dd>
|
||||
<% if @task_request.files.present? %>
|
||||
<% @task_request.files.each do |file| %>
|
||||
<%= file.filename %><br>
|
||||
<% end %>
|
||||
<% else %>
|
||||
"No files attached."
|
||||
<% end %>
|
||||
</dd>
|
||||
</dl>
|
||||
@@ -93,6 +93,11 @@ en:
|
||||
application:
|
||||
header:
|
||||
sign_out: Sign Out
|
||||
task_requests:
|
||||
index:
|
||||
empty: Task requests will appear here
|
||||
update:
|
||||
notice: The task request has been updated successfully
|
||||
users:
|
||||
create:
|
||||
notice: The user was created
|
||||
@@ -639,7 +644,6 @@ en:
|
||||
create:
|
||||
notice: Check your email for password reset instructions
|
||||
edit:
|
||||
notice: This password reset URL has expired or is invalid. Try again by clicking "Forgot your password?" below
|
||||
submit: Save New Password
|
||||
title: Password Reset
|
||||
new:
|
||||
@@ -730,6 +734,7 @@ en:
|
||||
music_release: Music Releases (%{count})
|
||||
report: Reports
|
||||
talent_release: Talent Releases (%{count})
|
||||
task_requests: Tasks
|
||||
public:
|
||||
acquired_media_releases:
|
||||
new:
|
||||
@@ -870,6 +875,7 @@ en:
|
||||
title: Sign In
|
||||
shared:
|
||||
ago: ago
|
||||
assist_me: Assist
|
||||
back: Back
|
||||
cancel: Cancel
|
||||
clear: Clear
|
||||
@@ -930,6 +936,31 @@ en:
|
||||
manage: Manage
|
||||
update:
|
||||
notice: The talent release has been updated
|
||||
task_requests:
|
||||
cancel:
|
||||
notice: Task has been cancelled successfully.
|
||||
create:
|
||||
notice: Task request created succussfully.
|
||||
edit:
|
||||
heading:
|
||||
Edit Task Request
|
||||
index:
|
||||
actions:
|
||||
new: Create Task Request
|
||||
empty: Task requests will appear here.
|
||||
table_headers:
|
||||
task_request_created_on: Created On
|
||||
task_request_deadline: Deadline
|
||||
task_request_results: Task Results
|
||||
task_request_status: Status
|
||||
task_request_time_allowed: Time Allowed
|
||||
new:
|
||||
heading: New Task Request
|
||||
task_request:
|
||||
actions:
|
||||
manage: Manage
|
||||
update:
|
||||
notice: Task request updated successfully.
|
||||
user_mailer:
|
||||
existing_account:
|
||||
subject: You've been added as a ME Suite Account Manager
|
||||
|
||||
@@ -31,6 +31,7 @@ Rails.application.routes.draw do
|
||||
resources :users, only: [:index, :new, :create, :edit, :update, :destroy] do
|
||||
resource :masquerade, only: :create
|
||||
end
|
||||
resources :task_requests, only: [:index, :edit, :update, :show]
|
||||
|
||||
root to: "accounts#index", as: :signed_in_root
|
||||
end
|
||||
@@ -97,6 +98,11 @@ Rails.application.routes.draw do
|
||||
delete :destroy_file
|
||||
end
|
||||
end
|
||||
resources :task_requests, except: :destroy do
|
||||
member do
|
||||
post :cancel
|
||||
end
|
||||
end
|
||||
end
|
||||
resource :profile, only: [:show, :update]
|
||||
resources :videos, only: [] do
|
||||
|
||||
14
db/migrate/20200518200245_create_task_requests.rb
Normal file
14
db/migrate/20200518200245_create_task_requests.rb
Normal file
@@ -0,0 +1,14 @@
|
||||
class CreateTaskRequests < ActiveRecord::Migration[6.0]
|
||||
def change
|
||||
create_table :task_requests do |t|
|
||||
t.references :project
|
||||
t.text :description
|
||||
t.datetime :deadline
|
||||
t.string :time_allowed
|
||||
t.text :additional_notes
|
||||
t.integer :status, default: 0
|
||||
|
||||
t.timestamps
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,5 @@
|
||||
class AddDeliverableUrlToTaskRequests < ActiveRecord::Migration[6.0]
|
||||
def change
|
||||
add_column :task_requests, :deliverable_url, :string
|
||||
end
|
||||
end
|
||||
@@ -37,15 +37,15 @@ CREATE EXTENSION IF NOT EXISTS pg_trgm WITH SCHEMA public;
|
||||
COMMENT ON EXTENSION pg_trgm IS 'text similarity measurement and index searching based on trigrams';
|
||||
|
||||
|
||||
--
|
||||
-- Name: pg_search_dmetaphone(text); Type: FUNCTION; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
CREATE FUNCTION public.pg_search_dmetaphone(text) RETURNS text
|
||||
LANGUAGE sql IMMUTABLE STRICT
|
||||
AS $_$
|
||||
SELECT array_to_string(ARRAY(SELECT dmetaphone(unnest(regexp_split_to_array($1, E'\\s+')))), ' ')
|
||||
$_$;
|
||||
--
|
||||
-- Name: pg_search_dmetaphone(text); Type: FUNCTION; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
CREATE FUNCTION public.pg_search_dmetaphone(text) RETURNS text
|
||||
LANGUAGE sql IMMUTABLE STRICT
|
||||
AS $_$
|
||||
SELECT array_to_string(ARRAY(SELECT dmetaphone(unnest(regexp_split_to_array($1, E'\\s+')))), ' ')
|
||||
$_$;
|
||||
|
||||
|
||||
SET default_tablespace = '';
|
||||
@@ -1326,6 +1326,43 @@ CREATE SEQUENCE public.talent_releases_id_seq
|
||||
ALTER SEQUENCE public.talent_releases_id_seq OWNED BY public.talent_releases.id;
|
||||
|
||||
|
||||
--
|
||||
-- Name: task_requests; Type: TABLE; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
CREATE TABLE public.task_requests (
|
||||
id bigint NOT NULL,
|
||||
project_id bigint,
|
||||
description text,
|
||||
deadline timestamp without time zone,
|
||||
time_allowed character varying,
|
||||
additional_notes text,
|
||||
status integer DEFAULT 0,
|
||||
created_at timestamp(6) without time zone NOT NULL,
|
||||
updated_at timestamp(6) without time zone NOT NULL,
|
||||
deliverable_url character varying
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- Name: task_requests_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
CREATE SEQUENCE public.task_requests_id_seq
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
|
||||
|
||||
--
|
||||
-- Name: task_requests_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
ALTER SEQUENCE public.task_requests_id_seq OWNED BY public.task_requests.id;
|
||||
|
||||
|
||||
--
|
||||
-- Name: terms; Type: TABLE; Schema: public; Owner: -
|
||||
--
|
||||
@@ -1559,9 +1596,9 @@ CREATE TABLE public.zoom_meetings (
|
||||
created_at timestamp(6) without time zone NOT NULL,
|
||||
updated_at timestamp(6) without time zone NOT NULL,
|
||||
broadcast_id bigint,
|
||||
status integer DEFAULT 0,
|
||||
zoom_user_id bigint,
|
||||
project_id bigint,
|
||||
status integer DEFAULT 0
|
||||
project_id bigint
|
||||
);
|
||||
|
||||
|
||||
@@ -1832,6 +1869,13 @@ ALTER TABLE ONLY public.tags ALTER COLUMN id SET DEFAULT nextval('public.tags_id
|
||||
ALTER TABLE ONLY public.talent_releases ALTER COLUMN id SET DEFAULT nextval('public.talent_releases_id_seq'::regclass);
|
||||
|
||||
|
||||
--
|
||||
-- Name: task_requests id; Type: DEFAULT; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public.task_requests ALTER COLUMN id SET DEFAULT nextval('public.task_requests_id_seq'::regclass);
|
||||
|
||||
|
||||
--
|
||||
-- Name: terms id; Type: DEFAULT; Schema: public; Owner: -
|
||||
--
|
||||
@@ -2160,6 +2204,14 @@ ALTER TABLE ONLY public.talent_releases
|
||||
ADD CONSTRAINT talent_releases_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: task_requests task_requests_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public.task_requests
|
||||
ADD CONSTRAINT task_requests_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: terms terms_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
||||
--
|
||||
@@ -2763,6 +2815,13 @@ CREATE INDEX index_talent_releases_on_term_id ON public.talent_releases USING bt
|
||||
CREATE INDEX index_talent_releases_on_territory_id ON public.talent_releases USING btree (territory_id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: index_task_requests_on_project_id; Type: INDEX; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
CREATE INDEX index_task_requests_on_project_id ON public.task_requests USING btree (project_id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: index_unreleased_appearances_on_video_id; Type: INDEX; Schema: public; Owner: -
|
||||
--
|
||||
@@ -3499,6 +3558,6 @@ INSERT INTO "schema_migrations" (version) VALUES
|
||||
('20200427073429'),
|
||||
('20200428091105'),
|
||||
('20200507110804'),
|
||||
('20200512161738');
|
||||
|
||||
|
||||
('20200512161738'),
|
||||
('20200518200245'),
|
||||
('20200519191908');
|
||||
|
||||
@@ -23,10 +23,6 @@ class ZoomGateway
|
||||
"#{self.USER_TYPE_NAME}-directme-host"
|
||||
end
|
||||
|
||||
def enable_recordings?
|
||||
ENV['ZOOM_ENABLE_RECORDINGS'] == '1'
|
||||
end
|
||||
|
||||
def apply_limits?
|
||||
self.USER_TYPE_NAME == 'pro'
|
||||
end
|
||||
@@ -37,14 +33,12 @@ class ZoomGateway
|
||||
end
|
||||
|
||||
def create_meeting(host_id, **kwargs)
|
||||
recording_type = self.class.enable_recordings? ? 'cloud' : 'none'
|
||||
meeting = @client.meeting_create({ user_id: host_id,
|
||||
topic: kwargs[:topic],
|
||||
type: 1, # Instant meeting
|
||||
settings: {
|
||||
host_video: true,
|
||||
participant_video: true,
|
||||
auto_recording: recording_type,
|
||||
participant_video: true
|
||||
} })
|
||||
meeting["id"]
|
||||
end
|
||||
@@ -84,10 +78,6 @@ class ZoomGateway
|
||||
@client.user_delete(id: host_id)
|
||||
end
|
||||
|
||||
def delete_recording(meeting_id, recording_id)
|
||||
@client.recording_delete(meeting_id: meeting_id, recording_id: recording_id)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def parse_zoom_error(error)
|
||||
|
||||
@@ -24,20 +24,4 @@ RSpec.describe ProjectsChannel, type: :channel do
|
||||
}.to have_broadcasted_to(project).with(event: "video_status_update", content: content)
|
||||
end
|
||||
end
|
||||
|
||||
describe ".conference_recording_ready" do
|
||||
it "broadcasts to the project channel" do
|
||||
recording_file = Rack::Test::UploadedFile.new(Rails.root.join("spec", "fixtures", "files", "video_file.mp4"), "video/mp4")
|
||||
zoom_meeting = create(:zoom_meeting, project: project, recording: recording_file)
|
||||
video_url = 'http://url.to.video/video.mp4'
|
||||
allow(zoom_meeting.recording).to receive(:service_url).and_return(video_url)
|
||||
|
||||
expect {
|
||||
ProjectsChannel.conference_recording_ready(project, zoom_meeting.recording)
|
||||
}.to have_broadcasted_to(project).with { |data|
|
||||
expect(data['content']).to include(video_url)
|
||||
expect(data['event']).to eq('conference_recording_ready')
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
68
spec/controllers/admin/task_requests_controller_spec.rb
Normal file
68
spec/controllers/admin/task_requests_controller_spec.rb
Normal file
@@ -0,0 +1,68 @@
|
||||
require "rails_helper"
|
||||
|
||||
RSpec.describe Admin::TaskRequestsController, type: :controller do
|
||||
render_views
|
||||
|
||||
let!(:current_user) { create(:user, :admin) }
|
||||
|
||||
before do
|
||||
sign_in(current_user)
|
||||
end
|
||||
|
||||
describe "#index" do
|
||||
it "returns a successful response" do
|
||||
get :index
|
||||
|
||||
expect(response).to be_successful
|
||||
end
|
||||
end
|
||||
|
||||
describe "#edit" do
|
||||
let(:task_request) { create(:task_request) }
|
||||
|
||||
it "returns a successful response" do
|
||||
get :edit, params: { id: task_request }
|
||||
|
||||
expect(response).to be_successful
|
||||
end
|
||||
|
||||
it "assigns task request" do
|
||||
get :edit, params: { id: task_request }
|
||||
|
||||
expect(assigns(:task_request)).to eq task_request
|
||||
end
|
||||
end
|
||||
|
||||
describe "#update" do
|
||||
let(:task_request) { create(:task_request) }
|
||||
|
||||
it "redirects to task requests page" do
|
||||
patch :update, params: { id: task_request, task_request: update_params }
|
||||
|
||||
expect(response).to be_redirect
|
||||
expect(response).to redirect_to admin_task_requests_path
|
||||
end
|
||||
|
||||
it "sets a flash notice" do
|
||||
patch :update, params: { id: task_request, task_request: update_params }
|
||||
|
||||
expect(flash.notice).to eq "The task request has been updated successfully"
|
||||
end
|
||||
|
||||
it "updates task request" do
|
||||
patch :update, params: { id: task_request, task_request: update_params }
|
||||
|
||||
expect(task_request.reload.status).to eq("completed")
|
||||
expect(task_request.reload.deliverable_url).to eq("example.com/deliverables")
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def update_params
|
||||
{
|
||||
status: "completed",
|
||||
deliverable_url: "example.com/deliverables"
|
||||
}
|
||||
end
|
||||
end
|
||||
@@ -26,7 +26,8 @@ RSpec.describe AppearanceReleasesController, tye: :controller do
|
||||
get :index, params: { project_id: project }
|
||||
|
||||
expect(response.body).to have_content "John Doe"
|
||||
expect(response.body).to have_content "P: 5551234567E: jane.doe@test.com"
|
||||
expect(response.body).to have_content "555-123-4567"
|
||||
expect(response.body).to have_content "jane.doe@test.com"
|
||||
expect(response.body).to have_content "Some notes here"
|
||||
expect(response.body).to have_button "Import Release"
|
||||
expect(response.body).to have_content "Manage"
|
||||
|
||||
@@ -56,16 +56,6 @@ RSpec.describe PasswordResetsController, type: :controller do
|
||||
expect(response.body).to have_content("Password Reset")
|
||||
expect(response.body).to have_selector("input[name='password_reset[password]']")
|
||||
end
|
||||
|
||||
context "when reset token is invalid" do
|
||||
it "redirects to the sign in page" do
|
||||
get :edit, params: { id: "bad token" }
|
||||
|
||||
expect(response).to be_redirect
|
||||
expect(response).to redirect_to(new_session_path)
|
||||
expect(flash.notice).to be_present
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "#update" do
|
||||
|
||||
130
spec/controllers/task_requests_controller_spec.rb
Normal file
130
spec/controllers/task_requests_controller_spec.rb
Normal file
@@ -0,0 +1,130 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe TaskRequestsController, type: :controller do
|
||||
render_views
|
||||
|
||||
let(:user) { create(:user) }
|
||||
let(:account) { user.primary_account }
|
||||
let(:project) { create(:project, account: user.primary_account) }
|
||||
|
||||
before do
|
||||
sign_in user
|
||||
end
|
||||
|
||||
describe "#index" do
|
||||
it "responds successfully" do
|
||||
get :index, params: { project_id: project }
|
||||
|
||||
expect(response).to be_successful
|
||||
end
|
||||
|
||||
it "renders content" do
|
||||
create(:task_request, project: project, description: "Another Request")
|
||||
|
||||
get :index, params: { project_id: project }
|
||||
|
||||
expect(response.body).to have_link "Create Task Request"
|
||||
expect(response.body).to have_content "Pending"
|
||||
end
|
||||
|
||||
context "when there are many records" do
|
||||
it "paginates the table" do
|
||||
create_list(:task_request, 20, project: project)
|
||||
|
||||
get :index, params: { project_id: project }
|
||||
|
||||
expect(response.body).to have_link("2", href: project_task_requests_path(project, page: 2))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "#new" do
|
||||
it "responds successfully" do
|
||||
get :new, params: { project_id: project }
|
||||
|
||||
expect(response).to be_successful
|
||||
expect(assigns(:task_request)).to be_a_new(TaskRequest)
|
||||
expect(response).to render_template(:new)
|
||||
end
|
||||
end
|
||||
|
||||
describe "#create" do
|
||||
it "responds with a redirect" do
|
||||
post :create, params: { project_id: project.id, task_request: task_request_params }
|
||||
|
||||
expect(response).to be_redirect
|
||||
expect(flash.notice).not_to be_nil
|
||||
end
|
||||
|
||||
it "does create a new record" do
|
||||
expect {
|
||||
post :create, params: { project_id: project.id, task_request: task_request_params }
|
||||
}.to change(TaskRequest, :count)
|
||||
end
|
||||
|
||||
it "logs an event" do
|
||||
expect {
|
||||
post :create, params: { project_id: project.id, task_request: task_request_params }
|
||||
}.to have_enqueued_job(TrackAnalyticsJob).with(user, account, :track_create_task_request, user_agent: "Rails Testing", user_ip: "0.0.0.0")
|
||||
end
|
||||
end
|
||||
|
||||
describe "#update" do
|
||||
let!(:task_request) { create(:task_request, project: project, description: "My description" ) }
|
||||
|
||||
it "updates task request" do
|
||||
patch :update, params: { project_id: project.id, id: task_request.id, task_request: update_params }
|
||||
|
||||
expect(task_request.reload.description).to eq("This is updated description")
|
||||
end
|
||||
end
|
||||
|
||||
describe "#show" do
|
||||
let!(:task_request) { create(:task_request, project: project, description: "Task Request") }
|
||||
|
||||
it "responds successfully" do
|
||||
get :show, params: { project_id: project.id, id: task_request.id }
|
||||
|
||||
expect(response).to be_successful
|
||||
expect(assigns(:task_request)).to eq(task_request)
|
||||
end
|
||||
|
||||
it "renders content" do
|
||||
get :show, params: { project_id: project.id, id: task_request.id }
|
||||
|
||||
expect(response.body).to have_content "Task Request"
|
||||
expect(response.body).to have_content "pending"
|
||||
end
|
||||
end
|
||||
|
||||
describe "#cancel" do
|
||||
let!(:task_request) { create(:task_request, project: project, description: "Task to be cancelled") }
|
||||
|
||||
it "responds with redirect" do
|
||||
post :cancel, params: { project_id: project.id, id: task_request.id }
|
||||
|
||||
expect(response).to be_redirect
|
||||
expect(response).to redirect_to(project_task_requests_path(project))
|
||||
expect(flash.notice).not_to be_nil
|
||||
end
|
||||
|
||||
it "updates the status to 'cancelled'" do
|
||||
expect {
|
||||
post :cancel, params: { project_id: project.id, id: task_request.id }
|
||||
}.to change { task_request.reload.status }.from("pending").to("cancelled")
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def task_request_params
|
||||
attributes = attributes_for(:task_request).except(:status)
|
||||
files = 2.times.map { Rack::Test::UploadedFile.new(file_fixture("location_photo.png"), "image/png") }
|
||||
|
||||
attributes.merge({ files: files })
|
||||
end
|
||||
|
||||
def update_params
|
||||
{ description: "This is updated description" }
|
||||
end
|
||||
end
|
||||
@@ -69,13 +69,6 @@ RSpec.describe ZoomNotificationsController, type: :controller do
|
||||
|
||||
expect(zoom_meeting.reload).to be_ended
|
||||
end
|
||||
|
||||
it 'updates the recording when recording complete notification is received' do
|
||||
expect {
|
||||
post :create, params: recording_complete
|
||||
}.to change { zoom_meeting.recording }
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
14
spec/factories/task_requests.rb
Normal file
14
spec/factories/task_requests.rb
Normal file
@@ -0,0 +1,14 @@
|
||||
FactoryBot.define do
|
||||
factory :task_request do
|
||||
association :project
|
||||
deadline { 10.days.from_now }
|
||||
time_allowed "10 days"
|
||||
description "Task request"
|
||||
additional_notes "Additional notes"
|
||||
status 0
|
||||
|
||||
trait :with_files do
|
||||
files { [Rack::Test::UploadedFile.new('spec/fixtures/files/contract.pdf', 'application/pdf')] }
|
||||
end
|
||||
end
|
||||
end
|
||||
61
spec/features/admin_managing_task_requests_spec.rb
Normal file
61
spec/features/admin_managing_task_requests_spec.rb
Normal file
@@ -0,0 +1,61 @@
|
||||
require "rails_helper"
|
||||
|
||||
feature "Admin managing task requests" do
|
||||
let(:current_user) { create(:user, admin: true, email: "user@test.com") }
|
||||
let(:project) { create(:project, account: current_user.primary_account, name: "Test Project") }
|
||||
|
||||
before do
|
||||
sign_in current_user
|
||||
end
|
||||
|
||||
scenario "admin should see View action for task request in Manage dropdown", js: true do
|
||||
create(:task_request)
|
||||
visit admin_task_requests_path
|
||||
|
||||
click_on 'Manage'
|
||||
expect(page).to have_content 'View'
|
||||
end
|
||||
|
||||
scenario "admin can open detail view of task request", js: true do
|
||||
task_request = create(:task_request, :with_files)
|
||||
visit admin_task_requests_path
|
||||
|
||||
click_on 'Manage'
|
||||
click_link 'View'
|
||||
switch_to_window(windows.last)
|
||||
|
||||
expect(page).to have_content 'Description'
|
||||
expect(page).to have_content task_request.description
|
||||
|
||||
expect(page).to have_content 'Created At'
|
||||
expect(page).to have_content task_request.created_at
|
||||
|
||||
expect(page).to have_content 'Deadline'
|
||||
expect(page).to have_content task_request.deadline
|
||||
|
||||
expect(page).to have_content 'Time Allowed'
|
||||
expect(page).to have_content task_request.time_allowed
|
||||
|
||||
expect(page).to have_content 'Additional Notes'
|
||||
expect(page).to have_content task_request.additional_notes
|
||||
|
||||
expect(page).to have_content 'Status'
|
||||
expect(page).to have_content task_request.status
|
||||
|
||||
expect(page).to have_content 'Files'
|
||||
task_request.files.each do |file|
|
||||
expect(page).to have_link file.blob.filename
|
||||
end
|
||||
end
|
||||
|
||||
scenario "no files attached label is shown if there are no files attached to the task request", js:true do
|
||||
create(:task_request)
|
||||
visit admin_task_requests_path
|
||||
|
||||
click_on 'Manage'
|
||||
click_link 'View'
|
||||
switch_to_window(windows.last)
|
||||
|
||||
expect(page).to have_content 'No files attached'
|
||||
end
|
||||
end
|
||||
@@ -1,45 +0,0 @@
|
||||
require "rails_helper"
|
||||
|
||||
describe AttachRecordingToZoomMeetingJob do
|
||||
let(:project) { create(:project) }
|
||||
let(:zoom_meeting) { create(:zoom_meeting, project: project) }
|
||||
let(:recording_hash) { {'id' => 'recording-id', 'download_url' => 'http://download.url', 'recording_start' => '2020-05-22 16:33:50 UTC', 'recording_end' => '2020-05-22 17:34:06 UTC'} }
|
||||
let(:download_token) { 'download_token' }
|
||||
|
||||
before :each do
|
||||
allow_any_instance_of(ZoomGateway).to receive(:delete_recording)
|
||||
end
|
||||
|
||||
describe ".perform_now" do
|
||||
it "downloads the video" do
|
||||
allow(zoom_meeting.recording).to receive(:attach)
|
||||
|
||||
expect(URI).to receive(:open).with("http://download.url?access_token=download_token")
|
||||
AttachRecordingToZoomMeetingJob.perform_now zoom_meeting, recording_hash, download_token
|
||||
end
|
||||
|
||||
it "deletes the recording through the API" do
|
||||
stub_uri_open
|
||||
allow(zoom_meeting.recording).to receive(:attach).and_return(true)
|
||||
|
||||
expect_any_instance_of(ZoomGateway).to receive(:delete_recording).with(zoom_meeting.api_meeting_id, 'recording-id')
|
||||
AttachRecordingToZoomMeetingJob.perform_now zoom_meeting, recording_hash, download_token
|
||||
end
|
||||
|
||||
it "attaches downloaded video to recording" do
|
||||
allow(zoom_meeting.recording).to receive(:attach)
|
||||
stub_uri_open
|
||||
|
||||
AttachRecordingToZoomMeetingJob.perform_now zoom_meeting, recording_hash, download_token
|
||||
expect(zoom_meeting.recording).to have_received(:attach).with(hash_including(content_type: 'video/mp4'))
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def stub_uri_open
|
||||
url = "http://download.url?access_token=download_token"
|
||||
file = double(:file, read: 'stubbed read')
|
||||
allow(URI).to receive(:open).with(url).and_return(file)
|
||||
end
|
||||
end
|
||||
@@ -64,21 +64,6 @@ RSpec.describe ZoomGateway do
|
||||
expect(ZoomGateway.HOST_ROLE).to eq('pro-directme-host')
|
||||
end
|
||||
end
|
||||
|
||||
context '.enable_recordings?' do
|
||||
it 'is truthy when ZOOM_ENABLE_RECORDINGS is set to 1' do
|
||||
stub_env_variable('ZOOM_ENABLE_RECORDINGS', '1')
|
||||
expect(ZoomGateway.enable_recordings?).to be_truthy
|
||||
end
|
||||
|
||||
it 'is falsey otherwise' do
|
||||
stub_env_variable('ZOOM_ENABLE_RECORDINGS', '0')
|
||||
expect(ZoomGateway.enable_recordings?).to be_falsey
|
||||
|
||||
stub_env_variable('ZOOM_ENABLE_RECORDINGS', '2')
|
||||
expect(ZoomGateway.enable_recordings?).to be_falsey
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe ".find_meeting" do
|
||||
@@ -126,13 +111,6 @@ RSpec.describe ZoomGateway do
|
||||
end
|
||||
end
|
||||
|
||||
describe '.delete_recording' do
|
||||
it 'calls api client to delete recording' do
|
||||
expect_any_instance_of(Zoom.new.class).to receive(:recording_delete)
|
||||
gateway.delete_recording('meeting-id', 'recording-id')
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def stub_env_variable(name, value)
|
||||
|
||||
@@ -66,16 +66,14 @@ RSpec.describe Account do
|
||||
end
|
||||
|
||||
describe "#storage_total" do
|
||||
it "sums videos, release photos, contracts, signatures, recordings" do
|
||||
it "sums videos, release photos, contracts, signatures" do
|
||||
video_file = Rack::Test::UploadedFile.new(Rails.root.join("spec", "fixtures", "files", "video_file.mp4"), "video/mp4")
|
||||
recording_file = Rack::Test::UploadedFile.new(Rails.root.join("spec", "fixtures", "files", "video_file.mp4"), "video/mp4")
|
||||
photo_file = Rack::Test::UploadedFile.new(Rails.root.join("spec", "fixtures", "files", "person_photo.png"), "image/png")
|
||||
contract_file = Rack::Test::UploadedFile.new(Rails.root.join("spec", "fixtures", "files", "contract.pdf"), "application/pdf")
|
||||
signature_file = Rack::Test::UploadedFile.new(Rails.root.join("spec", "fixtures", "files", "signature.png"), "image/png")
|
||||
edl_file = Rack::Test::UploadedFile.new(Rails.root.join("spec", "fixtures", "files", "sample-edl.edl"), "application/octet-stream")
|
||||
|
||||
expect(video_file.size).to eq 1_055_736
|
||||
expect(recording_file.size).to eq 1_055_736
|
||||
expect(edl_file.size).to eq 440
|
||||
expect(photo_file.size).to eq 910
|
||||
expect(contract_file.size).to eq 12
|
||||
@@ -91,9 +89,8 @@ RSpec.describe Account do
|
||||
acquired_media_release = create(:acquired_media_release, project: project, contract: contract_file)
|
||||
import = create(:import, project: project, file: contract_file)
|
||||
music_release = create(:music_release, project: project, contract: contract_file)
|
||||
zoom_meeting = create(:zoom_meeting, project: project, recording: recording_file)
|
||||
|
||||
expect(account.storage_total).to eq 2_125_672
|
||||
expect(account.storage_total).to eq 1_069_936
|
||||
end
|
||||
|
||||
it "sums only for projects tied to account" do
|
||||
@@ -129,8 +126,8 @@ RSpec.describe Account do
|
||||
Download,
|
||||
User,
|
||||
Broadcast,
|
||||
Account,
|
||||
ZoomMeeting
|
||||
TaskRequest,
|
||||
Account
|
||||
]
|
||||
Rails.application.eager_load!
|
||||
ActiveRecord::Base.descendants.each do |model|
|
||||
|
||||
@@ -6,7 +6,6 @@ describe HeadshotCollection do
|
||||
project = create(:project,
|
||||
appearance_releases: create_list(:appearance_release, 1),
|
||||
talent_releases: create_list(:talent_release, 1),
|
||||
headshot_collection_uid: "123abc"
|
||||
)
|
||||
|
||||
collection = HeadshotCollection.for_project(project)
|
||||
@@ -15,7 +14,7 @@ describe HeadshotCollection do
|
||||
expect(collection).to be_a(HeadshotCollection)
|
||||
expect(collection.releasables).to include(project.appearance_releases.first)
|
||||
expect(collection.releasables).to include(project.talent_releases.first)
|
||||
expect(collection.collection_uid).to eq(project.headshot_collection_uid)
|
||||
expect(collection.collection_uid).to eq(project.id)
|
||||
end
|
||||
|
||||
context "when a release has no headshot photo attachment" do
|
||||
@@ -86,17 +85,6 @@ describe HeadshotCollection do
|
||||
expect(mapping["appearance_release_#{releases.first.id}"]).to include("123")
|
||||
expect(mapping["talent_release_#{releases.last.id}"]).to include("456")
|
||||
end
|
||||
|
||||
context "when collection uid is blank" do
|
||||
it "is not included in the hash" do
|
||||
releases = []
|
||||
collection = HeadshotCollection.new(nil, releases)
|
||||
|
||||
hash = collection.to_hash
|
||||
|
||||
expect(hash.keys).not_to include(:collection_uid)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
16
spec/models/task_request_spec.rb
Normal file
16
spec/models/task_request_spec.rb
Normal file
@@ -0,0 +1,16 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe TaskRequest, type: :model do
|
||||
describe "associations" do
|
||||
it { is_expected.to belong_to(:project) }
|
||||
end
|
||||
|
||||
describe "enums" do
|
||||
it { is_expected.to define_enum_for(:status).with_values([:pending, :completed, :cancelled]) }
|
||||
end
|
||||
|
||||
describe "#order_by_recent" do
|
||||
subject { described_class }
|
||||
it { is_expected.to respond_to(:order_by_recent) }
|
||||
end
|
||||
end
|
||||
@@ -16,17 +16,6 @@ RSpec.describe ZoomMeeting, type: :model do
|
||||
end
|
||||
|
||||
|
||||
describe "attachments" do
|
||||
it { is_expected.to respond_to(:recording) }
|
||||
end
|
||||
|
||||
describe "validations" do
|
||||
context '#recording' do
|
||||
it { is_expected.to allow_content_type("video/mp4").for(:recording) }
|
||||
it { is_expected.not_to allow_content_types("image/png").for(:recording) }
|
||||
end
|
||||
end
|
||||
|
||||
describe 'associations' do
|
||||
it { is_expected.to belong_to(:zoom_user) }
|
||||
it { is_expected.to belong_to(:project).optional(true) }
|
||||
|
||||
@@ -15,10 +15,6 @@ describe ContractTemplatePolicy do
|
||||
it { is_expected.not_to permit(user_context, :create) }
|
||||
end
|
||||
|
||||
permissions :show? do
|
||||
it { is_expected.to permit(user_context, :show) }
|
||||
end
|
||||
|
||||
permissions :destroy? do
|
||||
it { is_expected.not_to permit(user_context, contract_template) }
|
||||
|
||||
@@ -37,32 +33,6 @@ describe ContractTemplatePolicy do
|
||||
it { is_expected.to permit(user_context, :create) }
|
||||
end
|
||||
|
||||
permissions :show? do
|
||||
it { is_expected.to permit(user_context, :show) }
|
||||
end
|
||||
|
||||
permissions :destroy? do
|
||||
it { is_expected.to permit(user_context, contract_template) }
|
||||
|
||||
context "when there are associated releases" do
|
||||
let(:contract_template) { create(:contract_template, appearance_releases: build_list(:appearance_release, 1)) }
|
||||
|
||||
it { is_expected.to permit(user_context, contract_template) }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context "for an account manager" do
|
||||
let(:user) { create(:user, :account_manager) }
|
||||
|
||||
permissions :create? do
|
||||
it { is_expected.to permit(user_context, :create) }
|
||||
end
|
||||
|
||||
permissions :show? do
|
||||
it { is_expected.to permit(user_context, :show) }
|
||||
end
|
||||
|
||||
permissions :destroy? do
|
||||
it { is_expected.to permit(user_context, contract_template) }
|
||||
|
||||
@@ -109,7 +79,7 @@ describe ContractTemplatePolicy do
|
||||
context "for associate" do
|
||||
let(:user) { create(:user, :associate, primary_account: account) }
|
||||
|
||||
it { is_expected.to include(member_project.contract_templates.first) }
|
||||
it { is_expected.not_to include(member_project.contract_templates.first) }
|
||||
it { is_expected.not_to include(non_member_project.contract_templates.first) }
|
||||
it { is_expected.not_to include(outside_project.contract_templates.first) }
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user