enju_flower 0.1.0.pre12 → 0.1.0.pre13

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 (67) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/manifestations_controller.rb +771 -0
  3. data/app/views/layouts/{patrons.html.erb → agents.html.erb} +0 -0
  4. data/app/views/layouts/{patrons.mobile.erb → agents.mobile.erb} +0 -0
  5. data/app/views/manifestations/_manifestation.html.erb +5 -5
  6. data/app/views/manifestations/_show_holding.html.erb +1 -1
  7. data/app/views/manifestations/_show_holding.mobile.erb +1 -1
  8. data/lib/enju_flower/version.rb +1 -1
  9. data/spec/dummy/config/initializers/inflections.rb +0 -5
  10. data/spec/dummy/db/migrate/20130303104849_add_state_index_to_reserve.rb +5 -0
  11. data/spec/dummy/db/migrate/20130303124821_add_retained_at_to_reserve.rb +5 -0
  12. data/spec/dummy/db/migrate/20130304015019_add_postponed_at_to_reserve.rb +5 -0
  13. data/spec/dummy/db/migrate/20130416054135_add_circulation_status_id_to_item.rb +8 -0
  14. data/spec/dummy/db/migrate/20130519065638_add_lock_version_to_reserve.rb +5 -0
  15. data/spec/dummy/db/migrate/20130519065837_add_lock_version_to_checkin.rb +5 -0
  16. data/spec/dummy/db/test.sqlite3 +0 -0
  17. data/spec/dummy/solr/data/test/index/{_23i.fdt → _20.fdt} +0 -0
  18. data/spec/dummy/solr/data/test/index/{_23i.fdx → _20.fdx} +0 -0
  19. data/spec/dummy/solr/data/test/index/{_23i.fnm → _20.fnm} +0 -0
  20. data/spec/dummy/solr/data/test/index/{_23i.frq → _20.frq} +0 -0
  21. data/spec/dummy/solr/data/test/index/{_23i.nrm → _20.nrm} +0 -0
  22. data/spec/dummy/solr/data/test/index/{_23i.prx → _20.prx} +0 -0
  23. data/spec/dummy/solr/data/test/index/{_23i.tii → _20.tii} +0 -0
  24. data/spec/dummy/solr/data/test/index/{_23i.tis → _20.tis} +0 -0
  25. data/spec/dummy/solr/data/test/index/{_23j.fdt → _21.fdt} +0 -0
  26. data/spec/dummy/solr/data/test/index/{_23j.fdx → _21.fdx} +0 -0
  27. data/spec/dummy/solr/data/test/index/{_23j.fnm → _21.fnm} +0 -0
  28. data/spec/dummy/solr/data/test/index/{_23j.frq → _21.frq} +0 -0
  29. data/spec/dummy/solr/data/test/index/{_23j.nrm → _21.nrm} +0 -0
  30. data/spec/dummy/solr/data/test/index/{_23j.prx → _21.prx} +0 -0
  31. data/spec/dummy/solr/data/test/index/{_23j.tii → _21.tii} +0 -0
  32. data/spec/dummy/solr/data/test/index/{_23j.tis → _21.tis} +0 -0
  33. data/spec/dummy/solr/data/test/index/{_23k.fdt → _22.fdt} +0 -0
  34. data/spec/dummy/solr/data/test/index/{_23k.fdx → _22.fdx} +0 -0
  35. data/spec/dummy/solr/data/test/index/{_23k.fnm → _22.fnm} +1 -1
  36. data/spec/dummy/solr/data/test/index/_22.frq +0 -0
  37. data/spec/dummy/solr/data/test/index/{_23k.nrm → _22.nrm} +1 -1
  38. data/spec/dummy/solr/data/test/index/_22.prx +0 -0
  39. data/spec/dummy/solr/data/test/index/_22.tii +0 -0
  40. data/spec/dummy/solr/data/test/index/_22.tis +0 -0
  41. data/spec/dummy/solr/data/test/index/segments.gen +0 -0
  42. data/spec/dummy/solr/data/test/index/{segments_2u7 → segments_2s} +0 -0
  43. data/spec/dummy/solr/data/test/spellchecker/segments_1 +0 -0
  44. data/spec/dummy/tmp/cache/4F7/F90/default_role +0 -0
  45. data/spec/dummy/tmp/cache/6E4/420/search_engine_all +0 -0
  46. data/spec/fixtures/agent_import_files.yml +47 -0
  47. data/spec/fixtures/agent_import_results.yml +29 -0
  48. data/spec/fixtures/agent_relationships.yml +6 -6
  49. data/spec/fixtures/agents.yml +2 -2
  50. data/spec/fixtures/circulation_statuses.yml +136 -0
  51. data/spec/fixtures/creates.yml +1 -1
  52. data/spec/fixtures/donates.yml +1 -1
  53. data/spec/fixtures/event_categories.yml +55 -0
  54. data/spec/fixtures/events.yml +142 -0
  55. data/spec/fixtures/identifier_types.yml +7 -0
  56. data/spec/fixtures/item_has_use_restrictions.yml +61 -0
  57. data/spec/fixtures/items.yml +48 -1
  58. data/spec/fixtures/manifestations.yml +1 -1
  59. data/spec/fixtures/owns.yml +1 -1
  60. data/spec/fixtures/produces.yml +1 -1
  61. data/spec/fixtures/realizes.yml +1 -1
  62. data/spec/fixtures/series_statements.yml +15 -2
  63. metadata +82 -57
  64. data/spec/dummy/solr/data/test/index/_23k.frq +0 -0
  65. data/spec/dummy/solr/data/test/index/_23k.prx +0 -0
  66. data/spec/dummy/solr/data/test/index/_23k.tii +0 -0
  67. data/spec/dummy/solr/data/test/index/_23k.tis +0 -0
