enju_oai 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. data/app/views/manifestations/list_identifiers.oai.builder +1 -1
  2. data/app/views/manifestations/list_records.oai.builder +1 -1
  3. data/lib/enju_oai/oai_controller.rb +32 -0
  4. data/lib/enju_oai/version.rb +1 -1
  5. data/spec/controllers/manifestations_controller_spec.rb +45 -0
  6. data/spec/dummy/README.rdoc +261 -0
  7. data/spec/dummy/Rakefile +7 -0
  8. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  9. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  10. data/spec/dummy/app/controllers/application_controller.rb +76 -0
  11. data/spec/dummy/app/controllers/manifestations_controller.rb +519 -0
  12. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  13. data/spec/dummy/app/models/ability.rb +29 -0
  14. data/spec/dummy/app/models/carrier_type.rb +33 -0
  15. data/spec/dummy/app/models/create.rb +38 -0
  16. data/spec/dummy/app/models/exemplify.rb +45 -0
  17. data/spec/dummy/app/models/item.rb +276 -0
  18. data/spec/dummy/app/models/manifestation.rb +631 -0
  19. data/spec/dummy/app/models/patron.rb +290 -0
  20. data/spec/dummy/app/models/produce.rb +39 -0
  21. data/spec/dummy/app/models/realize.rb +38 -0
  22. data/spec/dummy/app/models/role.rb +46 -0
  23. data/spec/dummy/app/models/search_engine.rb +51 -0
  24. data/spec/dummy/app/models/user.rb +94 -0
  25. data/spec/dummy/app/models/user_has_role.rb +4 -0
  26. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  27. data/spec/dummy/config/application.rb +57 -0
  28. data/spec/dummy/config/boot.rb +10 -0
  29. data/spec/dummy/config/configatron/cucumber.rb +4 -0
  30. data/spec/dummy/config/configatron/defaults.rb +28 -0
  31. data/spec/dummy/config/configatron/development.rb +4 -0
  32. data/spec/dummy/config/configatron/production.rb.sample +12 -0
  33. data/spec/dummy/config/configatron/test.rb +7 -0
  34. data/spec/dummy/config/database.yml +25 -0
  35. data/spec/dummy/config/environment.rb +5 -0
  36. data/spec/dummy/config/environments/development.rb +37 -0
  37. data/spec/dummy/config/environments/production.rb +67 -0
  38. data/spec/dummy/config/environments/test.rb +37 -0
  39. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  40. data/spec/dummy/config/initializers/configatron.rb +2 -0
  41. data/spec/dummy/config/initializers/devise.rb +209 -0
  42. data/spec/dummy/config/initializers/inflections.rb +15 -0
  43. data/spec/dummy/config/initializers/mime_types.rb +14 -0
  44. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  45. data/spec/dummy/config/initializers/session_store.rb +8 -0
  46. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  47. data/spec/dummy/config/locales/en.yml +5 -0
  48. data/spec/dummy/config/routes.rb +60 -0
  49. data/spec/dummy/config.ru +4 -0
  50. data/spec/dummy/db/migrate/001_create_patrons.rb +53 -0
  51. data/spec/dummy/db/migrate/002_devise_create_users.rb +71 -0
  52. data/spec/dummy/db/migrate/005_create_manifestations.rb +59 -0
  53. data/spec/dummy/db/migrate/006_create_items.rb +28 -0
  54. data/spec/dummy/db/migrate/012_create_owns.rb +14 -0
  55. data/spec/dummy/db/migrate/015_create_creates.rb +14 -0
  56. data/spec/dummy/db/migrate/041_create_roles.rb +13 -0
  57. data/spec/dummy/db/migrate/047_create_produces.rb +14 -0
  58. data/spec/dummy/db/migrate/059_create_libraries.rb +30 -0
  59. data/spec/dummy/db/migrate/073_create_carrier_types.rb +11 -0
  60. data/spec/dummy/db/migrate/077_create_user_groups.rb +12 -0
  61. data/spec/dummy/db/migrate/080_create_library_groups.rb +21 -0
  62. data/spec/dummy/db/migrate/112_create_frequencies.rb +12 -0
  63. data/spec/dummy/db/migrate/117_create_form_of_works.rb +12 -0
  64. data/spec/dummy/db/migrate/20080830154109_create_realizes.rb +15 -0
  65. data/spec/dummy/db/migrate/20080830172106_create_exemplifies.rb +15 -0
  66. data/spec/dummy/db/migrate/20080905191442_create_patron_types.rb +12 -0
  67. data/spec/dummy/db/migrate/20081023092436_create_search_engines.rb +17 -0
  68. data/spec/dummy/db/migrate/20081025083323_create_countries.rb +28 -0
  69. data/spec/dummy/db/migrate/20081025083905_create_languages.rb +23 -0
  70. data/spec/dummy/db/migrate/20090719201843_create_extents.rb +12 -0
  71. data/spec/dummy/db/migrate/20090720091106_create_medium_of_performances.rb +12 -0
  72. data/spec/dummy/db/migrate/20090720091429_create_content_types.rb +12 -0
  73. data/spec/dummy/db/migrate/20090812151902_create_patron_relationship_types.rb +12 -0
  74. data/spec/dummy/db/migrate/20091025080447_create_licenses.rb +12 -0
  75. data/spec/dummy/db/migrate/20091202124834_create_versions.rb +18 -0
  76. data/spec/dummy/db/migrate/20100211105551_add_admin_networks_to_library_group.rb +9 -0
  77. data/spec/dummy/db/migrate/20100326024214_add_date_index_to_resource.rb +11 -0
  78. data/spec/dummy/db/migrate/20100502171926_add_latitude_and_longitude_to_library.rb +11 -0
  79. data/spec/dummy/db/migrate/20100525124311_create_manifestation_relationships.rb +13 -0
  80. data/spec/dummy/db/migrate/20100606065209_create_user_has_roles.rb +12 -0
  81. data/spec/dummy/db/migrate/20100606073747_create_patron_relationships.rb +13 -0
  82. data/spec/dummy/db/migrate/20100607044753_create_manifestation_relationship_types.rb +12 -0
  83. data/spec/dummy/db/migrate/20100627193848_add_enju_access_key_to_user.rb +10 -0
  84. data/spec/dummy/db/migrate/20100814091104_add_position_to_patron_relationship.rb +11 -0
  85. data/spec/dummy/db/migrate/20100919121500_drop_user_email_unique_index.rb +11 -0
  86. data/spec/dummy/db/migrate/20101103090330_add_title_to_patron.rb +9 -0
  87. data/spec/dummy/db/migrate/20101103090457_rename_manifestation_identifier_to_identifier.rb +9 -0
  88. data/spec/dummy/db/migrate/20101212070145_add_acquired_at_to_item.rb +9 -0
  89. data/spec/dummy/db/migrate/20101228081401_rename_postal_code_to_zip_code.rb +11 -0
  90. data/spec/dummy/db/migrate/20110115022329_add_position_to_library_group.rb +9 -0
  91. data/spec/dummy/db/migrate/20110222073537_add_url_to_library_group.rb +9 -0
  92. data/spec/dummy/db/migrate/20110301035123_add_pub_date_to_manifestation.rb +9 -0
  93. data/spec/dummy/db/migrate/20110301121550_add_birth_date_and_death_date_to_patron.rb +11 -0
  94. data/spec/dummy/db/migrate/20110318183304_add_valid_period_for_new_user_to_user_group.rb +13 -0
  95. data/spec/dummy/db/migrate/20110619064807_add_edition_string_to_manifestation.rb +9 -0
  96. data/spec/dummy/db/migrate/20110627122938_add_number_of_day_to_notify_overdue_to_user_group.rb +13 -0
  97. data/spec/dummy/db/migrate/20110916053430_rename_manifestation_number_list_to_number_string.rb +13 -0
  98. data/spec/dummy/db/migrate/20110916091020_add_volume_number_to_manifestation.rb +13 -0
  99. data/spec/dummy/db/migrate/20110927135845_add_missing_since_to_item.rb +9 -0
  100. data/spec/dummy/db/migrate/20111103221239_rename_manifestation_identifier_to_manifestation_identifier.rb +9 -0
  101. data/spec/dummy/db/migrate/20111124110059_create_create_types.rb +12 -0
  102. data/spec/dummy/db/migrate/20111124110319_create_realize_types.rb +12 -0
  103. data/spec/dummy/db/migrate/20111124110355_create_produce_types.rb +12 -0
  104. data/spec/dummy/db/migrate/20111124112131_add_create_type_to_create.rb +7 -0
  105. data/spec/dummy/db/migrate/20120105074911_add_isil_to_library.rb +5 -0
  106. data/spec/dummy/db/migrate/20120319120638_add_content_type_id_to_manifestation.rb +6 -0
  107. data/spec/dummy/db/migrate/20120410104851_add_year_of_publication_to_manifestation.rb +5 -0
  108. data/spec/dummy/db/migrate/20120413225628_add_fingerprint_to_manifestation.rb +5 -0
  109. data/spec/dummy/db/migrate/20120415164821_add_attachment_meta_to_manifestation.rb +5 -0
  110. data/spec/dummy/db/migrate/20120418081407_add_month_of_publication_to_manifestation.rb +5 -0
  111. data/spec/dummy/db/migrate/20120426034355_add_unique_index_to_item_identifier.rb +11 -0
  112. data/spec/dummy/db/migrate/20120426042730_add_unique_index_to_manifestation_identifier.rb +11 -0
  113. data/spec/dummy/db/schema.rb +564 -0
  114. data/spec/dummy/db/test.sqlite3 +0 -0
  115. data/spec/dummy/lib/enju_leaf/calculate_stat.rb +30 -0
  116. data/spec/dummy/lib/enju_leaf/expire_editable_fragment.rb +30 -0
  117. data/spec/dummy/lib/enju_leaf/expire_fragment_cache.rb +17 -0
  118. data/spec/dummy/lib/enju_leaf/import_file.rb +13 -0
  119. data/spec/dummy/lib/enju_leaf/localized_name.rb +13 -0
  120. data/spec/dummy/lib/enju_leaf/master_model.rb +19 -0
  121. data/spec/dummy/lib/enju_leaf/url_validator.rb +10 -0
  122. data/spec/dummy/lib/enju_leaf.rb +8 -0
  123. data/spec/dummy/public/404.html +26 -0
  124. data/spec/dummy/public/422.html +26 -0
  125. data/spec/dummy/public/500.html +25 -0
  126. data/spec/dummy/public/favicon.ico +0 -0
  127. data/spec/dummy/script/rails +6 -0
  128. data/spec/dummy/tmp/cache/4F7/F90/default_role +0 -0
  129. data/spec/dummy/tmp/cache/6E4/420/search_engine_all +0 -0
  130. data/spec/factories/manifestation.rb +6 -0
  131. data/spec/factories/user.rb +34 -0
  132. data/spec/fixtures/carrier_types.yml +51 -0
  133. data/spec/fixtures/creates.yml +66 -0
  134. data/spec/fixtures/exemplifies.yml +156 -0
  135. data/spec/fixtures/items.yml +262 -0
  136. data/spec/fixtures/libraries.yml +109 -0
  137. data/spec/fixtures/library_groups.yml +36 -0
  138. data/spec/fixtures/manifestations.yml +2024 -0
  139. data/spec/fixtures/patron_types.yml +41 -0
  140. data/spec/fixtures/patrons.yml +338 -0
  141. data/spec/fixtures/produces.yml +150 -0
  142. data/spec/fixtures/realizes.yml +87 -0
  143. data/spec/fixtures/roles.yml +21 -0
  144. data/spec/fixtures/user_has_roles.yml +41 -0
  145. data/spec/fixtures/users.yml +93 -0
  146. data/spec/spec_helper.rb +38 -0
  147. data/spec/support/controller_macros.rb +48 -0
  148. data/spec/support/devise.rb +4 -0
  149. metadata +290 -6
  150. data/test/enju_oai_test.rb +0 -7
  151. data/test/test_helper.rb +0 -15
