blacklight 5.3.0 → 5.4.0.rc1

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 (64) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -1
  3. data/VERSION +1 -1
  4. data/app/assets/javascripts/blacklight/blacklight.js +1 -0
  5. data/app/assets/javascripts/blacklight/collapsable.js +9 -0
  6. data/app/controllers/bookmarks_controller.rb +72 -9
  7. data/app/helpers/blacklight/blacklight_helper_behavior.rb +15 -7
  8. data/app/helpers/blacklight/catalog_helper_behavior.rb +17 -9
  9. data/app/helpers/blacklight/configuration_helper_behavior.rb +59 -7
  10. data/app/helpers/blacklight/facets_helper_behavior.rb +1 -16
  11. data/app/helpers/blacklight/url_helper_behavior.rb +21 -2
  12. data/app/models/bookmark.rb +13 -4
  13. data/app/models/solr_document.rb +5 -0
  14. data/app/views/bookmarks/_tools.html.erb +10 -11
  15. data/app/views/catalog/_bookmark_control.html.erb +2 -2
  16. data/app/views/catalog/_refworks_form.html.erb +3 -2
  17. data/app/views/catalog/_sort_widget.html.erb +5 -5
  18. data/app/views/catalog/_view_type_group.html.erb +2 -2
  19. data/app/views/shared/_header_navbar.html.erb +1 -3
  20. data/config/locales/blacklight.pt-BR.yml +223 -0
  21. data/db/migrate/20140320000000_add_polymorphic_type_to_bookmarks.rb +8 -0
  22. data/gemfiles/rails4.1.gemfile +1 -1
  23. data/lib/blacklight.rb +5 -0
  24. data/lib/blacklight/catalog.rb +33 -5
  25. data/lib/blacklight/configuration.rb +12 -3
  26. data/lib/blacklight/configuration/facet_field.rb +1 -1
  27. data/lib/blacklight/configuration/search_field.rb +3 -2
  28. data/lib/blacklight/configuration/solr_field.rb +2 -1
  29. data/lib/blacklight/configuration/sort_field.rb +2 -1
  30. data/lib/blacklight/engine.rb +9 -1
  31. data/lib/blacklight/exceptions.rb +3 -0
  32. data/lib/blacklight/rails/routes.rb +12 -0
  33. data/lib/blacklight/request_builders.rb +19 -18
  34. data/lib/blacklight/search_fields.rb +0 -9
  35. data/lib/blacklight/solr/document.rb +15 -0
  36. data/lib/blacklight/solr/document/export.rb +4 -0
  37. data/lib/blacklight/solr_helper.rb +25 -28
  38. data/lib/blacklight/solr_response.rb +31 -29
  39. data/lib/blacklight/solr_response/response.rb +18 -0
  40. data/lib/blacklight/user.rb +17 -4
  41. data/lib/blacklight/utils.rb +30 -2
  42. data/lib/generators/blacklight/install_generator.rb +4 -0
  43. data/lib/generators/blacklight/templates/config/initializers/blacklight_initializer.rb +9 -0
  44. data/spec/controllers/application_controller_spec.rb +0 -1
  45. data/spec/controllers/bookmarks_controller_spec.rb +8 -4
  46. data/spec/controllers/catalog_controller_spec.rb +48 -55
  47. data/spec/controllers/saved_searches_controller_spec.rb +1 -4
  48. data/spec/controllers/search_history_controller_spec.rb +0 -1
  49. data/spec/features/bookmarks_spec.rb +14 -0
  50. data/spec/features/search_formats_spec.rb +45 -0
  51. data/spec/helpers/blacklight_helper_spec.rb +71 -30
  52. data/spec/helpers/configuration_helper_spec.rb +128 -4
  53. data/spec/helpers/facets_helper_spec.rb +1 -1
  54. data/spec/lib/blacklight/configuration_spec.rb +0 -5
  55. data/spec/lib/blacklight/search_fields_spec.rb +0 -22
  56. data/spec/lib/blacklight/solr/document_spec.rb +6 -0
  57. data/spec/lib/blacklight/solr_helper_spec.rb +31 -10
  58. data/spec/lib/blacklight/solr_response_spec.rb +8 -0
  59. data/spec/lib/blacklight/user_spec.rb +38 -4
  60. data/spec/models/bookmark_spec.rb +22 -17
  61. data/spec/spec_helper.rb +2 -0
  62. data/template.demo.rb +4 -9
  63. metadata +12 -6
  64. data/spec/data/sample_docs.yml +0 -655
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0d93877de36068052dea5532f02351756789a2bd
4
- data.tar.gz: 9103ab9e7d7a91c17de2233aed70f0f3e7df5c4c
3
+ metadata.gz: 540546b2abe3b14b82ac1bf0bc9c079db212a291
4
+ data.tar.gz: 7fa2ffa45e80e88b3d02a744124b94be1f7b64a5
5
5
  SHA512:
6
- metadata.gz: 7eec942d25ae5133dff56c7dbe1b3d169b01510bfdb86adfb99ba533e230e04287c988f86b58e9104e62a6617f3c93bc1bca009085ed6be98bdbb03ccedc5c5e
7
- data.tar.gz: dd0767408947a969b6bb130b65d38e243e664d2efce6667d9d23d29b6c8bff5847a3909104f4da4d53782e890e82c23c984f2e8b370e46e398a5d78872179806
6
+ metadata.gz: a06c30a6d5e7b2bb8686ed8f80a8bad01e237b9bf52d6af2fb63c546c15a631e4b8f77c033afffcd231499101d404369d8eda26c2ed58f18f02b8e490c4884d4
7
+ data.tar.gz: b47793969ac19bd39fc851cd1ade641be5b97c84ecc2bdbc34a0412ca628150833c2d50dda1f093ba4e8d331543c46fb5ca6e5b5d5978a38d79610177b5ce26a
data/Gemfile CHANGED
@@ -4,7 +4,9 @@ source 'https://rubygems.org'
4
4
  gemspec path: File.expand_path('..', __FILE__)
5
5
 
6
6
 
7
- gem 'simplecov', require: false
7
+ # Peg simplecov to < 0.8 until this is resolved:
8
+ # https://github.com/colszowka/simplecov/issues/281
9
+ gem 'simplecov', '~> 0.7.1', require: false
8
10
  gem 'coveralls', require: false
9
11
 
10
12
  gem 'engine_cart', '~> 0.3.0'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 5.3.0
1
+ 5.4.0.rc1
@@ -9,6 +9,7 @@
9
9
  //= require blacklight/bookmark_toggle
10
10
  //= require blacklight/ajax_modal
11
11
  //= require blacklight/search_context
12
+ //= require blacklight/collapsable
12
13
  //
13
14
  //Bootstrap JS for providing collapsable tablet/mobile menu/alert boxes
14
15
  //= require bootstrap/transition
@@ -0,0 +1,9 @@
1
+ (function($) {
2
+ Blacklight.onLoad(function() {
3
+ // when clicking on a link that toggles the collapsing behavior, don't do anything
4
+ // with the hash or the page could jump around.
5
+ $(document).on("click", "a[data-toggle=collapse][href='#'], [data-toggle=collapse] a[href='#']", function(event) {
6
+ event.preventDefault();
7
+ });
8
+ });
9
+ })(jQuery);
@@ -9,6 +9,10 @@ class BookmarksController < CatalogController
9
9
  include Blacklight::SolrHelper
10
10
 
11
11
  copy_blacklight_config_from(CatalogController)
12
+
13
+ rescue_from Blacklight::Exceptions::ExpiredSessionToken do
14
+ head :unauthorized
15
+ end
12
16
 
13
17
  # Blacklight uses #search_action_url to figure out the right URL for
14
18
  # the global search box
@@ -19,12 +23,25 @@ class BookmarksController < CatalogController
19
23
  before_filter :verify_user
20
24
 
21
25
  def index
22
- @bookmarks = current_or_guest_user.bookmarks
26
+ @bookmarks = token_or_current_or_guest_user.bookmarks
23
27
  bookmark_ids = @bookmarks.collect { |b| b.document_id.to_s }
24
28
 
25
- @response, @document_list = get_solr_response_for_field_values(SolrDocument.unique_key, bookmark_ids)
29
+ @response, @document_list = get_solr_response_for_document_ids(bookmark_ids)
30
+
31
+ respond_to do |format|
32
+ format.html { }
33
+ format.rss { render :layout => false }
34
+ format.atom { render :layout => false }
35
+ format.json do
36
+ render json: render_search_results_as_json
37
+ end
38
+
39
+ additional_response_formats(format)
40
+ document_export_formats(format)
41
+ end
26
42
  end