@@ -0,0 +1,771 @@
1
+ # -*- encoding: utf-8 -*-
2
+ class ManifestationsController < ApplicationController
3
+ load_and_authorize_resource :except => :index
4
+ authorize_resource :only => :index
5
+ before_filter :authenticate_user!, :only => :edit
6
+ before_filter :get_agent, :get_manifestation, :except => [:create, :update, :destroy]
7
+ before_filter :get_expression, :only => :new
8
+ if defined?(EnjuSubject)
9
+ before_filter :get_subject, :except => [:create, :update, :destroy]
10
+ end
11
+ before_filter :get_series_statement, :only => [:index, :new, :edit]
12
+ before_filter :get_item, :get_libraries, :only => :index
13
+ before_filter :prepare_options, :only => [:new, :edit]
14
+ before_filter :get_version, :only => [:show]
15
+ after_filter :solr_commit, :only => :destroy
16
+ after_filter :convert_charset, :only => :index
17
+ cache_sweeper :manifestation_sweeper, :only => [:create, :update, :destroy]
18
+ include EnjuOai::OaiController if defined?(EnjuOai)
19
+ include EnjuSearchLog if defined?(EnjuSearchLog)
20
+
21
+ # GET /manifestations
22
+ # GET /manifestations.json
23
+ def index
24
+ mode = params[:mode]
25
+ if mode == 'add'
26
+ unless current_user.try(:has_role?, 'Librarian')
27
+ access_denied; return
28
+ end
29
+ end
30
+
31
+ @seconds = Benchmark.realtime do
32
+ if defined?(EnjuOai)
33
+ @oai = check_oai_params(params)
34
+ next if @oai[:need_not_to_search]
35
+ if params[:format] == 'oai'
36
+ oai_search = true
37
+ from_and_until_times = set_from_and_until(Manifestation, params[:from], params[:until])
38
+ from_time = @from_time = from_and_until_times[:from]
39
+ until_time = @until_time = from_and_until_times[:until]
40
+ # OAI-PMHのデフォルトの件数
41
+ per_page = 200
42
+ if params[:resumptionToken]
43
+ current_token = get_resumption_token(params[:resumptionToken])
44
+ if current_token
45
+ page = (current_token[:cursor].to_i + per_page).div(per_page) + 1
46
+ else
47
+ @oai[:errors] << 'badResumptionToken'
48
+ end
49
+ end
50
+ page ||= 1
51
+
52
+ if params[:verb] == 'GetRecord' and params[:identifier]
53
+ begin
54
+ @manifestation = Manifestation.find_by_oai_identifier(params[:identifier])
55
+ rescue ActiveRecord::RecordNotFound
56
+ @oai[:errors] << "idDoesNotExist"
57
+ render :formats => :oai, :layout => false
58
+ return
59
+ end
60
+ render :template => 'manifestations/show', :formats => :oai, :layout => false
61
+ return
62
+ end
63
+ end
64
+ end
65
+
66
+ set_reservable if defined?(EnjuCirculation)
67
+
68
+ manifestations, sort, @count = {}, {}, {}
69
+ query = ""
70
+
71
+ if params[:format] == 'csv'
72
+ per_page = 65534
73
+ end
74
+
75
+ if params[:format] == 'sru'
76
+ if params[:operation] == 'searchRetrieve'
77
+ sru = Sru.new(params)
78
+ query = sru.cql.to_sunspot
79
+ sort = sru.sort_by
80
+ else
81
+ render :template => 'manifestations/explain', :layout => false
82
+ return
83
+ end
84
+ else
85
+ if params[:api] == 'openurl'
86
+ openurl = Openurl.new(params)
87
+ @manifestations = openurl.search
88
+ query = openurl.query_text
89
+ sort = set_search_result_order(params[:sort_by], params[:order])
90
+ else
91
+ query = make_query(params[:query], params)
92
+ sort = set_search_result_order(params[:sort_by], params[:order])
93
+ end
94
+ end
95
+
96
+ # 絞り込みを行わない状態のクエリ
97
+ @query = query.dup
98
+ query = query.gsub(' ', ' ')
99
+
100
+ includes = [:carrier_type, :series_statements]
101
+ includes << :bookmarks if defined?(EnjuBookmark)
102
+ search = Manifestation.search(:include => includes)
103
+ role = current_user.try(:role) || Role.default_role
104
+ case @reservable
105
+ when 'true'
106
+ reservable = true
107
+ when 'false'
108
+ reservable = false
109
+ else
110
+ reservable = nil
111
+ end
112
+
113
+ agent = get_index_agent
114
+ @index_agent = agent
115
+ manifestation = @manifestation if @manifestation
116
+ series_statement = @series_statement if @series_statement
117
+ parent = @parent = Manifestation.where(:id => params[:parent_id]).first if params[:parent_id].present?
118
+
119
+ if defined?(EnjuSubject)
120
+ subject = @subject if @subject
121
+ end
122
+
123
+ unless mode == 'add'
124
+ search.build do
125
+ with(:creator_ids).equal_to agent[:creator].id if agent[:creator]
126
+ with(:contributor_ids).equal_to agent[:contributor].id if agent[:contributor]
127
+ with(:publisher_ids).equal_to agent[:publisher].id if agent[:publisher]
128
+ with(:series_statement_ids).equal_to series_statement.id if series_statement
129
+ with(:parent_ids).equal_to parent.id if parent
130
+ end
131
+ end
132
+
133
+ search.build do
134
+ fulltext query unless query.blank?
135
+ order_by sort[:sort_by], sort[:order] unless oai_search
136
+ order_by :updated_at, :desc if oai_search
137
+ if defined?(EnjuSubject)
138
+ with(:subject_ids).equal_to subject.id if subject
139
+ end
140
+ unless parent
141
+ if params[:periodical].to_s.downcase == "true"
142
+ with(:series_master).equal_to true unless parent
143
+ with(:periodical).equal_to true
144
+ #if series_statement.periodical?
145
+ # if mode != 'add'
146
+ # order_by :volume_number, sort[:order]
147
+ # order_by :issue_number, sort[:order]
148
+ # order_by :serial_number, sort[:order]
149
+ # end
150
+ #else
151
+ # with(:periodical).equal_to false
152
+ #end
153
+ else
154
+ if mode != 'add'
155
+ with(:resource_master).equal_to true
156
+ end
157
+ end
158
+ end
159
+ order_by sort[:sort_by], sort[:order] unless oai_search
160
+ facet :reservable if defined?(EnjuCirculation)
161
+ end
162
+ search = make_internal_query(search)
163
+ search.data_accessor_for(Manifestation).select = [
164
+ :id,
165
+ :original_title,
166
+ :title_transcription,
167
+ :required_role_id,
168
+ :carrier_type_id,
169
+ :access_address,
170
+ :volume_number_string,
171
+ :issue_number_string,
172
+ :serial_number_string,
173
+ :date_of_publication,
174
+ :pub_date,
175
+ :language_id,
176
+ :created_at,
177
+ :updated_at,
178
+ :volume_number_string,
179
+ :volume_number,
180
+ :issue_number_string,
181
+ :issue_number,
182
+ :serial_number,
183
+ :edition_string,
184
+ :edition,
185
+ :periodical,
186
+ :statement_of_responsibility
187
+ ] if params[:format] == 'html' or params[:format].nil?
188
+ all_result = search.execute
189
+ @count[:query_result] = all_result.total
190
+ @reservable_facet = all_result.facet(:reservable).rows if defined?(EnjuCirculation)
191
+
192
+ if session[:search_params]
193
+ unless search.query.to_params == session[:search_params]
194
+ clear_search_sessions
195
+ end
196
+ else
197
+ clear_search_sessions
198
+ session[:params] = params
199
+ session[:search_params] == search.query.to_params
200
+ session[:query] = @query
201
+ end
202
+
203
+ if params[:format] == 'html' or params[:format].nil?
204
+ @search_query = Digest::SHA1.hexdigest(Marshal.dump(search.query.to_params).force_encoding('UTF-8'))
205
+ if flash[:search_query] == @search_query
206
+ flash.keep(:search_query)
207
+ else
208
+ if @series_statement
209
+ flash.keep(:search_query)
210
+ else
211
+ flash[:search_query] = @search_query
212
+ @manifestation_ids = search.build do
213
+ paginate :page => 1, :per_page => Setting.max_number_of_results
214
+ end.execute.raw_results.collect(&:primary_key).map{|i| i.to_i}
215
+ end
216
+ end
217
+
218
+ if defined?(EnjuBookmark)
219
+ if params[:view] == 'tag_cloud'
220
+ unless @manifestation_ids
221
+ @manifestation_ids = search.build do
222
+ paginate :page => 1, :per_page => Setting.max_number_of_results
223
+ end.execute.raw_results.collect(&:primary_key).map{|i| i.to_i}
224
+ end
225
+ #bookmark_ids = Bookmark.where(:manifestation_id => flash[:manifestation_ids]).limit(1000).pluck(:id)
226
+ bookmark_ids = Bookmark.where(:manifestation_id => @manifestation_ids).limit(1000).pluck(:id)
227
+ @tags = Tag.bookmarked(bookmark_ids)
228
+ render :partial => 'manifestations/tag_cloud'
229
+ return
230
+ end
231
+ end
232
+ end
233
+
234
+ page ||= params[:page] || 1
235
+ per_page ||= Manifestation.default_per_page
236
+ if params[:format] == 'sru'
237
+ search.query.start_record(params[:startRecord] || 1, params[:maximumRecords] || 200)
238
+ else
239
+ pub_dates = parse_pub_date(params)
240
+ pub_date_range = {}
241
+ if pub_dates[:from] == '*'
242
+ pub_date_range[:from] = 0
243
+ else
244
+ pub_date_range[:from] = Time.zone.parse(pub_dates[:from]).year
245
+ end
246
+ if pub_dates[:to] == '*'
247
+ pub_date_range[:to] = 10000
248
+ else
249
+ pub_date_range[:to] = Time.zone.parse(pub_dates[:to]).year
250
+ end
251
+ if params[:pub_year_range_interval]
252
+ pub_year_range_interval = params[:pub_year_range_interval].to_i
253
+ else
254
+ pub_year_range_interval = Setting.manifestation.facet.pub_year_range_interval
255
+ end
256
+
257
+ search.build do
258
+ facet :reservable if defined?(EnjuCirculation)
259
+ facet :carrier_type
260
+ facet :library
261
+ facet :language
262
+ facet :pub_year, :range => pub_date_range[:from]..pub_date_range[:to], :range_interval => pub_year_range_interval
263
+ facet :subject_ids if defined?(EnjuSubject)
264
+ paginate :page => page.to_i, :per_page => per_page
265
+ end
266
+ end
267
+ search_result = search.execute
268
+ if @count[:query_result] > Setting.max_number_of_results
269
+ max_count = Setting.max_number_of_results
270
+ else
271
+ max_count = @count[:query_result]
272
+ end
273
+ @manifestations = Kaminari.paginate_array(
274
+ search_result.results, :total_count => max_count
275
+ ).page(page)
276
+
277
+ if params[:format].blank? or params[:format] == 'html'
278
+ @carrier_type_facet = search_result.facet(:carrier_type).rows
279
+ @language_facet = search_result.facet(:language).rows
280
+ @library_facet = search_result.facet(:library).rows
281
+ @pub_year_facet = search_result.facet(:pub_year).rows.reverse
282
+ end
283
+
284
+ @search_engines = Rails.cache.fetch('search_engine_all'){SearchEngine.all}
285
+
286
+ if defined?(EnjuBookmark)
287
+ # TODO: 検索結果が少ない場合にも表示させる
288
+ if @manifestation_ids.blank?
289
+ if query.respond_to?(:suggest_tags)
290
+ @suggested_tag = query.suggest_tags.first
291
+ end
292
+ end
293
+ end
294
+
295
+ if defined?(EnjuSearchLog)
296
+ if current_user.try(:save_search_history)
297
+ current_user.save_history(query, @manifestations.offset_value + 1, @count[:query_result], params[:format])
298
+ end
299
+ end
300
+
301
+ if defined?(EnjuOai)
302
+ if params[:format] == 'oai'
303
+ unless @manifestations.empty?
304
+ @resumption = set_resumption_token(
305
+ params[:resumptionToken],
306
+ @from_time || Manifestation.last.updated_at,
307
+ @until_time || Manifestation.first.updated_at,
308
+ @manifestations.limit_value
309
+ )
310
+ else
311
+ @oai[:errors] << 'noRecordsMatch'
312
+ end
313
+ end
314
+ end
315
+ end
316
+
317
+ store_location # before_filter ではファセット検索のURLを記憶してしまう
318
+
319
+ respond_to do |format|
320
+ format.html
321
+ format.mobile
322
+ format.xml { render :xml => @manifestations }
323
+ format.sru { render :layout => false }
324
+ format.rss { render :layout => false }
325
+ format.csv { render :layout => false }
326
+ format.rdf { render :layout => false }
327
+ format.atom
328
+ format.mods
329
+ format.json { render :json => @manifestations }
330
+ format.js
331
+ if defined?(EnjuOai)
332
+ format.oai {
333
+ case params[:verb]
334
+ when 'Identify'
335
+ render :template => 'manifestations/identify'
336
+ when 'ListMetadataFormats'
337
+ render :template => 'manifestations/list_metadata_formats'
338
+ when 'ListSets'
339
+ @series_statements = SeriesStatement.select([:id, :original_title])
340
+ render :template => 'manifestations/list_sets'
341
+ when 'ListIdentifiers'
342
+ render :template => 'manifestations/list_identifiers'
343
+ when 'ListRecords'
344
+ render :template => 'manifestations/list_records'
345
+ end
346
+ }
347
+ end
348
+ end
349
+ end
350
+
351
+ # GET /manifestations/1
352
+ # GET /manifestations/1.json
353
+ def show
354
+ if @version
355
+ @manifestation = @manifestation.versions.find(@version).item if @version
356
+ end
357
+
358
+ case params[:mode]
359
+ when 'send_email'
360
+ if user_signed_in?
361
+ Notifier.manifestation_info(current_user.id, @manifestation.id).deliver
362
+ flash[:notice] = t('page.sent_email')
363
+ redirect_to @manifestation
364
+ return
365
+ else
366
+ access_denied; return
367
+ end
368
+ end
369
+
370
+ return if render_mode(params[:mode])
371
+
372
+ flash.keep(:search_query)
373
+ store_location
374
+
375
+ if @manifestation.series_master?
376
+ flash.keep(:notice) if flash[:notice]
377
+ flash[:manifestation_id] = @manifestation.id
378
+ redirect_to manifestations_url(:parent_id => @manifestation.id)
379
+ return
380
+ end
381
+
382
+ if defined?(EnjuCirculation)
383
+ @reserved_count = Reserve.waiting.where(:manifestation_id => @manifestation.id, :checked_out_at => nil).count
384
+ @reserve = current_user.reserves.where(:manifestation_id => @manifestation.id).first if user_signed_in?
385
+ end
386
+
387
+ if defined?(EnjuQuestion)
388
+ @questions = @manifestation.questions(:user => current_user, :page => params[:question_page])
389
+ end
390
+
391
+ if @manifestation.attachment.path
392
+ if Setting.uploaded_file.storage == :s3
393
+ data = open(@manifestation.attachment.url).read.force_encoding('UTF-8')
394
+ else
395
+ file = @manifestation.attachment.path
396
+ end
397
+ end
398
+
399
+ respond_to do |format|
400
+ format.html # show.html.erb
401
+ format.mobile
402
+ format.xml {
403
+ case params[:mode]
404
+ when 'related'
405
+ render :template => 'manifestations/related'
406
+ else
407
+ render :xml => @manifestation
408
+ end
409
+ }
410
+ format.rdf
411
+ format.mods
412
+ format.json { render :json => @manifestation }
413
+ #format.atom { render :template => 'manifestations/oai_ore' }
414
+ #format.js
415
+ format.download {
416
+ if @manifestation.attachment.path
417
+ if Setting.uploaded_file.storage == :s3
418
+ send_data @manifestation.attachment.data, :filename => File.basename(@manifestation.attachment_file_name), :type => 'application/octet-stream'
419
+ else
420
+ if File.exist?(file) and File.file?(file)
421
+ send_file file, :filename => File.basename(@manifestation.attachment_file_name), :type => 'application/octet-stream'
422
+ end
423
+ end
424
+ else
425
+ render :template => 'page/404', :status => 404
426
+ end
427
+ }
428
+ if defined?(EnjuOai)
429
+ format.oai
430
+ end
431
+ end
432
+ end
433
+
434
+ # GET /manifestations/new
435
+ # GET /manifestations/new.json
436
+ def new
437
+ @manifestation = Manifestation.new
438
+ @manifestation.language = Language.where(:iso_639_1 => @locale).first
439
+ parent = Manifestation.where(:id => params[:parent_id]).first if params[:parent_id].present?
440
+ if parent
441
+ @manifestation.parent_id = parent.id
442
+ @manifestation.original_title = parent.original_title
443
+ @manifestation.title_transcription = parent.title_transcription
444
+ @manifestation.periodical = true if parent.periodical
445
+ end
446
+
447
+ respond_to do |format|
448
+ format.html # new.html.erb
449
+ format.json { render :json => @manifestation }
450
+ end
451
+ end
452
+
453
+ # GET /manifestations/1/edit
454
+ def edit
455
+ unless current_user.has_role?('Librarian')
456
+ unless params[:mode] == 'tag_edit'
457
+ access_denied; return
458
+ end
459
+ end
460
+ if defined?(EnjuBookmark)
461
+ if params[:mode] == 'tag_edit'
462
+ @bookmark = current_user.bookmarks.where(:manifestation_id => @manifestation.id).first if @manifestation rescue nil
463
+ render :partial => 'manifestations/tag_edit', :locals => {:manifestation => @manifestation}
464
+ end
465
+ store_location unless params[:mode] == 'tag_edit'
466
+ end
467
+ end
468
+
469
+ # POST /manifestations
470
+ # POST /manifestations.json
471
+ def create
472
+ @manifestation = Manifestation.new(params[:manifestation])
473
+ parent = Manifestation.where(:id => @manifestation.parent_id).first
474
+ unless @manifestation.original_title?
475
+ @manifestation.original_title = @manifestation.attachment_file_name
476
+ end
477
+
478
+ respond_to do |format|
479
+ if @manifestation.save
480
+ if parent
481
+ parent.derived_manifestations << @manifestation
482
+ parent.index
483
+ @manifestation.index
484
+ end
485
+ Sunspot.commit
486
+
487
+ format.html { redirect_to @manifestation, :notice => t('controller.successfully_created', :model => t('activerecord.models.manifestation')) }
488
+ format.json { render :json => @manifestation, :status => :created, :location => @manifestation }
489
+ else
490
+ prepare_options
491
+ format.html { render :action => "new" }
492
+ format.json { render :json => @manifestation.errors, :status => :unprocessable_entity }
493
+ end
494
+ end
495
+ end
496
+
497
+ # PUT /manifestations/1
498
+ # PUT /manifestations/1.json
499
+ def update
500
+ respond_to do |format|
501
+ if @manifestation.update_attributes(params[:manifestation])
502
+ Sunspot.commit
503
+ format.html { redirect_to @manifestation, :notice => t('controller.successfully_updated', :model => t('activerecord.models.manifestation')) }
504
+ format.json { head :no_content }
505
+ else
506
+ prepare_options
507
+ format.html { render :action => "edit" }
508
+ format.json { render :json => @manifestation.errors, :status => :unprocessable_entity }
509
+ end
510
+ end
511
+ end
512
+
513
+ # DELETE /manifestations/1
514
+ # DELETE /manifestations/1.json
515
+ def destroy
516
+ @manifestation.destroy
517
+
518
+ respond_to do |format|
519
+ format.html { redirect_to manifestations_url, :notice => t('controller.successfully_deleted', :model => t('activerecord.models.manifestation')) }
520
+ format.json { head :no_content }
521
+ end
522
+ end
523
+
524
+ private
525
+
526
+ def make_query(query, options = {})
527
+ # TODO: integerやstringもqfに含める
528
+ query = query.to_s.strip
529
+
530
+ if query.size == 1
531
+ query = "#{query}*"
532
+ end
533
+
534
+ if options[:mode] == 'recent'
535
+ query = "#{query} created_at_d:[NOW-1MONTH TO NOW]"
536
+ end
537
+
538
+ #unless options[:carrier_type].blank?
539
+ # query = "#{query} carrier_type_s:#{options[:carrier_type]}"
540
+ #end
541
+
542
+ #unless options[:library].blank?
543
+ # library_list = options[:library].split.uniq.join(' and ')
544
+ # query = "#{query} library_sm:#{library_list}"
545
+ #end
546
+
547
+ #unless options[:language].blank?
548
+ # query = "#{query} language_sm:#{options[:language]}"
549
+ #end
550
+
551
+ #unless options[:subject].blank?
552
+ # query = "#{query} subject_sm:#{options[:subject]}"
553
+ #end
554
+
555
+ if options[:tag].present?
556
+ query = "#{query} tag_sm:#{options[:tag]}"
557
+ end
558
+
559
+ if options[:creator].present?
560
+ query = "#{query} creator_text:#{options[:creator]}"
561
+ end
562
+
563
+ if options[:contributor].present?
564
+ query = "#{query} contributor_text:#{options[:contributor]}"
565
+ end
566
+
567
+ if options[:isbn].present?
568
+ query = "#{query} isbn_sm:#{options[:isbn].gsub('-', '')}"
569
+ end
570
+
571
+ if options[:issn].present?
572
+ query = "#{query} issn_sm:#{options[:issn].gsub('-', '')}"
573
+ end
574
+
575
+ if options[:lccn].present?
576
+ query = "#{query} lccn_s:#{options[:lccn]}"
577
+ end
578
+
579
+ if options[:jpno].present?
580
+ query = "#{query} jpno_s:#{options[:jpno]}"
581
+ end
582
+
583
+ if options[:publisher].present?
584
+ query = "#{query} publisher_text:#{options[:publisher]}"
585
+ end
586
+
587
+ if options[:item_identifier].present?
588
+ query = "#{query} item_identifier_sm:#{options[:item_identifier]}"
589
+ end
590
+
591
+ unless options[:number_of_pages_at_least].blank? and options[:number_of_pages_at_most].blank?
592
+ number_of_pages = {}
593
+ number_of_pages[:at_least] = options[:number_of_pages_at_least].to_i
594
+ number_of_pages[:at_most] = options[:number_of_pages_at_most].to_i
595
+ number_of_pages[:at_least] = "*" if number_of_pages[:at_least] == 0
596
+ number_of_pages[:at_most] = "*" if number_of_pages[:at_most] == 0
597
+
598
+ query = "#{query} number_of_pages_i:[#{number_of_pages[:at_least]} TO #{number_of_pages[:at_most]}]"
599
+ end
600
+
601
+ query = set_pub_date(query, options)
602
+ query = set_acquisition_date(query, options)
603
+
604
+ query = query.strip
605
+ if query == '[* TO *]'
606
+ # unless params[:advanced_search]
607
+ query = ''
608
+ # end
609
+ end
610
+
611
+ return query
612
+ end
613
+
614
+ def set_search_result_order(sort_by, order)
615
+ sort = {}
616
+ # TODO: ページ数や大きさでの並べ替え
617
+ case sort_by
618
+ when 'title'
619
+ sort[:sort_by] = 'sort_title'
620
+ sort[:order] = 'asc'
621
+ when 'pub_date'
622
+ sort[:sort_by] = 'date_of_publication'
623
+ sort[:order] = 'desc'
624
+ else
625
+ # デフォルトの並び方
626
+ sort[:sort_by] = 'created_at'
627
+ sort[:order] = 'desc'
628
+ end
629
+ if order == 'asc'
630
+ sort[:order] = 'asc'
631
+ elsif order == 'desc'
632
+ sort[:order] = 'desc'
633
+ end
634
+ sort
635
+ end
636
+
637
+ def render_mode(mode)
638
+ case mode
639
+ when 'holding'
640
+ render :partial => 'manifestations/show_holding', :locals => {:manifestation => @manifestation}
641
+ when 'barcode'
642
+ if defined?(EnjuBarcode)
643
+ barcode = Barby::QrCode.new(@manifestation.id)
644
+ send_data(barcode.to_svg, :disposition => 'inline', :type => 'image/svg+xml')
645
+ end
646
+ when 'tag_edit'
647
+ if defined?(EnjuBookmark)
648
+ render :partial => 'manifestations/tag_edit', :locals => {:manifestation => @manifestation}
649
+ end
650
+ when 'tag_list'
651
+ if defined?(EnjuBookmark)
652
+ render :partial => 'manifestations/tag_list', :locals => {:manifestation => @manifestation}
653
+ end
654
+ when 'show_index'
655
+ render :partial => 'manifestations/show_index', :locals => {:manifestation => @manifestation}
656
+ when 'show_creators'
657
+ render :partial => 'manifestations/show_creators', :locals => {:manifestation => @manifestation}
658
+ when 'show_all_creators'
659
+ render :partial => 'manifestations/show_creators', :locals => {:manifestation => @manifestation}
660
+ when 'pickup'
661
+ render :partial => 'manifestations/pickup', :locals => {:manifestation => @manifestation}
662
+ when 'calil_list'
663
+ if defined?(EnjuCalil)
664
+ render :partial => 'manifestations/calil_list', :locals => {:manifestation => @manifestation}
665
+ end
666
+ else
667
+ false
668
+ end
669
+ end
670
+
671
+ def prepare_options
672
+ @carrier_types = CarrierType.select([:id, :display_name, :position])
673
+ @content_types = ContentType.select([:id, :display_name, :position])
674
+ @roles = Role.select([:id, :display_name, :position])
675
+ @languages = Language.select([:id, :display_name, :position])
676
+ @frequencies = Frequency.select([:id, :display_name, :position])
677
+ @identifier_types = IdentifierType.select([:id, :display_name, :position])
678
+ @nii_types = NiiType.select([:id, :display_name, :position]) if defined?(EnjuNii)
679
+ if defined?(EnjuSubject)
680
+ @subject_types = SubjectType.select([:id, :display_name, :position])
681
+ @subject_heading_types = SubjectHeadingType.select([:id, :display_name, :position])
682
+ @classification_types = ClassificationType.select([:id, :display_name, :position])
683
+ end
684
+ end
685
+
686
+ def get_index_agent
687
+ agent = {}
688
+ case
689
+ when params[:agent_id]
690
+ agent[:agent] = Agent.find(params[:agent_id])
691
+ when params[:creator_id]
692
+ agent[:creator] = @creator = Agent.find(params[:creator_id])
693
+ when params[:contributor_id]
694
+ agent[:contributor] = @contributor = Agent.find(params[:contributor_id])
695
+ when params[:publisher_id]
696
+ agent[:publisher] = @publisher = Agent.find(params[:publisher_id])
697
+ end
698
+ agent
699
+ end
700
+
701
+ def set_reservable
702
+ case params[:reservable].to_s
703
+ when 'true'
704
+ @reservable = true
705
+ when 'false'
706
+ @reservable = false
707
+ else
708
+ @reservable = nil
709
+ end
710
+ end
711
+
712
+ def parse_pub_date(options)
713
+ pub_date = {}
714
+ if options[:pub_date_from].blank?
715
+ pub_date[:from] = "*"
716
+ else
717
+ pub_date[:from] = Time.zone.parse(options[:pub_date_from]).beginning_of_day.utc.iso8601 rescue nil
718
+ unless pub_date[:from]
719
+ pub_date[:from] = Time.zone.parse(Time.mktime(options[:pub_date_from]).to_s).beginning_of_day.utc.iso8601
720
+ end
721
+ end
722
+
723
+ if options[:pub_date_to].blank?
724
+ pub_date[:to] = "*"
725
+ else
726
+ pub_date[:to] = Time.zone.parse(options[:pub_date_to]).end_of_day.utc.iso8601 rescue nil
727
+ unless pub_date[:to]
728
+ pub_date[:to] = Time.zone.parse(Time.mktime(options[:pub_date_to]).to_s).end_of_year.utc.iso8601
729
+ end
730
+ end
731
+ pub_date
732
+ end
733
+
734
+ def set_pub_date(query, options)
735
+ unless options[:pub_date_from].blank? and options[:pub_date_to].blank?
736
+ options[:pub_date_from].to_s.gsub!(/\D/, '')
737
+ options[:pub_date_to].to_s.gsub!(/\D/, '')
738
+ pub_date = parse_pub_date(options)
739
+ query = "#{query} date_of_publication_d:[#{pub_date[:from]} TO #{pub_date[:to]}]"
740
+ end
741
+ query
742
+ end
743
+
744
+ def set_acquisition_date(query, options)
745
+ unless options[:acquired_from].blank? and options[:acquired_to].blank?
746
+ options[:acquired_from].to_s.gsub!(/\D/, '')
747
+ options[:acquired_to].to_s.gsub!(/\D/, '')
748
+
749
+ acquisition_date = {}
750
+ if options[:acquired_from].blank?
751
+ acquisition_date[:from] = "*"
752
+ else
753
+ acquisition_date[:from] = Time.zone.parse(options[:acquired_from]).beginning_of_day.utc.iso8601 rescue nil
754
+ unless acquisition_date[:from]
755
+ acquisition_date[:from] = Time.zone.parse(Time.mktime(options[:acquired_from]).to_s).beginning_of_day.utc.iso8601
756
+ end
757
+ end
758
+
759
+ if options[:acquired_to].blank?
760
+ acquisition_date[:to] = "*"
761
+ else
762
+ acquisition_date[:to] = Time.zone.parse(options[:acquired_to]).end_of_day.utc.iso8601 rescue nil
763
+ unless acquisition_date[:to]
764
+ acquisition_date[:to] = Time.zone.parse(Time.mktime(options[:acquired_to]).to_s).end_of_year.utc.iso8601
765
+ end
766
+ end
767
+ query = "#{query} acquired_at_d:[#{acquisition_date[:from]} TO #{acquisition_date[:to]}]"
768
+ end
769
+ query
770
+ end
771
+ end