curation_concerns 1.0.0.beta6 → 1.0.0.beta7
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/app/actors/curation_concerns/actors/add_to_work_actor.rb +35 -0
- data/app/controllers/concerns/curation_concerns/curation_concern_controller.rb +21 -4
- data/app/forms/curation_concerns/forms/work_form.rb +10 -4
- data/app/models/concerns/curation_concerns/nested_works.rb +14 -0
- data/app/models/concerns/curation_concerns/work_behavior.rb +1 -0
- data/app/presenters/curation_concerns/composite_presenter_factory.rb +22 -0
- data/app/presenters/curation_concerns/model_proxy.rb +1 -1
- data/app/presenters/curation_concerns/work_show_presenter.rb +21 -2
- data/app/search_builders/curation_concerns/work_relation.rb +40 -0
- data/app/services/curation_concerns/actors/actor_factory.rb +1 -0
- data/app/services/curation_concerns/contextual_path.rb +19 -0
- data/app/services/curation_concerns/thumbnail_path_service.rb +2 -1
- data/app/views/curation_concerns/base/_actions.html.erb +3 -0
- data/app/views/curation_concerns/base/_file_manager_member.html.erb +1 -1
- data/app/views/curation_concerns/base/_file_manager_members.html.erb +1 -1
- data/app/views/curation_concerns/base/_form_in_works.html.erb +6 -0
- data/app/views/curation_concerns/base/_form_supplementary_fields.html.erb +1 -0
- data/app/views/curation_concerns/base/_member.html.erb +3 -3
- data/app/views/curation_concerns/base/_related_files.html.erb +5 -5
- data/app/views/curation_concerns/base/_representative_media.html.erb +1 -1
- data/app/views/curation_concerns/base/_show_actions.html.erb +14 -0
- data/app/views/curation_concerns/base/file_manager.html.erb +1 -1
- data/app/views/curation_concerns/base/show.html.erb +9 -1
- data/config/locales/curation_concerns.en.yml +3 -0
- data/lib/curation_concerns/rails/routes.rb +10 -0
- data/lib/curation_concerns/version.rb +1 -1
- data/lib/generators/curation_concerns/work/templates/model.rb.erb +2 -0
- data/spec/actors/curation_concerns/work_actor_spec.rb +33 -0
- data/spec/controllers/curation_concerns/generic_works_controller_spec.rb +9 -0
- data/spec/features/create_child_work_spec.rb +62 -0
- data/spec/models/generic_work_spec.rb +25 -0
- data/spec/presenters/curation_concerns/work_show_presenter_spec.rb +22 -2
- data/spec/search_builders/curation_concerns/work_relation_spec.rb +10 -0
- data/spec/services/thumbnail_path_service_spec.rb +1 -1
- data/spec/views/curation_concerns/base/_member.html.erb_spec.rb +3 -0
- data/spec/views/curation_concerns/base/_show_actions.html.erb_spec.rb +10 -1
- data/spec/views/curation_concerns/base/file_manager.html.erb_spec.rb +16 -2
- metadata +13 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 22cca2bceccfc06d12a86825fe10d8f27ecfc0b7
|
4
|
+
data.tar.gz: 2cb151b95b0c2da91d3fcb2b0b54404e4d4ad1d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 080f23f93d1c098d0f15e3c1c6c416de18cf2f40894d8fb2b700e8a4e571b632d8c0a680b50fc72a6547336ad3aef527196c76c9eb65f66e72de57ea5be19538
|
7
|
+
data.tar.gz: 99c4d8ee5bf8f9f6e7272cc45a54a114672e7371f64a3b108cfb1ad9bff90d3897a2619de52f58bb6274e03be48b22414d7678059f07aeceeea34d7d76d9d723
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module CurationConcerns
|
2
|
+
module Actors
|
3
|
+
class AddToWorkActor < AbstractActor
|
4
|
+
def create(attributes)
|
5
|
+
work_ids = attributes.delete(:in_works_ids)
|
6
|
+
next_actor.create(attributes) && add_to_works(work_ids)
|
7
|
+
end
|
8
|
+
|
9
|
+
def update(attributes)
|
10
|
+
work_ids = attributes.delete(:in_works_ids)
|
11
|
+
add_to_works(work_ids) && next_actor.update(attributes)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def add_to_works(new_work_ids)
|
17
|
+
return true unless new_work_ids.present?
|
18
|
+
(curation_concern.in_works_ids - new_work_ids).each do |old_id|
|
19
|
+
work = ::ActiveFedora::Base.find(old_id)
|
20
|
+
work.ordered_members.delete(curation_concern)
|
21
|
+
work.members.delete(curation_concern)
|
22
|
+
work.save
|
23
|
+
end
|
24
|
+
|
25
|
+
# add to new
|
26
|
+
(new_work_ids - curation_concern.in_works_ids).each do |work_id|
|
27
|
+
work = ::ActiveFedora::Base.find(work_id)
|
28
|
+
work.ordered_members << curation_concern
|
29
|
+
work.save
|
30
|
+
end
|
31
|
+
true
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -12,7 +12,7 @@ module CurationConcerns::CurationConcernController
|
|
12
12
|
class_attribute :_curation_concern_type, :show_presenter
|
13
13
|
self.show_presenter = CurationConcerns::WorkShowPresenter
|
14
14
|
attr_accessor :curation_concern
|
15
|
-
helper_method :curation_concern
|
15
|
+
helper_method :curation_concern, :contextual_path
|
16
16
|
end
|
17
17
|
|
18
18
|
module ClassMethods
|
@@ -53,7 +53,7 @@ module CurationConcerns::CurationConcernController
|
|
53
53
|
# or the user doesn't have access to it.
|
54
54
|
def show
|
55
55
|
respond_to do |wants|
|
56
|
-
wants.html { presenter }
|
56
|
+
wants.html { presenter && parent_presenter }
|
57
57
|
wants.json do
|
58
58
|
# load and authorize @curation_concern manually because it's skipped for html
|
59
59
|
# This has to use #find instead of #load_instance_from_solr because
|
@@ -117,13 +117,22 @@ module CurationConcerns::CurationConcernController
|
|
117
117
|
@presenter ||= show_presenter.new(curation_concern_from_search_results, current_ability, request)
|
118
118
|
end
|
119
119
|
|
120
|
+
def parent_presenter
|
121
|
+
@parent_presenter ||=
|
122
|
+
begin
|
123
|
+
if params[:parent_id]
|
124
|
+
@parent_presenter ||= show_presenter.new(search_result_document(id: params[:parent_id]), current_ability, request)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
120
129
|
def _prefixes
|
121
130
|
@_prefixes ||= super + ['curation_concerns/base']
|
122
131
|
end
|
123
132
|
|
124
133
|
def after_create_response
|
125
134
|
respond_to do |wants|
|
126
|
-
wants.html { redirect_to
|
135
|
+
wants.html { redirect_to contextual_path(curation_concern, parent_presenter) }
|
127
136
|
wants.json { render :show, status: :created, location: polymorphic_path([main_app, curation_concern]) }
|
128
137
|
end
|
129
138
|
end
|
@@ -166,10 +175,18 @@ module CurationConcerns::CurationConcernController
|
|
166
175
|
CurationConcerns::WorkSearchBuilder
|
167
176
|
end
|
168
177
|
|
178
|
+
def contextual_path(presenter, parent_presenter)
|
179
|
+
::CurationConcerns::ContextualPath.new(presenter, parent_presenter).show
|
180
|
+
end
|
181
|
+
|
169
182
|
private
|
170
183
|
|
171
184
|
def curation_concern_from_search_results
|
172
|
-
|
185
|
+
search_result_document(params)
|
186
|
+
end
|
187
|
+
|
188
|
+
def search_result_document(search_params)
|
189
|
+
_, document_list = search_results(search_params)
|
173
190
|
raise CanCan::AccessDenied.new(nil, :show) if document_list.empty?
|
174
191
|
document_list.first
|
175
192
|
end
|
@@ -7,7 +7,7 @@ module CurationConcerns
|
|
7
7
|
delegate :human_readable_type, :open_access?, :authenticated_only_access?,
|
8
8
|
:open_access_with_embargo_release_date?, :private_access?,
|
9
9
|
:embargo_release_date, :lease_expiration_date, :member_ids,
|
10
|
-
:visibility, to: :model
|
10
|
+
:visibility, :in_works_ids, to: :model
|
11
11
|
|
12
12
|
self.terms = [:title, :creator, :contributor, :description,
|
13
13
|
:keyword, :rights, :publisher, :date_created, :subject, :language,
|
@@ -15,7 +15,7 @@ module CurationConcerns
|
|
15
15
|
:representative_id, :thumbnail_id, :files,
|
16
16
|
:visibility_during_embargo, :embargo_release_date, :visibility_after_embargo,
|
17
17
|
:visibility_during_lease, :lease_expiration_date, :visibility_after_lease,
|
18
|
-
:visibility, :ordered_member_ids, :source]
|
18
|
+
:visibility, :ordered_member_ids, :source, :in_works_ids]
|
19
19
|
|
20
20
|
self.required_fields = [:title]
|
21
21
|
|
@@ -42,8 +42,14 @@ module CurationConcerns
|
|
42
42
|
# This determines whether the allowed parameters are single or multiple.
|
43
43
|
# By default it delegates to the model.
|
44
44
|
def multiple?(term)
|
45
|
-
|
46
|
-
|
45
|
+
case term.to_s
|
46
|
+
when 'ordered_member_ids'
|
47
|
+
true
|
48
|
+
when 'in_works_ids'
|
49
|
+
true
|
50
|
+
else
|
51
|
+
super
|
52
|
+
end
|
47
53
|
end
|
48
54
|
|
49
55
|
# Overriden to cast 'rights' to an array
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module CurationConcerns
|
2
|
+
module NestedWorks
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
class_attribute :valid_child_concerns
|
7
|
+
self.valid_child_concerns = CurationConcerns::ClassifyConcern.new.all_curation_concern_classes
|
8
|
+
end
|
9
|
+
|
10
|
+
def in_works_ids
|
11
|
+
in_works.map(&:id)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -14,6 +14,7 @@ module CurationConcerns::WorkBehavior
|
|
14
14
|
include CurationConcerns::RequiredMetadata
|
15
15
|
include Hydra::AccessControls::Embargoable
|
16
16
|
include GlobalID::Identification
|
17
|
+
include CurationConcerns::NestedWorks
|
17
18
|
|
18
19
|
included do
|
19
20
|
property :owner, predicate: RDF::URI.new('http://opaquenamespace.org/ns/hydra/owner'), multiple: false
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module CurationConcerns
|
2
|
+
##
|
3
|
+
# Dynamic presenter which instantiates a file set presenter if given an object
|
4
|
+
# with a given ID, but otherwise instantiates a work presenter.
|
5
|
+
class CompositePresenterFactory
|
6
|
+
attr_reader :file_set_presenter_class, :work_presenter_class, :file_set_ids
|
7
|
+
def initialize(file_set_presenter_class, work_presenter_class, file_set_ids)
|
8
|
+
@file_set_presenter_class = file_set_presenter_class
|
9
|
+
@work_presenter_class = work_presenter_class
|
10
|
+
@file_set_ids = file_set_ids
|
11
|
+
end
|
12
|
+
|
13
|
+
def new(*args)
|
14
|
+
obj = args.first
|
15
|
+
if file_set_ids.include?(obj.id)
|
16
|
+
file_set_presenter_class.new(*args)
|
17
|
+
else
|
18
|
+
work_presenter_class.new(*args)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -4,7 +4,7 @@ module CurationConcerns
|
|
4
4
|
module ModelProxy
|
5
5
|
delegate :to_param, :to_key, :id, to: :solr_document
|
6
6
|
|
7
|
-
delegate :model_name, to: :_delegated_to
|
7
|
+
delegate :model_name, :valid_child_concerns, to: :_delegated_to
|
8
8
|
|
9
9
|
def to_partial_path
|
10
10
|
_delegated_to._to_partial_path
|
@@ -15,6 +15,9 @@ module CurationConcerns
|
|
15
15
|
# modify this attribute to use an alternate presenter class for the child works
|
16
16
|
self.work_presenter_class = self
|
17
17
|
|
18
|
+
# Methods used by blacklight helpers
|
19
|
+
delegate :has?, :first, :fetch, to: :solr_document
|
20
|
+
|
18
21
|
# @param [SolrDocument] solr_document
|
19
22
|
# @param [Ability] current_ability
|
20
23
|
# @param [ActionDispatch::Request] request the http request context
|
@@ -45,7 +48,15 @@ module CurationConcerns
|
|
45
48
|
# @return FileSetPresenter presenter for the representative FileSets
|
46
49
|
def representative_presenter
|
47
50
|
return nil if representative_id.blank?
|
48
|
-
@representative_presenter ||=
|
51
|
+
@representative_presenter ||=
|
52
|
+
begin
|
53
|
+
result = member_presenters([representative_id]).first
|
54
|
+
if result.respond_to?(:representative_presenter)
|
55
|
+
result.representative_presenter
|
56
|
+
else
|
57
|
+
result
|
58
|
+
end
|
59
|
+
end
|
49
60
|
end
|
50
61
|
|
51
62
|
# @return [Array<WorkShowPresenter>] presenters for the ordered_members that are not FileSets
|
@@ -56,12 +67,16 @@ module CurationConcerns
|
|
56
67
|
# @param [Array<String>] ids a list of ids to build presenters for
|
57
68
|
# @param [Class] presenter_class the type of presenter to build
|
58
69
|
# @return [Array<presenter_class>] presenters for the ordered_members (not filtered by class)
|
59
|
-
def member_presenters(ids = ordered_ids, presenter_class =
|
70
|
+
def member_presenters(ids = ordered_ids, presenter_class = composite_presenter_class)
|
60
71
|
PresenterFactory.build_presenters(ids,
|
61
72
|
presenter_class,
|
62
73
|
*presenter_factory_arguments)
|
63
74
|
end
|
64
75
|
|
76
|
+
def composite_presenter_class
|
77
|
+
CompositePresenterFactory.new(file_presenter_class, work_presenter_class, ordered_ids & file_set_ids)
|
78
|
+
end
|
79
|
+
|
65
80
|
# @return [Array<CollectionPresenter>] presenters for the collections that this work is a member of
|
66
81
|
def collection_presenters
|
67
82
|
PresenterFactory.build_presenters(in_collection_ids,
|
@@ -69,6 +84,10 @@ module CurationConcerns
|
|
69
84
|
*presenter_factory_arguments)
|
70
85
|
end
|
71
86
|
|
87
|
+
def link_name
|
88
|
+
current_ability.can?(:read, id) ? to_s : 'File'
|
89
|
+
end
|
90
|
+
|
72
91
|
private
|
73
92
|
|
74
93
|
def presenter_factory_arguments
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module CurationConcerns
|
2
|
+
class WorkRelation < ActiveFedora::Relation
|
3
|
+
def initialize(opts = {})
|
4
|
+
super(DummyModel, opts)
|
5
|
+
end
|
6
|
+
|
7
|
+
def equivalent_class?(klass)
|
8
|
+
CurationConcerns.config.curation_concerns.include?(klass)
|
9
|
+
end
|
10
|
+
|
11
|
+
def search_model_clause
|
12
|
+
clauses = CurationConcerns.config.curation_concerns.map do |k|
|
13
|
+
ActiveFedora::SolrQueryBuilder.construct_query_for_rel(has_model: k.to_s)
|
14
|
+
end
|
15
|
+
clauses.size == 1 ? clauses.first : "(#{clauses.join(' OR ')})"
|
16
|
+
end
|
17
|
+
|
18
|
+
class DummyModel
|
19
|
+
def self.primary_concern
|
20
|
+
CurationConcerns.config.curation_concerns.first
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.delegated_attributes
|
24
|
+
primary_concern.delegated_attributes
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.solr_query_handler
|
28
|
+
primary_concern.solr_query_handler
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.default_sort_params
|
32
|
+
primary_concern.default_sort_params
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.id_to_uri(*args)
|
36
|
+
primary_concern.id_to_uri(*args)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module CurationConcerns
|
2
|
+
class ContextualPath
|
3
|
+
include Rails.application.routes.url_helpers
|
4
|
+
include ActionDispatch::Routing::PolymorphicRoutes
|
5
|
+
attr_reader :presenter, :parent_presenter
|
6
|
+
def initialize(presenter, parent_presenter)
|
7
|
+
@presenter = presenter
|
8
|
+
@parent_presenter = parent_presenter
|
9
|
+
end
|
10
|
+
|
11
|
+
def show
|
12
|
+
if parent_presenter
|
13
|
+
polymorphic_path([:curation_concerns, :parent, presenter.model_name.singular], parent_id: parent_presenter.id, id: presenter.id)
|
14
|
+
else
|
15
|
+
polymorphic_path([presenter])
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -8,6 +8,7 @@ module CurationConcerns
|
|
8
8
|
|
9
9
|
thumb = fetch_thumbnail(object)
|
10
10
|
return unless thumb
|
11
|
+
return call(thumb) unless thumb.is_a?(::FileSet)
|
11
12
|
if thumb.audio?
|
12
13
|
audio_image
|
13
14
|
elsif thumbnail?(thumb)
|
@@ -19,7 +20,7 @@ module CurationConcerns
|
|
19
20
|
|
20
21
|
def fetch_thumbnail(object)
|
21
22
|
return object if object.thumbnail_id == object.id
|
22
|
-
::
|
23
|
+
::ActiveFedora::Base.find(object.thumbnail_id)
|
23
24
|
rescue ActiveFedora::ObjectNotFoundError
|
24
25
|
Rails.logger.error("Couldn't find thumbnail #{object.thumbnail_id} for #{object.id}")
|
25
26
|
nil
|
@@ -6,7 +6,7 @@
|
|
6
6
|
<%= f.input :title, as: :string, input_html: { name: "#{f.object.model_name.singular}[title][]", class: "title" }, value: node.to_s, label: false %>
|
7
7
|
</div>
|
8
8
|
<div class="file-set-link pull-right">
|
9
|
-
<%= link_to
|
9
|
+
<%= link_to contextual_path(node, @presenter), title: "Edit file" do %>
|
10
10
|
<span class="glyphicon glyphicon-edit" aria-hidden="true"></span>
|
11
11
|
<% end %>
|
12
12
|
</div>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<ul id="sortable" data-id="<%= @presenter.id %>" data-class-name="<%= @presenter.model_name.plural %>" data-singular-class-name="<%= @presenter.model_name.singular %>" class="list-unstyled grid clearfix">
|
2
|
-
<% @presenter.
|
2
|
+
<% @presenter.member_presenters.each do |member| %>
|
3
3
|
<%= render "file_manager_member", node: member %>
|
4
4
|
<% end %>
|
5
5
|
</ul>
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<% if params[:parent_id] %>
|
2
|
+
<% (f.object.in_works_ids + [params[:parent_id]]).uniq.each do |work_id| %>
|
3
|
+
<%= f.input :in_works_ids, as: :hidden, input_html: { value: work_id, multiple: true } %>
|
4
|
+
<% end %>
|
5
|
+
<%= hidden_field_tag 'parent_id', params[:parent_id] %>
|
6
|
+
<% end %>
|
@@ -2,11 +2,11 @@
|
|
2
2
|
<td class="thumbnail">
|
3
3
|
<%= render_thumbnail_tag member %>
|
4
4
|
</td>
|
5
|
-
<td class="attribute filename"><%= link_to(member.link_name,
|
6
|
-
<td class="attribute date_uploaded"><%= member.date_uploaded %></td>
|
5
|
+
<td class="attribute filename"><%= link_to(member.link_name, contextual_path(member, @presenter)) %></td>
|
6
|
+
<td class="attribute date_uploaded"><%= member.try(:date_uploaded) %></td>
|
7
7
|
<td class="attribute permission"><%= member.permission_badge %></td>
|
8
8
|
<td>
|
9
|
-
<%= render '
|
9
|
+
<%= render 'actions', member: member %>
|
10
10
|
</td>
|
11
11
|
</tr>
|
12
12
|
|
@@ -1,7 +1,7 @@
|
|
1
|
-
<% if presenter.
|
1
|
+
<% if presenter.member_presenters.present? %>
|
2
2
|
<div class="panel panel-default related_files">
|
3
3
|
<div class="panel-heading">
|
4
|
-
<h2
|
4
|
+
<h2><%= t('curation_concerns.show.related_files.heading') %></h2>
|
5
5
|
</div>
|
6
6
|
<table class="table table-striped">
|
7
7
|
<thead>
|
@@ -14,11 +14,11 @@
|
|
14
14
|
</tr>
|
15
15
|
</thead>
|
16
16
|
<tbody>
|
17
|
-
<%= render partial: 'member', collection: presenter.
|
17
|
+
<%= render partial: 'member', collection: presenter.member_presenters %>
|
18
18
|
</tbody>
|
19
19
|
</table>
|
20
20
|
</div>
|
21
21
|
<% elsif can? :edit, presenter.id %>
|
22
|
-
<h2
|
23
|
-
<p class="text-center"><em>This <%= presenter.human_readable_type %> has no
|
22
|
+
<h2><%= t('curation_concerns.show.related_files.heading') %></h2>
|
23
|
+
<p class="text-center"><em>This <%= presenter.human_readable_type %> has no members associated with it. You can add one using the "Attach a File" button below.</em></p>
|
24
24
|
<% end %>
|
@@ -4,6 +4,20 @@
|
|
4
4
|
<%= link_to "Edit This #{@presenter.human_readable_type}", edit_polymorphic_path([main_app, @presenter]), class: 'btn btn-default' %>
|
5
5
|
<%= link_to "Attach a File", main_app.new_curation_concerns_file_set_path(@presenter), class: 'btn btn-default' %>
|
6
6
|
<%= link_to t("file_manager.link_text"), polymorphic_path([main_app, :file_manager, @presenter]), class: 'btn btn-default' %>
|
7
|
+
<% if @presenter.valid_child_concerns.length > 0 %>
|
8
|
+
<div class="btn-group">
|
9
|
+
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
10
|
+
Attach Child <span class="caret"></span>
|
11
|
+
</button>
|
12
|
+
<ul class="dropdown-menu">
|
13
|
+
<% @presenter.valid_child_concerns.each do |concern| %>
|
14
|
+
<li>
|
15
|
+
<%= link_to "Attach #{concern.human_readable_type}", polymorphic_path([main_app, :new, :curation_concerns, :parent, concern.model_name.singular], parent_id: @presenter.id) %>
|
16
|
+
</li>
|
17
|
+
<% end %>
|
18
|
+
</ul>
|
19
|
+
</div>
|
20
|
+
<% end %>
|
7
21
|
<%= link_to "Delete This #{@presenter.human_readable_type}", [main_app, @presenter], class: 'btn btn-danger pull-right', data: { confirm: "Delete this #{@presenter.human_readable_type}?" }, method: :delete %>
|
8
22
|
<% end %>
|
9
23
|
<% if collector %>
|
@@ -1,6 +1,14 @@
|
|
1
1
|
<% provide :page_title, @presenter.page_title %>
|
2
2
|
<% provide :page_header do %>
|
3
|
-
<h1><%= @presenter %>
|
3
|
+
<h1><%= @presenter %> </h1>
|
4
|
+
<% if @parent_presenter %>
|
5
|
+
<ul class="breadcrumb">
|
6
|
+
<li><%= link_to @parent_presenter, polymorphic_path([main_app, @parent_presenter]) %></li>
|
7
|
+
<li class="active"><%= @presenter.human_readable_type %></li>
|
8
|
+
</ul>
|
9
|
+
<% else %>
|
10
|
+
<span class="human_readable_type">(<%= @presenter.human_readable_type %>)</span>
|
11
|
+
<% end %>
|
4
12
|
<% end %>
|
5
13
|
|
6
14
|
<% collector = can?(:collect, @presenter.id) %>
|
@@ -19,6 +19,16 @@ module ActionDispatch::Routing
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
+
resources :parent, only: [] do
|
23
|
+
concerns_to_route.each do |curation_concern_name|
|
24
|
+
namespaced_resources curation_concern_name, except: [:index], &block
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
resources :parent, only: [] do
|
29
|
+
resources :file_sets, only: [:show]
|
30
|
+
end
|
31
|
+
|
22
32
|
resources :permissions, only: [] do
|
23
33
|
member do
|
24
34
|
get :confirm
|
@@ -3,5 +3,7 @@
|
|
3
3
|
class <%= class_name %> < ActiveFedora::Base
|
4
4
|
include ::CurationConcerns::WorkBehavior
|
5
5
|
include ::CurationConcerns::BasicMetadata
|
6
|
+
# Change this to restrict which works can be added as a child.
|
7
|
+
# self.valid_child_concerns = []
|
6
8
|
validates :title, presence: { message: 'Your work must have a title.' }
|
7
9
|
end
|
@@ -74,6 +74,18 @@ describe CurationConcerns::Actors::GenericWorkActor do
|
|
74
74
|
end
|
75
75
|
end
|
76
76
|
end
|
77
|
+
context 'with in_work_ids' do
|
78
|
+
let(:parent) { FactoryGirl.create(:generic_work) }
|
79
|
+
let(:attributes) do
|
80
|
+
FactoryGirl.attributes_for(:generic_work, visibility: visibility).merge(
|
81
|
+
in_works_ids: [parent.id]
|
82
|
+
)
|
83
|
+
end
|
84
|
+
it "attaches the parent" do
|
85
|
+
expect(subject.create(attributes)).to be true
|
86
|
+
expect(curation_concern.in_works).to eq [parent]
|
87
|
+
end
|
88
|
+
end
|
77
89
|
context 'with a file' do
|
78
90
|
let(:attributes) do
|
79
91
|
FactoryGirl.attributes_for(:generic_work, visibility: visibility).tap do |a|
|
@@ -171,6 +183,27 @@ describe CurationConcerns::Actors::GenericWorkActor do
|
|
171
183
|
end
|
172
184
|
end
|
173
185
|
|
186
|
+
context 'with in_works_ids' do
|
187
|
+
let(:parent) { FactoryGirl.create(:generic_work) }
|
188
|
+
let(:old_parent) { FactoryGirl.create(:generic_work) }
|
189
|
+
let(:attributes) do
|
190
|
+
FactoryGirl.attributes_for(:generic_work).merge(
|
191
|
+
in_works_ids: [parent.id]
|
192
|
+
)
|
193
|
+
end
|
194
|
+
before do
|
195
|
+
curation_concern.apply_depositor_metadata(user.user_key)
|
196
|
+
curation_concern.save!
|
197
|
+
old_parent.ordered_members << curation_concern
|
198
|
+
old_parent.save!
|
199
|
+
end
|
200
|
+
it "attaches the parent" do
|
201
|
+
expect(subject.update(attributes)).to be true
|
202
|
+
expect(curation_concern.in_works).to eq [parent]
|
203
|
+
|
204
|
+
expect(old_parent.reload.members).to eq []
|
205
|
+
end
|
206
|
+
end
|
174
207
|
context 'adding to collections' do
|
175
208
|
let!(:collection1) { create(:collection, user: user) }
|
176
209
|
let!(:collection2) { create(:collection, user: user) }
|
@@ -13,6 +13,15 @@ describe CurationConcerns::GenericWorksController do
|
|
13
13
|
get :show, id: a_work
|
14
14
|
expect(response).to be_success
|
15
15
|
end
|
16
|
+
context "with a parent work" do
|
17
|
+
render_views
|
18
|
+
it "renders a breadcrumb" do
|
19
|
+
parent = create(:generic_work, title: ['Parent Work'], user: user, ordered_members: [a_work])
|
20
|
+
get :show, id: a_work, parent_id: parent
|
21
|
+
|
22
|
+
expect(response.body).to have_content "Parent Work"
|
23
|
+
end
|
24
|
+
end
|
16
25
|
end
|
17
26
|
|
18
27
|
context 'someone elses private work' do
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'redlock'
|
3
|
+
|
4
|
+
feature 'Creating a new child Work' do
|
5
|
+
let(:user) { FactoryGirl.create(:user) }
|
6
|
+
|
7
|
+
let(:redlock_client_stub) { # stub out redis connection
|
8
|
+
client = double('redlock client')
|
9
|
+
allow(client).to receive(:lock).and_yield(true)
|
10
|
+
allow(Redlock::Client).to receive(:new).and_return(client)
|
11
|
+
client
|
12
|
+
}
|
13
|
+
let(:parent) { FactoryGirl.create(:generic_work, user: user, title: ["Parent First"]) }
|
14
|
+
|
15
|
+
before do
|
16
|
+
sign_in user
|
17
|
+
|
18
|
+
# stub out characterization. Travis doesn't have fits installed, and it's not relevant to the test.
|
19
|
+
allow(CharacterizeJob).to receive(:perform_later)
|
20
|
+
redlock_client_stub
|
21
|
+
parent
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'creates the child work' do
|
25
|
+
visit "/concern/parent/#{parent.id}/generic_works/new"
|
26
|
+
work_title = 'My Test Work'
|
27
|
+
within('form.new_generic_work') do
|
28
|
+
fill_in('Title', with: work_title)
|
29
|
+
click_on('Create Generic work')
|
30
|
+
end
|
31
|
+
expect(page).to have_content parent.title.first
|
32
|
+
visit "/concern/generic_works/#{parent.id}"
|
33
|
+
expect(page).to have_content work_title
|
34
|
+
end
|
35
|
+
|
36
|
+
context "when it's being updated" do
|
37
|
+
let(:curation_concern) { FactoryGirl.create(:generic_work, user: user) }
|
38
|
+
before do
|
39
|
+
parent.ordered_members << curation_concern
|
40
|
+
parent.save!
|
41
|
+
end
|
42
|
+
it 'can be updated' do
|
43
|
+
visit "/concern/parent/#{parent.id}/generic_works/#{curation_concern.id}/edit"
|
44
|
+
click_on "Update Generic work"
|
45
|
+
|
46
|
+
expect(parent.reload.ordered_members.to_a.length).to eq 1
|
47
|
+
end
|
48
|
+
it "doesn't lose other memberships" do
|
49
|
+
new_parent = FactoryGirl.create(:generic_work, user: user)
|
50
|
+
new_parent.ordered_members << curation_concern
|
51
|
+
new_parent.save!
|
52
|
+
|
53
|
+
visit "/concern/parent/#{parent.id}/generic_works/#{curation_concern.id}/edit"
|
54
|
+
click_on "Update Generic work"
|
55
|
+
|
56
|
+
expect(parent.reload.ordered_members.to_a.length).to eq 1
|
57
|
+
expect(new_parent.reload.ordered_members.to_a.length).to eq 1
|
58
|
+
|
59
|
+
expect(curation_concern.reload.in_works_ids.length).to eq 2
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -14,6 +14,11 @@ describe GenericWork do
|
|
14
14
|
it { is_expected.to eq 'curation_concerns_generic_work' }
|
15
15
|
end
|
16
16
|
|
17
|
+
describe '.valid_child_concerns' do
|
18
|
+
it "is all registered curation concerns by default" do
|
19
|
+
expect(described_class.valid_child_concerns).to eq [described_class]
|
20
|
+
end
|
21
|
+
end
|
17
22
|
context 'with attached files' do
|
18
23
|
subject { FactoryGirl.create(:work_with_files) }
|
19
24
|
|
@@ -27,6 +32,13 @@ describe GenericWork do
|
|
27
32
|
subject { described_class.indexer }
|
28
33
|
it { is_expected.to eq CurationConcerns::WorkIndexer }
|
29
34
|
end
|
35
|
+
context "with children" do
|
36
|
+
subject { FactoryGirl.create(:work_with_file_and_work) }
|
37
|
+
it "can have the thumbnail set to the work" do
|
38
|
+
subject.thumbnail = subject.ordered_members.to_a.last
|
39
|
+
expect(subject.save).to eq true
|
40
|
+
end
|
41
|
+
end
|
30
42
|
|
31
43
|
describe 'to_solr' do
|
32
44
|
subject { build(:work, date_uploaded: Date.today).to_solr }
|
@@ -62,4 +74,17 @@ describe GenericWork do
|
|
62
74
|
subject { work.to_global_id }
|
63
75
|
it { is_expected.to be_kind_of GlobalID }
|
64
76
|
end
|
77
|
+
|
78
|
+
describe "#in_works_ids" do
|
79
|
+
let(:parent) { FactoryGirl.create(:generic_work) }
|
80
|
+
subject { FactoryGirl.create(:generic_work) }
|
81
|
+
before do
|
82
|
+
parent.ordered_members << subject
|
83
|
+
parent.save!
|
84
|
+
end
|
85
|
+
|
86
|
+
it "returns ids" do
|
87
|
+
expect(subject.in_works_ids).to eq [parent.id]
|
88
|
+
end
|
89
|
+
end
|
65
90
|
end
|
@@ -61,6 +61,17 @@ describe CurationConcerns::WorkShowPresenter do
|
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
64
|
+
describe "#member_presenters" do
|
65
|
+
let(:obj) { create(:work_with_file_and_work) }
|
66
|
+
let(:attributes) { obj.to_solr }
|
67
|
+
|
68
|
+
it "returns appropriate classes for each" do
|
69
|
+
expect(presenter.member_presenters.size).to eq 2
|
70
|
+
expect(presenter.member_presenters.first).to be_instance_of(::CurationConcerns::FileSetPresenter)
|
71
|
+
expect(presenter.member_presenters.last).to be_instance_of(described_class)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
64
75
|
describe "#file_set_presenters" do
|
65
76
|
let(:obj) { create(:work_with_ordered_files) }
|
66
77
|
let(:attributes) { obj.to_solr }
|
@@ -86,7 +97,7 @@ describe CurationConcerns::WorkShowPresenter do
|
|
86
97
|
let(:attributes) { {} }
|
87
98
|
let(:presenter_class) { double }
|
88
99
|
before do
|
89
|
-
allow(presenter).to receive(:
|
100
|
+
allow(presenter).to receive(:composite_presenter_class).and_return(presenter_class)
|
90
101
|
allow(presenter).to receive(:ordered_ids).and_return(['12', '33'])
|
91
102
|
allow(presenter).to receive(:file_set_ids).and_return(['33', '12'])
|
92
103
|
end
|
@@ -104,7 +115,7 @@ describe CurationConcerns::WorkShowPresenter do
|
|
104
115
|
let(:attributes) { obj.to_solr }
|
105
116
|
let(:presenter_class) { double }
|
106
117
|
before do
|
107
|
-
allow(presenter).to receive(:
|
118
|
+
allow(presenter).to receive(:composite_presenter_class).and_return(presenter_class)
|
108
119
|
end
|
109
120
|
it "has a representative" do
|
110
121
|
expect(CurationConcerns::PresenterFactory).to receive(:build_presenters)
|
@@ -134,6 +145,15 @@ describe CurationConcerns::WorkShowPresenter do
|
|
134
145
|
it { is_expected.to eq 'foo' }
|
135
146
|
end
|
136
147
|
|
148
|
+
describe "#valid_child_concerns" do
|
149
|
+
subject { presenter }
|
150
|
+
it "delegates to the class attribute of the model" do
|
151
|
+
allow(GenericWork).to receive(:valid_child_concerns).and_return([GenericWork])
|
152
|
+
|
153
|
+
expect(subject.valid_child_concerns).to eq [GenericWork]
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
137
157
|
describe "#attribute_to_html" do
|
138
158
|
let(:renderer) { double('renderer') }
|
139
159
|
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe CurationConcerns::WorkRelation do
|
4
|
+
let!(:work) { create(:generic_work) }
|
5
|
+
let!(:file_set) { create(:file_set) }
|
6
|
+
let!(:collection) { create(:collection) }
|
7
|
+
it 'has works and not collections or file sets' do
|
8
|
+
expect(subject).to eq [work]
|
9
|
+
end
|
10
|
+
end
|
@@ -32,7 +32,7 @@ describe CurationConcerns::ThumbnailPathService do
|
|
32
32
|
let(:original_file) { mock_file_factory(mime_type: 'image/jpeg') }
|
33
33
|
before do
|
34
34
|
allow(File).to receive(:exist?).and_return(true)
|
35
|
-
allow(
|
35
|
+
allow(ActiveFedora::Base).to receive(:find).with('999').and_return(representative)
|
36
36
|
allow(representative).to receive(:original_file).and_return(original_file)
|
37
37
|
end
|
38
38
|
|
@@ -25,6 +25,9 @@ describe 'curation_concerns/base/_member.html.erb' do
|
|
25
25
|
allow(view).to receive(:can?).with(:read, kind_of(String)).and_return(true)
|
26
26
|
allow(view).to receive(:can?).with(:edit, kind_of(String)).and_return(true)
|
27
27
|
allow(view).to receive(:can?).with(:destroy, String).and_return(true)
|
28
|
+
allow(view).to receive(:contextual_path).with(anything, anything) do |x, y|
|
29
|
+
CurationConcerns::ContextualPath.new(x, y).show
|
30
|
+
end
|
28
31
|
render 'curation_concerns/base/member.html.erb', member: presenter
|
29
32
|
end
|
30
33
|
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe 'curation_concerns/base/show_actions' do
|
4
4
|
let(:model) { double('model', persisted?: true, to_param: '123', model_name: GenericWork.model_name) }
|
5
|
-
let(:presenter) { double("presenter", human_readable_type: 'Image', id: '123', to_model: model) }
|
5
|
+
let(:presenter) { double("presenter", human_readable_type: 'Image', id: '123', to_model: model, valid_child_concerns: [GenericWork]) }
|
6
6
|
before do
|
7
7
|
assign(:presenter, presenter)
|
8
8
|
render 'curation_concerns/base/show_actions.html.erb', collector: collector, editor: editor
|
@@ -15,4 +15,13 @@ describe 'curation_concerns/base/show_actions' do
|
|
15
15
|
expect(rendered).to have_link 'Add to a Collection'
|
16
16
|
end
|
17
17
|
end
|
18
|
+
context "as an editor" do
|
19
|
+
let(:editor) { true }
|
20
|
+
let(:collector) { true }
|
21
|
+
context "when there are valid_child_concerns" do
|
22
|
+
it "creates a link" do
|
23
|
+
expect(rendered).to have_link 'Attach Generic Work', href: "/concern/parent/#{presenter.id}/generic_works/new"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
18
27
|
end
|
@@ -1,8 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
RSpec.describe "curation_concerns/base/file_manager.html.erb" do
|
4
|
-
let(:members) { [file_set] }
|
4
|
+
let(:members) { [file_set, member] }
|
5
5
|
let(:file_set) { CurationConcerns::FileSetPresenter.new(solr_doc, nil) }
|
6
|
+
let(:member) { CurationConcerns::WorkShowPresenter.new(solr_doc_work, nil) }
|
6
7
|
let(:solr_doc) do
|
7
8
|
SolrDocument.new(
|
8
9
|
resource.to_solr.merge(
|
@@ -13,6 +14,16 @@ RSpec.describe "curation_concerns/base/file_manager.html.erb" do
|
|
13
14
|
)
|
14
15
|
)
|
15
16
|
end
|
17
|
+
let(:solr_doc_work) do
|
18
|
+
SolrDocument.new(
|
19
|
+
resource.to_solr.merge(
|
20
|
+
id: "work",
|
21
|
+
title_tesim: "Work",
|
22
|
+
thumbnail_path_ss: "/test/image/path.jpg",
|
23
|
+
label_tesim: ["work"]
|
24
|
+
)
|
25
|
+
)
|
26
|
+
end
|
16
27
|
let(:resource) { FactoryGirl.build(:file_set) }
|
17
28
|
|
18
29
|
let(:parent) { FactoryGirl.build(:generic_work) }
|
@@ -26,7 +37,7 @@ RSpec.describe "curation_concerns/base/file_manager.html.erb" do
|
|
26
37
|
let(:blacklight_config) { CatalogController.new.blacklight_config }
|
27
38
|
|
28
39
|
before do
|
29
|
-
allow(parent_presenter).to receive(:
|
40
|
+
allow(parent_presenter).to receive(:member_presenters).and_return([file_set, member])
|
30
41
|
assign(:presenter, parent_presenter)
|
31
42
|
# Blacklight nonsense
|
32
43
|
allow(view).to receive(:dom_class) { '' }
|
@@ -35,6 +46,9 @@ RSpec.describe "curation_concerns/base/file_manager.html.erb" do
|
|
35
46
|
allow(view).to receive(:search_session).and_return({})
|
36
47
|
allow(view).to receive(:current_search_session).and_return(nil)
|
37
48
|
allow(view).to receive(:curation_concern).and_return(parent)
|
49
|
+
allow(view).to receive(:contextual_path).with(anything, anything) do |x, y|
|
50
|
+
CurationConcerns::ContextualPath.new(x, y).show
|
51
|
+
end
|
38
52
|
render
|
39
53
|
end
|
40
54
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: curation_concerns
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.beta7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Zumwalt
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2016-06-
|
13
|
+
date: 2016-06-02 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: hydra-head
|
@@ -617,6 +617,7 @@ files:
|
|
617
617
|
- app/actors/curation_concerns/actors/abstract_actor.rb
|
618
618
|
- app/actors/curation_concerns/actors/actor_stack.rb
|
619
619
|
- app/actors/curation_concerns/actors/add_to_collection_actor.rb
|
620
|
+
- app/actors/curation_concerns/actors/add_to_work_actor.rb
|
620
621
|
- app/actors/curation_concerns/actors/apply_order_actor.rb
|
621
622
|
- app/actors/curation_concerns/actors/assign_representative_actor.rb
|
622
623
|
- app/actors/curation_concerns/actors/attach_files_actor.rb
|
@@ -745,6 +746,7 @@ files:
|
|
745
746
|
- app/models/concerns/curation_concerns/has_representative.rb
|
746
747
|
- app/models/concerns/curation_concerns/human_readable_type.rb
|
747
748
|
- app/models/concerns/curation_concerns/naming.rb
|
749
|
+
- app/models/concerns/curation_concerns/nested_works.rb
|
748
750
|
- app/models/concerns/curation_concerns/permissions.rb
|
749
751
|
- app/models/concerns/curation_concerns/permissions/readable.rb
|
750
752
|
- app/models/concerns/curation_concerns/permissions/writable.rb
|
@@ -760,6 +762,7 @@ files:
|
|
760
762
|
- app/models/single_use_link.rb
|
761
763
|
- app/models/version_committer.rb
|
762
764
|
- app/presenters/curation_concerns/collection_presenter.rb
|
765
|
+
- app/presenters/curation_concerns/composite_presenter_factory.rb
|
763
766
|
- app/presenters/curation_concerns/embargo_presenter.rb
|
764
767
|
- app/presenters/curation_concerns/file_set_presenter.rb
|
765
768
|
- app/presenters/curation_concerns/lease_presenter.rb
|
@@ -790,8 +793,10 @@ files:
|
|
790
793
|
- app/search_builders/curation_concerns/search_filters.rb
|
791
794
|
- app/search_builders/curation_concerns/single_result.rb
|
792
795
|
- app/search_builders/curation_concerns/single_use_link_search_builder.rb
|
796
|
+
- app/search_builders/curation_concerns/work_relation.rb
|
793
797
|
- app/search_builders/curation_concerns/work_search_builder.rb
|
794
798
|
- app/services/curation_concerns/actors/actor_factory.rb
|
799
|
+
- app/services/curation_concerns/contextual_path.rb
|
795
800
|
- app/services/curation_concerns/curation_concern.rb
|
796
801
|
- app/services/curation_concerns/derivative_path.rb
|
797
802
|
- app/services/curation_concerns/embargo_service.rb
|
@@ -867,6 +872,7 @@ files:
|
|
867
872
|
- app/views/collections/index.html.erb
|
868
873
|
- app/views/collections/new.html.erb
|
869
874
|
- app/views/collections/show.html.erb
|
875
|
+
- app/views/curation_concerns/base/_actions.html.erb
|
870
876
|
- app/views/curation_concerns/base/_attribute_rows.html.erb
|
871
877
|
- app/views/curation_concerns/base/_attributes.html.erb
|
872
878
|
- app/views/curation_concerns/base/_collections.html.erb
|
@@ -880,6 +886,7 @@ files:
|
|
880
886
|
- app/views/curation_concerns/base/_form_additional_information.html.erb
|
881
887
|
- app/views/curation_concerns/base/_form_descriptive_fields.html.erb
|
882
888
|
- app/views/curation_concerns/base/_form_files_and_links.html.erb
|
889
|
+
- app/views/curation_concerns/base/_form_in_works.html.erb
|
883
890
|
- app/views/curation_concerns/base/_form_media.html.erb
|
884
891
|
- app/views/curation_concerns/base/_form_permission.html.erb
|
885
892
|
- app/views/curation_concerns/base/_form_permission_embargo.html.erb
|
@@ -1076,6 +1083,7 @@ files:
|
|
1076
1083
|
- spec/features/add_file_spec.rb
|
1077
1084
|
- spec/features/catalog_search_spec.rb
|
1078
1085
|
- spec/features/collection_spec.rb
|
1086
|
+
- spec/features/create_child_work_spec.rb
|
1079
1087
|
- spec/features/create_work_spec.rb
|
1080
1088
|
- spec/features/embargo_spec.rb
|
1081
1089
|
- spec/features/lease_spec.rb
|
@@ -1156,6 +1164,7 @@ files:
|
|
1156
1164
|
- spec/search_builders/curation_concerns/embargo_search_builder_spec.rb
|
1157
1165
|
- spec/search_builders/curation_concerns/file_set_search_builder_spec.rb
|
1158
1166
|
- spec/search_builders/curation_concerns/lease_search_builder_spec.rb
|
1167
|
+
- spec/search_builders/curation_concerns/work_relation_spec.rb
|
1159
1168
|
- spec/search_builders/resource_types_service_spec.rb
|
1160
1169
|
- spec/services/curation_concern_spec.rb
|
1161
1170
|
- spec/services/derivative_path_spec.rb
|
@@ -1278,6 +1287,7 @@ test_files:
|
|
1278
1287
|
- spec/features/add_file_spec.rb
|
1279
1288
|
- spec/features/catalog_search_spec.rb
|
1280
1289
|
- spec/features/collection_spec.rb
|
1290
|
+
- spec/features/create_child_work_spec.rb
|
1281
1291
|
- spec/features/create_work_spec.rb
|
1282
1292
|
- spec/features/embargo_spec.rb
|
1283
1293
|
- spec/features/lease_spec.rb
|
@@ -1358,6 +1368,7 @@ test_files:
|
|
1358
1368
|
- spec/search_builders/curation_concerns/embargo_search_builder_spec.rb
|
1359
1369
|
- spec/search_builders/curation_concerns/file_set_search_builder_spec.rb
|
1360
1370
|
- spec/search_builders/curation_concerns/lease_search_builder_spec.rb
|
1371
|
+
- spec/search_builders/curation_concerns/work_relation_spec.rb
|
1361
1372
|
- spec/search_builders/resource_types_service_spec.rb
|
1362
1373
|
- spec/services/curation_concern_spec.rb
|
1363
1374
|
- spec/services/derivative_path_spec.rb
|