@@ -0,0 +1,519 @@
1
+ # -*- encoding: utf-8 -*-
2
+ class ManifestationsController < ApplicationController
3
+ load_and_authorize_resource :except => :index
4
+ authorize_resource :only => :index
5
+ include EnjuOai::OaiController if defined?(EnjuOai)
6
+ include EnjuSearchLog if defined?(EnjuSearchLog)
7
+
8
+ # GET /manifestations
9
+ # GET /manifestations.json
10
+ def index
11
+ mode = params[:mode]
12
+ if mode == 'add'
13
+ unless current_user.try(:has_role?, 'Librarian')
14
+ access_denied; return
15
+ end
16
+ end
17
+
18
+ @seconds = Benchmark.realtime do
19
+ if defined?(EnjuOai)
20
+ @oai = check_oai_params(params)
21
+ next if @oai[:need_not_to_search]
22
+ if params[:format] == 'oai'
23
+ oai_search = true
24
+ from_and_until_times = set_from_and_until(Manifestation, params[:from], params[:until])
25
+ from_time = @from_time = from_and_until_times[:from]
26
+ until_time = @until_time = from_and_until_times[:until]
27
+ # OAI-PMHのデフォルトの件数
28
+ per_page = 200
29
+ if params[:resumptionToken]
30
+ current_token = get_resumption_token(params[:resumptionToken])
31
+ if current_token
32
+ page = (current_token[:cursor].to_i + per_page).div(per_page) + 1
33
+ else
34
+ @oai[:errors] << 'badResumptionToken'
35
+ end
36
+ end
37
+ page ||= 1
38
+
39
+ if params[:verb] == 'GetRecord' and params[:identifier]
40
+ begin
41
+ @manifestation = Manifestation.find_by_oai_identifier(params[:identifier])
42
+ rescue ActiveRecord::RecordNotFound
43
+ @oai[:errors] << "idDoesNotExist"
44
+ render :formats => :oai, :layout => false
45
+ return
46
+ end
47
+ render :template => 'manifestations/show', :formats => :oai, :layout => false
48
+ return
49
+ end
50
+ end
51
+ end
52
+
53
+ set_reservable if defined?(EnjuCirculation)
54
+
55
+ manifestations, sort, @count = {}, {}, {}
56
+ query = ""
57
+
58
+ if params[:format] == 'csv'
59
+ per_page = 65534
60
+ end
61
+
62
+ if params[:format] == 'sru'
63
+ if params[:operation] == 'searchRetrieve'
64
+ sru = Sru.new(params)
65
+ query = sru.cql.to_sunspot
66
+ sort = sru.sort_by
67
+ else
68
+ render :template => 'manifestations/explain', :layout => false
69
+ return
70
+ end
71
+ else
72
+ if params[:api] == 'openurl'
73
+ openurl = Openurl.new(params)
74
+ @manifestations = openurl.search
75
+ query = openurl.query_text
76
+ sort = set_search_result_order(params[:sort_by], params[:order])
77
+ else
78
+ query = make_query(params[:query], params)
79
+ sort = set_search_result_order(params[:sort_by], params[:order])
80
+ end
81
+ end
82
+
83
+ # 絞り込みを行わない状態のクエリ
84
+ @query = query.dup
85
+ query = query.gsub(' ', ' ')
86
+
87
+ includes = [:carrier_type, :required_role, :items, :creators, :contributors, :publishers]
88
+ includes << :bookmarks if defined?(EnjuBookmark)
89
+ search = Manifestation.search(:include => includes)
90
+ role = current_user.try(:role) || Role.default_role
91
+ case @reservable
92
+ when 'true'
93
+ reservable = true
94
+ when 'false'
95
+ reservable = false
96
+ else
97
+ reservable = nil
98
+ end
99
+
100
+ patron = get_index_patron
101
+ @index_patron = patron
102
+ manifestation = @manifestation if @manifestation
103
+ series_statement = @series_statement if @series_statement
104
+
105
+ if defined?(EnjuSubject)
106
+ subject = @subject if @subject
107
+ end
108
+
109
+ unless mode == 'add'
110
+ search.build do
111
+ with(:creator_ids).equal_to patron[:creator].id if patron[:creator]
112
+ with(:contributor_ids).equal_to patron[:contributor].id if patron[:contributor]
113
+ with(:publisher_ids).equal_to patron[:publisher].id if patron[:publisher]
114
+ with(:original_manifestation_ids).equal_to manifestation.id if manifestation
115
+ with(:series_statement_id).equal_to series_statement.id if series_statement
116
+ end
117
+ end
118
+
119
+ search.build do
120
+ fulltext query unless query.blank?
121
+ order_by sort[:sort_by], sort[:order] unless oai_search
122
+ order_by :updated_at, :desc if oai_search
123
+ if defined?(EnjuSubject)
124
+ with(:subject_ids).equal_to subject.id if subject
125
+ end
126
+ if series_statement
127
+ with(:periodical_master).equal_to false
128
+ if mode != 'add'
129
+ with(:periodical).equal_to true
130
+ end
131
+ else
132
+ if mode != 'add'
133
+ with(:periodical).equal_to false
134
+ end
135
+ end
136
+ facet :reservable if defined?(EnjuCirculation)
137
+ end
138
+ search = make_internal_query(search)
139
+ search.data_accessor_for(Manifestation).select = [
140
+ :id,
141
+ :original_title,
142
+ :title_transcription,
143
+ :required_role_id,
144
+ :carrier_type_id,
145
+ :access_address,
146
+ :volume_number_string,
147
+ :issue_number_string,
148
+ :serial_number_string,
149
+ :date_of_publication,
150
+ :pub_date,
151
+ :language_id,
152
+ :carrier_type_id,
153
+ :created_at,
154
+ :updated_at,
155
+ :volume_number_string,
156
+ :volume_number,
157
+ :issue_number_string,
158
+ :issue_number,
159
+ :serial_number,
160
+ :edition_string,
161
+ :edition
162
+ ] if params[:format] == 'html' or params[:format].nil?
163
+ all_result = search.execute
164
+ @count[:query_result] = all_result.total
165
+ @reservable_facet = all_result.facet(:reservable).rows if defined?(EnjuCirculation)
166
+
167
+ if session[:search_params]
168
+ unless search.query.to_params == session[:search_params]
169
+ clear_search_sessions
170
+ end
171
+ else
172
+ clear_search_sessions
173
+ session[:params] = params
174
+ session[:search_params] == search.query.to_params
175
+ session[:query] = @query
176
+ end
177
+
178
+ unless session[:manifestation_ids]
179
+ manifestation_ids = search.build do
180
+ paginate :page => 1, :per_page => configatron.max_number_of_results
181
+ end.execute.raw_results.collect(&:primary_key).map{|id| id.to_i}
182
+ session[:manifestation_ids] = manifestation_ids
183
+ end
184
+
185
+ if defined?(EnjuBookmark)
186
+ if session[:manifestation_ids]
187
+ if params[:view] == 'tag_cloud'
188
+ bookmark_ids = Bookmark.where(:manifestation_id => session[:manifestation_ids]).limit(1000).select(:id).collect(&:id)
189
+ @tags = Tag.bookmarked(bookmark_ids)
190
+ render :partial => 'manifestations/tag_cloud'
191
+ #session[:manifestation_ids] = nil
192
+ return
193
+ end
194
+ end
195
+ end
196
+
197
+ page ||= params[:page] || 1
198
+ per_page ||= Manifestation.per_page
199
+ if params[:format] == 'sru'
200
+ search.query.start_record(params[:startRecord] || 1, params[:maximumRecords] || 200)
201
+ else
202
+ search.build do
203
+ facet :reservable if defined?(EnjuCirculation)
204
+ facet :carrier_type
205
+ facet :library
206
+ facet :language
207
+ facet :subject_ids if defined?(EnjuSubject)
208
+ paginate :page => page.to_i, :per_page => per_page
209
+ end
210
+ end
211
+ search_result = search.execute
212
+ if @count[:query_result] > configatron.max_number_of_results
213
+ max_count = configatron.max_number_of_results
214
+ else
215
+ max_count = @count[:query_result]
216
+ end
217
+ @manifestations = WillPaginate::Collection.create(page, per_page, max_count) do |pager|
218
+ pager.replace(search_result.results)
219
+ end
220
+
221
+ if params[:format].blank? or params[:format] == 'html'
222
+ @carrier_type_facet = search_result.facet(:carrier_type).rows
223
+ @language_facet = search_result.facet(:language).rows
224
+ @library_facet = search_result.facet(:library).rows
225
+ end
226
+
227
+ @search_engines = Rails.cache.fetch('search_engine_all'){SearchEngine.all}
228
+
229
+ if defined?(EnjuBookmark)
230
+ # TODO: 検索結果が少ない場合にも表示させる
231
+ if manifestation_ids.blank?
232
+ if query.respond_to?(:suggest_tags)
233
+ @suggested_tag = query.suggest_tags.first
234
+ end
235
+ end
236
+ end
237
+
238
+ if defined?(EnjuSearchLog)
239
+ save_search_history(query, @manifestations.offset, @count[:query_result], current_user)
240
+ end
241
+
242
+ if defined?(EnjuOai)
243
+ if params[:format] == 'oai'
244
+ unless @manifestations.empty?
245
+ @resumption = set_resumption_token(
246
+ params[:resumptionToken],
247
+ @from_time || Manifestation.last.updated_at,
248
+ @until_time || Manifestation.first.updated_at,
249
+ @manifestations.per_page
250
+ )
251
+ else
252
+ @oai[:errors] << 'noRecordsMatch'
253
+ end
254
+ end
255
+ end
256
+ end
257
+
258
+ store_location # before_filter ではファセット検索のURLを記憶してしまう
259
+
260
+ respond_to do |format|
261
+ format.html
262
+ format.mobile
263
+ format.xml { render :xml => @manifestations }
264
+ format.sru { render :layout => false }
265
+ format.rss { render :layout => false }
266
+ format.csv { render :layout => false }
267
+ format.rdf { render :layout => false }
268
+ format.atom
269
+ format.oai {
270
+ case params[:verb]
271
+ when 'Identify'
272
+ render :template => 'manifestations/identify'
273
+ when 'ListMetadataFormats'
274
+ render :template => 'manifestations/list_metadata_formats'
275
+ when 'ListSets'
276
+ @series_statements = SeriesStatement.select([:id, :original_title])
277
+ render :template => 'manifestations/list_sets'
278
+ when 'ListIdentifiers'
279
+ render :template => 'manifestations/list_identifiers'
280
+ when 'ListRecords'
281
+ render :template => 'manifestations/list_records'
282
+ end
283
+ }
284
+ format.mods
285
+ format.json { render :json => @manifestations }
286
+ format.js
287
+ end
288
+ end
289
+
290
+ private
291
+
292
+ def make_query(query, options = {})
293
+ # TODO: integerやstringもqfに含める
294
+ query = query.to_s.strip
295
+
296
+ if query.size == 1
297
+ query = "#{query}*"
298
+ end
299
+
300
+ if options[:mode] == 'recent'
301
+ query = "#{query} created_at_d:[NOW-1MONTH TO NOW]"
302
+ end
303
+
304
+ unless options[:tag].blank?
305
+ query = "#{query} tag_sm:#{options[:tag]}"
306
+ end
307
+
308
+ unless options[:creator].blank?
309
+ query = "#{query} creator_text:#{options[:creator]}"
310
+ end
311
+
312
+ unless options[:contributor].blank?
313
+ query = "#{query} contributor_text:#{options[:contributor]}"
314
+ end
315
+
316
+ unless options[:isbn].blank?
317
+ query = "#{query} isbn_sm:#{options[:isbn].gsub('-', '')}"
318
+ end
319
+
320
+ unless options[:issn].blank?
321
+ query = "#{query} issn_s:#{options[:issn].gsub('-', '')}"
322
+ end
323
+
324
+ unless options[:lccn].blank?
325
+ query = "#{query} lccn_s:#{options[:lccn]}"
326
+ end
327
+
328
+ unless options[:nbn].blank?
329
+ query = "#{query} nbn_s:#{options[:nbn]}"
330
+ end
331
+
332
+ unless options[:publisher].blank?
333
+ query = "#{query} publisher_text:#{options[:publisher]}"
334
+ end
335
+
336
+ unless options[:item_identifier].blank?
337
+ query = "#{query} item_identifier_sm:#{options[:item_identifier]}"
338
+ end
339
+
340
+ unless options[:number_of_pages_at_least].blank? and options[:number_of_pages_at_most].blank?
341
+ number_of_pages = {}
342
+ number_of_pages[:at_least] = options[:number_of_pages_at_least].to_i
343
+ number_of_pages[:at_most] = options[:number_of_pages_at_most].to_i
344
+ number_of_pages[:at_least] = "*" if number_of_pages[:at_least] == 0
345
+ number_of_pages[:at_most] = "*" if number_of_pages[:at_most] == 0
346
+
347
+ query = "#{query} number_of_pages_i:[#{number_of_pages[:at_least]} TO #{number_of_pages[:at_most]}]"
348
+ end
349
+
350
+ query = set_pub_date(query, options)
351
+ query = set_acquisition_date(query, options)
352
+
353
+ query = query.strip
354
+ if query == '[* TO *]'
355
+ # unless params[:advanced_search]
356
+ query = ''
357
+ # end
358
+ end
359
+
360
+ return query
361
+ end
362
+
363
+ def set_search_result_order(sort_by, order)
364
+ sort = {}
365
+ # TODO: ページ数や大きさでの並べ替え
366
+ case sort_by
367
+ when 'title'
368
+ sort[:sort_by] = 'sort_title'
369
+ sort[:order] = 'asc'
370
+ when 'pub_date'
371
+ sort[:sort_by] = 'date_of_publication'
372
+ sort[:order] = 'desc'
373
+ else
374
+ # デフォルトの並び方
375
+ sort[:sort_by] = 'created_at'
376
+ sort[:order] = 'desc'
377
+ end
378
+ if order == 'asc'
379
+ sort[:order] = 'asc'
380
+ elsif order == 'desc'
381
+ sort[:order] = 'desc'
382
+ end
383
+ sort
384
+ end
385
+
386
+ def render_mode(mode)
387
+ case mode
388
+ when 'holding'
389
+ render :partial => 'manifestations/show_holding', :locals => {:manifestation => @manifestation}
390
+ when 'barcode'
391
+ if defined?(EnjuBarcode)
392
+ barcode = Barby::QrCode.new(@manifestation.id)
393
+ send_data(barcode.to_svg, :disposition => 'inline', :type => 'image/svg+xml')
394
+ end
395
+ when 'tag_edit'
396
+ if defined?(EnjuBookmark)
397
+ render :partial => 'manifestations/tag_edit', :locals => {:manifestation => @manifestation}
398
+ end
399
+ when 'tag_list'
400
+ if defined?(EnjuBookmark)
401
+ render :partial => 'manifestations/tag_list', :locals => {:manifestation => @manifestation}
402
+ end
403
+ when 'show_index'
404
+ render :partial => 'manifestations/show_index', :locals => {:manifestation => @manifestation}
405
+ when 'show_creators'
406
+ render :partial => 'manifestations/show_creators', :locals => {:manifestation => @manifestation}
407
+ when 'show_all_creators'
408
+ render :partial => 'manifestations/show_creators', :locals => {:manifestation => @manifestation}
409
+ when 'pickup'
410
+ render :partial => 'manifestations/pickup', :locals => {:manifestation => @manifestation}
411
+ when 'calil_list'
412
+ if defined?(EnjuCalil)
413
+ render :partial => 'manifestations/calil_list', :locals => {:manifestation => @manifestation}
414
+ end
415
+ else
416
+ false
417
+ end
418
+ end
419
+
420
+ def prepare_options
421
+ @carrier_types = CarrierType.all
422
+ @content_types = ContentType.all
423
+ @roles = Role.all
424
+ @languages = Language.all_cache
425
+ @frequencies = Frequency.all
426
+ @nii_types = NiiType.all if defined?(NiiType)
427
+ end
428
+
429
+ def get_index_patron
430
+ patron = {}
431
+ case
432
+ when params[:patron_id]
433
+ patron[:patron] = Patron.find(params[:patron_id])
434
+ when params[:creator_id]
435
+ patron[:creator] = Patron.find(params[:creator_id])
436
+ when params[:contributor_id]
437
+ patron[:contributor] = Patron.find(params[:contributor_id])
438
+ when params[:publisher_id]
439
+ patron[:publisher] = Patron.find(params[:publisher_id])
440
+ end
441
+ patron
442
+ end
443
+
444
+ def set_reservable
445
+ case params[:reservable].to_s
446
+ when 'true'
447
+ @reservable = true
448
+ when 'false'
449
+ @reservable = false
450
+ else
451
+ @reservable = nil
452
+ end
453
+ end
454
+
455
+ def set_pub_date(query, options)
456
+ unless options[:pub_date_from].blank? and options[:pub_date_to].blank?
457
+ options[:pub_date_from].to_s.gsub!(/\D/, '')
458
+ options[:pub_date_to].to_s.gsub!(/\D/, '')
459
+
460
+ pub_date = {}
461
+ if options[:pub_date_from].blank?
462
+ pub_date[:from] = "*"
463
+ else
464
+ pub_date[:from] = Time.zone.parse(options[:pub_date_from]).beginning_of_day.utc.iso8601 rescue nil
465
+ unless pub_date[:from]
466
+ pub_date[:from] = Time.zone.parse(Time.mktime(options[:pub_date_from]).to_s).beginning_of_day.utc.iso8601
467
+ end
468
+ end
469
+
470
+ if options[:pub_date_to].blank?
471
+ pub_date[:to] = "*"
472
+ else
473
+ pub_date[:to] = Time.zone.parse(options[:pub_date_to]).end_of_day.utc.iso8601 rescue nil
474
+ unless pub_date[:to]
475
+ pub_date[:to] = Time.zone.parse(Time.mktime(options[:pub_date_to]).to_s).end_of_year.utc.iso8601
476
+ end
477
+ end
478
+ query = "#{query} date_of_publication_d:[#{pub_date[:from]} TO #{pub_date[:to]}]"
479
+ end
480
+ query
481
+ end
482
+
483
+ def set_acquisition_date(query, options)
484
+ unless options[:acquired_from].blank? and options[:acquired_to].blank?
485
+ options[:acquired_from].to_s.gsub!(/\D/, '')
486
+ options[:acquired_to].to_s.gsub!(/\D/, '')
487
+
488
+ acquisition_date = {}
489
+ if options[:acquired_from].blank?
490
+ acquisition_date[:from] = "*"
491
+ else
492
+ acquisition_date[:from] = Time.zone.parse(options[:acquired_from]).beginning_of_day.utc.iso8601 rescue nil
493
+ unless acquisition_date[:from]
494
+ acquisition_date[:from] = Time.zone.parse(Time.mktime(options[:acquired_from]).to_s).beginning_of_day.utc.iso8601
495
+ end
496
+ end
497
+
498
+ if options[:acquired_to].blank?
499
+ acquisition_date[:to] = "*"
500
+ else
501
+ acquisition_date[:to] = Time.zone.parse(options[:acquired_to]).end_of_day.utc.iso8601 rescue nil
502
+ unless acquisition_date[:to]
503
+ acquisition_date[:to] = Time.zone.parse(Time.mktime(options[:acquired_to]).to_s).end_of_year.utc.iso8601
504
+ end
505
+ end
506
+ query = "#{query} acquired_at_d:[#{acquisition_date[:from]} TO #{acquisition_date[:to]}]"
507
+ end
508
+ query
509
+ end
510
+
511
+ def set_title
512
+ if @series_statement
513
+ @manifestation.set_series_statement(@series_statement)
514
+ elsif @original_manifestation
515
+ @manifestation.original_title = @original_manifestation.original_title
516
+ @manifestation.title_transcription = @original_manifestation.title_transcription
517
+ end
518
+ end
519
+ end
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end
@@ -0,0 +1,29 @@
1
+ class Ability
2
+ include CanCan::Ability
3
+
4
+ def initialize(user, ip_address = nil)
5
+ case user.try(:role).try(:name)
6
+ when 'Administrator'
7
+ can [:read, :create, :update], Manifestation
8
+ can :destroy, Manifestation do |manifestation|
9
+ if defined?(EnjuCirculation)
10
+ manifestation.items.empty? and !manifestation.periodical_master? and !manifestation.is_reserved?
11
+ else
12
+ manifestation.items.empty? and !manifestation.periodical_master?
13
+ end
14
+ end
15
+ when 'Librarian'
16
+ can [:read, :create, :update], Manifestation
17
+ can :destroy, Manifestation do |manifestation|
18
+ false
19
+ end
20
+ when 'User'
21
+ can :read, Manifestation do |manifestation|
22
+ manifestation.required_role_id <= 2
23
+ end
24
+ can :edit, Manifestation
25
+ else
26
+ can :read, Manifestation
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,33 @@
1
+ class CarrierType < ActiveRecord::Base
2
+ include MasterModel
3
+ default_scope :order => "position"
4
+ has_many :manifestations
5
+ if defined?(EnjuCirculation)
6
+ has_many :carrier_type_has_checkout_types, :dependent => :destroy
7
+ has_many :checkout_types, :through => :carrier_type_has_checkout_types
8
+ end
9
+
10
+ def mods_type
11
+ case name
12
+ when 'print'
13
+ 'text'
14
+ else
15
+ # TODO: その他のタイプ
16
+ 'software, multimedia'
17
+ end
18
+ end
19
+ end
20
+
21
+ # == Schema Information
22
+ #
23
+ # Table name: carrier_types
24
+ #
25
+ # id :integer not null, primary key
26
+ # name :string(255) not null
27
+ # display_name :text
28
+ # note :text
29
+ # position :integer
30
+ # created_at :datetime
31
+ # updated_at :datetime
32
+ #
33
+
@@ -0,0 +1,38 @@
1
+ class Create < ActiveRecord::Base
2
+ belongs_to :patron
3
+ belongs_to :work, :class_name => 'Manifestation', :foreign_key => 'work_id'
4
+ belongs_to :create_type
5
+
6
+ validates_associated :patron, :work
7
+ validates_presence_of :patron_id, :work_id
8
+ validates_uniqueness_of :work_id, :scope => :patron_id
9
+ after_save :reindex
10
+ after_destroy :reindex
11
+
12
+ acts_as_list :scope => :work
13
+
14
+ def self.per_page
15
+ 10
16
+ end
17
+
18
+ def reindex
19
+ patron.try(:index)
20
+ work.try(:index)
21
+ end
22
+ end
23
+
24
+
25
+ # == Schema Information
26
+ #
27
+ # Table name: creates
28
+ #
29
+ # id :integer not null, primary key
30
+ # patron_id :integer not null
31
+ # work_id :integer not null
32
+ # position :integer
33
+ # type :string(255)
34
+ # created_at :datetime
35
+ # updated_at :datetime
36
+ # create_type_id :integer
37
+ #
38
+
@@ -0,0 +1,45 @@
1
+ class Exemplify < ActiveRecord::Base
2
+ belongs_to :manifestation
3
+ belongs_to :item
4
+
5
+ validates_associated :manifestation, :item
6
+ validates_presence_of :manifestation_id, :item_id
7
+ validates_uniqueness_of :item_id
8
+ after_save :reindex
9
+ after_destroy :reindex
10
+
11
+ acts_as_list :scope => :manifestation_id
12
+
13
+ def self.per_page
14
+ 10
15
+ end
16
+
17
+ def reindex
18
+ manifestation.try(:index)
19
+ item.try(:index)
20
+ end
21
+
22
+ if defined?(EnjuCirculation)
23
+ after_create :create_lending_policy
24
+
25
+ def create_lending_policy
26
+ UserGroupHasCheckoutType.available_for_item(item).each do |rule|
27
+ LendingPolicy.create!(:item_id => item.id, :user_group_id => rule.user_group_id, :fixed_due_date => rule.fixed_due_date, :loan_period => rule.checkout_period, :renewal => rule.checkout_renewal_limit)
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ # == Schema Information
34
+ #
35
+ # Table name: exemplifies
36
+ #
37
+ # id :integer not null, primary key
38
+ # manifestation_id :integer not null
39
+ # item_id :integer not null
40
+ # type :string(255)
41
+ # position :integer
42
+ # created_at :datetime
43
+ # updated_at :datetime
44
+ #
45
+