hydra-collections 0.0.1
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 +7 -0
- data/.gitignore +20 -0
- data/.gitmodules +4 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +16 -0
- data/Gemfile +12 -0
- data/LICENSE.txt +22 -0
- data/README.md +133 -0
- data/Rakefile +12 -0
- data/app/assets/javascripts/hydra/batch_select.js +41 -0
- data/app/assets/javascripts/hydra_collections.js +12 -0
- data/app/controllers/collections_controller.rb +18 -0
- data/app/helpers/batch_select_helper.rb +25 -0
- data/app/helpers/collections_helper.rb +14 -0
- data/app/models/collection.rb +16 -0
- data/app/views/batch_select/_add_button.html.erb +3 -0
- data/app/views/batch_select/_check_all.html.erb +4 -0
- data/app/views/batch_select/_tools.html.erb +10 -0
- data/app/views/collections/_button_create_collection.html.erb +2 -0
- data/app/views/collections/_form.html.erb +36 -0
- data/app/views/collections/_form_for_select_collection.html.erb +13 -0
- data/app/views/collections/new.html.erb +3 -0
- data/app/views/collections/show.html.erb +9 -0
- data/config/jetty.yml +6 -0
- data/config/routes.rb +3 -0
- data/fedora_conf/conf/development/fedora.fcfg +946 -0
- data/fedora_conf/conf/test/fedora.fcfg +946 -0
- data/hydra-collections.gemspec +27 -0
- data/lib/hydra-collections.rb +7 -0
- data/lib/hydra/collection.rb +52 -0
- data/lib/hydra/collections.rb +12 -0
- data/lib/hydra/collections/accepts_batches.rb +55 -0
- data/lib/hydra/collections/collectible.rb +24 -0
- data/lib/hydra/collections/search_service.rb +58 -0
- data/lib/hydra/collections/version.rb +5 -0
- data/lib/hydra/collections_controller_behavior.rb +108 -0
- data/lib/hydra/datastreams/collection_rdf_datastream.rb +36 -0
- data/solr_conf/conf/schema.xml +372 -0
- data/solr_conf/conf/solrconfig.xml +163 -0
- data/solr_conf/solr.xml +35 -0
- data/spec/controllers/accepts_batches_spec.rb +72 -0
- data/spec/controllers/collections_controller_spec.rb +93 -0
- data/spec/factories.rb +18 -0
- data/spec/factories/.gitkeep +0 -0
- data/spec/factories/users.rb +31 -0
- data/spec/helpers/collections_helper_spec.rb +29 -0
- data/spec/lib/collectible_spec.rb +31 -0
- data/spec/lib/search_service_spec.rb +41 -0
- data/spec/models/collection_spec.rb +100 -0
- data/spec/spec_helper.rb +24 -0
- data/spec/support/Gemfile +19 -0
- data/spec/support/app/models/sample.rb +37 -0
- data/spec/support/app/models/solr_document.rb +5 -0
- data/spec/support/app/views/catalog/_document_header.html.erb +11 -0
- data/spec/support/app/views/catalog/_sort_and_per_page.html.erb +20 -0
- data/spec/support/config/initializers/hydra_config.rb +28 -0
- data/spec/support/db/migrate/20111101221803_create_searches.rb +16 -0
- data/spec/support/lib/generators/test_app_generator.rb +54 -0
- data/spec/support/lib/tasks/rspec.rake +9 -0
- data/tasks/hydra-collections-dev.rake +68 -0
- data/tasks/jetty.rake +40 -0
- metadata +194 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9c5a786d66ac76371de611ba60c82a417cb7bf2e
|
4
|
+
data.tar.gz: d2aa7e948ff445d78cf8850a42cf3f1eb6c4f0bf
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: df8819b16d5c05fb2bba1c0d8ea75b7cdab1f4222a468c91c0ae72eafbe66ecd5ae06439d85b65241e5a5595d27bc3fb5ba11fe3966108b074724476ede2cf58
|
7
|
+
data.tar.gz: 0501175dc1e84dd91992945b8ae666355d2577e83bedcc692ba61211c5c738eefa6685ea3bdc87a6d27dff82785537c002247d7e98a6df77c70697608534edce
|
data/.gitignore
ADDED
data/.gitmodules
ADDED
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
hydra-collections
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby-2.0.0-p0
|
data/.travis.yml
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
language: ruby
|
2
|
+
rvm:
|
3
|
+
- "2.0.0"
|
4
|
+
notifications:
|
5
|
+
email:
|
6
|
+
recipients:
|
7
|
+
- "michael@psu.edu"
|
8
|
+
- "cam156@psu.edu"
|
9
|
+
- "dmc186@psu.edu"
|
10
|
+
on_success: "change"
|
11
|
+
on_failure: "always"
|
12
|
+
irc:
|
13
|
+
channels:
|
14
|
+
- "irc.freenode.org#scholarsphere"
|
15
|
+
template:
|
16
|
+
- "%{repository}//%{branch}@%{commit} by %{author}: %{message} - %{build_url}"
|
data/Gemfile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in hydra-collections.gemspec
|
4
|
+
gemspec
|
5
|
+
|
6
|
+
group :development, :test do
|
7
|
+
gem 'sqlite3'
|
8
|
+
gem "factory_girl_rails", "~> 4.1.0"
|
9
|
+
gem 'devise'
|
10
|
+
gem 'capybara', '~>1.1.3'
|
11
|
+
gem 'jettywrapper'
|
12
|
+
end
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Carolyn Cole
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
# Hydra::Collections [](http://badge.fury.io/rb/hydra-collections) [](https://travis-ci.org/psu-stewardship/hydra-collections) [](https://gemnasium.com/psu-stewardship/hydra-collections)
|
2
|
+
|
3
|
+
Add collections to your Hydra application
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'hydra-collections'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install hydra-collections
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
### Mount the engine to get the routes in config/routes.rb
|
22
|
+
|
23
|
+
mount Hydra::Collections::Engine => '/'
|
24
|
+
|
25
|
+
### Call button_create_collection view helper in your search result page template.
|
26
|
+
We recommend putting it in catalog/_sort_and_per_page.html.erb which you will manually override in you app.
|
27
|
+
|
28
|
+
<%= button_create_collection %>
|
29
|
+
|
30
|
+
### Any time you want to refer to the routes from hydra-collections use collections.
|
31
|
+
collections.new_collections_path
|
32
|
+
|
33
|
+
### Make your Models Collectible
|
34
|
+
|
35
|
+
Add `include Hydra::Collections::Collectible` to the models for anything that you want to be able to add to collections (ie. GenericFile, Book, Article, etc.), then add `index_collection_pids` to the solrization logic (ie. put it in to_solr)
|
36
|
+
|
37
|
+
Example:
|
38
|
+
```ruby
|
39
|
+
class GenericFile < ActiveFedora::Base
|
40
|
+
include Hydra::Collections::Collectible
|
41
|
+
...
|
42
|
+
def to_solr(solr_doc={}, opts={})
|
43
|
+
super(solr_doc, opts)
|
44
|
+
index_collection_pids(solr_doc)
|
45
|
+
return solr_doc
|
46
|
+
end
|
47
|
+
end
|
48
|
+
```
|
49
|
+
|
50
|
+
Any items that include the `Hydra::Collections::Collectible` module can look up which collections they belong to via `.collections`. The `index_collection_pids` puts the pids of all associated collections into the `collection` facet.
|
51
|
+
|
52
|
+
### Make your Controller Accept a Batch
|
53
|
+
|
54
|
+
Add `include Hydra::Collections::AcceptsBatches` to the collections you would like to process batches of models
|
55
|
+
|
56
|
+
You can access the batch in your update.
|
57
|
+
|
58
|
+
Example:
|
59
|
+
```ruby
|
60
|
+
class BatchEditsController < ApplicationController
|
61
|
+
include Hydra::Collections::AcceptsBatches
|
62
|
+
...
|
63
|
+
|
64
|
+
def update
|
65
|
+
batch.each do |doc_id|
|
66
|
+
obj = ActiveFedora::Base.find(doc_id, :cast=>true)
|
67
|
+
update_document(obj)
|
68
|
+
obj.save
|
69
|
+
end
|
70
|
+
flash[:notice] = "Batch update complete"
|
71
|
+
after_update
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
```
|
76
|
+
### Include the javascript to discover checked batch items
|
77
|
+
|
78
|
+
include `//= require hydra/batch_select` in your application.js
|
79
|
+
|
80
|
+
### Display a selection checkbox in each document partial
|
81
|
+
|
82
|
+
include `<%= button_for_add_to_batch document %>'
|
83
|
+
|
84
|
+
Example: views/catalog/_document_header.html.erb
|
85
|
+
```ruby
|
86
|
+
<% # header bar for doc items in index view -%>
|
87
|
+
<div class="documentHeader clearfix">
|
88
|
+
<%= button_for_add_to_batch(document) %>
|
89
|
+
|
90
|
+
...
|
91
|
+
</div>
|
92
|
+
|
93
|
+
```
|
94
|
+
|
95
|
+
|
96
|
+
### Update your view to submit a Batch
|
97
|
+
|
98
|
+
include
|
99
|
+
Add `submits-batches` class to your view input to initialize batch processing
|
100
|
+
|
101
|
+
Example:
|
102
|
+
```ruby
|
103
|
+
<%= button_to label, edit_batch_edits_path, :method=>:get, :class=>"btn submits-batches", 'data-behavior'=>'batch-edit', :id=>'batch-edit' %>
|
104
|
+
```
|
105
|
+
|
106
|
+
### Update you action view to submit changes to the batch
|
107
|
+
|
108
|
+
Add `updates-batches` class to your
|
109
|
+
|
110
|
+
|
111
|
+
## Contributing
|
112
|
+
|
113
|
+
1. Fork it
|
114
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
115
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
116
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
117
|
+
5. Create new Pull Request
|
118
|
+
|
119
|
+
### Setup instructions for Contributors
|
120
|
+
|
121
|
+
In order to make modifications to the gem code and run the tests, clone the repository then
|
122
|
+
|
123
|
+
```
|
124
|
+
$ bundle install
|
125
|
+
$ git submodule init
|
126
|
+
$ git submodule update
|
127
|
+
$ rake jetty:config
|
128
|
+
$ rake jetty:start
|
129
|
+
$ rake clean
|
130
|
+
$ rake spec
|
131
|
+
```
|
132
|
+
|
133
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
require "bundler/gem_tasks"
|
3
|
+
|
4
|
+
Dir.glob('tasks/*.rake').each { |r| import r }
|
5
|
+
|
6
|
+
ENV["RAILS_ROOT"] ||= 'spec/internal'
|
7
|
+
|
8
|
+
desc 'Run CI tests in e.g. Travis environment'
|
9
|
+
task :travis => ['clean', 'ci']
|
10
|
+
|
11
|
+
desc 'Default: run CI'
|
12
|
+
task :default => [:travis]
|
@@ -0,0 +1,41 @@
|
|
1
|
+
$(function () {
|
2
|
+
|
3
|
+
// add the batch ids to any submit of a batch update
|
4
|
+
var batch_ids = null;
|
5
|
+
$('input.updates-batches').on('click', function() {
|
6
|
+
var form = $(this).closest("form");
|
7
|
+
var hash, id;
|
8
|
+
|
9
|
+
// pull the ids from the url
|
10
|
+
if (!batch_ids) {
|
11
|
+
batch_ids = [];
|
12
|
+
// pull the ids from the url
|
13
|
+
var q = document.URL.split('?')[1];
|
14
|
+
if(q != undefined){
|
15
|
+
q = q.split('&');
|
16
|
+
for(var i = 0; i < q.length; i++){
|
17
|
+
hash = q[i].split('=');
|
18
|
+
if (hash[0] == "batch_document_ids%5B%5D")
|
19
|
+
batch_ids.push(unescape(hash[1]));
|
20
|
+
}
|
21
|
+
}
|
22
|
+
}
|
23
|
+
|
24
|
+
// push the ids in the form
|
25
|
+
for(var j = 0; j < batch_ids.length; j++){
|
26
|
+
if (form.children("input[value='"+batch_ids[j]+"']").length == 0)
|
27
|
+
form.append('<input type="hidden" multiple="multiple" name="batch_document_ids[]" value="'+batch_ids[j]+'" />');
|
28
|
+
}
|
29
|
+
|
30
|
+
});
|
31
|
+
$('input.submits-batches').on('click', function() {
|
32
|
+
var form = $(this).closest("form");
|
33
|
+
$.map( $(".batch_document_selector:checked"), function(document, i) {
|
34
|
+
var id = document.id.substring("batch_document_".length);
|
35
|
+
form.append('<input type="hidden" multiple="multiple" name="batch_document_ids[]" value="'+id+'" />');
|
36
|
+
});
|
37
|
+
|
38
|
+
|
39
|
+
});
|
40
|
+
|
41
|
+
});
|
@@ -0,0 +1,12 @@
|
|
1
|
+
$(function () {
|
2
|
+
|
3
|
+
// change the action based which collection is selected
|
4
|
+
$('input.submits-batches').on('click', function() {
|
5
|
+
|
6
|
+
var form = $(this).closest("form");
|
7
|
+
var collection_id = $(".collection-selector:checked")[0].value;
|
8
|
+
form[0].action = form[0].action.replace("collection_replace_id",collection_id);
|
9
|
+
|
10
|
+
});
|
11
|
+
|
12
|
+
});
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# Copyright © 2012 The Pennsylvania State University
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
|
16
|
+
class CollectionsController < ApplicationController
|
17
|
+
include Hydra::CollectionsControllerBehavior
|
18
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# View Helpers for Hydra Batch Edit functionality
|
2
|
+
module BatchSelectHelper
|
3
|
+
|
4
|
+
# determines if the given document id is in the batch
|
5
|
+
# def item_in_batch?(doc_id)
|
6
|
+
# session[:batch_document_ids] && session[:batch_document_ids].include?(doc_id) ? true : false
|
7
|
+
# end
|
8
|
+
|
9
|
+
# 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
|
10
|
+
def batch_select_tools
|
11
|
+
render :partial=>'/batch_select/tools'
|
12
|
+
end
|
13
|
+
|
14
|
+
# Displays the button to select/deselect items for your batch. Call this in the index partial that's rendered for each search result.
|
15
|
+
# @param [Hash] document the Hash (aka Solr hit) for one Solr document
|
16
|
+
def button_for_add_to_batch(document)
|
17
|
+
render :partial=>'/batch_select/add_button', :locals=>{:document=>document}
|
18
|
+
end
|
19
|
+
|
20
|
+
# 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
|
21
|
+
def batch_check_all(label = 'Use all results')
|
22
|
+
render :partial=>'/batch_select/check_all', :locals=>{:label=>label}
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# View Helpers for Hydra Batch Edit functionality
|
2
|
+
module CollectionsHelper
|
3
|
+
|
4
|
+
|
5
|
+
# Displays the Collections create collection button. Put this in your search result page template. We recommend putting it in catalog/_sort_and_per_page.html.erb
|
6
|
+
def button_for_create_collection(label = 'Create Collection')
|
7
|
+
render :partial=>'/collections/button_create_collection', :locals=>{:label=>label}
|
8
|
+
end
|
9
|
+
|
10
|
+
def button_for_add_batch_to_collection(label = 'Add Selected to a Collection')
|
11
|
+
render :partial=>'/collections/button_add_batch_to_collection', :locals=>{:label=>label}
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# Copyright © 2013 The Pennsylvania State University
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
class Collection < ActiveFedora::Base
|
15
|
+
include Hydra::Collection
|
16
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<div class="btn-group batch-tools hidden" data-behavior="batch-tools">
|
2
|
+
<button class="btn"><i class="icon-cog"></i> Tools</button>
|
3
|
+
<button class="btn dropdown-toggle" data-toggle="dropdown">
|
4
|
+
<span class="caret"></span>
|
5
|
+
</button>
|
6
|
+
<ul class="dropdown-menu">
|
7
|
+
<li data-behavior="batch-edit-activate" data-state="<%= batch_edit_state %>"><a href="#"><i class=""></i> Batch edit</a></li>
|
8
|
+
</ul>
|
9
|
+
</div>
|
10
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
<div class="container">
|
2
|
+
<%-# This syntax [collections, @collection] tells form_for to use the routes from the engine named collections %>
|
3
|
+
<%= form_for([collections, @collection]) do |f| %>
|
4
|
+
<% if @collection.errors.any? %>
|
5
|
+
<div id="error_explanation">
|
6
|
+
<h2><%= pluralize(@collection.errors.count, "error") %> prohibited this topic from being saved:</h2>
|
7
|
+
|
8
|
+
<ul>
|
9
|
+
<% @collection.errors.full_messages.each do |msg| %>
|
10
|
+
<li><%= msg %></li>
|
11
|
+
<% end %>
|
12
|
+
</ul>
|
13
|
+
</div>
|
14
|
+
<% end %>
|
15
|
+
|
16
|
+
<div class="field">
|
17
|
+
<%= f.label :title %><br />
|
18
|
+
<%= f.text_field :title %>
|
19
|
+
</div>
|
20
|
+
|
21
|
+
<div class="field">
|
22
|
+
<%= f.label :description %><br />
|
23
|
+
<%= f.text_area :description %>
|
24
|
+
</div>
|
25
|
+
|
26
|
+
<%- unless params[:batch_document_ids].nil? || params[:batch_document_ids].empty? %>
|
27
|
+
<%- params[:batch_document_ids].each do |batch_item| %>
|
28
|
+
<input type="hidden" name="batch_document_ids[]" value="<%= batch_item %>"/>
|
29
|
+
<%- end %>
|
30
|
+
<%- end %>
|
31
|
+
|
32
|
+
<div class="actions">
|
33
|
+
<%= f.submit %>
|
34
|
+
</div>
|
35
|
+
<% end %>
|
36
|
+
</div>
|