27
43
 
44
+
28
45
  def update
29
46
  create
30
47
  end
@@ -41,13 +58,13 @@ class BookmarksController < CatalogController
41
58
  if params[:bookmarks]
42
59
  @bookmarks = params[:bookmarks]
43
60
  else
44
- @bookmarks = [{ :document_id => params[:id] }]
61
+ @bookmarks = [{ document_id: params[:id], document_type: blacklight_config.solr_document_model.to_s }]
45
62
  end
46
63
 
47
64
  current_or_guest_user.save! unless current_or_guest_user.persisted?
48
65
 
49
66
  success = @bookmarks.all? do |bookmark|
50
- current_or_guest_user.bookmarks.create(bookmark) unless current_or_guest_user.existing_bookmark_for(bookmark[:document_id])
67
+ current_or_guest_user.bookmarks.create(bookmark) unless current_or_guest_user.bookmarks.where(bookmark).exists?
51
68
  end
52
69
 
53
70
  if request.xhr?
@@ -66,10 +83,10 @@ class BookmarksController < CatalogController
66
83
  # Beware, :id is the Solr document_id, not the actual Bookmark id.
67
84
  # idempotent, as DELETE is supposed to be.
68
85
  def destroy
69
- bookmark = current_or_guest_user.existing_bookmark_for(params[:id])
70
-
71
- success = (!bookmark) || current_or_guest_user.bookmarks.delete(bookmark)
72
-
86
+ bookmark = current_or_guest_user.bookmarks.where(document_id: params[:id], document_type: blacklight_config.solr_document_model).first
87
+
88
+ success = bookmark && bookmark.delete && bookmark.destroyed?
89
+
73
90
  unless request.xhr?
74
91
  if success
75
92
  flash[:notice] = I18n.t('blacklight.bookmarks.remove.success')
@@ -94,10 +111,56 @@ class BookmarksController < CatalogController
94
111
 
95
112
  protected
96
113
  def verify_user
97
- flash[:notice] = I18n.t('blacklight.bookmarks.need_login') and raise Blacklight::Exceptions::AccessDenied unless current_or_guest_user
114
+ unless current_or_guest_user or (action == "index" and token_or_current_or_guest_user)
115
+ flash[:notice] = I18n.t('blacklight.bookmarks.need_login') and raise Blacklight::Exceptions::AccessDenied
116
+ end
98
117
  end
99
118
 
100
119
  def start_new_search_session?
101
120
  action_name == "index"
102
121
  end
122
+
123
+ # Used for #export action, with encrypted user_id.
124
+ def decrypt_user_id(encrypted_user_id)
125
+ user_id, timestamp = message_encryptor.decrypt_and_verify(encrypted_user_id)
126
+
127
+ if timestamp < 1.hour.ago
128
+ raise Blacklight::Exceptions::ExpiredSessionToken.new
129
+ end
130
+
131
+ user_id
132
+ end
133
+
134
+ # Used for #export action with encrypted user_id, available
135
+ # as a helper method for views.
136
+ def encrypt_user_id(user_id)
137
+ message_encryptor.encrypt_and_sign([user_id, Time.now])
138
+ end
139
+ helper_method :encrypt_user_id
140
+
141
+ ##
142
+ # This method provides Rails 3 compatibility to our message encryptor.
143
+ # When we drop support for Rails 3, we can just use the AS::KeyGenerator
144
+ # directly instead of this helper.
145
+ def bookmarks_export_secret_token salt
146
+ OpenSSL::PKCS5.pbkdf2_hmac_sha1(Blacklight.secret_key, salt, 1000, 64)
147
+ end
148
+
149
+ def message_encryptor
150
+ derived_secret = bookmarks_export_secret_token("bookmarks session key")
151
+ ActiveSupport::MessageEncryptor.new(derived_secret)
152
+ end
153
+
154
+ def token_or_current_or_guest_user
155
+ token_user || current_or_guest_user
156
+ end
157
+
158
+ def token_user
159
+ @token_user ||= if params[:encrypted_user_id]
160
+ user_id = decrypt_user_id params[:encrypted_user_id]
161
+ User.find(user_id)
162
+ else
163
+ nil
164
+ end
165
+ end
103
166
  end
