From e5ac3e934561cad2d1b0534a7a5a3f8600575326 Mon Sep 17 00:00:00 2001 From: Senad Uka Date: Sun, 6 Sep 2020 21:42:50 +0200 Subject: [PATCH] Upstream sync --- app/assets/javascripts/download_releases.js | 20 +++ app/assets/javascripts/stream_player.js.erb | 11 -- app/controllers/api/releases_controller.rb | 5 +- .../contract_downloads_controller.rb | 33 +++-- app/controllers/pages_controller.rb | 12 ++ app/helpers/tags_helper.rb | 1 + app/jobs/generate_contracts_zip_job.rb | 40 ++++-- app/policies/broadcast_recording_policy.rb | 4 +- .../serializable_acquired_media_release.rb | 12 +- app/serializers/serializable_user.rb | 6 +- .../release_contract_collection_service.rb | 2 +- app/views/appearance_releases/index.html.erb | 3 +- app/views/appearance_releases/index.js.erb | 2 + .../broadcasts/_broadcast_recordings.html.erb | 6 +- app/views/broadcasts/_live_take.html.erb | 2 +- app/views/broadcasts/show.html.erb | 26 +++- app/views/pages/nanocosmos_player.html.erb | 45 +++++++ .../initializers/content_security_policy.rb | 4 +- config/routes.rb | 1 + ...acquired_media_releases_controller_spec.rb | 10 ++ .../api/profiles_controller_spec.rb | 2 + spec/jobs/generate_contracts_zip_job_spec.rb | 114 +++++++++++++++++- 22 files changed, 312 insertions(+), 49 deletions(-) create mode 100644 app/assets/javascripts/download_releases.js create mode 100644 app/views/pages/nanocosmos_player.html.erb diff --git a/app/assets/javascripts/download_releases.js b/app/assets/javascripts/download_releases.js new file mode 100644 index 0000000..9d7726a --- /dev/null +++ b/app/assets/javascripts/download_releases.js @@ -0,0 +1,20 @@ +$(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 = $('').attr({ type: 'hidden', name: 'release_ids', value: JSON.stringify(releasable_ids) }); + const search_query = $('').attr({ type: 'hidden', name: 'search_query', value: $("form input[type='search']").val() }); + const type_filter = $('').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'); + } +}); \ No newline at end of file diff --git a/app/assets/javascripts/stream_player.js.erb b/app/assets/javascripts/stream_player.js.erb index a59e859..af1aee9 100644 --- a/app/assets/javascripts/stream_player.js.erb +++ b/app/assets/javascripts/stream_player.js.erb @@ -1,8 +1,4 @@ $(document).on("click", "[data-behavior=play_recording]", function() { - if ($(this).hasClass('active')){ - return false; - } - $("#broadcast_video").data('videoType', 'recording'); var playback_url = $(this).attr("data-playback-url") @@ -16,13 +12,6 @@ $(document).on("click", "[data-behavior=play_recording]", function() { height: '100%', autoPlay: true }); - - $(".dropdown-menu").children().removeClass('active'); - $(".dropdown-menu").children().children('i').remove(); - $(this).siblings().removeClass('active'); - $(this).siblings().children("i").remove(); - $(this).addClass('active'); - $(this).prepend(' '); }); $(document).on("click", "[data-behavior=play_stream]", function() { $("#broadcast_video").data('videoType', 'stream'); }); \ No newline at end of file diff --git a/app/controllers/api/releases_controller.rb b/app/controllers/api/releases_controller.rb index 0bff7bb..4c29ba9 100644 --- a/app/controllers/api/releases_controller.rb +++ b/app/controllers/api/releases_controller.rb @@ -45,13 +45,14 @@ class Api::ReleasesController < Api::ApiController if model_name == "acquired_media_release" mapping = { "#{model_name.camelize}": SerializableAcquiredMediaRelease, - FileInfo: SerializableFileInfo + FileInfo: SerializableFileInfo, + "ActiveStorage::Attachment".to_sym => ActiveStorage::SerializableAttachment, } render jsonapi: release, status: status, class: mapping, - include: [:file_infos] + include: [:files, :file_infos] else mapping = { "#{model_name.camelize}": show_serializable, diff --git a/app/controllers/contract_downloads_controller.rb b/app/controllers/contract_downloads_controller.rb index b8bade4..af242dc 100644 --- a/app/controllers/contract_downloads_controller.rb +++ b/app/controllers/contract_downloads_controller.rb @@ -7,28 +7,41 @@ class ContractDownloadsController < ApplicationController def create authorize policy_scope(Download).create - fetch_releases - - download = @project.downloads.create!(release_type: params[:release_type]) + + download = @project.downloads.create!(release_type: 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: params[:release_type] }, :layout => false + in_progress_downloads_details = render_to_string "_other_pending_downloads", locals: { downloads: other_downloads_in_progress, release_type: 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: params[:release_type].titleize)) + ProjectsChannel.broadcast_download_generation_update(download, I18n.t("contract_downloads.download.pending", release_type: release_type.titleize)) end - GenerateContractsZipJob.perform_later(@project, download, params[:release_type], @releases.ids) + GenerateContractsZipJob.perform_later(@project, download, release_type, release_ids, search_query, type_filter) end private - def fetch_releases - @releases = policy_scope(@project.public_send(releases)) + def release_type + params[:release_type] end - def releases - params[:release_type].constantize.model_name.plural + 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 end end diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb index 33b75a8..71e03e3 100644 --- a/app/controllers/pages_controller.rb +++ b/app/controllers/pages_controller.rb @@ -4,4 +4,16 @@ class PagesController < ApplicationController skip_after_action :verify_authorized skip_after_action :verify_policy_scoped skip_before_action :require_login + + layout :layout_for_page + + private + + def layout_for_page + case params[:id] + when 'nanocosmos_player' + false + else + end + end end diff --git a/app/helpers/tags_helper.rb b/app/helpers/tags_helper.rb index 5da02e0..c67e47a 100644 --- a/app/helpers/tags_helper.rb +++ b/app/helpers/tags_helper.rb @@ -17,6 +17,7 @@ module TagsHelper disable_with: disabled_content, }, form: { + id: "selected_releases_form", data: { releasable_ids: [], }, diff --git a/app/jobs/generate_contracts_zip_job.rb b/app/jobs/generate_contracts_zip_job.rb index 65bc376..43c5857 100644 --- a/app/jobs/generate_contracts_zip_job.rb +++ b/app/jobs/generate_contracts_zip_job.rb @@ -7,13 +7,14 @@ class GenerateContractsZipJob < ApplicationJob @project = job.arguments.first @download = job.arguments.second @release_type = job.arguments.third - @folder_name = "#{@project.name.parameterize}_#{get_release_name(@release_type).gsub('_', '-')}" + @release_ids = job.arguments.fourth + @search_query = job.arguments.fifth + @type_filter = job.arguments[5] + @folder_name = "#{@project.name.parameterize}_#{release_name.gsub('_', '-')}" @download.update!(name: @folder_name, status: :pending) end - def perform(project, download, release_type, release_ids) - releases = project.public_send(get_release_name(release_type)).where(id: release_ids) - + def perform(project, download, release_type, release_ids, search_query, type_filter) ::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| @@ -31,7 +32,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 @@ -61,7 +62,32 @@ class GenerateContractsZipJob < ApplicationJob end end - def get_release_name(release_type) - release_type.constantize.model_name.plural + 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 end end diff --git a/app/policies/broadcast_recording_policy.rb b/app/policies/broadcast_recording_policy.rb index 6a94c84..0424c88 100644 --- a/app/policies/broadcast_recording_policy.rb +++ b/app/policies/broadcast_recording_policy.rb @@ -12,10 +12,10 @@ class BroadcastRecordingPolicy < ApplicationPolicy end def edit? - destroy? + true end def update? - edit? + true end end diff --git a/app/serializers/serializable_acquired_media_release.rb b/app/serializers/serializable_acquired_media_release.rb index a05b181..6700b60 100644 --- a/app/serializers/serializable_acquired_media_release.rb +++ b/app/serializers/serializable_acquired_media_release.rb @@ -7,7 +7,7 @@ class SerializableAcquiredMediaRelease < JSONAPI::Serializable::Resource :person_title, :person_company, :created_at, :updated_at, :collection_uid, :territory_old, :term_old, :applicable_medium_id, :applicable_medium_text, :territory_id, :territory_text, :term_id, :term_text, :restriction_id, :restriction_text, :categories, :description, :tag_list - + has_many :file_infos do data do @object.file_infos @@ -17,4 +17,14 @@ class SerializableAcquiredMediaRelease < JSONAPI::Serializable::Resource { count: @object.file_infos.size } end end + + has_many :files do + data do + @object.files + end + + meta do + { count: @object.files.size } + end + end end diff --git a/app/serializers/serializable_user.rb b/app/serializers/serializable_user.rb index b03813c..7705021 100644 --- a/app/serializers/serializable_user.rb +++ b/app/serializers/serializable_user.rb @@ -1,5 +1,9 @@ class SerializableUser < JSONAPI::Serializable::Resource type "user" - attributes :email + attributes :email, :full_name + + attribute :company_name do + @object.primary_account.name + end end diff --git a/app/services/release_contract_collection_service.rb b/app/services/release_contract_collection_service.rb index 898b42b..1b6b4a0 100644 --- a/app/services/release_contract_collection_service.rb +++ b/app/services/release_contract_collection_service.rb @@ -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 diff --git a/app/views/appearance_releases/index.html.erb b/app/views/appearance_releases/index.html.erb index 65b60ff..92f5ca5 100644 --- a/app/views/appearance_releases/index.html.erb +++ b/app/views/appearance_releases/index.html.erb @@ -1,5 +1,6 @@
+ />
<% if policy(AppearanceRelease).new? %> @@ -16,7 +17,7 @@ <% end %> <% if @appearance_releases.any? && policy(AppearanceRelease).download_multiple? %> - <%= 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..." } %> + <%= 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..." } %> <% end %>
diff --git a/app/views/appearance_releases/index.js.erb b/app/views/appearance_releases/index.js.erb index ebc1c7c..e76d092 100644 --- a/app/views/appearance_releases/index.js.erb +++ b/app/views/appearance_releases/index.js.erb @@ -3,3 +3,5 @@ $("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 %>); \ No newline at end of file diff --git a/app/views/broadcasts/_broadcast_recordings.html.erb b/app/views/broadcasts/_broadcast_recordings.html.erb index c6b8f89..e764e6e 100644 --- a/app/views/broadcasts/_broadcast_recordings.html.erb +++ b/app/views/broadcasts/_broadcast_recordings.html.erb @@ -3,12 +3,12 @@ <% recordings.each do |recording| %>
- <% if (controller.class.module_parent.to_s != "Public" && policy(BroadcastRecording).update?) %> + <% if policy(BroadcastRecording).update? %> <%= link_to fa_icon("#{recording.starred ? 'star' : 'star-o'} fw"), [broadcast.project, broadcast, recording, :broadcast_recording_starrings], method: :post, class: "text-warning mr-3", remote: true %> <% end %> - <%= image_tag(recording.thumbnail_url, class: 'img-thumbnail img-fluid max-w-75') %> + <%= image_tag(recording.thumbnail_url, class: 'img-thumbnail img-fluid max-w-75', data: { behavior: "play_recording", playback_url: recording.playback_url, id: dom_id(recording) }) %>
- <% if (controller.class.module_parent.to_s != "Public" && policy(BroadcastRecording).edit?) %> + <% if policy(BroadcastRecording).edit? %> <%= link_to fa_icon('edit'), [:edit, broadcast.project, broadcast, recording], remote: true %> <% end %> <%= link_to(fa_icon('download'), recording.download_url, target: "_blank") %> diff --git a/app/views/broadcasts/_live_take.html.erb b/app/views/broadcasts/_live_take.html.erb index 97a42b8..cb09912 100644 --- a/app/views/broadcasts/_live_take.html.erb +++ b/app/views/broadcasts/_live_take.html.erb @@ -9,4 +9,4 @@
-
\ No newline at end of file + diff --git a/app/views/broadcasts/show.html.erb b/app/views/broadcasts/show.html.erb index ed6c4e4..8d79161 100644 --- a/app/views/broadcasts/show.html.erb +++ b/app/views/broadcasts/show.html.erb @@ -22,11 +22,16 @@
<%= product_wordmark(:direct_me, class: 'navbar-brand text-white') %>