hydra-collections 4.0.0 → 5.0.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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -0
  3. data/.travis.yml +0 -3
  4. data/Gemfile +6 -1
  5. data/app/controllers/concerns/hydra/collections/selects_collections.rb +30 -33
  6. data/app/controllers/concerns/hydra/collections_controller_behavior.rb +39 -17
  7. data/app/models/concerns/hydra/collection.rb +5 -76
  8. data/app/models/concerns/hydra/collections/actions.rb +22 -0
  9. data/app/models/concerns/hydra/collections/metadata.rb +62 -0
  10. data/app/models/concerns/hydra/collections/relations.rb +8 -0
  11. data/app/search_builders/hydra/collections/search_builder.rb +31 -0
  12. data/app/views/collections/_bookmark_control.html.erb +2 -0
  13. data/app/views/collections/_document_list.html.erb +1 -1
  14. data/app/views/collections/_index_default.html.erb +2 -0
  15. data/app/views/collections/_index_header_default.html.erb +2 -0
  16. data/app/views/collections/_paginate_compact.html.erb +1 -0
  17. data/app/views/collections/_results_pagination.html.erb +9 -0
  18. data/app/views/collections/_search_results.html.erb +23 -0
  19. data/app/views/collections/_thumbnail_default.html.erb +2 -0
  20. data/app/views/collections/index.html.erb +9 -0
  21. data/app/views/collections/show.html.erb +3 -3
  22. data/app/views/layouts/collections.html.erb +48 -0
  23. data/config/routes.rb +3 -3
  24. data/hydra-collections.gemspec +3 -2
  25. data/lib/hydra/collections/collectible.rb +1 -0
  26. data/lib/hydra/collections/search_service.rb +2 -2
  27. data/lib/hydra/collections/version.rb +1 -1
  28. data/spec/controllers/collections_controller_spec.rb +37 -51
  29. data/spec/controllers/other_collections_controller_spec.rb +25 -57
  30. data/spec/controllers/selects_collections_spec.rb +14 -30
  31. data/spec/helpers/collections_helper_spec.rb +5 -5
  32. data/spec/lib/collectible_spec.rb +1 -0
  33. data/spec/models/collection_spec.rb +7 -34
  34. data/spec/spec_helper.rb +7 -11
  35. data/spec/test_app_templates/Gemfile.extra +1 -0
  36. data/spec/test_app_templates/app/controllers/other_collections_controller.rb +8 -0
  37. data/spec/test_app_templates/app/views/catalog/_sort_and_per_page.html.erb +3 -8
  38. data/spec/test_app_templates/config/blacklight.yml +22 -0
  39. data/spec/test_app_templates/lib/generators/test_app_generator.rb +17 -9
  40. data/spec/views/collections/_thumbnail_default.html.erb_spec.rb +25 -0
  41. data/spec/views/collections/show.html.erb_spec.rb +32 -0
  42. metadata +44 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e408397139dfd38d3a70d30dd1384209a34cf8fe
4
- data.tar.gz: b90ffd34c4127afc9dab4e7c29da30b26e874302
3
+ metadata.gz: ef2d245ae222f9d4aa4164e6e6293facd7ae8af7
4
+ data.tar.gz: 2e785a983145507e7ca33cf38b0deabd4bfd0f68
5
5
  SHA512:
6
- metadata.gz: 175c87cf77a8d496a334cb4b3f510520ef51866706bb5105ee7a7640faa91e0a930cd6ab8049be1c402b4e994d2e33959e30428dcbbf4e0775c204c6b5c4bf2d
7
- data.tar.gz: a35332501f69ce656560aaee963dc22d7643392b4f5984de22ef668229c8d9a6f1b57dc48205a8d70f191cd564e5cb2af9a8a0754b03592b7d5153490fccbec4
6
+ metadata.gz: 9975569dca4f4f8b6b7c5b426cb24045e0d8c07669af92982378f629cc02b8f2c56efeceb8101c7dcaf2a1dc8fd39f5aec8a059332ce5ad6c7bf1214ab4e68ba
7
+ data.tar.gz: 7c3d2f47293e9899e300fae0e5bbe82492518e7825a2565ba05a8c7c04ab43ec6e7d04ea8921ad6201214d88c8751cb05c371c5a883e4f1b3cca1656ca4b3d85
data/.rspec CHANGED
@@ -1 +1,2 @@
1
1
  --colour
2
+ --backtrace
@@ -9,9 +9,6 @@ env:
9
9
  matrix:
10
10
  - "RAILS_VERSION=4.1.8"