@@ -134,9 +134,7 @@ module Blacklight::BlacklightHelperBehavior
134
134
  # @param [Blacklight::Solr::Configuration::SolrField] solr_field
135
135
  # @return [Boolean]
136
136
  def should_render_index_field? document, solr_field
137
- document.has?(solr_field.field) ||
138
- (document.has_highlight_field? solr_field.field if solr_field.highlight) ||
139
- solr_field.accessor
137
+ should_render_field?(solr_field, document) && document_has_value?(document, solr_field)
140
138
  end
141
139
 
142
140
  ##
@@ -146,9 +144,19 @@ module Blacklight::BlacklightHelperBehavior
146
144
  # @param [Blacklight::Solr::Configuration::SolrField] solr_field
147
145
  # @return [Boolean]
148
146
  def should_render_show_field? document, solr_field
149
- document.has?(solr_field.field) ||
150
- (document.has_highlight_field? solr_field.field if solr_field.highlight) ||
151
- solr_field.accessor
147
+ should_render_field?(solr_field, document) && document_has_value?(document, solr_field)
148
+ end
149
+
150
+ ##
151
+ # Check if a document has (or, might have, in the case of accessor methods) a value for
152
+ # the given solr field
153
+ # @param [SolrDocument] document
154
+ # @param [Blacklight::Solr::Configuration::SolrField] solr_field
155
+ # @return [Boolean]
156
+ def document_has_value? document, field_config
157
+ document.has?(field_config.field) ||
158
+ (document.has_highlight_field? field_config.field if field_config.highlight) ||
159
+ field_config.accessor
152
160
  end
153
161
 
154
162
  ##
@@ -378,7 +386,7 @@ module Blacklight::BlacklightHelperBehavior
378
386
  # @return [String]
379
387
  def render_document_index documents = nil, locals = {}
380
388
  documents ||= @document_list
381
- render_document_index_with_view(document_index_view_type, documents)
389
+ render_document_index_with_view(document_index_view_type, documents, locals)
382
390
  end
383
391
 
384
392
  ##
@@ -87,15 +87,6 @@ module Blacklight::CatalogHelperBehavior
87
87
  (@response.rows if @response and @response.rows > 0) || params.fetch(:per_page, default_per_page).to_i
88
88
  end
89
89
 
90
- ##
91
- # Export to Refworks URL
92
- #
93
- # @param [SolrDocument]
94
- # @return [String]
95
- def refworks_export_url(document = @document)
96
- "http://www.refworks.com/express/expressimport.asp?vendor=#{CGI.escape(application_name)}&filter=MARC%20Format&encoding=65001&url=#{CGI.escape(polymorphic_path(document, :format => 'refworks_marc_txt', :only_path => false))}"
97
- end
98
-
99
90
  ##
100
91
  # Get the classes to add to a document's div
101
92
  #
@@ -205,4 +196,21 @@ module Blacklight::CatalogHelperBehavior
205
196
  def default_view_type_group_icon_classes view
206
197
  "glyphicon-#{view.to_s.parameterize } view-icon-#{view.to_s.parameterize}"
207
198
  end
199
+
200
+ def current_bookmarks response = nil
201
+ response ||= @response
202
+ @current_bookmarks ||= current_or_guest_user.bookmarks_for_documents(response.documents).to_a
203
+ end
204
+
205
+ def render_marc_tools
206
+ return unless defined? Blacklight::Marc
207
+
208
+ begin
209
+ # blacklight-marc 5.4+
210
+ render 'marc_tools'
211
+ rescue ActionView::MissingTemplate
212
+ # blacklight-marc 5.0+
213
+ render('endnote') + render('refworks')
214
+ end
215
+ end
208
216
  end
@@ -11,13 +11,26 @@ module Blacklight::ConfigurationHelperBehavior
11
11
 
12
12
  # Used in the document_list partial (search view) for building a select element
13
13
  def sort_fields
14
- blacklight_config.sort_fields.map { |key, x| [x.label, x.key] }
14
+ active_sort_fields.map { |key, x| [x.label, x.key] }
15
+ end
16
+
17
+ def active_sort_fields
18
+ blacklight_config.sort_fields.select { |sort_key, field_config| should_render_field?(field_config) }
15
19
  end
