curation_concerns 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +8 -0
- data/Gemfile +1 -2
- data/README.md +1 -1
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/app/assets/javascripts/curation_concerns/curation_concerns.js +2 -0
- data/app/assets/javascripts/curation_concerns/uploader.js +4 -4
- data/app/assets/stylesheets/curation_concerns/_modules.scss +1 -0
- data/app/assets/stylesheets/curation_concerns/_positioning.scss +3 -0
- data/app/assets/stylesheets/curation_concerns/modules/icons.scss +11 -0
- data/app/controllers/concerns/curation_concerns/api.rb +1 -12
- data/app/controllers/concerns/curation_concerns/application_controller_behavior.rb +20 -6
- data/app/controllers/concerns/curation_concerns/curation_concern_controller.rb +44 -25
- data/app/controllers/concerns/curation_concerns/file_sets_controller_behavior.rb +32 -23
- data/app/controllers/concerns/curation_concerns/parent_container.rb +0 -11
- data/app/controllers/concerns/curation_concerns/single_use_links_controller_behavior.rb +1 -1
- data/app/controllers/concerns/curation_concerns/single_use_links_viewer_controller_behavior.rb +7 -1
- data/app/controllers/concerns/curation_concerns/upload_sets_controller_behavior.rb +19 -7
- data/app/controllers/curation_concerns/permissions_controller.rb +1 -1
- data/app/forms/curation_concerns/forms/collection_edit_form.rb +6 -2
- data/app/forms/curation_concerns/forms/work_form.rb +14 -3
- data/app/forms/curation_concerns/upload_set_form.rb +43 -0
- data/app/helpers/curation_concerns/ability_helper.rb +12 -18
- data/app/helpers/curation_concerns/file_set_helper.rb +1 -1
- data/app/helpers/curation_concerns/main_app_helpers.rb +1 -0
- data/app/helpers/curation_concerns/permissions_helper.rb +20 -0
- data/app/helpers/curation_concerns/url_helper.rb +3 -11
- data/app/inputs/multi_value_with_help_input.rb +8 -0
- data/app/inputs/select_with_help_input.rb +3 -0
- data/app/inputs/select_with_modal_help_input.rb +36 -0
- data/app/inputs/with_help_icon.rb +34 -0
- data/app/presenters/curation_concerns/collection_presenter.rb +9 -0
- data/app/presenters/curation_concerns/file_set_presenter.rb +2 -1
- data/app/presenters/curation_concerns/presents_attributes.rb +16 -0
- data/app/presenters/curation_concerns/work_show_presenter.rb +3 -2
- data/app/renderers/curation_concerns/attribute_renderer.rb +22 -4
- data/app/renderers/curation_concerns/configured_microdata.rb +40 -0
- data/app/services/curation_concerns/parent_service.rb +1 -1
- data/app/views/catalog/_action_menu_partials/_default.html.erb +2 -2
- data/app/views/collections/_form.html.erb +8 -9
- data/app/views/collections/_sort_and_per_page.html.erb +25 -23
- data/app/views/collections/show.html.erb +1 -1
- data/app/views/curation_concerns/base/_attributes.html.erb +1 -1
- data/app/views/curation_concerns/base/_form.html.erb +6 -7
- data/app/views/curation_concerns/base/_form_permission.html.erb +3 -0
- data/app/views/curation_concerns/base/_multiple_upload.html.erb +3 -0
- data/app/views/curation_concerns/base/_show_actions.html.erb +2 -2
- data/app/views/curation_concerns/base/_versioning.html.erb +1 -1
- data/app/views/curation_concerns/base/_visibility.html.erb +17 -0
- data/app/views/curation_concerns/base/show.html.erb +1 -1
- data/app/views/curation_concerns/classify_concerns/new.html.erb +1 -1
- data/app/views/curation_concerns/file_sets/_actions.html.erb +2 -2
- data/app/views/curation_concerns/file_sets/_form.html.erb +1 -1
- data/app/views/curation_concerns/file_sets/_rights_modal.html.erb +41 -0
- data/app/views/curation_concerns/file_sets/media_display/_default.html.erb +4 -1
- data/app/views/curation_concerns/file_sets/media_display/_image.html.erb +9 -8
- data/app/views/curation_concerns/file_sets/media_display/_office_document.html.erb +9 -7
- data/app/views/curation_concerns/file_sets/media_display/_pdf.html.erb +7 -5
- data/app/views/curation_concerns/file_sets/show.html.erb +2 -2
- data/app/views/curation_concerns/file_sets/upload/_alerts.html.erb +3 -3
- data/app/views/curation_concerns/file_sets/upload/_form.html.erb +1 -1
- data/app/views/curation_concerns/file_sets/upload/_script_templates.html.erb +1 -1
- data/app/views/curation_concerns/permissions/confirm.html.erb +1 -1
- data/app/views/curation_concerns/single_use_links_viewer/show.html.erb +1 -1
- data/app/views/embargoes/edit.html.erb +4 -4
- data/app/views/layouts/curation_concerns.html.erb +1 -1
- data/app/views/leases/edit.html.erb +3 -3
- data/app/views/shared/_add_works.html.erb +6 -3
- data/app/views/upload_sets/_base_metadata.html.erb +12 -0
- data/app/views/upload_sets/_metadata.html.erb +3 -13
- data/app/views/upload_sets/edit.html.erb +1 -1
- data/config/locales/curation_concerns.en.yml +46 -0
- data/curation_concerns.gemspec +5 -4
- data/lib/curation_concerns/engine.rb +5 -0
- data/lib/curation_concerns/form_builder.rb +16 -0
- data/lib/curation_concerns/rails/routes.rb +7 -5
- data/lib/generators/curation_concerns/install_generator.rb +1 -1
- data/lib/generators/curation_concerns/work/work_generator.rb +1 -1
- data/spec/actors/curation_concerns/file_set_actor_spec.rb +26 -16
- data/spec/controllers/curation_concerns/file_sets_controller_json_spec.rb +14 -4
- data/spec/controllers/curation_concerns/file_sets_controller_spec.rb +3 -3
- data/spec/controllers/curation_concerns/generic_works_controller_json_spec.rb +4 -4
- data/spec/controllers/curation_concerns/generic_works_controller_spec.rb +21 -0
- data/spec/controllers/curation_concerns/single_use_links_controller_spec.rb +2 -2
- data/spec/controllers/curation_concerns/single_use_links_viewer_controller_spec.rb +1 -1
- data/spec/controllers/upload_sets_controller_spec.rb +20 -27
- data/spec/factories/file_sets.rb +1 -0
- data/spec/factories/generic_works.rb +1 -0
- data/spec/factories/users.rb +0 -12
- data/spec/features/collection_spec.rb +1 -3
- data/spec/forms/collection_edit_form_spec.rb +16 -1
- data/spec/forms/upload_set_form_spec.rb +55 -0
- data/spec/forms/work_form_spec.rb +68 -3
- data/spec/helpers/curation_concerns/ability_helper_spec.rb +45 -0
- data/spec/helpers/curation_concerns/permissions_helper_spec.rb +12 -0
- data/spec/helpers/url_helper_spec.rb +0 -3
- data/spec/indexers/collection_indexer_spec.rb +5 -0
- data/spec/indexers/{file_set_indexing_service_spec.rb → file_set_indexer_spec.rb} +40 -2
- data/spec/indexers/{generic_work_indexing_service_spec.rb → work_indexer_spec.rb} +1 -1
- data/spec/inputs/multi_value_with_help_input_spec.rb +32 -0
- data/spec/inputs/select_with_help_input_spec.rb +43 -0
- data/spec/inputs/select_with_modal_help_input_spec.rb +21 -0
- data/spec/jobs/import_url_job_spec.rb +33 -1
- data/spec/jobs/ingest_file_job_spec.rb +29 -16
- data/spec/jobs/upload_set_update_job_spec.rb +24 -11
- data/spec/lib/curation_concerns/messages_spec.rb +2 -2
- data/spec/lib/curation_concerns/name_spec.rb +20 -0
- data/spec/lib/curation_concerns/null_logger_spec.rb +10 -0
- data/spec/models/curation_concerns/collection_behavior_spec.rb +41 -10
- data/spec/models/curation_concerns/work_behavior_spec.rb +1 -13
- data/spec/models/file_set_spec.rb +19 -4
- data/spec/models/generic_work_spec.rb +7 -2
- data/spec/models/quick_classification_query_spec.rb +35 -0
- data/spec/models/upload_set_spec.rb +5 -7
- data/spec/presenters/curation_concerns/collection_presenter_spec.rb +20 -0
- data/spec/presenters/curation_concerns/file_set_presenter_spec.rb +10 -3
- data/spec/presenters/curation_concerns/work_show_presenter_spec.rb +13 -1
- data/spec/renderers/curation_concerns/attribute_renderer_spec.rb +41 -8
- data/spec/routing/curation_concerns/routes_spec.rb +2 -2
- data/spec/routing/route_spec.rb +1 -1
- data/spec/services/file_set_audit_service_spec.rb +46 -4
- data/spec/spec_helper.rb +5 -7
- data/spec/views/collections/_sort_and_per_page.html.erb_spec.rb +32 -0
- data/spec/views/curation_concerns/base/_attributes.html.erb_spec.rb +8 -1
- data/spec/views/curation_concerns/base/show.html.erb_spec.rb +36 -2
- data/spec/views/curation_concerns/file_sets/_file_set.html.erb_spec.rb +3 -2
- data/spec/views/curation_concerns/file_sets/show.html.erb_spec.rb +56 -0
- data/spec/views/curation_concerns/single_use_links_viewer/show.html.erb_spec.rb +19 -0
- data/spec/views/shared/_add_content.html.erb_spec.rb +3 -3
- data/spec/views/single_use_links/new_download.html.erb_spec.rb +1 -1
- data/spec/views/upload_sets/_metadata.html.erb_spec.rb +28 -0
- metadata +80 -50
- data/app/assets/stylesheets/curation_concerns/help_requests.scss +0 -3
- data/app/controllers/concerns/curation_concerns/without_namespace.rb +0 -16
- data/app/controllers/registrations_controller.rb +0 -19
- data/app/controllers/sessions_controller.rb +0 -4
- data/app/views/curation_concerns/file_sets/_multiple_upload.html.erb +0 -3
- data/spec/fixtures/Example.ogg +0 -0
- data/spec/fixtures/charter.docx +0 -0
- data/spec/fixtures/countdown.avi +0 -0
- data/spec/fixtures/curation_concerns_generic_stub.txt +0 -1
- data/spec/fixtures/empty_file.txt +0 -0
- data/spec/fixtures/files/image.png +0 -0
- data/spec/fixtures/image.jp2 +0 -0
- data/spec/fixtures/image.jpg +0 -0
- data/spec/fixtures/piano_note.wav +0 -0
- data/spec/fixtures/sample_mpeg4.mp4 +0 -0
- data/spec/fixtures/small_file.txt +0 -1
- data/spec/fixtures/spoken-text.m4a +0 -0
- data/spec/fixtures/test.pdf +0 -0
- data/spec/fixtures/test4.pdf +0 -0
- data/spec/fixtures/test5.mp3 +0 -0
- data/spec/fixtures/world.png +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 489a8d74c2cc2694cae734316ac806ccb728ba35
|
|
4
|
+
data.tar.gz: dc4312a11afa53f206991fe1777d9f5ea416e08c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: bbadbe42f6cb6b7153ad122fdd935ca085f7bfc9bae9fca0d5a0fc6390926063b8ac6f34693187a052c6ae56e7f9184942b6fa332a0e584e40e2eddd9de585a0
|
|
7
|
+
data.tar.gz: 8b029a62c46cdf9748048bed0b3d5f6eb1945f346ea165555253257f8dc87b9a4cb7235d00cbe0087667a53220f352ca1a473acf661152ca0676fb39f3f15568
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
|
@@ -6,3 +6,11 @@ rvm:
|
|
|
6
6
|
env:
|
|
7
7
|
global:
|
|
8
8
|
- NOKOGIRI_USE_SYSTEM_LIBRARIES=true
|
|
9
|
+
notifications:
|
|
10
|
+
irc:
|
|
11
|
+
channels:
|
|
12
|
+
- "irc.freenode.org#projecthydra"
|
|
13
|
+
template:
|
|
14
|
+
- "%{repository}//%{branch}@%{commit} by %{author}: %{message} - %{build_url}"
|
|
15
|
+
before_script:
|
|
16
|
+
- jdk_switcher use oraclejdk8
|
data/Gemfile
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
source 'https://rubygems.org'
|
|
2
2
|
|
|
3
|
+
gem 'hydra-works', github: 'projecthydra-labs/hydra-works'
|
|
3
4
|
# Specify your gem's dependencies in curation_concerns.gemspec
|
|
4
5
|
gemspec
|
|
5
6
|
|
|
6
|
-
gem 'slop', '~> 3.6.0' # This just helps us generate a valid Gemfile.lock when Rails 4.2 is installed (which requires byebug which has a dependency on slop)
|
|
7
|
-
|
|
8
7
|
gem 'curation_concerns-models', path: './curation_concerns-models'
|
|
9
8
|
|
|
10
9
|
group :development, :test do
|
data/README.md
CHANGED
|
@@ -23,7 +23,7 @@ And then execute:
|
|
|
23
23
|
|
|
24
24
|
$ bundle install
|
|
25
25
|
|
|
26
|
-
Then
|
|
26
|
+
Then run the install generator. You will be prompted if you want to overwrite the default `app/controllers/catalog_controller.rb`, to which you should type `Y` (yes). If you don't want to be prompted on overwrite, you may run the generator with the `-f` (force) option.
|
|
27
27
|
|
|
28
28
|
$ rails generate curation_concerns:install
|
|
29
29
|
$ rake db:migrate
|
data/Rakefile
CHANGED
|
@@ -10,7 +10,7 @@ Dir.glob('tasks/*.rake').each { |r| import r }
|
|
|
10
10
|
# This makes it possible to run curation_concerns:jetty:config from here.
|
|
11
11
|
import 'curation_concerns-models/lib/tasks/curation_concerns-models_tasks.rake'
|
|
12
12
|
|
|
13
|
-
Jettywrapper.hydra_jetty_version = 'v8.
|
|
13
|
+
Jettywrapper.hydra_jetty_version = 'v8.6.0'
|
|
14
14
|
|
|
15
15
|
desc 'Run style checker'
|
|
16
16
|
RuboCop::RakeTask.new(:rubocop) do |task|
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.4.0
|
|
@@ -60,6 +60,7 @@ var filestoupload =0;
|
|
|
60
60
|
$($('#fileupload .files .cancel button')[data.context[0].rowIndex]).click();
|
|
61
61
|
}
|
|
62
62
|
var total_sz = parseInt($('#total_upload_size').val()) + data.files[0].size;
|
|
63
|
+
$('#total_upload_size').val( total_sz );
|
|
63
64
|
// is file size too big
|
|
64
65
|
if (data.files[0].size > max_file_size) {
|
|
65
66
|
$($('#fileupload .files .cancel button')[data.context[0].rowIndex]).click();
|
|
@@ -69,7 +70,9 @@ var filestoupload =0;
|
|
|
69
70
|
// cumulative upload file size is too big
|
|
70
71
|
else if( total_sz > max_total_file_size) {
|
|
71
72
|
if (first_file_after_max == '') first_file_after_max = data.files[0].name;
|
|
72
|
-
$($('#fileupload .files .cancel button')[data.context[0].rowIndex]).click();
|
|
73
|
+
$($('#fileupload .files .cancel button')[data.context[0].rowIndex]).click();
|
|
74
|
+
// artificially bump size to max so small files don't sneak in out of order.
|
|
75
|
+
$('#total_upload_size').val( max_total_file_size );
|
|
73
76
|
$("#errmsg").html("All files selected from " + first_file_after_max + " and after will not be uploaded because your total upload is too big. You may not upload more than " + max_total_file_size_str + " in one upload.");
|
|
74
77
|
$("#errmsg").fadeIn('slow');
|
|
75
78
|
}
|
|
@@ -79,9 +82,6 @@ var filestoupload =0;
|
|
|
79
82
|
$("#errmsg").html("All files selected from " + first_file_after_max + " and after will not be uploaded because your total number of files is too big. You may not upload more than " + max_file_count + " files in one upload.");
|
|
80
83
|
$("#errmsg").fadeIn('slow');
|
|
81
84
|
}
|
|
82
|
-
else {
|
|
83
|
-
$('#total_upload_size').val( parseInt($('#total_upload_size').val()) + data.files[0].size );
|
|
84
|
-
}
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
|
|
@@ -4,22 +4,11 @@ module CurationConcerns
|
|
|
4
4
|
|
|
5
5
|
def self.generate_response_body(response_type: :success, message: nil, options: {})
|
|
6
6
|
json_body = default_responses[response_type].merge(options)
|
|
7
|
-
json_body[:description] = message if message
|
|
7
|
+
json_body[:description] = message if message
|
|
8
8
|
json_body
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
-
# Messages that should be overridden by defaults from locale file
|
|
12
|
-
# ie. exception messages from CanCan::AccessDenied
|
|
13
|
-
|
|
14
|
-
def self.messages_to_override
|
|
15
|
-
[
|
|
16
|
-
'You are not authorized to access this page.',
|
|
17
|
-
'ActiveFedora::ObjectNotFoundError'
|
|
18
|
-
]
|
|
19
|
-
end
|
|
20
|
-
|
|
21
11
|
# Default (json) responses for various response types
|
|
22
|
-
|
|
23
12
|
def self.default_responses
|
|
24
13
|
{
|
|
25
14
|
success: {
|
|
@@ -7,31 +7,45 @@ module CurationConcerns
|
|
|
7
7
|
included do
|
|
8
8
|
helper CurationConcerns::MainAppHelpers
|
|
9
9
|
|
|
10
|
-
rescue_from ActiveFedora::ObjectNotFoundError do |
|
|
10
|
+
rescue_from ActiveFedora::ObjectNotFoundError do |_exception|
|
|
11
11
|
respond_to do |wants|
|
|
12
|
-
wants.
|
|
13
|
-
|
|
12
|
+
wants.json { render_json_response(response_type: :not_found) }
|
|
13
|
+
# default to HTML response, even for other non-HTML formats we don't
|
|
14
|
+
# neccesarily know about, seems to be consistent with what Rails4 does
|
|
15
|
+
# by default with uncaught ActiveRecord::RecordNotFound in production
|
|
16
|
+
wants.any do
|
|
17
|
+
# use standard, possibly locally overridden, 404.html file. Even for
|
|
18
|
+
# possibly non-html formats, this is consistent with what Rails does
|
|
19
|
+
# on raising an ActiveRecord::RecordNotFound. Rails.root IS needed
|
|
20
|
+
# for it to work under testing, without worrying about CWD.
|
|
21
|
+
render file: "#{Rails.root}/public/404.html", status: :not_found, layout: false
|
|
22
|
+
end
|
|
14
23
|
end
|
|
15
24
|
end
|
|
16
25
|
end
|
|
17
26
|
|
|
27
|
+
# Called by Hydra::Controller::ControllerBehavior when CanCan::AccessDenied is caught
|
|
28
|
+
# @param [CanCan::AccessDenied] exception error to handle
|
|
18
29
|
def deny_access(exception)
|
|
30
|
+
# For the JSON message, we don't want to display the default CanCan messages,
|
|
31
|
+
# just custom Hydra messages such as "This item is under embargo.", etc.
|
|
32
|
+
json_message = exception.message if exception.is_a? Hydra::AccessDenied
|
|
19
33
|
if current_user && current_user.persisted?
|
|
20
34
|
respond_to do |wants|
|
|
21
35
|
wants.html do
|
|
22
|
-
if [:show, :edit, :update, :destroy].include? exception.action
|
|
36
|
+
if [:show, :edit, :create, :update, :destroy].include? exception.action
|
|
23
37
|
render 'curation_concerns/base/unauthorized', status: :unauthorized
|
|
24
38
|
else
|
|
25
39
|
redirect_to main_app.root_url, alert: exception.message
|
|
26
40
|
end
|
|
27
41
|
end
|
|
28
|
-
wants.json { render_json_response(response_type: :forbidden, message:
|
|
42
|
+
wants.json { render_json_response(response_type: :forbidden, message: json_message) }
|
|
29
43
|
end
|
|
30
44
|
else
|
|
31
45
|
session['user_return_to'.freeze] = request.url
|
|
32
46
|
respond_to do |wants|
|
|
33
47
|
wants.html { redirect_to main_app.new_user_session_path, alert: exception.message }
|
|
34
|
-
wants.json { render_json_response(response_type: :unauthorized, message:
|
|
48
|
+
wants.json { render_json_response(response_type: :unauthorized, message: json_message) }
|
|
35
49
|
end
|
|
36
50
|
end
|
|
37
51
|
end
|
|
@@ -26,6 +26,7 @@ module CurationConcerns::CurationConcernController
|
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
def new
|
|
29
|
+
build_form
|
|
29
30
|
end
|
|
30
31
|
|
|
31
32
|
def create
|
|
@@ -46,12 +47,7 @@ module CurationConcerns::CurationConcernController
|
|
|
46
47
|
# or the user doesn't have access to it.
|
|
47
48
|
def show
|
|
48
49
|
respond_to do |wants|
|
|
49
|
-
wants.html
|
|
50
|
-
_, document_list = search_results(params, CatalogController.search_params_logic + [:find_one])
|
|
51
|
-
curation_concern = document_list.first
|
|
52
|
-
raise CanCan::AccessDenied.new(nil, :show) unless curation_concern
|
|
53
|
-
@presenter = show_presenter.new(curation_concern, current_ability)
|
|
54
|
-
end
|
|
50
|
+
wants.html { presenter }
|
|
55
51
|
wants.json do
|
|
56
52
|
# load and authorize @curation_concern manually because it's skipped for html
|
|
57
53
|
# This has to use #find instead of #load_instance_from_solr because
|
|
@@ -60,23 +56,12 @@ module CurationConcerns::CurationConcernController
|
|
|
60
56
|
authorize! :show, @curation_concern
|
|
61
57
|
render :show, status: :ok
|
|
62
58
|
end
|
|
59
|
+
additional_response_formats(wants)
|
|
63
60
|
end
|
|
64
61
|
end
|
|
65
62
|
|
|
66
|
-
# Gives the class of the show presenter. Override this if you want
|
|
67
|
-
# to use a different presenter.
|
|
68
|
-
def show_presenter
|
|
69
|
-
CurationConcerns::WorkShowPresenter
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
# Gives the class of the form. Override this if you want
|
|
73
|
-
# to use a different form.
|
|
74
|
-
def form_class
|
|
75
|
-
CurationConcerns.const_get("#{self.class.curation_concern_type}Form")
|
|
76
|
-
end
|
|
77
|
-
|
|
78
63
|
def edit
|
|
79
|
-
|
|
64
|
+
build_form
|
|
80
65
|
end
|
|
81
66
|
|
|
82
67
|
def update
|
|
@@ -86,7 +71,7 @@ module CurationConcerns::CurationConcernController
|
|
|
86
71
|
setup_form
|
|
87
72
|
respond_to do |wants|
|
|
88
73
|
wants.html do
|
|
89
|
-
|
|
74
|
+
build_form
|
|
90
75
|
render 'edit', status: :unprocessable_entity
|
|
91
76
|
end
|
|
92
77
|
wants.json { render_json_response(response_type: :unprocessable_entity, options: { errors: curation_concern.errors }) }
|
|
@@ -104,10 +89,30 @@ module CurationConcerns::CurationConcernController
|
|
|
104
89
|
|
|
105
90
|
protected
|
|
106
91
|
|
|
92
|
+
# Gives the class of the show presenter. Override this if you want
|
|
93
|
+
# to use a different presenter.
|
|
94
|
+
def show_presenter
|
|
95
|
+
CurationConcerns::WorkShowPresenter
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Gives the class of the form. Override this if you want
|
|
99
|
+
# to use a different form.
|
|
100
|
+
def form_class
|
|
101
|
+
CurationConcerns.const_get("#{self.class.curation_concern_type.to_s.demodulize}Form")
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def build_form
|
|
105
|
+
@form = form_class.new(curation_concern, current_ability)
|
|
106
|
+
end
|
|
107
|
+
|
|
107
108
|
def actor
|
|
108
109
|
@actor ||= CurationConcerns::CurationConcern.actor(curation_concern, current_user, attributes_for_actor)
|
|
109
110
|
end
|
|
110
111
|
|
|
112
|
+
def presenter
|
|
113
|
+
@presenter ||= show_presenter.new(curation_concern_from_search_results, current_ability)
|
|
114
|
+
end
|
|
115
|
+
|
|
111
116
|
# Override setup_form in concrete controllers to get the form ready for display
|
|
112
117
|
def setup_form
|
|
113
118
|
return unless curation_concern.respond_to?(:contributor) && curation_concern.contributor.blank?
|
|
@@ -120,8 +125,8 @@ module CurationConcerns::CurationConcernController
|
|
|
120
125
|
|
|
121
126
|
def after_create_response
|
|
122
127
|
respond_to do |wants|
|
|
123
|
-
wants.html { redirect_to [main_app,
|
|
124
|
-
wants.json { render :show, status: :created, location: polymorphic_path([main_app,
|
|
128
|
+
wants.html { redirect_to [main_app, curation_concern] }
|
|
129
|
+
wants.json { render :show, status: :created, location: polymorphic_path([main_app, curation_concern]) }
|
|
125
130
|
end
|
|
126
131
|
end
|
|
127
132
|
|
|
@@ -131,8 +136,8 @@ module CurationConcerns::CurationConcernController
|
|
|
131
136
|
redirect_to main_app.confirm_curation_concerns_permission_path(curation_concern)
|
|
132
137
|
else
|
|
133
138
|
respond_to do |wants|
|
|
134
|
-
wants.html { redirect_to [main_app,
|
|
135
|
-
wants.json { render :show, status: :ok, location: polymorphic_path([main_app,
|
|
139
|
+
wants.html { redirect_to [main_app, curation_concern] }
|
|
140
|
+
wants.json { render :show, status: :ok, location: polymorphic_path([main_app, curation_concern]) }
|
|
136
141
|
end
|
|
137
142
|
end
|
|
138
143
|
end
|
|
@@ -150,6 +155,20 @@ module CurationConcerns::CurationConcernController
|
|
|
150
155
|
end
|
|
151
156
|
|
|
152
157
|
def hash_key_for_curation_concern
|
|
153
|
-
self.class.curation_concern_type.
|
|
158
|
+
self.class.curation_concern_type.model_name.param_key
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# Override this method to add additional response
|
|
162
|
+
# formats to your local app
|
|
163
|
+
def additional_response_formats(_)
|
|
164
|
+
# nop
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
private
|
|
168
|
+
|
|
169
|
+
def curation_concern_from_search_results
|
|
170
|
+
_, document_list = search_results(params, CatalogController.search_params_logic + [:find_one])
|
|
171
|
+
raise CanCan::AccessDenied.new(nil, :show) if document_list.empty?
|
|
172
|
+
document_list.first
|
|
154
173
|
end
|
|
155
174
|
end
|
|
@@ -23,7 +23,7 @@ module CurationConcerns
|
|
|
23
23
|
|
|
24
24
|
# routed to /files/:id/edit
|
|
25
25
|
def edit
|
|
26
|
-
|
|
26
|
+
initialize_edit_form
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
# routed to /files (POST)
|
|
@@ -45,7 +45,7 @@ module CurationConcerns
|
|
|
45
45
|
end
|
|
46
46
|
rescue RSolr::Error::Http => error
|
|
47
47
|
logger.error "FileSetController::create rescued #{error.class}\n\t#{error}\n #{error.backtrace.join("\n")}\n\n"
|
|
48
|
-
render_json_response(response_type: :internal_error, options: { message: 'Error occurred while creating
|
|
48
|
+
render_json_response(response_type: :internal_error, options: { message: 'Error occurred while creating a FileSet.' })
|
|
49
49
|
ensure
|
|
50
50
|
# remove the tempfile (only if it is a temp file)
|
|
51
51
|
file.tempfile.delete if file.respond_to?(:tempfile)
|
|
@@ -54,19 +54,13 @@ module CurationConcerns
|
|
|
54
54
|
# routed to /files/:id
|
|
55
55
|
def show
|
|
56
56
|
respond_to do |wants|
|
|
57
|
-
wants.html
|
|
58
|
-
_, document_list = search_results(params, [:add_access_controls_to_solr_params, :find_one, :only_file_sets])
|
|
59
|
-
curation_concern = document_list.first
|
|
60
|
-
raise CanCan::AccessDenied unless curation_concern
|
|
61
|
-
@presenter = show_presenter.new(curation_concern, current_ability)
|
|
62
|
-
end
|
|
57
|
+
wants.html { presenter }
|
|
63
58
|
wants.json do
|
|
64
59
|
# load and authorize @curation_concern manually because it's skipped for html
|
|
65
60
|
@file_set = curation_concern_type.load_instance_from_solr(params[:id]) unless curation_concern
|
|
66
61
|
authorize! :show, @file_set
|
|
67
62
|
render :show, status: :ok
|
|
68
63
|
end
|
|
69
|
-
additional_response_formats(wants)
|
|
70
64
|
end
|
|
71
65
|
end
|
|
72
66
|
|
|
@@ -76,9 +70,16 @@ module CurationConcerns
|
|
|
76
70
|
CurationConcerns::FileSetPresenter
|
|
77
71
|
end
|
|
78
72
|
|
|
73
|
+
# Gives the class of the form. Override this if you want
|
|
74
|
+
# to use a different form.
|
|
75
|
+
def form_class
|
|
76
|
+
CurationConcerns::Forms::FileSetEditForm
|
|
77
|
+
end
|
|
78
|
+
|
|
79
79
|
def destroy
|
|
80
|
+
parent = @file_set.in_works.first
|
|
80
81
|
actor.destroy
|
|
81
|
-
redirect_to [main_app,
|
|
82
|
+
redirect_to [main_app, parent], notice: 'The file has been deleted.'
|
|
82
83
|
end
|
|
83
84
|
|
|
84
85
|
# routed to /files/:id (PUT)
|
|
@@ -95,14 +96,16 @@ module CurationConcerns
|
|
|
95
96
|
if success
|
|
96
97
|
respond_to do |wants|
|
|
97
98
|
wants.html do
|
|
98
|
-
redirect_to [main_app, :
|
|
99
|
-
"The file #{view_context.link_to(@file_set, [main_app, :curation_concerns, @file_set])} has been updated."
|
|
99
|
+
redirect_to [main_app, @file_set], notice: "The file #{view_context.link_to(@file_set, [main_app, @file_set])} has been updated."
|
|
100
100
|
end
|
|
101
|
-
wants.json { render :show, status: :ok, location: polymorphic_path([main_app,
|
|
101
|
+
wants.json { render :show, status: :ok, location: polymorphic_path([main_app, @file_set]) }
|
|
102
102
|
end
|
|
103
103
|
else
|
|
104
104
|
respond_to do |wants|
|
|
105
|
-
wants.html
|
|
105
|
+
wants.html do
|
|
106
|
+
initialize_edit_form
|
|
107
|
+
render 'edit', status: :unprocessable_entity
|
|
108
|
+
end
|
|
106
109
|
wants.json { render_json_response(response_type: :unprocessable_entity, options: { errors: @file_set.errors }) }
|
|
107
110
|
end
|
|
108
111
|
end
|
|
@@ -118,16 +121,23 @@ module CurationConcerns
|
|
|
118
121
|
|
|
119
122
|
# this is provided so that implementing application can override this behavior and map params to different attributes
|
|
120
123
|
def update_metadata
|
|
121
|
-
file_attributes =
|
|
124
|
+
file_attributes = form_class.model_attributes(attributes)
|
|
122
125
|
actor.update_metadata(file_attributes)
|
|
123
126
|
end
|
|
124
127
|
|
|
125
128
|
protected
|
|
126
129
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
130
|
+
def presenter
|
|
131
|
+
@presenter ||= begin
|
|
132
|
+
_, document_list = search_results(params, [:add_access_controls_to_solr_params, :find_one, :only_file_sets])
|
|
133
|
+
curation_concern = document_list.first
|
|
134
|
+
raise CanCan::AccessDenied unless curation_concern
|
|
135
|
+
show_presenter.new(curation_concern, current_ability)
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def initialize_edit_form
|
|
140
|
+
@groups = current_user.groups
|
|
131
141
|
end
|
|
132
142
|
|
|
133
143
|
def file_set_params
|
|
@@ -169,19 +179,18 @@ module CurationConcerns
|
|
|
169
179
|
|
|
170
180
|
def process_file(file)
|
|
171
181
|
update_metadata_from_upload_screen
|
|
172
|
-
|
|
173
|
-
actor.create_metadata(params[:upload_set_id], parent, params[:file_set])
|
|
182
|
+
actor.create_metadata(find_parent_by_id, params[:file_set])
|
|
174
183
|
if actor.create_content(file)
|
|
175
184
|
respond_to do |format|
|
|
176
185
|
format.html do
|
|
177
186
|
if request.xhr?
|
|
178
187
|
render 'jq_upload', formats: 'json', content_type: 'text/html'
|
|
179
188
|
else
|
|
180
|
-
redirect_to [main_app,
|
|
189
|
+
redirect_to [main_app, @file_set.in_works.first]
|
|
181
190
|
end
|
|
182
191
|
end
|
|
183
192
|
format.json do
|
|
184
|
-
render 'jq_upload', status: :created, location: polymorphic_path([main_app,
|
|
193
|
+
render 'jq_upload', status: :created, location: polymorphic_path([main_app, curation_concern])
|
|
185
194
|
end
|
|
186
195
|
end
|
|
187
196
|
else
|
|
@@ -3,7 +3,6 @@ module CurationConcerns::ParentContainer
|
|
|
3
3
|
|
|
4
4
|
included do
|
|
5
5
|
helper_method :parent
|
|
6
|
-
# before_filter :authorize_edit_parent_rights!, except: [:show] # Not sure we actually want this enforced any more (was originally in worthwhile), especially since GenericFiles and GenericWorks (which are PCDM::Objects)can belong to multiple parents
|
|
7
6
|
end
|
|
8
7
|
|
|
9
8
|
# TODO: this is slow, refactor to return a Presenter (fetch from solr)
|
|
@@ -36,14 +35,4 @@ module CurationConcerns::ParentContainer
|
|
|
36
35
|
def new_or_create?
|
|
37
36
|
%w(create new).include? action_name
|
|
38
37
|
end
|
|
39
|
-
|
|
40
|
-
def namespaced_parent_id
|
|
41
|
-
# Sufia::Noid.namespaceize(params[:parent_id])
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
# restricts edit access so that you can only edit a record if you can also edit its parent.
|
|
45
|
-
|
|
46
|
-
def authorize_edit_parent_rights!
|
|
47
|
-
authorize! :edit, parent_id
|
|
48
|
-
end
|
|
49
38
|
end
|
|
@@ -26,7 +26,7 @@ module CurationConcerns
|
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
def new_show
|
|
29
|
-
@su = SingleUseLink.create itemId: params[:id], path: polymorphic_path([main_app,
|
|
29
|
+
@su = SingleUseLink.create itemId: params[:id], path: polymorphic_path([main_app, asset])
|
|
30
30
|
@link = curation_concerns.show_single_use_link_path(@su.downloadKey)
|
|
31
31
|
|
|
32
32
|
respond_to do |format|
|
data/app/controllers/concerns/curation_concerns/single_use_links_viewer_controller_behavior.rb
CHANGED
|
@@ -29,7 +29,7 @@ module CurationConcerns
|
|
|
29
29
|
# Authorize using SingleUseLinksViewerController::Ability
|
|
30
30
|
authorize! :read, curation_concern
|
|
31
31
|
|
|
32
|
-
raise not_found_exception unless single_use_link.path == polymorphic_path([main_app,
|
|
32
|
+
raise not_found_exception unless single_use_link.path == polymorphic_path([main_app, curation_concern])
|
|
33
33
|
|
|
34
34
|
# show the file
|
|
35
35
|
@presenter = presenter_class.new(curation_concern, current_ability)
|
|
@@ -41,6 +41,12 @@ module CurationConcerns
|
|
|
41
41
|
|
|
42
42
|
protected
|
|
43
43
|
|
|
44
|
+
def content_options
|
|
45
|
+
super.tap do |options|
|
|
46
|
+
options[:disposition] = 'attachment' if action_name == 'download'
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
44
50
|
# This is called in a before filter. It causes @asset to be set.
|
|
45
51
|
def authorize_download!
|
|
46
52
|
authorize! :read, asset
|
|
@@ -8,31 +8,43 @@ module CurationConcerns
|
|
|
8
8
|
with_themed_layout '1_column'
|
|
9
9
|
|
|
10
10
|
class_attribute :edit_form_class
|
|
11
|
-
self.edit_form_class = CurationConcerns::
|
|
11
|
+
self.edit_form_class = CurationConcerns::UploadSetForm
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
def edit
|
|
15
|
+
# TODO: redlock this line so that two processes don't attempt to create at the same time.
|
|
15
16
|
@upload_set = UploadSet.find_or_create(params[:id])
|
|
16
17
|
@form = edit_form
|
|
17
18
|
end
|
|
18
19
|
|
|
19
20
|
def update
|
|
20
21
|
authenticate_user!
|
|
21
|
-
@upload_set = UploadSet.
|
|
22
|
+
@upload_set = UploadSet.find(params[:id])
|
|
22
23
|
@upload_set.status = ["processing"]
|
|
23
24
|
@upload_set.save
|
|
24
|
-
|
|
25
|
-
UploadSetUpdateJob.perform_later(current_user.user_key, params[:id], params[:title], file_attributes, params[:visibility])
|
|
25
|
+
create_update_job
|
|
26
26
|
flash[:notice] = 'Your files are being processed by ' + t('curation_concerns.product_name') + ' in the background. The metadata and access controls you specified are being applied. Files will be marked <span class="label label-danger" title="Private">Private</span> until this process is complete (shouldn\'t take too long, hang in there!). You may need to refresh your dashboard to see these updates.'
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
redirect_after_update
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
protected
|
|
32
32
|
|
|
33
|
+
# Override this method if you want to go elsewhere
|
|
34
|
+
def redirect_after_update
|
|
35
|
+
redirect_to main_app.curation_concerns_generic_works_path
|
|
36
|
+
end
|
|
37
|
+
|
|
33
38
|
def edit_form
|
|
34
|
-
|
|
35
|
-
|
|
39
|
+
edit_form_class.new(@upload_set, current_ability)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def create_update_job
|
|
43
|
+
UploadSetUpdateJob.perform_later(current_user.user_key,
|
|
44
|
+
params[:id],
|
|
45
|
+
params[:title],
|
|
46
|
+
edit_form_class.model_attributes(params[:upload_set]),
|
|
47
|
+
params[:visibility])
|
|
36
48
|
end
|
|
37
49
|
end
|
|
38
50
|
end
|
|
@@ -9,7 +9,7 @@ class CurationConcerns::PermissionsController < ApplicationController
|
|
|
9
9
|
def copy
|
|
10
10
|
VisibilityCopyJob.perform_later(curation_concern.id)
|
|
11
11
|
flash_message = 'Updating file permissions. This may take a few minutes. You may want to refresh your browser or return to this record later to see the updated file permissions.'
|
|
12
|
-
redirect_to
|
|
12
|
+
redirect_to [main_app, curation_concern], notice: flash_message
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def curation_concern
|
|
@@ -3,8 +3,12 @@ module CurationConcerns
|
|
|
3
3
|
class CollectionEditForm
|
|
4
4
|
include HydraEditor::Form
|
|
5
5
|
self.model_class = ::Collection
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
|
|
7
|
+
delegate :human_readable_type, :member_ids, to: :model
|
|
8
|
+
|
|
9
|
+
self.terms = [:resource_type, :title, :creator, :contributor, :description,
|
|
10
|
+
:tag, :rights, :publisher, :date_created, :subject, :language,
|
|
11
|
+
:representative_id, :thumbnail_id, :identifier, :based_near,
|
|
8
12
|
:related_url, :visibility]
|
|
9
13
|
|
|
10
14
|
# Test to see if the given field is required
|
|
@@ -4,9 +4,14 @@ module CurationConcerns
|
|
|
4
4
|
include HydraEditor::Form
|
|
5
5
|
attr_accessor :current_ability
|
|
6
6
|
|
|
7
|
+
delegate :human_readable_type, :open_access?, :authenticated_only_access?,
|
|
8
|
+
:open_access_with_embargo_release_date?, :private_access?,
|
|
9
|
+
:embargo_release_date, :lease_expiration_date, :member_ids, to: :model
|
|
10
|
+
|
|
7
11
|
self.terms = [:title, :creator, :contributor, :description,
|
|
8
|
-
:
|
|
9
|
-
:
|
|
12
|
+
:tag, :rights, :publisher, :date_created, :subject, :language,
|
|
13
|
+
:identifier, :based_near, :related_url,
|
|
14
|
+
:representative_id, :thumbnail_id, :files,
|
|
10
15
|
:visibility_during_embargo, :embargo_release_date, :visibility_after_embargo,
|
|
11
16
|
:visibility_during_lease, :lease_expiration_date, :visibility_after_lease,
|
|
12
17
|
:visibility]
|
|
@@ -14,8 +19,14 @@ module CurationConcerns
|
|
|
14
19
|
# @param [ActiveFedora::Base,#member_ids] model
|
|
15
20
|
# @param [Ability] current_ability
|
|
16
21
|
def initialize(model, current_ability)
|
|
17
|
-
@model = model
|
|
18
22
|
@current_ability = current_ability
|
|
23
|
+
super(model)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# The value for embargo_relase_date and lease_expiration_date should not
|
|
27
|
+
# be initialized to empty string
|
|
28
|
+
def initialize_field(key)
|
|
29
|
+
super unless [:embargo_release_date, :lease_expiration_date].include?(key)
|
|
19
30
|
end
|
|
20
31
|
|
|
21
32
|
# The possible values for the representative_id dropdown
|