11
11
  - "RAILS_VERSION=4.2.0"
12
- matrix:
13
- allow_failures:
14
- - env: "RAILS_VERSION=4.2.0"
15
12
  notifications:
16
13
  email:
17
14
  recipients:
data/Gemfile CHANGED
@@ -3,16 +3,21 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in hydra-collections.gemspec
4
4
  gemspec
5
5
 
6
+ gem 'kaminari', github: 'harai/kaminari', branch: 'route_prefix_prototype'
7
+
6
8
  group :development, :test do
7
9
  gem 'sqlite3'
8
10
  gem "factory_girl_rails"
9
11
  gem 'devise'
10
12
  gem 'capybara'
11
13
  gem 'jettywrapper'
12
- gem 'byebug', require: false
14
+ gem 'byebug', require: false unless ENV['CI']
13
15
  gem 'coveralls', require: false
16
+ gem 'rspec-activemodel-mocks'
14
17
  end
15
18
 
19
+ gem 'slop', '~> 3.6' # because rails installs byebug in the Gemfile
20
+
16
21
  file = File.expand_path("Gemfile", ENV['ENGINE_CART_DESTINATION'] || ENV['RAILS_ROOT'] || File.expand_path("../spec/internal", __FILE__))
17
22
  if File.exists?(file)
18
23
  puts "Loading #{file} ..." if $DEBUG # `ruby -d` or `bundle -v`
@@ -1,9 +1,15 @@
1
1
  module Hydra::Collections::SelectsCollections
2
2
  extend ActiveSupport::Concern
3
-
3
+
4
+ included do
5
+ configure_blacklight do |config|
6
+ config.search_builder_class = Hydra::Collections::SearchBuilder
7
+ end
8
+ end
9
+
4
10
  def access_levels
5
11
  { read: [:read, :edit], edit: [:edit] }
6
- end
12
+ end
7
13
 
8
14
  # add one of the following methods as a before filter on any page that shows the form_for_select_collection
9
15
  def find_collections_with_read_access
@@ -13,44 +19,35 @@ module Hydra::Collections::SelectsCollections
13
19
  def find_collections_with_edit_access
14
20
  find_collections(:edit)
15
21
  end
16
-
17
- #
18
- def find_collections (access_level='')
22
+
23
+ #
24
+ def find_collections (access_level = nil)
19
25
  # need to know the user if there is an access level applied otherwise we are just doing public collections
20
26
  authenticate_user! unless access_level.blank?
21
-
22
- # update the permission filters for the query of need be
23
- original_permissions = discovery_permissions
24
- self.class.send(:define_method, "discovery_permissions") { access_levels[access_level] } unless access_level.blank?
25
-
26
- # Blacklight doesn't let you explicitly pass your own solr_search_params_logic when running searches --
27
- # You have to set the controller's solr_search_params_logic class attribute. So this method temporarily sets solr_search_params_logic to collection_search_params_logic then switches it back.
28
-
29
- # temporarily set solr_search_params_logic to collection_search_params_logic
30
- orig_solr_search_params_logic = self.class.solr_search_params_logic
31
- self.class.solr_search_params_logic = collection_search_params_logic
32
- logger.debug "Collection Search logic: "+ self.class.solr_search_params_logic.inspect
27
+
33
28
  # run the solr query to find the collections
34
- (resp, doc_list) = get_search_results({q: ''}, {rows: 100})
35
-
36
- #reset to original solr logic
37
- self.class.send(:define_method, "discovery_permissions") { original_permissions } unless access_level.blank?
38
- self.class.solr_search_params_logic = orig_solr_search_params_logic
29
+ query = collections_search_builder(access_level).with({q: ''}).query
30
+ response = repository.search(query)
39
31
 
40
32
  # return the user's collections (or public collections if no access_level is applied)
41
- @user_collections = doc_list
33
+ @user_collections = response.documents
42
34
  end
43
-
44
- def add_collection_filter(solr_parameters, user_parameters)
45
- solr_parameters[:fq] ||= []
46
- solr_parameters[:fq] << "#{Solrizer.solr_name("has_model", :symbol)}:Collection"
35
+
36
+ def collections_search_builder_class
37
+ Hydra::Collections::SearchBuilder
38
+ end
39
+
40
+ def collections_search_builder(access_level = nil)
41
+ @collections_search_builder ||= collections_search_builder_class.new(collection_search_params_logic, self).tap do |builder|
42
+ builder.current_ability = current_ability
43
+ builder.discovery_perms = access_levels[access_level] if access_level
44
+ end
47
45
  end
