diff --git a/hyrax/app/controllers/hyrax/admin/workflows_controller.rb b/hyrax/app/controllers/hyrax/admin/workflows_controller.rb new file mode 100644 index 0000000000000000000000000000000000000000..65180ff0e07e751b8aa4298b7be57ba1aa7ab7b4 --- /dev/null +++ b/hyrax/app/controllers/hyrax/admin/workflows_controller.rb @@ -0,0 +1,93 @@ +# frozen_string_literal: true +module Hyrax + # Presents a list of works in workflow + class Admin::WorkflowsController < ApplicationController + before_action :ensure_authorized! + with_themed_layout 'dashboard' + class_attribute :deposited_workflow_state_name + + # Works that are in this workflow state (see workflow json template) are excluded from the + # status list and display in the "Published" tab + self.deposited_workflow_state_name = 'published' + + def index + add_breadcrumb t(:'hyrax.controls.home'), root_path + add_breadcrumb t(:'hyrax.dashboard.breadcrumbs.admin'), hyrax.dashboard_path + add_breadcrumb t(:'hyrax.admin.sidebar.tasks'), '#' + add_breadcrumb t(:'hyrax.admin.sidebar.workflow_review'), request.path + assign_action_objects_params + doc = if params[:state] == 'published' + actionable_objects + elsif params[:state] == 'archived' + Hyrax::SolrQueryService.new(query: ["workflow_state_name_ssim:archived"]).accessible_by(ability: current_ability).solr_documents + elsif params[:state] == 'tombstoned' + Hyrax::SolrQueryService.new(query: ["is_tombstoned_ssim:true"]).accessible_by(ability: current_ability).solr_documents + else + actionable_objects.select{|object| doc_under_review?(object.workflow_state) } + end + + @response = WorkflowResponse.new(doc.to_a, doc.count, current_page, per_page, under_review?) + end + + private + + def ensure_authorized! + authorize! :review, :submissions + end + + def actionable_objects + @actionable_objects ||= + Hyrax::Workflow::ActionableObjects.new(user: current_user) + end + + def current_page + @page ||= params.fetch('page', 1).to_i + end + + def per_page + @per_page ||= params.fetch('per_page', 10).to_i + end + + def assign_action_objects_params + actionable_objects.page = current_page + actionable_objects.per_page = per_page + actionable_objects.workflow_state_filter = (under_review? ? '!' : '') + deposited_workflow_state_name + end + + def under_review? + @under_review = params['state'] != 'published' + end + + def doc_under_review?(workflow_state) + ["pending_review_from_publication_manager","changes_required_from_publication_manager","pending_review_from_crc_manager","changes_required_from_crc_manager","pending_review_from_group_manager","changes_required_from_group_manager"].include?(workflow_state) + end + + class WorkflowResponse + attr_reader :total_count + attr_reader :current_page + attr_reader :per_page + attr_reader :docs + attr_reader :under_review + + def initialize(docs, total_count, page, per_page, under_review) + @docs = docs + @total_count = total_count + @per_page = per_page.to_i + @current_page = page.to_i + @under_review = under_review + end + + def total_pages + (total_count.to_f / per_page).ceil + end + + def limit_value + docs.length + end + + def viewing_under_review? + under_review + end + end + end +end \ No newline at end of file diff --git a/hyrax/app/controllers/hyrax/crc1280_experiments_controller.rb b/hyrax/app/controllers/hyrax/crc1280_experiments_controller.rb index 1b676ca58145d413172043470cff7f6846144425..d4672000862333b9745ba2324983253e3391e5a4 100644 --- a/hyrax/app/controllers/hyrax/crc1280_experiments_controller.rb +++ b/hyrax/app/controllers/hyrax/crc1280_experiments_controller.rb @@ -17,7 +17,22 @@ module Hyrax # Use this line if you want to use a custom presenter self.show_presenter = Hyrax::Crc1280ExperimentPresenter + before_action :authorize_collection_access, only: :new before_action :check_tombstone, only: [:show, :edit] + before_action :redirect_to_default_collection, only:[:new] + + def authorize_collection_access + group_id = params[:add_works_to_collection] + + if current_user.admin? || current_user.crc_manager_for?(group_id) || current_user.group_manager_for?(group_id) || current_user.group_member_for?(group_id) + return true + end + + redirect_to root_path + + flash[:alert] = 'You are not authorized to access this page.' + end + def new @admin_set_options = available_admin_sets @@ -43,6 +58,15 @@ module Hyrax end end end + + def redirect_to_default_collection + return if params.has_key?(:add_works_to_collection) + + collection = Hyrax::PcdmCollection.where(title: [ENV.fetch('CRC_1280_COLLECTION', "CRC 1280")]).first + + flash[:notice] = "You need to navigate to your group to create an experiment." + redirect_to dashboard_collection_path(collection.id) + end def build_breadcrumbs return super if ['show', 'edit'].exclude?(action_name) diff --git a/hyrax/app/helpers/hyrax/listeners/lifecycle_listener_helper.rb b/hyrax/app/helpers/hyrax/listeners/lifecycle_listener_helper.rb index 0f8dd0914c1de7464901e108b3f75a9d8668591a..0611c960782a90ec8f326b3eef47487f1cb627dc 100644 --- a/hyrax/app/helpers/hyrax/listeners/lifecycle_listener_helper.rb +++ b/hyrax/app/helpers/hyrax/listeners/lifecycle_listener_helper.rb @@ -19,18 +19,25 @@ module Hyrax object end + def before_save_callbacks(object) + case object.class.name + when 'Crc1280Experiment', 'Dataset' + object = object.set_format_and_size + end + + object = save_object!(object) + object + end + def after_save_callbacks(object) case object.class.name when 'Crc1280Experiment' object.save_metadata_as_json_in_s3 - object = object.set_format_and_size object.save_meta_json_in_s3 when 'Dataset' object.save_metadata_as_json_in_s3 - object = object.set_format_and_size end - object = save_object!(object) Hyrax.index_adapter.save(resource: object) object end diff --git a/hyrax/app/indexers/crc1280_experiment_indexer.rb b/hyrax/app/indexers/crc1280_experiment_indexer.rb index e1c13165224e43844dea8da705bd427fce4ed2b0..40335caddd3d81a7f347f33cb15cbc46324f9f6a 100644 --- a/hyrax/app/indexers/crc1280_experiment_indexer.rb +++ b/hyrax/app/indexers/crc1280_experiment_indexer.rb @@ -5,7 +5,7 @@ class Crc1280ExperimentIndexer < Hyrax::Indexers::PcdmObjectIndexer(Crc1280Experiment) include Hyrax::Indexer(:basic_metadata) include Hyrax::Indexer(:crc1280_experiment) - + include Hyrax::IndexesWorkflow # Custom indexers for crc dataset model include ComplexField::PersonIndexer include ComplexField::DateIndexer diff --git a/hyrax/app/indexers/hyrax/indexes_workflow.rb b/hyrax/app/indexers/hyrax/indexes_workflow.rb new file mode 100644 index 0000000000000000000000000000000000000000..e63038ec7a8b0abe8d6d434d810d4b89139647a2 --- /dev/null +++ b/hyrax/app/indexers/hyrax/indexes_workflow.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true +module Hyrax + module IndexesWorkflow + mattr_accessor :suppressed_field, instance_writer: false do + "suppressed_bsi" + end + + # Adds thumbnail indexing to the solr document + def to_solr + super.tap do |solr_doc| + index_workflow_fields(solr_doc) + end + end + + # Write the workflow roles and state so one can see where the document moves to next + # @param [Hash] solr_document the solr document to add the field to + def index_workflow_fields(solr_document) + entity = Sipity::Entity(resource) + solr_document[workflow_role_field] = workflow_roles(entity).map { |role| "#{entity.workflow.permission_template.source_id}-#{entity.workflow.name}-#{role}" } + solr_document[workflow_state_name_field] = entity.workflow_state.name if entity.workflow_state + rescue Sipity::ConversionError + nil + end + + def workflow_state_name_field + "workflow_state_name_ssim" + end + + def workflow_role_field + "actionable_workflow_roles_ssim" + end + + def workflow_roles(entity) + Hyrax::Workflow::PermissionQuery.scope_roles_associated_with_the_given_entity(entity: entity) + end + end +end \ No newline at end of file diff --git a/hyrax/app/listeners/hyrax_listener.rb b/hyrax/app/listeners/hyrax_listener.rb index 8bd42361131c981da4cacef061e350f528fd3dba..57dcb10e925631d937f77c128638144b6ebb3fdf 100644 --- a/hyrax/app/listeners/hyrax_listener.rb +++ b/hyrax/app/listeners/hyrax_listener.rb @@ -77,6 +77,8 @@ class HyraxListener def on_object_deposited(event) object = event[:object] object = after_create_callbacks(object) + object = before_save_callbacks(object) + object = after_save_callbacks(object) ContentDepositEventJob.perform_later(object, event[:user]) end @@ -88,6 +90,7 @@ class HyraxListener # end def on_object_metadata_updated(event) + object = before_save_callbacks(event[:object]) object = after_save_callbacks(event[:object]) ContentUpdateEventJob.perform_later(object, event[:user]) end diff --git a/hyrax/app/models/complex_modality.rb b/hyrax/app/models/complex_modality.rb index c62215bbaf61a4198ae1a7047a6c01b954a56fef..404e0300621f13f52f178c0b23529079a992779b 100644 --- a/hyrax/app/models/complex_modality.rb +++ b/hyrax/app/models/complex_modality.rb @@ -18,7 +18,7 @@ class ComplexModality < ActiveRecord::Base validates :s3_folder_name, uniqueness: { scope: :parent_source_identifier, message: ->(object, data) { I18n.t('rdms.errors.complex_modality.title.uniqueness', value: object.s3_folder_name) } }, unless: -> { self.is_imported } before_validation :set_s3_folder_name - after_save :save_metadata_as_json_in_s3, :update_crc1280_experiment_date_modified_and_files_data, :reindex_parent_work + after_save :save_metadata_as_json_in_s3, :save_meta_json_in_s3, :update_crc1280_experiment_date_modified_and_files_data, :reindex_parent_work after_commit :fix_duplication_of_title, on: :create before_destroy :clear_s3_and_all_associated_objects diff --git a/hyrax/app/models/complex_session.rb b/hyrax/app/models/complex_session.rb index d6dc4e6eb2d395a662fee2797748332158f2a5f3..9ec385a883de875810466b62517da0701c670252 100644 --- a/hyrax/app/models/complex_session.rb +++ b/hyrax/app/models/complex_session.rb @@ -20,7 +20,7 @@ class ComplexSession < ActiveRecord::Base validates :s3_folder_name, uniqueness: { scope: :parent_source_identifier, message: ->(object, data) { I18n.t('rdms.errors.complex_session.title.uniqueness', value: object.s3_folder_name) } }, unless: -> { self.is_imported } before_validation :set_s3_folder_name - after_save :save_metadata_as_json_in_s3, :update_crc1280_experiment_date_modified_and_files_data, :reindex_parent_work + after_save :save_metadata_as_json_in_s3,:save_meta_json_in_s3, :update_crc1280_experiment_date_modified_and_files_data, :reindex_parent_work after_commit :fix_duplication_of_title, on: :create before_destroy :clear_s3_and_all_associated_objects diff --git a/hyrax/app/models/complex_subject.rb b/hyrax/app/models/complex_subject.rb index d739b7a53d7d59d87dafc0a6b9647381ec54c222..a0256c48aa45836af4f05fe823aad81c16a1d1e3 100644 --- a/hyrax/app/models/complex_subject.rb +++ b/hyrax/app/models/complex_subject.rb @@ -20,7 +20,7 @@ class ComplexSubject < ActiveRecord::Base before_validation :set_s3_folder_name - after_save :save_metadata_as_json_in_s3, :update_crc1280_experiment_date_modified_and_files_data, :reindex_parent_work + after_save :save_metadata_as_json_in_s3,:save_meta_json_in_s3, :update_crc1280_experiment_date_modified_and_files_data, :reindex_parent_work after_commit :fix_duplication_of_title, on: :create before_destroy :clear_s3_and_all_associated_objects diff --git a/hyrax/app/models/hyrax/pcdm_collection.rb b/hyrax/app/models/hyrax/pcdm_collection.rb index eaca794e7a113406418bdc8de13871aebeda6cbf..41fe97e6d7ba10a2eb082684e2eb2f2690e093ce 100644 --- a/hyrax/app/models/hyrax/pcdm_collection.rb +++ b/hyrax/app/models/hyrax/pcdm_collection.rb @@ -95,10 +95,21 @@ module Hyrax end def parent_collections - Hyrax.custom_queries.find_parent_collections(resource: self) + Hyrax.custom_queries.find_parent_collections(resource: self) end + def self.where(**args) + query = <<-SQL + SELECT * FROM orm_resources + WHERE metadata @> ? + AND internal_resource = 'Hyrax::PcdmCollection'; + SQL + + jsonb_query = args.to_json + Hyrax.query_service.run_query(query, jsonb_query) + end + protected def visibility_writer diff --git a/hyrax/app/services/hyrax/work_uploads_handler.rb b/hyrax/app/services/hyrax/work_uploads_handler.rb index b7cad9711d3daff958ff749466194cbc344b550c..59b402630511687a9f1eb5f53dd5b90411a75398 100644 --- a/hyrax/app/services/hyrax/work_uploads_handler.rb +++ b/hyrax/app/services/hyrax/work_uploads_handler.rb @@ -158,7 +158,9 @@ module Hyrax end def work_attributes_for(file) - work_attributes = @file_set_params ? @file_set_params.find{ |hash| hash[:uploaded_file_id].to_s == file.id.to_s } : {} + return {} unless @file_set_params.present? + + @file_set_params.find { |hash| hash[:uploaded_file_id].to_s == file.id.to_s } || {} end ## diff --git a/hyrax/app/views/hyrax/admin/workflows/_tabs.html.erb b/hyrax/app/views/hyrax/admin/workflows/_tabs.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..a577115f11b29eae654446ca2a8bf983e4cdd186 --- /dev/null +++ b/hyrax/app/views/hyrax/admin/workflows/_tabs.html.erb @@ -0,0 +1,15 @@ +<ul class="nav nav-tabs" id="my_nav" role="list"> + <li<%= ' class="nav-item"'.html_safe if @response.viewing_under_review? %>> + <%= link_to t('hyrax.admin.workflows.index.tabs.under_review'), + hyrax.admin_workflows_path(state: 'under-review'), class: "nav-link#{' active' if params[:state] == nil || params[:state] == 'under-review'}" %> + </li> + <li<%= ' class="nav-item"'.html_safe if !@response.viewing_under_review? %>> + <%= link_to t('hyrax.admin.workflows.index.tabs.published'), hyrax.admin_workflows_path(state: 'published'), class: "nav-link#{' active' if params[:state] == 'published'}" %> + </li> + <li<%= ' class="nav-item"'.html_safe if !@response.viewing_under_review? %>> + <%= link_to t('hyrax.admin.workflows.index.tabs.archived'), hyrax.admin_workflows_path(state: 'archived'), class: "nav-link#{' active' if params[:state] == 'archived'}" %> + </li> + <li<%= ' class="nav-item"'.html_safe if !@response.viewing_under_review? %>> + <%= link_to t('hyrax.admin.workflows.index.tabs.Tombstoned'), hyrax.admin_workflows_path(state: 'tombstoned'), class: "nav-link#{' active' if params[:state] == 'tombstoned'}" %> + </li> +</ul> \ No newline at end of file diff --git a/hyrax/app/views/hyrax/datasets/show.html.erb b/hyrax/app/views/hyrax/datasets/show.html.erb index aa7bfa2579ee30f0bd55c32af8370ba90641c64c..cf47cbd9788033482230db6775031c9113e06708 100644 --- a/hyrax/app/views/hyrax/datasets/show.html.erb +++ b/hyrax/app/views/hyrax/datasets/show.html.erb @@ -19,6 +19,7 @@ </div> <% end %> <div class="col-sm-3 text-center"> + <%= render 'download_all', presenter: @presenter %> <% if is_published?(@presenter) %> <%= render 'citations', presenter: @presenter %> <%= render 'social_media' %> diff --git a/hyrax/config/locales/hyrax.en.yml b/hyrax/config/locales/hyrax.en.yml index f161600ad7de05d342b0c10ffb127f57b94fb0cc..1f745545c7bdda774b657344e0968f32bf3e6cfd 100644 --- a/hyrax/config/locales/hyrax.en.yml +++ b/hyrax/config/locales/hyrax.en.yml @@ -272,6 +272,11 @@ en: headers: main: Work (dataset) Statistics total: "Total Works (datasets):" + workflows: + index: + tabs: + archived: Archived + tombstoned: Tombstoned base: form: batch_upload_hint: To create a separate work (dataset) for each of the files, go to