enju_flower 0.1.0.pre12 → 0.1.0.pre13

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