48
-
49
- # Defines which solr_search_params_logic should be used when searching for Collections
46
+
47
+ # Defines which search_params_logic should be used when searching for Collections
50
48
  def collection_search_params_logic
51
- base_logic = [:default_solr_parameters, :add_query_to_solr, :add_access_controls_to_solr_params]
52
- base_logic += [:add_collection_filter]
53
- base_logic
49
+ [:default_solr_parameters, :add_query_to_solr, :add_access_controls_to_solr_params,
50
+ :add_collection_filter, :some_rows]
54
51
  end
55
-
52
+
56
53
  end
@@ -2,16 +2,16 @@ module Hydra
2
2
  module CollectionsControllerBehavior
3
3
  extend ActiveSupport::Concern
4
4
 
5
- included do
6
- include Blacklight::Configurable
7
- include Blacklight::SolrHelper
5
+ include Blacklight::Base
6
+ include Hydra::Collections::SelectsCollections
8
7
 
8
+ included do
9
9
  include Hydra::Collections::AcceptsBatches
10
- include Hydra::Collections::SelectsCollections
11
10
 
12
11
  # This is needed as of BL 3.7
13
12
  self.copy_blacklight_config_from(CatalogController)
14
13
 
14
+
15
15
  # Catch permission errors
16
16
  rescue_from Hydra::AccessDenied, CanCan::AccessDenied do |exception|
17
17
  if exception.action == :edit
@@ -28,8 +28,14 @@ module Hydra
28
28
  before_filter :authenticate_user!, :except => [:show]
29
29
  load_and_authorize_resource :except=>[:index], instance_name: :collection
30
30
 
31
- #This includes only the collection members in the search
32
- self.solr_search_params_logic += [:include_collection_ids]
31
+ layout 'collections'
32
+ end
33
+
34
+ def index
35
+ # run the solr query to find the collections
36
+ query = collections_search_builder.with(params).query
37
+ @response = repository.search(query)
38
+ @document_list = @response.documents
33
39
  end
34
40
 
35
41
  def new
@@ -88,8 +94,7 @@ module Hydra
88
94
 
89
95
  def update
90
96
  process_member_changes
91
- @collection.update_attributes(collection_params.except(:members))
92
- if @collection.save
97
+ if @collection.update(collection_params.except(:members))
93
98
  after_update
94
99
  else
95
100
  after_update_error
@@ -118,8 +123,17 @@ module Hydra
118
123
  end
119
124
  end
120
125
 
126
+ def collection
127
+ @collection
128
+ end
129
+
121
130
  protected
122
131
 
132
+ # Defines which search_params_logic should be used when searching for Collection members
133
+ def collection_member_search_logic
134
+ search_params_logic + [:include_collection_ids]
135
+ end
136
+
123
137
  def collection_params
