hydra-collections 4.0.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
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