16
20
 
17
21
  # Used in the search form partial for building a select tag
18
22
  def search_fields
19
23
  search_field_options_for_select
20
24
  end
25
+
26
+ # Returns suitable argument to options_for_select method, to create
27
+ # an html select based on #search_field_list. Skips search_fields
28
+ # marked :include_in_simple_select => false
29
+ def search_field_options_for_select
30
+ blacklight_config.search_fields.collect do |key, field_def|
31
+ [field_def.label, field_def.key] if should_render_field?(field_def)
32
+ end.compact
33
+ end
21
34
 
22
35
  # used in the catalog/_show/_default partial
23
36
  def document_show_fields document=nil
@@ -63,10 +76,10 @@ module Blacklight::ConfigurationHelperBehavior
63
76
  ##
64
77
  # Look up the label for a solr field.
65
78
  #
66
- # @overload
79
+ # @overload label
67
80
  # @param [Symbol] an i18n key
68
81
  #
69
- # @overload
82
+ # @overload label, i18n_key, another_i18n_key, and_another_i18n_key
70
83
  # @param [String] default label to display if the i18n look up fails
71
84
  # @param [Symbol] i18n keys to attempt to look up
72
85
  # before falling back to the label
@@ -84,16 +97,22 @@ module Blacklight::ConfigurationHelperBehavior
84
97
  t(first, default: rest)
85
98
  end
86
99
 
100
+ def document_index_views
101
+ blacklight_config.view.select do |k, config|
102
+ should_render_field? config
103
+ end
104
+ end
105
+
87
106
  ##
88
107
  # Get the default index view type
89
108
  def default_document_index_view_type
90
- blacklight_config.view.keys.first
109
+ document_index_views.select { |k,config| config.respond_to? :default and config.default }.keys.first || document_index_views.keys.first
91
110
  end
92
111
 
93
112
  ##
94
113
  # Check if there are alternative views configuration
95
114
  def has_alternative_views?
96
- blacklight_config.view.keys.length > 1
115
+ document_index_views.keys.length > 1
97
116
  end
98
117
 
99
118
  ##
@@ -104,13 +123,13 @@ module Blacklight::ConfigurationHelperBehavior
104
123
 
105
124
  # Used in the document list partial (search view) for creating a link to the document show action
106
125
  def document_show_link_field document=nil
107
- blacklight_config.view_config(document_index_view_type).title_field.to_sym
126
+ blacklight_config.view_config(document_index_view_type).title_field.try(:to_sym) || document.id
108
127
  end
109
128
 
110
129
  ##
111
130
  # Default sort field
112
131
  def default_sort_field
113
- blacklight_config.sort_fields.first.last if blacklight_config.sort_fields.first
132
+ (active_sort_fields.select { |k,config| config.respond_to? :default and config.default }.first || active_sort_fields.first).try(:last)
114
133
  end
115
134
 
116
135
  ##
@@ -126,4 +145,37 @@ module Blacklight::ConfigurationHelperBehavior
126
145
  [t(:'blacklight.search.per_page.label', :count => count).html_safe, count]
127
146
  end
128
147
  end
148
+
149
+ ##
150
+ # Determine whether to render a field by evaluating :if and :unless conditions
151
+ #
152
+ # @param [SolrDocument] document
153
+ # @param [Blacklight::Solr::Configuration::SolrField] solr_field
154
+ # @return [Boolean]
155
+ def should_render_field? field_config, *args
156
+ return field_config if field_config === true or field_config === false
157
+
158
+ if_value = !field_config.respond_to?(:if) || field_config.if.nil? || evaluate_configuration_conditional(field_config.if, field_config, *args)
159
+
160
+ unless_value = !field_config.respond_to?(:unless) || field_config.unless.nil? || !evaluate_configuration_conditional(field_config.unless, field_config, *args)
161
+
162
+ if_value && unless_value
163
+ end
164
+
165
+ def evaluate_configuration_conditional proc_helper_or_boolean, *args_for_procs_and_methods
166
+ case proc_helper_or_boolean
167
+ when Symbol
168
+ arity = method(proc_helper_or_boolean).arity
169
+
170
+ if arity == 0
171
+ send(proc_helper_or_boolean)
172
+ else
173
+ send(proc_helper_or_boolean, *args_for_procs_and_methods)
174
+ end
175
+ when Proc
176
+ proc_helper_or_boolean.call self, *args_for_procs_and_methods
177
+ else
178
+ proc_helper_or_boolean
179
+ end
180
+ end
129
181
  end
