curation_concerns 1.5.0 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -1
- data/Gemfile +0 -4
- data/app/actors/curation_concerns/actors/file_actor.rb +19 -3
- data/app/assets/javascripts/curation_concerns/curation_concerns.js +1 -0
- data/app/assets/javascripts/curation_concerns/file_manager/sorting.es6 +44 -5
- data/app/assets/javascripts/curation_concerns/file_manager.es6 +9 -2
- data/app/controllers/concerns/curation_concerns/collections_controller_behavior.rb +57 -18
- data/app/controllers/concerns/curation_concerns/permissions_controller_behavior.rb +23 -0
- data/app/controllers/concerns/curation_concerns/selects_collections.rb +2 -0
- data/app/controllers/curation_concerns/permissions_controller.rb +1 -16
- data/app/forms/curation_concerns/forms/work_form.rb +0 -7
- data/app/helpers/batch_select_helper.rb +0 -15
- data/app/helpers/curation_concerns/collections_helper.rb +40 -6
- data/app/helpers/curation_concerns/main_app_helpers.rb +0 -2
- data/app/jobs/characterize_job.rb +5 -3
- data/app/jobs/create_derivatives_job.rb +3 -2
- data/app/jobs/ingest_file_job.rb +16 -16
- data/app/models/concerns/curation_concerns/admin_set_behavior.rb +5 -0
- data/app/models/concerns/curation_concerns/basic_metadata.rb +8 -0
- data/app/models/concerns/curation_concerns/collection_behavior.rb +2 -3
- data/app/models/concerns/curation_concerns/serializers.rb +2 -2
- data/app/models/concerns/curation_concerns/solr_document_behavior.rb +3 -2
- data/app/models/concerns/curation_concerns/work_behavior.rb +1 -1
- data/app/presenters/curation_concerns/work_show_presenter.rb +2 -1
- data/app/renderers/curation_concerns/renderers/external_link_attribute_renderer.rb +13 -0
- data/app/renderers/{renderers.rb → curation_concerns/renderers.rb} +0 -0
- data/app/search_builders/curation_concerns/admin_set_search_builder.rb +3 -3
- data/app/search_builders/curation_concerns/collection_search_builder.rb +6 -4
- data/app/search_builders/curation_concerns/file_set_search_builder.rb +3 -3
- data/app/search_builders/curation_concerns/filter_by_type.rb +17 -5
- data/app/search_builders/curation_concerns/member_search_builder.rb +7 -3
- data/app/search_builders/curation_concerns/single_result.rb +1 -1
- data/app/services/curation_concerns/admin_set_service.rb +6 -8
- data/app/services/curation_concerns/indexes_thumbnails.rb +0 -1
- data/app/services/curation_concerns/license_service.rb +8 -0
- data/app/services/curation_concerns/working_directory.rb +4 -2
- data/app/views/collections/_search_form.html.erb +2 -2
- data/app/views/curation_concerns/base/_file_manager_actions.html.erb +1 -0
- data/app/views/curation_concerns/base/_file_manager_member_resource_options.html.erb +4 -0
- data/app/views/curation_concerns/base/_file_manager_resource_form.html.erb +1 -0
- data/app/views/curation_concerns/base/_form_rights.html.erb +3 -2
- data/config/locales/curation_concerns.en.yml +4 -0
- data/curation_concerns.gemspec +3 -3
- data/lib/curation_concerns/version.rb +1 -1
- data/lib/generators/curation_concerns/models_generator.rb +8 -0
- data/lib/generators/curation_concerns/templates/spec/models/collection_spec.rb +7 -0
- data/lib/generators/curation_concerns/templates/spec/models/file_set_spec.rb +7 -0
- data/spec/actors/curation_concerns/file_actor_spec.rb +17 -3
- data/spec/actors/curation_concerns/file_set_actor_spec.rb +34 -8
- data/spec/controllers/curation_concerns/collections_controller_spec.rb +3 -4
- data/spec/controllers/selects_collections_controller_spec.rb +7 -2
- data/spec/factories/generic_works.rb +3 -1
- data/spec/features/collection_spec.rb +2 -0
- data/spec/helpers/curation_concerns/collections_helper_spec.rb +87 -3
- data/spec/indexers/file_set_indexer_spec.rb +3 -0
- data/spec/indexers/work_indexer_spec.rb +2 -1
- data/spec/javascripts/file_manager_member_spec.coffee +2 -1
- data/spec/javascripts/file_manager_sorting_spec.coffee +23 -0
- data/spec/javascripts/fixtures/sortable.html +182 -0
- data/spec/javascripts/save_manager_spec.coffee +2 -1
- data/spec/jobs/characterize_job_spec.rb +18 -1
- data/spec/jobs/ingest_file_job_spec.rb +18 -13
- data/spec/models/admin_set_spec.rb +5 -3
- data/spec/models/file_set_spec.rb +2 -4
- data/spec/models/solr_document_spec.rb +17 -3
- data/spec/presenters/curation_concerns/collection_presenter_spec.rb +5 -0
- data/spec/renderers/curation_concerns/renderers/external_link_attribute_renderer_spec.rb +22 -0
- data/spec/search_builders/curation_concerns/admin_set_search_builder_spec.rb +8 -5
- data/spec/search_builders/curation_concerns/file_set_search_builder_spec.rb +2 -2
- data/spec/services/curation_concerns/admin_set_service_spec.rb +53 -22
- data/spec/spec_helper.rb +1 -2
- data/spec/test_app_templates/Gemfile.extra +4 -0
- data/spec/views/curation_concerns/base/_attributes.html.erb_spec.rb +10 -4
- data/spec/views/curation_concerns/base/file_manager.html.erb_spec.rb +8 -0
- data/spec/views/curation_concerns/base/show.json.jbuilder_spec.rb +1 -1
- data/spec/views/curation_concerns/file_sets/show.json.jbuilder_spec.rb +1 -1
- metadata +19 -22
- data/app/helpers/collections_helper.rb +0 -4
- data/app/helpers/curation_concerns/collections_helper_behavior.rb +0 -41
- data/app/helpers/curation_concerns/permissions_helper.rb +0 -19
- data/app/helpers/curation_concerns/rights_helper.rb +0 -9
- data/app/models/collection.rb +0 -6
- data/spec/helpers/collections_helper_spec.rb +0 -88
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a18cbc58262bda78bbccb7fcc5e263e09675b574
|
4
|
+
data.tar.gz: fb6ff7b4b9ad80ff9f2ccb26dbfa2ce93b35b585
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: df0282909989ce292b1dbaa07ae83497e0bb7a8cd253120c5dc3d6d5d9d085a539aefacb701fd13e8fa70bef726b008fd2e5937faad7a6cc96b1808af0bb6695
|
7
|
+
data.tar.gz: 7bc806d8693440c4e17958531be96a56af544878796081521339bfa7ae261672f537900337035a29ae79b1a7385693b0f5403f82ae37a29fd0e8f493d8f94ad5
|
data/.rubocop.yml
CHANGED
data/Gemfile
CHANGED
@@ -3,10 +3,6 @@ source 'https://rubygems.org'
|
|
3
3
|
# Specify your gem's dependencies in curation_concerns.gemspec
|
4
4
|
gemspec
|
5
5
|
|
6
|
-
if ENV['RDF_VERSION']
|
7
|
-
gem 'rdf', ENV['RDF_VERSION']
|
8
|
-
end
|
9
|
-
|
10
6
|
group :development, :test do
|
11
7
|
gem 'simplecov', '~> 0.9', require: false
|
12
8
|
gem 'coveralls', require: false
|
@@ -20,9 +20,11 @@ module CurationConcerns
|
|
20
20
|
# have made it to the repo
|
21
21
|
# @param [File, ActionDigest::HTTP::UploadedFile, Tempfile] file the file to save in the repository
|
22
22
|
def ingest_file(file)
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
IngestFileJob.perform_later(
|
24
|
+
file_set,
|
25
|
+
working_file(file),
|
26
|
+
user,
|
27
|
+
ingest_options(file))
|
26
28
|
true
|
27
29
|
end
|
28
30
|
|
@@ -38,6 +40,20 @@ module CurationConcerns
|
|
38
40
|
CharacterizeJob.perform_later(file_set, repository_file.id)
|
39
41
|
true
|
40
42
|
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def working_file(file)
|
47
|
+
path = file.path
|
48
|
+
return path if File.exist?(path)
|
49
|
+
CurationConcerns::WorkingDirectory.copy_file_to_working_directory(file, file_set.id)
|
50
|
+
end
|
51
|
+
|
52
|
+
def ingest_options(file, opts = {})
|
53
|
+
opts.merge!(mime_type: file.content_type) if file.respond_to?(:content_type)
|
54
|
+
opts.merge!(filename: file.original_filename) if file.respond_to?(:original_filename)
|
55
|
+
opts.merge!(relation: relation)
|
56
|
+
end
|
41
57
|
end
|
42
58
|
end
|
43
59
|
end
|
@@ -10,6 +10,7 @@
|
|
10
10
|
//= require curation_concerns/collections
|
11
11
|
//= require curation_concerns/file_manager
|
12
12
|
//= require curation_concerns/boot
|
13
|
+
//= require babel/polyfill
|
13
14
|
|
14
15
|
// Initialize plugins and Bootstrap dropdowns on jQuery's ready event as well as
|
15
16
|
// Turbolinks's page change event.
|
@@ -5,6 +5,7 @@ export default class SortManager {
|
|
5
5
|
this.initialize_sort()
|
6
6
|
this.element.data("current-order", this.order)
|
7
7
|
this.save_manager = save_manager
|
8
|
+
this.initialize_alpha_sort_button()
|
8
9
|
}
|
9
10
|
|
10
11
|
initialize_sort() {
|
@@ -42,17 +43,21 @@ export default class SortManager {
|
|
42
43
|
return this.element.children().index(item)
|
43
44
|
}
|
44
45
|
|
46
|
+
register_order_change() {
|
47
|
+
if(this.order.toString() != this.element.data("current-order").toString()) {
|
48
|
+
this.save_manager.push_changed(this)
|
49
|
+
} else {
|
50
|
+
this.save_manager.mark_unchanged(this)
|
51
|
+
}
|
52
|
+
}
|
53
|
+
|
45
54
|
get stopped_sorting() {
|
46
55
|
return (event, ui) => {
|
47
56
|
this.sorting_info.end = this.get_sort_position($(ui.item))
|
48
57
|
if(this.sorting_info.end == this.sorting_info.start) {
|
49
58
|
return
|
50
59
|
}
|
51
|
-
|
52
|
-
this.save_manager.push_changed(this)
|
53
|
-
} else {
|
54
|
-
this.save_manager.mark_unchanged(this)
|
55
|
-
}
|
60
|
+
this.register_order_change()
|
56
61
|
}
|
57
62
|
}
|
58
63
|
|
@@ -82,4 +87,38 @@ export default class SortManager {
|
|
82
87
|
}
|
83
88
|
).toArray()
|
84
89
|
}
|
90
|
+
|
91
|
+
get alpha_sort_button() {
|
92
|
+
return $("*[data-action='alpha-sort-action']")
|
93
|
+
}
|
94
|
+
|
95
|
+
initialize_alpha_sort_button() {
|
96
|
+
let that = this
|
97
|
+
this.alpha_sort_button.click(function() { that.sort_alpha() } )
|
98
|
+
}
|
99
|
+
|
100
|
+
sort_alpha() {
|
101
|
+
// create array of { title, element } objects
|
102
|
+
let array = []
|
103
|
+
let children = this.element.children().get()
|
104
|
+
children.forEach(function(child) {
|
105
|
+
let title = $(child).find("input.title").val()
|
106
|
+
array.push(
|
107
|
+
{ title: title,
|
108
|
+
element: child }
|
109
|
+
)
|
110
|
+
})
|
111
|
+
// sort array by title of each object
|
112
|
+
array.sort(function(o1, o2) {
|
113
|
+
let a = o1.title.toLowerCase()
|
114
|
+
let b = o2.title.toLowerCase()
|
115
|
+
return a < b ? -1 : (a > b ? 1 : 0);
|
116
|
+
});
|
117
|
+
// replace contents of #sortable with elements from the array
|
118
|
+
this.element.empty()
|
119
|
+
for (let child of array) {
|
120
|
+
this.element.append(child.element)
|
121
|
+
}
|
122
|
+
this.register_order_change()
|
123
|
+
}
|
85
124
|
}
|
@@ -42,8 +42,9 @@ export default class FileManager {
|
|
42
42
|
}
|
43
43
|
|
44
44
|
// Initialize a form that represents the parent resource as a whole.
|
45
|
-
// For the purpose of CC, this
|
46
|
-
//
|
45
|
+
// For the purpose of CC, this comes with hidden fields for
|
46
|
+
// thumbnail_id and representative_id
|
47
|
+
// which are synchronized with the radio buttons on each member and then
|
47
48
|
// submitted with the SaveManager.
|
48
49
|
resource_form() {
|
49
50
|
let manager = new FileManagerMember($("#resource-form").parent(), this.save_manager)
|
@@ -55,6 +56,12 @@ export default class FileManager {
|
|
55
56
|
$("*[data-member-link=thumbnail_id]").val(val)
|
56
57
|
$("*[data-member-link=thumbnail_id]").change()
|
57
58
|
})
|
59
|
+
new InputTracker($("*[data-member-link=representative_id]"), manager)
|
60
|
+
$("#sortable *[name=representative_id]").change(function() {
|
61
|
+
let val = $("#sortable *[name=representative_id]:checked").val()
|
62
|
+
$("*[data-member-link=representative_id]").val(val)
|
63
|
+
$("*[data-member-link=representative_id]").change()
|
64
|
+
})
|
58
65
|
}
|
59
66
|
|
60
67
|
// Keep the ui/sortable placeholder the right size.
|
@@ -2,9 +2,7 @@ module CurationConcerns
|
|
2
2
|
module CollectionsControllerBehavior
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
include Blacklight::AccessControls::Catalog
|
5
|
-
|
6
5
|
include Blacklight::Base
|
7
|
-
include CurationConcerns::SelectsCollections
|
8
6
|
|
9
7
|
included do
|
10
8
|
before_action :filter_docs_with_read_access!, except: :show
|
@@ -29,17 +27,38 @@ module CurationConcerns
|
|
29
27
|
end
|
30
28
|
|
31
29
|
# actions: audit, index, create, new, edit, show, update, destroy, permissions, citation
|
32
|
-
before_action :authenticate_user!, except: [:show]
|
30
|
+
before_action :authenticate_user!, except: [:show, :index]
|
33
31
|
load_and_authorize_resource except: [:index, :show], instance_name: :collection
|
34
32
|
|
35
|
-
class_attribute :presenter_class,
|
33
|
+
class_attribute :presenter_class,
|
34
|
+
:form_class,
|
35
|
+
:list_search_builder_class,
|
36
|
+
:single_item_search_builder_class,
|
37
|
+
:member_search_builder_class
|
38
|
+
|
39
|
+
alias_method :collection_search_builder_class, :single_item_search_builder_class
|
40
|
+
deprecation_deprecate collection_search_builder_class: "use single_item_search_builder_class instead"
|
41
|
+
|
42
|
+
alias_method :collections_search_builder_class, :list_search_builder_class
|
43
|
+
deprecation_deprecate collections_search_builder_class: "use list_search_builder_class instead"
|
44
|
+
|
45
|
+
alias_method :collection_member_search_builder_class, :member_search_builder_class
|
46
|
+
deprecation_deprecate collection_member_search_builder_class: "use member_search_builder_class instead"
|
47
|
+
|
36
48
|
self.presenter_class = CurationConcerns::CollectionPresenter
|
37
49
|
self.form_class = CurationConcerns::Forms::CollectionEditForm
|
50
|
+
|
51
|
+
# To build a query to find a list of collections
|
52
|
+
self.list_search_builder_class = CurationConcerns::CollectionSearchBuilder
|
53
|
+
# The search builder to find the collection
|
54
|
+
self.single_item_search_builder_class = CurationConcerns::WorkSearchBuilder
|
55
|
+
# The search builder to find the collections' members
|
56
|
+
self.member_search_builder_class = CurationConcerns::CollectionMemberSearchBuilder
|
38
57
|
end
|
39
58
|
|
40
59
|
def index
|
41
60
|
# run the solr query to find the collections
|
42
|
-
query =
|
61
|
+
query = list_search_builder.with(params).query
|
43
62
|
@response = repository.search(query)
|
44
63
|
@document_list = @response.documents
|
45
64
|
end
|
@@ -55,7 +74,7 @@ module CurationConcerns
|
|
55
74
|
|
56
75
|
def edit
|
57
76
|
query_collection_members
|
58
|
-
|
77
|
+
@user_collections = find_collections_for_form
|
59
78
|
form
|
60
79
|
end
|
61
80
|
|
@@ -144,6 +163,17 @@ module CurationConcerns
|
|
144
163
|
|
145
164
|
protected
|
146
165
|
|
166
|
+
# TODO: This method could become a collection service.
|
167
|
+
# TODO: It seems suspicious that this is returning collections with read
|
168
|
+
# access rather than collections with edit access
|
169
|
+
# run a solr query to get the collections the user has access to read
|
170
|
+
# @return [Array] a list of the user's collections
|
171
|
+
def find_collections_for_form
|
172
|
+
query = list_search_builder.with(q: '').query
|
173
|
+
response = repository.search(query)
|
174
|
+
response.documents
|
175
|
+
end
|
176
|
+
|
147
177
|
def remove_select_something_first_flash
|
148
178
|
flash.delete(:notice) if flash.notice == 'Select something first'
|
149
179
|
end
|
@@ -152,25 +182,38 @@ module CurationConcerns
|
|
152
182
|
@presenter ||= begin
|
153
183
|
# Query Solr for the collection.
|
154
184
|
# run the solr query to find the collection members
|
155
|
-
response = repository.search(
|
185
|
+
response = repository.search(single_item_search_builder.query)
|
156
186
|
curation_concern = response.documents.first
|
157
187
|
raise CanCan::AccessDenied unless curation_concern
|
158
188
|
presenter_class.new(curation_concern, current_ability)
|
159
189
|
end
|
160
190
|
end
|
161
191
|
|
162
|
-
|
163
|
-
|
192
|
+
# Instantiates the search builder that builds a query for a single item
|
193
|
+
# this is useful in the show view.
|
194
|
+
def single_item_search_builder
|
195
|
+
single_item_search_builder_class.new(self).with(params.except(:q, :page))
|
164
196
|
end
|
165
197
|
|
166
|
-
|
167
|
-
|
198
|
+
alias collection_search_builder single_item_search_builder
|
199
|
+
deprecation_deprecate collection_search_builder: "use single_item_search_builder instead"
|
200
|
+
|
201
|
+
# Instantiates the search builder that builds a query for items that are
|
202
|
+
# members of the current collection. This is used in the show view.
|
203
|
+
def member_search_builder
|
204
|
+
@member_search_builder ||= member_search_builder_class.new(self)
|
168
205
|
end
|
169
206
|
|
170
|
-
|
171
|
-
|
207
|
+
alias collection_member_search_builder member_search_builder
|
208
|
+
deprecation_deprecate collection_member_search_builder: "use member_search_builder instead"
|
209
|
+
|
210
|
+
def list_search_builder
|
211
|
+
list_search_builder_class.new(self)
|
172
212
|
end
|
173
213
|
|
214
|
+
alias collections_search_builder list_search_builder
|
215
|
+
deprecation_deprecate collections_search_builder: "use list_search_builder instead"
|
216
|
+
|
174
217
|
def collection_params
|
175
218
|
form_class.model_attributes(params[:collection])
|
176
219
|
end
|
@@ -189,7 +232,7 @@ module CurationConcerns
|
|
189
232
|
|
190
233
|
# @return <Hash> a representation of the solr query that find the collection members
|
191
234
|
def query_for_collection_members
|
192
|
-
|
235
|
+
member_search_builder.with(params_for_members_query).query
|
193
236
|
end
|
194
237
|
|
195
238
|
# You can override this method if you need to provide additional inputs to the search
|
@@ -200,10 +243,6 @@ module CurationConcerns
|
|
200
243
|
params.merge(q: params[:cq])
|
201
244
|
end
|
202
245
|
|
203
|
-
def collection_member_search_builder
|
204
|
-
@collection_member_search_builder ||= collection_member_search_builder_class.new(self)
|
205
|
-
end
|
206
|
-
|
207
246
|
def process_member_changes
|
208
247
|
case params[:collection][:members]
|
209
248
|
when 'add' then add_members_to_collection
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module CurationConcerns
|
2
|
+
module PermissionsControllerBehavior
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
include CurationConcerns::CurationConcernController
|
7
|
+
|
8
|
+
def confirm
|
9
|
+
end
|
10
|
+
|
11
|
+
def copy
|
12
|
+
authorize! :edit, curation_concern
|
13
|
+
VisibilityCopyJob.perform_later(curation_concern)
|
14
|
+
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.'
|
15
|
+
redirect_to [main_app, curation_concern], notice: flash_message
|
16
|
+
end
|
17
|
+
|
18
|
+
def curation_concern
|
19
|
+
@curation_concern ||= ActiveFedora::Base.find(params[:id])
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -1,7 +1,9 @@
|
|
1
1
|
module CurationConcerns::SelectsCollections
|
2
2
|
extend ActiveSupport::Concern
|
3
|
+
extend Deprecation
|
3
4
|
|
4
5
|
included do
|
6
|
+
Deprecation.warn(CurationConcerns::SelectsCollections, "CurationConcerns::SelectsCollections is deprecated and will be removed in curation_concerns 2.0")
|
5
7
|
configure_blacklight do |config|
|
6
8
|
config.search_builder_class = CurationConcerns::CollectionSearchBuilder
|
7
9
|
end
|
@@ -1,18 +1,3 @@
|
|
1
1
|
class CurationConcerns::PermissionsController < ApplicationController
|
2
|
-
include CurationConcerns::
|
3
|
-
with_themed_layout '1_column'
|
4
|
-
|
5
|
-
def confirm
|
6
|
-
end
|
7
|
-
|
8
|
-
def copy
|
9
|
-
authorize! :edit, curation_concern
|
10
|
-
VisibilityCopyJob.perform_later(curation_concern)
|
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 [main_app, curation_concern], notice: flash_message
|
13
|
-
end
|
14
|
-
|
15
|
-
def curation_concern
|
16
|
-
@curation_concern ||= ActiveFedora::Base.find(params[:id])
|
17
|
-
end
|
2
|
+
include CurationConcerns::PermissionsControllerBehavior
|
18
3
|
end
|
@@ -51,13 +51,6 @@ module CurationConcerns
|
|
51
51
|
super
|
52
52
|
end
|
53
53
|
end
|
54
|
-
|
55
|
-
# Overriden to cast 'rights' to an array
|
56
|
-
def sanitize_params(form_params)
|
57
|
-
super.tap do |params|
|
58
|
-
params['rights'] = Array.wrap(params['rights']) if params.key?('rights')
|
59
|
-
end
|
60
|
-
end
|
61
54
|
end
|
62
55
|
|
63
56
|
private
|
@@ -1,23 +1,8 @@
|
|
1
1
|
# View Helpers for Hydra Batch Edit functionality
|
2
2
|
module BatchSelectHelper
|
3
|
-
# determines if the given document id is in the batch
|
4
|
-
# def item_in_batch?(doc_id)
|
5
|
-
# session[:batch_document_ids] && session[:batch_document_ids].include?(doc_id) ? true : false
|
6
|
-
# end
|
7
|
-
|
8
|
-
# Displays the batch edit tools. Put this in your search result page template. We recommend putting it in catalog/_sort_and_per_page.html.erb
|
9
|
-
def batch_select_tools
|
10
|
-
render partial: '/batch_select/tools'
|
11
|
-
end
|
12
|
-
|
13
3
|
# Displays the button to select/deselect items for your batch. Call this in the index partial that's rendered for each search result.
|
14
4
|
# @param [Hash] document the Hash (aka Solr hit) for one Solr document
|
15
5
|
def button_for_add_to_batch(document)
|
16
6
|
render partial: '/batch_select/add_button', locals: { document: document }
|
17
7
|
end
|
18
|
-
|
19
|
-
# Displays the check all button to select/deselect items for your batch. Put this in your search result page template. We put it in catalog/index.html
|
20
|
-
def batch_check_all(label = 'Use all results')
|
21
|
-
render partial: '/batch_select/check_all', locals: { label: label }
|
22
|
-
end
|
23
8
|
end
|
@@ -1,4 +1,41 @@
|
|
1
1
|
module CurationConcerns::CollectionsHelper
|
2
|
+
def has_collection_search_parameters?
|
3
|
+
!params[:cq].blank?
|
4
|
+
end
|
5
|
+
|
6
|
+
def button_for_remove_from_collection(collection, document, label = 'Remove From Collection')
|
7
|
+
render '/collections/button_remove_from_collection', collection: collection, label: label, document: document
|
8
|
+
end
|
9
|
+
|
10
|
+
def button_for_remove_selected_from_collection(collection, label = 'Remove From Collection')
|
11
|
+
render '/collections/button_for_remove_selected_from_collection', collection: collection, label: label
|
12
|
+
end
|
13
|
+
|
14
|
+
# add hidden fields to a form for removing a single document from a collection
|
15
|
+
def single_item_action_remove_form_fields(form, document)
|
16
|
+
single_item_action_form_fields(form, document, 'remove')
|
17
|
+
end
|
18
|
+
|
19
|
+
# add hidden fields to a form for adding a single document to a collection
|
20
|
+
def single_item_action_add_form_fields(form, document)
|
21
|
+
single_item_action_form_fields(form, document, 'add')
|
22
|
+
end
|
23
|
+
|
24
|
+
# add hidden fields to a form for performing an action on a single document on a collection
|
25
|
+
def single_item_action_form_fields(form, document, action)
|
26
|
+
render '/collections/single_item_action_fields', form: form, document: document, action: action
|
27
|
+
end
|
28
|
+
|
29
|
+
def hidden_collection_members
|
30
|
+
erbout = ''
|
31
|
+
if params[:batch_document_ids].present?
|
32
|
+
params[:batch_document_ids].each do |batch_item|
|
33
|
+
erbout.concat hidden_field_tag('batch_document_ids[]', batch_item)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
erbout.html_safe
|
37
|
+
end
|
38
|
+
|
2
39
|
def collection_modal_id(collectible)
|
3
40
|
"#{collectible.to_param.tr(':', '-')}-modal"
|
4
41
|
end
|
@@ -49,13 +86,10 @@ module CurationConcerns::CollectionsHelper
|
|
49
86
|
if current_user.respond_to?(:collections)
|
50
87
|
return current_user.collections.map { |c| [c.title.join(', '), c.id] }
|
51
88
|
end
|
52
|
-
query = ActiveFedora::SolrQueryBuilder
|
53
|
-
.construct_query_for_rel(
|
54
|
-
has_model: Collection.to_class_uri)
|
55
89
|
convert_solr_docs_to_select_options(
|
56
|
-
|
57
|
-
|
58
|
-
|
90
|
+
::Collection.search_with_conditions({},
|
91
|
+
fl: 'title_tesim id',
|
92
|
+
rows: 1000)
|
59
93
|
)
|
60
94
|
end
|
61
95
|
|
@@ -3,13 +3,15 @@ class CharacterizeJob < ActiveJob::Base
|
|
3
3
|
|
4
4
|
# @param [FileSet] file_set
|
5
5
|
# @param [String] file_id identifier for a Hydra::PCDM::File
|
6
|
-
|
7
|
-
|
6
|
+
# @param [String, NilClass] filepath the cached file within the CurationConcerns.config.working_path
|
7
|
+
def perform(file_set, file_id, filepath = nil)
|
8
|
+
filename = CurationConcerns::WorkingDirectory.find_or_retrieve(file_id, file_set.id, filepath)
|
8
9
|
raise LoadError, "#{file_set.class.characterization_proxy} was not found" unless file_set.characterization_proxy?
|
9
10
|
Hydra::Works::CharacterizationService.run(file_set.characterization_proxy, filename)
|
10
11
|
Rails.logger.debug "Ran characterization on #{file_set.characterization_proxy.id} (#{file_set.characterization_proxy.mime_type})"
|
11
12
|
file_set.characterization_proxy.save!
|
12
13
|
file_set.update_index
|
13
|
-
|
14
|
+
file_set.parent.in_collections.each(&:update_index) if file_set.parent
|
15
|
+
CreateDerivativesJob.perform_later(file_set, file_id, filename)
|
14
16
|
end
|
15
17
|
end
|
@@ -3,9 +3,10 @@ class CreateDerivativesJob < ActiveJob::Base
|
|
3
3
|
|
4
4
|
# @param [FileSet] file_set
|
5
5
|
# @param [String] file_id identifier for a Hydra::PCDM::File
|
6
|
-
|
6
|
+
# @param [String, NilClass] filepath the cached file within the CurationConcerns.config.working_path
|
7
|
+
def perform(file_set, file_id, filepath = nil)
|
7
8
|
return if file_set.video? && !CurationConcerns.config.enable_ffmpeg
|
8
|
-
filename = CurationConcerns::WorkingDirectory.find_or_retrieve(file_id, file_set.id)
|
9
|
+
filename = CurationConcerns::WorkingDirectory.find_or_retrieve(file_id, file_set.id, filepath)
|
9
10
|
|
10
11
|
file_set.create_derivatives(filename)
|
11
12
|
|
data/app/jobs/ingest_file_job.rb
CHANGED
@@ -2,36 +2,36 @@ class IngestFileJob < ActiveJob::Base
|
|
2
2
|
queue_as CurationConcerns.config.ingest_queue_name
|
3
3
|
|
4
4
|
# @param [FileSet] file_set
|
5
|
-
# @param [String]
|
6
|
-
# @param [String,NilClass] mime_type
|
5
|
+
# @param [String] filepath the cached file within the CurationConcerns.config.working_path
|
7
6
|
# @param [User] user
|
8
|
-
# @
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
if mime_type
|
14
|
-
local_file = Hydra::Derivatives::IoDecorator.new(local_file)
|
15
|
-
local_file.mime_type = mime_type
|
16
|
-
local_file.original_name = File.basename(filename)
|
17
|
-
end
|
7
|
+
# @option opts [String] mime_type
|
8
|
+
# @option opts [String] filename
|
9
|
+
# @option opts [String] relation, ex. :original_file
|
10
|
+
def perform(file_set, filepath, user, opts = {})
|
11
|
+
relation = opts.fetch(:relation, :original_file).to_sym
|
18
12
|
|
19
|
-
#
|
13
|
+
# Wrap in an IO decorator to attach passed-in options
|
14
|
+
local_file = Hydra::Derivatives::IoDecorator.new(File.open(filepath, "rb"))
|
15
|
+
local_file.mime_type = opts.fetch(:mime_type, nil)
|
16
|
+
local_file.original_name = opts.fetch(:filename, File.basename(filepath))
|
17
|
+
|
18
|
+
# Tell AddFileToFileSet service to skip versioning because versions will be minted by
|
19
|
+
# VersionCommitter when necessary during save_characterize_and_record_committer.
|
20
20
|
Hydra::Works::AddFileToFileSet.call(file_set,
|
21
21
|
local_file,
|
22
|
-
relation
|
22
|
+
relation,
|
23
23
|
versioning: false)
|
24
24
|
|
25
25
|
# Persist changes to the file_set
|
26
26
|
file_set.save!
|
27
27
|
|
28
|
-
repository_file = file_set.send(relation
|
28
|
+
repository_file = file_set.send(relation)
|
29
29
|
|
30
30
|
# Do post file ingest actions
|
31
31
|
CurationConcerns::VersioningService.create(repository_file, user)
|
32
32
|
|
33
33
|
# TODO: this is a problem, the file may not be available at this path on another machine.
|
34
34
|
# It may be local, or it may be in s3
|
35
|
-
CharacterizeJob.perform_later(file_set, repository_file.id)
|
35
|
+
CharacterizeJob.perform_later(file_set, repository_file.id, filepath)
|
36
36
|
end
|
37
37
|
end
|
@@ -17,6 +17,11 @@ module CurationConcerns
|
|
17
17
|
property :description, predicate: ::RDF::Vocab::DC.description do |index|
|
18
18
|
index.as :stored_searchable
|
19
19
|
end
|
20
|
+
|
21
|
+
property :creator, predicate: ::RDF::Vocab::DC11.creator do |index|
|
22
|
+
index.as :symbol
|
23
|
+
end
|
24
|
+
|
20
25
|
has_many :members,
|
21
26
|
predicate: ::RDF::Vocab::DC.isPartOf,
|
22
27
|
class_name: 'ActiveFedora::Base'
|
@@ -28,9 +28,17 @@ module CurationConcerns
|
|
28
28
|
property :keyword, predicate: ::RDF::Vocab::DC11.relation do |index|
|
29
29
|
index.as :stored_searchable, :facetable
|
30
30
|
end
|
31
|
+
|
32
|
+
# Used for a license
|
31
33
|
property :rights, predicate: ::RDF::Vocab::DC.rights do |index|
|
32
34
|
index.as :stored_searchable
|
33
35
|
end
|
36
|
+
|
37
|
+
# This is for the rights statement
|
38
|
+
property :rights_statement, predicate: ::RDF::Vocab::EDM.rights do |index|
|
39
|
+
index.as :stored_searchable
|
40
|
+
end
|
41
|
+
|
34
42
|
property :publisher, predicate: ::RDF::Vocab::DC11.publisher do |index|
|
35
43
|
index.as :stored_searchable, :facetable
|
36
44
|
end
|
@@ -14,7 +14,7 @@ module CurationConcerns
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def to_s
|
17
|
-
title.present? ? title : 'No Title'
|
17
|
+
title.present? ? title.join(' | ') : 'No Title'
|
18
18
|
end
|
19
19
|
|
20
20
|
module ClassMethods
|
@@ -35,11 +35,10 @@ module CurationConcerns
|
|
35
35
|
|
36
36
|
# One query per member_id because Solr is not a relational database
|
37
37
|
sizes = member_ids.collect do |work_id|
|
38
|
-
query = ActiveFedora::SolrQueryBuilder.construct_query_for_rel(has_model: ::FileSet.to_class_uri)
|
39
38
|
argz = { fl: "id, #{file_size_field}",
|
40
39
|
fq: "{!join from=#{member_ids_field} to=id}id:#{work_id}"
|
41
40
|
}
|
42
|
-
files =
|
41
|
+
files = ::FileSet.search_with_conditions({}, argz)
|
43
42
|
files.reduce(0) { |sum, f| sum + f[file_size_field].to_i }
|
44
43
|
end
|
45
44
|
|
@@ -66,7 +66,7 @@ module CurationConcerns
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def thumbnail_id
|
69
|
-
first(Solrizer.solr_name('
|
69
|
+
first(Solrizer.solr_name('hasRelatedImage', :symbol))
|
70
70
|
end
|
71
71
|
|
72
72
|
# Date created is indexed as a string. This allows users to enter values like: 'Circa 1840-1844'
|
@@ -104,7 +104,8 @@ module CurationConcerns
|
|
104
104
|
end
|
105
105
|
|
106
106
|
def creator
|
107
|
-
|
107
|
+
descriptor = hydra_model.index_config[:creator].behaviors.first
|
108
|
+
fetch(Solrizer.solr_name('creator', descriptor), [])
|
108
109
|
end
|
109
110
|
|
110
111
|
def contributor
|