Upstream sync
This commit is contained in:
@@ -8,11 +8,16 @@ $(document).on "turbolinks:load", ->
|
||||
# Called when the subscription has been terminated by the server
|
||||
|
||||
received: (data) ->
|
||||
return unless document.querySelector("meta[name=broadcast-token][content='#{broadcastToken}']")
|
||||
switch data.event
|
||||
when "broadcast_stream_update" then @refreshBroadcastVideo(data)
|
||||
when "stream_recording_ready" then @showBroadcastRecordings(data)
|
||||
when "file_upload_update" then @refreshBroadcastFilesTab(data)
|
||||
when "broadcast_stream_update"
|
||||
return unless document.querySelector("meta[name=broadcast-token][current=true][content='#{broadcastToken}']")
|
||||
@refreshBroadcastVideo(data)
|
||||
when "stream_recording_ready"
|
||||
return unless document.querySelector("meta[name=broadcast-token][current=true][content='#{broadcastToken}']")
|
||||
@showBroadcastRecordings(data)
|
||||
when "file_upload_update"
|
||||
return unless document.querySelector("meta[name=broadcast-token][content='#{broadcastToken}']")
|
||||
@refreshBroadcastFilesTab(data)
|
||||
|
||||
refreshBroadcastVideo: (data) ->
|
||||
$("#broadcast_updates").html data.status_content
|
||||
|
||||
@@ -31,7 +31,7 @@ u {
|
||||
}
|
||||
|
||||
.page {
|
||||
page-break-before: always;
|
||||
page-break-before: always;
|
||||
}
|
||||
|
||||
.logo {
|
||||
@@ -44,6 +44,14 @@ u {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.qr-code {
|
||||
margin-right: -30px;
|
||||
}
|
||||
|
||||
.do-not-copy-warning {
|
||||
padding-right: 15px;
|
||||
}
|
||||
|
||||
.heading-table td {
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
@@ -3,15 +3,25 @@
|
||||
class Api::DirectUploadsController < Api::ApiController
|
||||
include ActiveStorage::SetCurrent
|
||||
|
||||
deserializable_resource :direct_upload, only: [:create]
|
||||
|
||||
def create
|
||||
blob = ActiveStorage::Blob.create_before_direct_upload!(blob_args)
|
||||
blob = ActiveStorage::Blob.create_before_direct_upload!(blob_params)
|
||||
render jsonapi: DirectUpload.new(blob)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def blob_args
|
||||
params.require(:blob).permit(:filename, :byte_size, :checksum, :content_type, :metadata).to_h.symbolize_keys
|
||||
def blob_params
|
||||
params.
|
||||
require(:direct_upload).
|
||||
permit(:type, :filename, :byte_size, :checksum, :content_type, :metadata).
|
||||
except(:type).
|
||||
to_h.symbolize_keys
|
||||
end
|
||||
|
||||
class DeserializableDirectUpload < JSONAPI::Deserializable::Resource
|
||||
attributes :filename, :byte_size, :checksum, :content_type, :metadata
|
||||
end
|
||||
|
||||
class SerializableDirectUpload < JSONAPI::Serializable::Resource
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
class AppearanceReleaseImportsController < ApplicationController
|
||||
include AppearanceReleaseContext
|
||||
include ProjectContext
|
||||
include CreateReleasableJobs
|
||||
|
||||
before_action :set_project, only: [:create]
|
||||
|
||||
@@ -11,24 +10,16 @@ class AppearanceReleaseImportsController < ApplicationController
|
||||
|
||||
def create
|
||||
authorize AppearanceRelease
|
||||
@failed_files = []
|
||||
attachments = appearance_release_params
|
||||
|
||||
if attachments.nil?
|
||||
alert_message = t 'appearance_releases.create.no_attachments'
|
||||
redirect_to [@project, :appearance_releases], alert: alert_message
|
||||
else
|
||||
attachments.each do |attachment|
|
||||
create_imported_appearance_release attachment
|
||||
end
|
||||
MatchAppearanceReleasesJob.perform_later(@project, attachments)
|
||||
notice_message = t 'appearance_releases.create.matching_started'
|
||||
redirect_to [@project, :appearance_releases], notice: notice_message
|
||||
end
|
||||
|
||||
unless @failed_files.empty?
|
||||
alert_message = t 'appearance_releases.create.failed_import'
|
||||
alert_message += '<br><ul>'
|
||||
@failed_files.each { |file_name| alert_message += "<li>#{file_name}</li>" }
|
||||
alert_message += '</ul>'
|
||||
end
|
||||
|
||||
redirect_to [@project, :appearance_releases], alert: alert_message
|
||||
end
|
||||
|
||||
private
|
||||
@@ -45,45 +36,7 @@ class AppearanceReleaseImportsController < ApplicationController
|
||||
params.require(:attachments)
|
||||
end
|
||||
|
||||
def build_appearance_release(params = {})
|
||||
authorize appearance_releases.build(params)
|
||||
end
|
||||
|
||||
def log_create_analytics
|
||||
TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_non_native_release, release_type: AppearanceRelease.to_s, user_agent: request.user_agent, user_ip: request.remote_ip)
|
||||
end
|
||||
|
||||
def create_imported_appearance_release(attachment)
|
||||
blob = ActiveStorage::Blob.find_signed(attachment)
|
||||
return if blob.nil?
|
||||
|
||||
extension = blob.filename.extension_with_delimiter
|
||||
unless AppearanceRelease.acceptable_import_file_extensions.include? extension
|
||||
blob.purge
|
||||
@failed_files << blob.filename
|
||||
return
|
||||
end
|
||||
|
||||
random_contract_no = AppearanceRelease.random_contract_number.to_s
|
||||
appearance_release_params = {
|
||||
person_last_name: random_contract_no
|
||||
}
|
||||
|
||||
if blob.image?
|
||||
appearance_release_params[:person_photo] = attachment
|
||||
appearance_release_params[:person_first_name] = I18n.t('appearance_releases.shared.imported_appearance_release_headshot_name')
|
||||
elsif extension == '.pdf'
|
||||
appearance_release_params[:contract] = attachment
|
||||
appearance_release_params[:person_first_name] = I18n.t('appearance_releases.shared.imported_appearance_release_contract_name')
|
||||
end
|
||||
|
||||
appearance_release = build_appearance_release(appearance_release_params)
|
||||
|
||||
if appearance_release.save(context: :non_native)
|
||||
log_create_analytics
|
||||
after_create appearance_release
|
||||
else
|
||||
@failed_files << blob.filename
|
||||
end
|
||||
def acceptable_extensions
|
||||
AppearanceRelease.acceptable_import_file_extensions
|
||||
end
|
||||
end
|
||||
|
||||
100
app/jobs/match_appearance_releases_job.rb
Normal file
100
app/jobs/match_appearance_releases_job.rb
Normal file
@@ -0,0 +1,100 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class MatchAppearanceReleasesJob < ApplicationJob
|
||||
queue_as :default
|
||||
|
||||
def perform(project, attachments)
|
||||
filtered_attachments_object = filter_attachments attachments
|
||||
|
||||
return if filtered_attachments_object[:keys].blank?
|
||||
|
||||
matching_request = MatchingRequest.create project: project, attachments: filtered_attachments_object[:signed_ids]
|
||||
|
||||
payload = { request_id: matching_request.id, bucket: aws_bucket_name, files: filtered_attachments_object[:keys]}
|
||||
response = BrayniacAI::QrMatching.create! payload
|
||||
matches = response.matches || []
|
||||
key_signed_id_hash = Hash[filtered_attachments_object[:keys].zip(filtered_attachments_object[:signed_ids])]
|
||||
handle_matches matches, project, key_signed_id_hash
|
||||
matching_request.destroy
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def handle_matches(matches, project, key_signed_id_hash)
|
||||
matches.each do |match|
|
||||
contract_key = Array.wrap(match.contracts).first
|
||||
headshot_key = Array.wrap(match.headshots).first
|
||||
identifier = match.identifier
|
||||
|
||||
contract = key_signed_id_hash[contract_key]
|
||||
headshot = key_signed_id_hash[headshot_key]
|
||||
|
||||
next if contract.nil? && headshot.nil?
|
||||
|
||||
identified_release = identifier.blank? ? nil : AppearanceRelease.find_by(identifier: identifier)
|
||||
if identified_release.nil?
|
||||
create_release project, contract, headshot, identifier
|
||||
else
|
||||
update_release identified_release, contract, headshot
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def create_release(project, contract, headshot, identifier)
|
||||
random_contract_no = AppearanceRelease.random_contract_number.to_s
|
||||
is_incomplete = contract.nil? || headshot.nil?
|
||||
params = {
|
||||
project: project,
|
||||
person_first_name: appearance_first_name(is_incomplete),
|
||||
person_last_name: random_contract_no
|
||||
}
|
||||
|
||||
params[:person_photo] = headshot unless headshot.nil?
|
||||
params[:contract] = contract unless contract.nil?
|
||||
params[:identifier] = identifier unless blank?
|
||||
|
||||
return if AppearanceRelease.create(params)
|
||||
|
||||
logger.error "Failed to create AppearanceRelease with params : \r\n#{params}"
|
||||
end
|
||||
|
||||
def update_release(release, contract, headshot)
|
||||
release.contract = contract unless contract.nil?
|
||||
release.person_photo = headshot unless headshot.nil?
|
||||
|
||||
release.save
|
||||
end
|
||||
|
||||
def appearance_first_name(incomplete)
|
||||
if incomplete
|
||||
I18n.t('appearance_releases.shared.incomplete_match')
|
||||
else
|
||||
I18n.t('appearance_releases.shared.matched_import')
|
||||
end
|
||||
end
|
||||
|
||||
def aws_bucket_name
|
||||
ENV.fetch 'AWS_BUCKET'
|
||||
end
|
||||
|
||||
def filter_attachments(attachments)
|
||||
filtered_attachments_keys = []
|
||||
filtered_attachments_signed_ids = []
|
||||
|
||||
attachments.each do |attachment|
|
||||
blob = ActiveStorage::Blob.find_signed attachment
|
||||
next if blob.nil?
|
||||
|
||||
extension = blob.filename.extension
|
||||
next unless blob.image? || extension == 'pdf'
|
||||
|
||||
filtered_attachments_keys << blob.key
|
||||
filtered_attachments_signed_ids << attachment
|
||||
end
|
||||
|
||||
{
|
||||
keys: filtered_attachments_keys,
|
||||
signed_ids: filtered_attachments_signed_ids
|
||||
}
|
||||
end
|
||||
end
|
||||
@@ -56,6 +56,7 @@ class Account < ApplicationRecord
|
||||
Broadcast.where(project: projects),
|
||||
ZoomMeeting.where(project: projects),
|
||||
MedicalRelease.where(project: projects),
|
||||
MatchingRequest.where(project: projects),
|
||||
self
|
||||
])).sum(:byte_size).to_f
|
||||
end
|
||||
|
||||
@@ -8,7 +8,7 @@ class BlankContract
|
||||
end
|
||||
|
||||
def to_pdf
|
||||
kit = PDFKit.new(as_html)
|
||||
kit = PDFKit.new(as_html, margin_right: 1, margin_left: 1, margin_top: 10, margin_bottom: 1)
|
||||
kit.to_file("tmp/#{filename}")
|
||||
end
|
||||
|
||||
|
||||
9
app/models/concerns/attachable.rb
Normal file
9
app/models/concerns/attachable.rb
Normal file
@@ -0,0 +1,9 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Attachable
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
has_many_attached :attachments
|
||||
end
|
||||
end
|
||||
@@ -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? }
|
||||
}.reject { |k, v| v.blank? && k != :ids_to_images }
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
7
app/models/matching_request.rb
Normal file
7
app/models/matching_request.rb
Normal file
@@ -0,0 +1,7 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class MatchingRequest < ApplicationRecord
|
||||
include Attachable
|
||||
|
||||
belongs_to :project
|
||||
end
|
||||
@@ -24,7 +24,7 @@ class QrCode
|
||||
end
|
||||
end
|
||||
|
||||
def to_base64_png(width = 100, height = 100)
|
||||
def to_base64_png(width = 200, height = 200)
|
||||
_qr_code.as_png.resize(width, height).to_data_url
|
||||
end
|
||||
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
<div class="page">
|
||||
<% has_logo = local_assigns[:logo] %>
|
||||
<table class="heading-table">
|
||||
<tr>
|
||||
<td> </td>
|
||||
<td class="do-not-copy-warning"><strong><%= t '.do_not_copy_warning' %></strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<% if has_logo %>
|
||||
@@ -11,17 +15,9 @@
|
||||
<% end %>
|
||||
</td>
|
||||
<td>
|
||||
<img src="<%= qr_codes[copy_index] %>" />
|
||||
<img class="qr-code" src="<%= qr_codes[copy_index] %>" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> </td>
|
||||
<td class="serial-number"><%= serial_numbers[copy_index] %></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> </td>
|
||||
<td><strong><%= t '.do_not_copy_warning' %></strong></td>
|
||||
</tr>
|
||||
</table>
|
||||
<hr>
|
||||
<% if contract_template.body.present? %>
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
<meta name="project-id" content="<%= @project.id %>">
|
||||
<% end %>
|
||||
<% if @broadcast %>
|
||||
<meta name="broadcast-token" content="<%= @broadcast.token %>">
|
||||
<meta name="broadcast-token" current="true" content="<%= @broadcast.token %>">
|
||||
<% end %>
|
||||
<% # Subscribe to Action Cable for every broadcast including those in multi-view %>
|
||||
<% @multi_view_broadcasts.each do |multi_view_broadcast| %>
|
||||
<% if multi_view_broadcast.token != @broadcast.token %>
|
||||
<meta name="broadcast-token" content="<%= multi_view_broadcast.token %>">
|
||||
<meta name="broadcast-token" current="false" content="<%= multi_view_broadcast.token %>">
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
|
||||
<%= field_set_tag content_tag(:span, t(".custom_fields.heading"), class: "h6 text-muted text-uppercase"), id: "custom_fields", style: "display: none;" do %>
|
||||
<p class="alert alert-info"><%= fa_icon("info-circle", text: t(".custom_fields.instructions")) %></p>
|
||||
<%= render "shared/custom_fields", form: form %>
|
||||
|
||||
Reference in New Issue
Block a user