@@ -60,22 +60,7 @@ module Blacklight::FacetsHelperBehavior
60
60
  def should_render_facet? display_facet
61
61
  # display when show is nil or true
62
62
  facet_config = facet_configuration_for_field(display_facet.name)
63
-
64
- display = case facet_config.show
65
- when Symbol
66
- arity = method(facet_config.show).arity
67
-
68
- if arity == 0
69
- send(facet_config.show)
70
- else
71
- send(facet_config.show, display_facet)
72
- end
73
- when Proc
74
- facet_config.show.call self, facet_config, display_facet
75
- else
76
- facet_config.show
77
- end
78
-
63
+ display = should_render_field?(facet_config, display_facet)
79
64
  return display && display_facet.items.present?
80
65
  end
81
66
 
@@ -7,11 +7,11 @@ module Blacklight::UrlHelperBehavior
7
7
  # Extension point for downstream applications
8
8
  # to provide more interesting routing to
9
9
  # documents
10
- def url_for_document doc
10
+ def url_for_document doc, options = {}
11
11
  if respond_to?(:blacklight_config) and
12
12
  blacklight_config.show.route and
13
13
  (!doc.respond_to?(:to_model) or doc.to_model.is_a? SolrDocument)
14
- route = blacklight_config.show.route.merge(action: :show, id: doc)
14
+ route = blacklight_config.show.route.merge(action: :show, id: doc).merge(options)
15
15
  route[:controller] = controller_name if route[:controller] == :current
16
16
  route
17
17
  else
@@ -260,6 +260,25 @@ module Blacklight::UrlHelperBehavior
260
260
  p.delete(:f) if p[:f].empty?
261
261
  p
262
262
  end
263
+
264
+ # A URL to refworks export, with an embedded callback URL to this app.
265
+ # the callback URL is to bookmarks#export, which delivers a list of
266
+ # user's bookmarks in 'refworks marc txt' format -- we tell refworks
267
+ # to expect that format.
268
+ def bookmarks_export_url(format, params = {})
269
+ bookmarks_url(params.merge(format: :format, encrypted_user_id: encrypt_user_id(current_or_guest_user.id) ))
270
+ end
271
+
272
+ # This method should move to BlacklightMarc in Blacklight 6.x
273
+ def refworks_export_url params = {}
274
+ if params.is_a? ::SolrDocument or (params.nil? and instance_variable_defined? :@document)
275
+ Deprecation.warn self, "#refworks_export_url with a SolrDocument is deprecated. Pass in { url: url_for_document(@document) } instead"
276
+ url = url_for_document(params || @document, format: :refworks_marc_txt, only_path: false)
277
+ params = { url: url }
278
+ end
279
+
280
+ "http://www.refworks.com/express/expressimport.asp?vendor=#{CGI.escape(params[:vendor] || application_name)}&filter=#{CGI.escape(params[:filter] || "MARC Format")}&encoding=65001" + (("&url=#{CGI.escape(params[:url])}" if params[:url]) || "")
281
+ end
263
282
 
264
283
  if ::Rails.version < "4.0"
265
284
  def asset_url *args
@@ -1,13 +1,22 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  class Bookmark < ActiveRecord::Base
3
3
 
4
- belongs_to :user
5
- validates_presence_of :user_id, :scope=>:document_id
6
- attr_accessible :id, :document_id, :title if Rails::VERSION::MAJOR < 4
4
+ belongs_to :user, polymorphic: true
5
+ belongs_to :document, polymorphic: true
7
6
 
7
+ validates_presence_of :user_id, :scope=>:document_id
8
+ attr_accessible :id, :document_id, :document_type, :title if Rails::VERSION::MAJOR < 4
8
9
 
9
10
  def document
10
- SolrDocument.new SolrDocument.unique_key => document_id
11
+ document_type.new document_type.unique_key => document_id
12
+ end
13
+
14
+ def document_type
15
+ (super.constantize if defined?(super)) || default_document_type
16
+ end
17
+
18
+ def default_document_type
19
+ SolrDocument
11
20
  end
12
21
 
13
22
  end