Compare commits
2 Commits
improve-do
...
make-direc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
928ef05f2e | ||
|
|
8cbe368e24 |
@@ -1,20 +0,0 @@
|
||||
$(document).on("click", "#download_releases", function(event) {
|
||||
event.preventDefault();
|
||||
|
||||
const releasable_ids = JSON.parse($("#selected_releases_form").attr('data-releasable-ids'));
|
||||
const total_entries = $('#total_entries').val();
|
||||
|
||||
const input_ids = $('<input>').attr({ type: 'hidden', name: 'release_ids', value: JSON.stringify(releasable_ids) });
|
||||
const search_query = $('<input>').attr({ type: 'hidden', name: 'search_query', value: $("form input[type='search']").val() });
|
||||
const type_filter = $('<input>').attr({ type: 'hidden', name: 'type_filter', value: $('#type_filter_value').val() });
|
||||
|
||||
const download_count = releasable_ids.length > 0 ? releasable_ids.length : total_entries;
|
||||
|
||||
$(this).parent().append(input_ids);
|
||||
$(this).parent().append(search_query);
|
||||
$(this).parent().append(type_filter);
|
||||
|
||||
if (confirm(`${download_count} release(s) will be downloaded. Is this correct?`)){
|
||||
Rails.fire($(this).parent()[0], 'submit');
|
||||
}
|
||||
});
|
||||
@@ -7,41 +7,28 @@ class ContractDownloadsController < ApplicationController
|
||||
|
||||
def create
|
||||
authorize policy_scope(Download).create
|
||||
|
||||
download = @project.downloads.create!(release_type: release_type)
|
||||
fetch_releases
|
||||
|
||||
download = @project.downloads.create!(release_type: params[:release_type])
|
||||
other_downloads_in_progress = @project.downloads.unfinished_desc_order.offset(1)
|
||||
|
||||
if other_downloads_in_progress.any?
|
||||
in_progress_downloads_details = render_to_string "_other_pending_downloads", locals: { downloads: other_downloads_in_progress, release_type: release_type }, :layout => false
|
||||
in_progress_downloads_details = render_to_string "_other_pending_downloads", locals: { downloads: other_downloads_in_progress, release_type: params[:release_type] }, :layout => false
|
||||
ProjectsChannel.broadcast_download_generation_update(download, in_progress_downloads_details)
|
||||
else
|
||||
ProjectsChannel.broadcast_download_generation_update(download, I18n.t("contract_downloads.download.pending", release_type: release_type.titleize))
|
||||
ProjectsChannel.broadcast_download_generation_update(download, I18n.t("contract_downloads.download.pending", release_type: params[:release_type].titleize))
|
||||
end
|
||||
|
||||
GenerateContractsZipJob.perform_later(@project, download, release_type, release_ids, search_query, type_filter)
|
||||
GenerateContractsZipJob.perform_later(@project, download, params[:release_type], @releases.ids)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def release_type
|
||||
params[:release_type]
|
||||
def fetch_releases
|
||||
@releases = policy_scope(@project.public_send(releases))
|
||||
end
|
||||
|
||||
def search_query
|
||||
params[:search_query]
|
||||
end
|
||||
|
||||
def type_filter
|
||||
params[:type_filter]
|
||||
end
|
||||
|
||||
def release_ids
|
||||
JSON.parse(params[:release_ids])
|
||||
rescue StandardError
|
||||
[]
|
||||
end
|
||||
|
||||
def release_name(release_type)
|
||||
release_type.constantize.model_name.plural
|
||||
def releases
|
||||
params[:release_type].constantize.model_name.plural
|
||||
end
|
||||
end
|
||||
|
||||
@@ -17,7 +17,6 @@ module TagsHelper
|
||||
disable_with: disabled_content,
|
||||
},
|
||||
form: {
|
||||
id: "selected_releases_form",
|
||||
data: {
|
||||
releasable_ids: [],
|
||||
},
|
||||
|
||||
@@ -7,14 +7,13 @@ class GenerateContractsZipJob < ApplicationJob
|
||||
@project = job.arguments.first
|
||||
@download = job.arguments.second
|
||||
@release_type = job.arguments.third
|
||||
@release_ids = job.arguments.fourth
|
||||
@search_query = job.arguments.fifth
|
||||
@type_filter = job.arguments[5]
|
||||
@folder_name = "#{@project.name.parameterize}_#{release_name.gsub('_', '-')}"
|
||||
@folder_name = "#{@project.name.parameterize}_#{get_release_name(@release_type).gsub('_', '-')}"
|
||||
@download.update!(name: @folder_name, status: :pending)
|
||||
end
|
||||
|
||||
def perform(project, download, release_type, release_ids, search_query, type_filter)
|
||||
def perform(project, download, release_type, release_ids)
|
||||
releases = project.public_send(get_release_name(release_type)).where(id: release_ids)
|
||||
|
||||
::ReleaseContractCollectionService.new(releases, @folder_name).build do |dir, files|
|
||||
zipfile_name = "#{dir}/#{@folder_name}.zip"
|
||||
Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
|
||||
@@ -32,7 +31,7 @@ class GenerateContractsZipJob < ApplicationJob
|
||||
end
|
||||
rescue StandardError => e
|
||||
Rails.logger.error("Failed to generate download for project (##{project.id}) with release type #{release_type}\n" + e.message)
|
||||
|
||||
|
||||
@download.failure!
|
||||
ProjectsChannel.broadcast_download_generation_update(@download, I18n.t("contract_downloads.download.failure"))
|
||||
end
|
||||
@@ -62,32 +61,7 @@ class GenerateContractsZipJob < ApplicationJob
|
||||
end
|
||||
end
|
||||
|
||||
def release_name
|
||||
@release_type.constantize.model_name.plural
|
||||
end
|
||||
|
||||
def all_releases
|
||||
@project.public_send(release_name)
|
||||
end
|
||||
|
||||
def releases
|
||||
if @release_ids.any?
|
||||
return all_releases.where(id: @release_ids)
|
||||
end
|
||||
|
||||
results = all_releases
|
||||
if all_releases.respond_to?(:complete, :incomplete)
|
||||
results = case @type_filter
|
||||
when 'complete'
|
||||
all_releases.complete
|
||||
when 'incomplete'
|
||||
all_releases.incomplete
|
||||
else
|
||||
all_releases
|
||||
end
|
||||
end
|
||||
|
||||
results = results.search(@search_query) if @search_query.present?
|
||||
results
|
||||
def get_release_name(release_type)
|
||||
release_type.constantize.model_name.plural
|
||||
end
|
||||
end
|
||||
|
||||
@@ -24,7 +24,7 @@ class ReleaseContractCollectionService
|
||||
end
|
||||
|
||||
files = Dir.entries("#{dir}/").select { |f| !File.directory? f }
|
||||
# raise StandardError.new "Contracts or Contract Templates not found." unless files.any?
|
||||
raise StandardError.new "Contracts or Contract Templates not found." unless files.any?
|
||||
yield(dir, files)
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<input id="total_entries" type=hidden value=<%= @appearance_releases.total_entries %> />
|
||||
<div id="upload-progress-container" class="mb-1"></div>
|
||||
<div class="d-md-flex d-sm-flex flex-sm-column flex-md-row flex-md-wrap mb-2">
|
||||
<% if policy(AppearanceRelease).new? %>
|
||||
@@ -17,7 +16,7 @@
|
||||
<% end %>
|
||||
|
||||
<% if @appearance_releases.any? && policy(AppearanceRelease).download_multiple? %>
|
||||
<%= button_to "Download", [@project, :contract_downloads, release_type: @appearance_releases.name], id: "download_releases", method: :post, remote: true, class: "btn btn-light border mr-2 mb-2", data: { disable_with: "Please wait..." } %>
|
||||
<%= link_to "Download All", [@project, :contract_downloads, release_type: @appearance_releases.name], method: :post, remote: true, class: "btn btn-light border mr-2 mb-2", data: { disable_with: "Please wait..." } %>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -3,5 +3,3 @@ $("form input[type='search']").val("<%= params[:query] %>");
|
||||
$("#type_filter_actions").html("<%= j render 'type_filter_actions' %>");
|
||||
$("#appearance_releases_pagination").html("<%= j will_paginate(@appearance_releases) %>");
|
||||
$('#type_filter_value').val("<%= params[:type_filter] %>");
|
||||
$("#selected_releases_form").attr('data-releasable-ids', JSON.stringify([]));
|
||||
$("#total_entries").val(<%= @appearance_releases.total_entries %>);
|
||||
@@ -1,5 +1,5 @@
|
||||
<% if broadcast.director_mode_video_embed.present? && params[:director_mode].present? %>
|
||||
<div class="embed-responsive-item" data-video-type="stream">
|
||||
<% if broadcast.director_mode_video_embed.present? && params[:director_mode].nil? %>
|
||||
<div id="director_broadcast_video" class="embed-responsive-item" data-video-type="stream">
|
||||
<%= raw broadcast.director_mode_video_embed %>
|
||||
</div>
|
||||
<% elsif broadcast.streamer_recording? && broadcast.active? %>
|
||||
|
||||
@@ -48,18 +48,18 @@
|
||||
</div>
|
||||
</div>
|
||||
<% if @broadcast.director_mode_video_embed.present? %>
|
||||
<% if params[:director_mode] %>
|
||||
<% unless params[:director_mode] %>
|
||||
<div class="custom-control custom-switch ml-auto">
|
||||
<input type="checkbox" name="director_mode" value="true" class="custom-control-input" id="director_mode_switch" checked="checked" />
|
||||
<label class="custom-control-label text-white override-custom-control-label" for="director_mode_switch">Director Mode</label>
|
||||
</div>
|
||||
<%= link_to "Disable Director Mode", url_for(params.permit!.except(:director_mode)), class: "d-none", id: "director_mode_link" %>
|
||||
<%= link_to "Disable Director Mode", [@broadcast.project, @broadcast, director_mode: false], class: "d-none", id: "director_mode_link" %>
|
||||
<% else %>
|
||||
<div class="custom-control custom-switch ml-auto">
|
||||
<input type="checkbox" name="director_mode" value="true" class="custom-control-input" id="director_mode_switch" />
|
||||
<label class="custom-control-label text-white override-custom-control-label" for="director_mode_switch">Director Mode</label>
|
||||
</div>
|
||||
<%= link_to "Enable Director Mode", url_for(params.permit!.merge(director_mode: true)), class: "d-none", id: "director_mode_link" %>
|
||||
<%= link_to "Enable Director Mode", [@broadcast.project, @broadcast], class: "d-none", id: "director_mode_link" %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
@@ -542,9 +542,9 @@ CREATE TABLE public.broadcast_recordings (
|
||||
updated_at timestamp(6) without time zone NOT NULL,
|
||||
duration double precision,
|
||||
hidden boolean DEFAULT false,
|
||||
starred boolean DEFAULT false,
|
||||
name character varying,
|
||||
description text,
|
||||
starred boolean DEFAULT false
|
||||
description text
|
||||
);
|
||||
|
||||
|
||||
@@ -1492,7 +1492,6 @@ CREATE TABLE public.settings (
|
||||
--
|
||||
|
||||
CREATE SEQUENCE public.settings_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
@@ -1528,7 +1527,6 @@ CREATE TABLE public.taggings (
|
||||
--
|
||||
|
||||
CREATE SEQUENCE public.taggings_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
@@ -1559,7 +1557,6 @@ CREATE TABLE public.tags (
|
||||
--
|
||||
|
||||
CREATE SEQUENCE public.tags_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
|
||||
@@ -197,13 +197,13 @@ RSpec.describe BroadcastsController, type: :controller do
|
||||
|
||||
context "when director mode is enabled" do
|
||||
it "shows the video embed" do
|
||||
get :show, params: { project_id: project, id: broadcast, director_mode: true }
|
||||
get :show, params: { project_id: project, id: broadcast }
|
||||
|
||||
expect(response.body).to have_selector("iframe", text: "video player")
|
||||
end
|
||||
|
||||
it "renders the view dropdown with a director mode disable option" do
|
||||
get :show, params: { project_id: project, id: broadcast, director_mode: true }
|
||||
get :show, params: { project_id: project, id: broadcast }
|
||||
|
||||
expect(response.body).to have_content broadcast.name
|
||||
expect(response.body).to have_selector(".custom-control-label", text: "Director Mode")
|
||||
|
||||
@@ -151,6 +151,30 @@ feature 'User managing broadcasts' do
|
||||
end
|
||||
end
|
||||
|
||||
scenario 'opening broadcast page starts in normal mode if director mode is not available' do
|
||||
broadcast = create(:broadcast, :with_stream, :with_files, project: project)
|
||||
broadcast.director_mode_video_embed = nil
|
||||
broadcast.save
|
||||
|
||||
visit project_broadcast_path(project, broadcast)
|
||||
|
||||
expect(page).not_to have_selector('#director_broadcast_video')
|
||||
expect(page).to have_selector('#broadcast_video')
|
||||
|
||||
expect(page).not_to have_selector('#director_mode_switch')
|
||||
end
|
||||
|
||||
scenario 'opening broadcast page starts in director mode if available' do
|
||||
broadcast = create(:broadcast, :with_stream, :with_files, project: project, director_mode_video_embed: 'director_mode')
|
||||
|
||||
visit project_broadcast_path(project, broadcast)
|
||||
|
||||
expect(page).not_to have_selector('#broadcast_video')
|
||||
expect(page).to have_selector('#director_broadcast_video')
|
||||
|
||||
expect(page).to have_selector('#director_mode_switch')
|
||||
end
|
||||
|
||||
context 'When the user is associate' do
|
||||
let(:current_user) { create(:user, :associate) }
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ describe GenerateContractsZipJob do
|
||||
describe ".perform_later" do
|
||||
it "enqueues a background job for generating zip file" do
|
||||
expect {
|
||||
GenerateContractsZipJob.perform_later(project, download, "AppearanceRelease", project.appearance_releases.ids, '', '')
|
||||
GenerateContractsZipJob.perform_later(project, download, "AppearanceRelease", project.appearance_releases.ids)
|
||||
}.to have_enqueued_job
|
||||
end
|
||||
end
|
||||
@@ -28,7 +28,7 @@ describe GenerateContractsZipJob do
|
||||
shared_examples "generates ZIP containig CSV file with all releases data" do
|
||||
it "generates ZIP containing CSV file with all releases data for all release types" do
|
||||
lowercase_plural = subject.constantize.model_name.plural
|
||||
GenerateContractsZipJob.perform_now(project, download, subject, project.public_send(lowercase_plural).ids, '', '')
|
||||
GenerateContractsZipJob.perform_now(project, download, subject, project.public_send(lowercase_plural).ids)
|
||||
|
||||
generated_zip = download.file.blob.download
|
||||
csv_file_name = "#{project.name.parameterize}_#{lowercase_plural.gsub('_', '-')}.csv"
|
||||
@@ -50,111 +50,8 @@ describe GenerateContractsZipJob do
|
||||
end
|
||||
end
|
||||
|
||||
shared_examples "generates ZIP containig CSV file with specific releases data" do
|
||||
it "generates ZIP containing CSV file with all selected releases data for selected releases" do
|
||||
lowercase_plural = subject.constantize.model_name.plural
|
||||
all_releases = project.public_send(lowercase_plural)
|
||||
included_releases = all_releases.where(id: all_releases.ids[0..1])
|
||||
not_included_releases = all_releases.where.not(id: all_releases.ids[0..1])
|
||||
GenerateContractsZipJob.perform_now(project, download, subject, included_releases.ids, '', '')
|
||||
|
||||
generated_zip = download.file.blob.download
|
||||
csv_file_name = "#{project.name.parameterize}_#{lowercase_plural.gsub('_', '-')}.csv"
|
||||
Zip::InputStream.open(StringIO.new(generated_zip)) do |io|
|
||||
while entry = io.get_next_entry
|
||||
next unless entry.name == csv_file_name
|
||||
|
||||
csv_file = entry.get_input_stream.read
|
||||
|
||||
release_class = Object.const_get subject
|
||||
release_headers = release_class.csv_headers
|
||||
|
||||
release_headers.each do |header|
|
||||
expect(csv_file).to match header
|
||||
expect(csv_file).not_to match translation_missing
|
||||
end
|
||||
|
||||
included_releases.each do |release|
|
||||
expect(csv_file).to match release.person_first_name
|
||||
end
|
||||
|
||||
not_included_releases.each do |release|
|
||||
expect(csv_file).not_to match release.person_first_name
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it "generates ZIP containing CSV file with all filtered releases data for filtered releases" do
|
||||
lowercase_plural = subject.constantize.model_name.plural
|
||||
GenerateContractsZipJob.perform_now(project, download, subject, [], '', 'complete')
|
||||
|
||||
complete_releases = project.public_send(lowercase_plural).complete
|
||||
incomplete_releases = project.public_send(lowercase_plural).incomplete
|
||||
|
||||
generated_zip = download.file.blob.download
|
||||
csv_file_name = "#{project.name.parameterize}_#{lowercase_plural.gsub('_', '-')}.csv"
|
||||
Zip::InputStream.open(StringIO.new(generated_zip)) do |io|
|
||||
while entry = io.get_next_entry
|
||||
next unless entry.name == csv_file_name
|
||||
|
||||
csv_file = entry.get_input_stream.read
|
||||
|
||||
release_class = Object.const_get subject
|
||||
release_headers = release_class.csv_headers
|
||||
|
||||
release_headers.each do |header|
|
||||
expect(csv_file).to match header
|
||||
expect(csv_file).not_to match translation_missing
|
||||
end
|
||||
|
||||
complete_releases.each do |release|
|
||||
expect(csv_file).to match release.person_first_name
|
||||
end
|
||||
|
||||
incomplete_releases.each do |release|
|
||||
expect(csv_file).not_to match release.person_first_name
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it "generates ZIP containing CSV file with all search query matching releases" do
|
||||
lowercase_plural = subject.constantize.model_name.plural
|
||||
matched_releases = project.public_send(lowercase_plural).search('Brad')
|
||||
not_matched_releases = project.public_send(lowercase_plural).where.not(id: matched_releases.ids)
|
||||
GenerateContractsZipJob.perform_now(project, download, subject, [], 'Brad', '')
|
||||
|
||||
generated_zip = download.file.blob.download
|
||||
csv_file_name = "#{project.name.parameterize}_#{lowercase_plural.gsub('_', '-')}.csv"
|
||||
Zip::InputStream.open(StringIO.new(generated_zip)) do |io|
|
||||
while entry = io.get_next_entry
|
||||
next unless entry.name == csv_file_name
|
||||
|
||||
csv_file = entry.get_input_stream.read
|
||||
|
||||
release_class = Object.const_get subject
|
||||
release_headers = release_class.csv_headers
|
||||
|
||||
release_headers.each do |header|
|
||||
expect(csv_file).to match header
|
||||
expect(csv_file).not_to match translation_missing
|
||||
end
|
||||
|
||||
matched_releases.each do |release|
|
||||
expect(csv_file).to match release.person_first_name
|
||||
end
|
||||
|
||||
not_matched_releases.each do |release|
|
||||
expect(csv_file).not_to match release.person_first_name
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it "updates a download record and creates attachment for it" do
|
||||
GenerateContractsZipJob.perform_now(project, download, "AppearanceRelease", project.appearance_releases.ids, '', '')
|
||||
GenerateContractsZipJob.perform_now(project, download, "AppearanceRelease", project.appearance_releases.ids)
|
||||
|
||||
expect(download.project).to eq project
|
||||
expect(download.release_type).to eq "AppearanceRelease"
|
||||
@@ -172,12 +69,9 @@ describe GenerateContractsZipJob do
|
||||
|
||||
context "generates ZIP for appearance releases" do
|
||||
let(:release) { create(:appearance_release_with_contract_template, :native, project: project, person_name: "John Doe") }
|
||||
let(:incomplete_release) { create(:appearance_release_with_contract_template, project: project, person_name: "Jane Doe") }
|
||||
let(:complete_release) { create(:appearance_release_with_contract_template, :non_native, project: project, person_name: "Brad Doe") }
|
||||
subject { 'AppearanceRelease' }
|
||||
|
||||
it_behaves_like "generates ZIP containig CSV file with all releases data"
|
||||
it_behaves_like "generates ZIP containig CSV file with specific releases data"
|
||||
end
|
||||
|
||||
context "generates ZIP for location releases" do
|
||||
@@ -231,7 +125,7 @@ describe GenerateContractsZipJob do
|
||||
end
|
||||
|
||||
it "updates status to 'failure' and sends user a notification" do
|
||||
GenerateContractsZipJob.perform_now(project, download, "AppearanceRelease", project.appearance_releases.ids, '', '')
|
||||
GenerateContractsZipJob.perform_now(project, download, "AppearanceRelease", project.appearance_releases.ids)
|
||||
|
||||
expect(download.status).to eq "failure"
|
||||
expect(ProjectsChannel).to have_received(:broadcast_download_generation_update).with(download, I18n.t("contract_downloads.download.failure"))
|
||||
|
||||
Reference in New Issue
Block a user