124
138
  params.require(:collection).permit(:part_of, :contributor, :creator, :title,
125
139
  :description, :publisher, :date_created, :subject, :language, :rights,
@@ -129,13 +143,22 @@ module Hydra
129
143
  # Queries Solr for members of the collection.
130
144
  # Populates @response and @member_docs similar to Blacklight Catalog#index populating @response and @documents
131
145
  def query_collection_members
132
- query = params[:cq]
146
+ solr_params = params.symbolize_keys.merge(q: params[:cq])
147
+
148
+ # run the solr query to find the collection members
149
+ query = collection_member_search_builder.with(solr_params).query
150
+ @response = repository.search(query)
151
+ @member_docs = @response.documents
152
+ end
133
153
 
134
- #default the rows to 100 if not specified then merge in the user parameters and the attach the collection query
135
- solr_params = { rows: 100 }.merge(params.symbolize_keys).merge(q: query)
154
+ def collection_member_search_builder_class
155
+ Hydra::Collections::SearchBuilder
156
+ end
136
157
 
137
- # run the solr query to find the collections
138
- (@response, @member_docs) = get_search_results(solr_params)
158
+ def collection_member_search_builder
159
+ @collection_member_search_builder ||= collection_member_search_builder_class.new(collection_member_search_logic, self).tap do |builder|
160
+ builder.current_ability = current_ability
161
+ end
139
162
  end
140
163
 
141
164
  def process_member_changes
@@ -172,10 +195,9 @@ module Hydra
172
195
  end
173
196
  end
174
197
 
175
- # include filters into the query to only include the collection memebers
176
- def include_collection_ids(solr_parameters, user_parameters)
177
- solr_parameters[:fq] ||= []
178
- solr_parameters[:fq] << Solrizer.solr_name(:collection, :facetable)+':"'+@collection.id+'"'
198
+ # Override rails path for the views
199
+ def _prefixes
200
+ @_prefixes ||= super + ['catalog']
179
201
  end
180
202
  end # module CollectionsControllerBehavior
181
203
  end # module Hydra
@@ -1,96 +1,25 @@
1
1
  module Hydra
2
2
  module Collection
3
3
  extend ActiveSupport::Concern
4
- extend ActiveSupport::Autoload
4
+ extend Deprecation
5
5
  include Hydra::WithDepositor # for access to apply_depositor_metadata
6
6
  include Hydra::AccessControls::Permissions
7
7
  include Hydra::Collections::Collectible
8
-
9
- included do
10
- has_and_belongs_to_many :members, predicate: ActiveFedora::RDF::Fcrepo::RelsExt.hasCollectionMember, class_name: "ActiveFedora::Base" , after_remove: :update_member
11
-
12
- property :depositor, predicate: ::RDF::URI.new("http://id.loc.gov/vocabulary/relators/dpt"), multiple: false do |index|
13
- index.as :symbol, :stored_searchable
14
- end
15
-
16
- property :part_of, predicate: RDF::DC.isPartOf
17
- property :contributor, predicate: RDF::DC.contributor do |index|
18
- index.as :stored_searchable, :facetable
19
- end
20
- property :creator, predicate: RDF::DC.creator do |index|
21
- index.as :stored_searchable, :facetable
22
- end
23
- property :title, predicate: RDF::DC.title, multiple: false do |index|
24
- index.as :stored_searchable
25
- end
26
- property :description, predicate: RDF::DC.description, multiple: false do |index|
27
- index.type :text
28
- index.as :stored_searchable
29
- end
30
- property :publisher, predicate: RDF::DC.publisher do |index|
31
- index.as :stored_searchable, :facetable
32
- end
33
- property :date_created, predicate: RDF::DC.created do |index|
34
- index.as :stored_searchable
35
- end
36
- property :date_uploaded, predicate: RDF::DC.dateSubmitted, multiple: false do |index|
37
- index.type :date
38
- index.as :stored_sortable
39
- end
40
- property :date_modified, predicate: RDF::DC.modified, multiple: false do |index|
41
- index.type :date
42
- index.as :stored_sortable
43
- end
44
- property :subject, predicate: RDF::DC.subject do |index|
45
- index.as :stored_searchable, :facetable
46
- end
47
- property :language, predicate: RDF::DC.language do |index|
48
- index.as :stored_searchable, :facetable
49
- end
50
- property :rights, predicate: RDF::DC.rights do |index|
51
- index.as :stored_searchable
52
- end
53
- property :resource_type, predicate: RDF::DC.type do |index|
54
- index.as :stored_searchable, :facetable
55
- end
56
- property :identifier, predicate: RDF::DC.identifier do |index|
57
- index.as :stored_searchable
58
- end
59
- property :based_near, predicate: RDF::FOAF.based_near do |index|
60
- index.as :stored_searchable, :facetable
61
- end
62
- property :tag, predicate: RDF::DC.relation do |index|
63
- index.as :stored_searchable, :facetable
64
- end
65
- property :related_url, predicate: RDF::RDFS.seeAlso
66
-
67
- before_create :set_date_uploaded
68
- before_save :set_date_modified
69
- before_destroy :update_all_members
70
-
71
- after_save :update_all_members
72
- end
8
+ include Hydra::Collections::Metadata
9
+ include Hydra::Collections::Relations
73
10
 
74
11
  def update_all_members
12
+ Deprecation.warn(Collection, 'update_all_members is deprecated and will be removed in version 5.0')
75
13
  self.members.collect { |m| update_member(m) }
76
14
  end
77
15
 
78
16
  # TODO: Use solr atomic updates to accelerate this process
79
17
  def update_member member
18
+ Deprecation.warn(Collection, 'update_member is deprecated and will be removed in version 5.0')
80
19
  # because the member may have its collections cached, reload that cache so that it indexes the correct fields.
81
20
  member.collections(true) if member.respond_to? :collections
82
21
  member.update_index
83
22
  end
84
23
 
85
- private
86
-
87
- def set_date_uploaded
88
- self.date_uploaded = Date.today
89
- end
90
-
91
- def set_date_modified
92
- self.date_modified = Date.today
93
- end
94
-
95
24
  end
96
25
  end
@@ -0,0 +1,22 @@
1
+ module Hydra::Collections
2
+ module Actions
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ Deprecation.warn(Actions, "Hydra::Collections::Actions is deprecated and will be removed in 6.0.0")
7
+ before_create :set_date_uploaded
8
+ before_save :set_date_modified
9
+ end
10
+
11
+ private
12
+
13
+ def set_date_uploaded
14
+ self.date_uploaded = Date.today
15
+ end
16
+
17
+ def set_date_modified
18
+ self.date_modified = Date.today
19
+ end
20
+ end
21
+ end
22
+
@@ -0,0 +1,62 @@
1
+ module Hydra::Collections
2
+ module Metadata
3
+ extend ActiveSupport::Concern
4
+ included do
5
+ property :depositor, predicate: ::RDF::URI.new("http://id.loc.gov/vocabulary/relators/dpt"), multiple: false do |index|
6
+ index.as :symbol, :stored_searchable
7
+ end
8
+
9
+ property :part_of, predicate: RDF::DC.isPartOf
10
+ property :contributor, predicate: RDF::DC.contributor do |index|
11
+ index.as :stored_searchable, :facetable
12
+ end
13
+ property :creator, predicate: RDF::DC.creator do |index|
14
+ index.as :stored_searchable, :facetable
15
+ end
16
+ property :title, predicate: RDF::DC.title, multiple: false do |index|
17
+ index.as :stored_searchable
18
+ end
19
+ property :description, predicate: RDF::DC.description, multiple: false do |index|
20
+ index.type :text
21
+ index.as :stored_searchable
22
+ end
23
+ property :publisher, predicate: RDF::DC.publisher do |index|
24
+ index.as :stored_searchable, :facetable
25
+ end
26
+ property :date_created, predicate: RDF::DC.created do |index|
27
+ index.as :stored_searchable
28
+ end
29
+ property :date_uploaded, predicate: RDF::DC.dateSubmitted, multiple: false do |index|
30
+ index.type :date
31
+ index.as :stored_sortable
32
+ end
33
+ property :date_modified, predicate: RDF::DC.modified, multiple: false do |index|
34
+ index.type :date
35
+ index.as :stored_sortable
36
+ end
37
+ property :subject, predicate: RDF::DC.subject do |index|
38
+ index.as :stored_searchable, :facetable
39
+ end
40
+ property :language, predicate: RDF::DC.language do |index|
41
+ index.as :stored_searchable, :facetable
42
+ end
43
+ property :rights, predicate: RDF::DC.rights do |index|
44
+ index.as :stored_searchable
45
+ end
46
+ property :resource_type, predicate: RDF::DC.type do |index|
47
+ index.as :stored_searchable, :facetable
48
+ end
49
+ property :identifier, predicate: RDF::DC.identifier do |index|
50
+ index.as :stored_searchable
51
+ end
52
+ property :based_near, predicate: RDF::FOAF.based_near do |index|
53
+ index.as :stored_searchable, :facetable
54
+ end
55
+ property :tag, predicate: RDF::DC.relation do |index|
56
+ index.as :stored_searchable, :facetable
57
+ end
58
+ property :related_url, predicate: RDF::RDFS.seeAlso
59
+
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,8 @@
1
+ module Hydra::Collections
2
+ module Relations
3
+ extend ActiveSupport::Concern
4
+ included do
5
+ has_and_belongs_to_many :members, predicate: ActiveFedora::RDF::Fcrepo::RelsExt.hasCollectionMember, class_name: "ActiveFedora::Base"
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,31 @@
1
+ module Hydra::Collections
2
+ class SearchBuilder < Hydra::SearchBuilder
3
+
4
+ def collection
5
+ scope.collection
6
+ end
7
+
8
+ # include filters into the query to only include the collection memebers
9
+ def include_collection_ids(solr_parameters)
10
+ solr_parameters[:fq] ||= []
11
+ solr_parameters[:fq] << "{!join from=hasCollectionMember_ssim to=id}id:#{collection.id}"
12
+ end
13
+
14
+ def some_rows(solr_parameters)
15
+ solr_parameters[:rows] = '100'
16
+ end
17
+
18
+ def add_collection_filter(solr_parameters)
19
+ solr_parameters[:fq] ||= []
20
+ solr_parameters[:fq] << ActiveFedora::SolrQueryBuilder.construct_query_for_rel(has_model: ::Collection.to_class_uri)
21
+ end
22
+
23
+ def discovery_perms= perms
24
+ @discovery_perms = perms
25
+ end
26
+
27
+ def discovery_permissions
28
+ @discovery_perms || super
29
+ end
30
+ end
31
+ end