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.
- data/app/views/manifestations/list_identifiers.oai.builder +1 -1
- data/app/views/manifestations/list_records.oai.builder +1 -1
- data/lib/enju_oai/oai_controller.rb +32 -0
- data/lib/enju_oai/version.rb +1 -1
- data/spec/controllers/manifestations_controller_spec.rb +45 -0
- data/spec/dummy/README.rdoc +261 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +15 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +76 -0
- data/spec/dummy/app/controllers/manifestations_controller.rb +519 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/models/ability.rb +29 -0
- data/spec/dummy/app/models/carrier_type.rb +33 -0
- data/spec/dummy/app/models/create.rb +38 -0
- data/spec/dummy/app/models/exemplify.rb +45 -0
- data/spec/dummy/app/models/item.rb +276 -0
- data/spec/dummy/app/models/manifestation.rb +631 -0
- data/spec/dummy/app/models/patron.rb +290 -0
- data/spec/dummy/app/models/produce.rb +39 -0
- data/spec/dummy/app/models/realize.rb +38 -0
- data/spec/dummy/app/models/role.rb +46 -0
- data/spec/dummy/app/models/search_engine.rb +51 -0
- data/spec/dummy/app/models/user.rb +94 -0
- data/spec/dummy/app/models/user_has_role.rb +4 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config/application.rb +57 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/configatron/cucumber.rb +4 -0
- data/spec/dummy/config/configatron/defaults.rb +28 -0
- data/spec/dummy/config/configatron/development.rb +4 -0
- data/spec/dummy/config/configatron/production.rb.sample +12 -0
- data/spec/dummy/config/configatron/test.rb +7 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +67 -0
- data/spec/dummy/config/environments/test.rb +37 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/configatron.rb +2 -0
- data/spec/dummy/config/initializers/devise.rb +209 -0
- data/spec/dummy/config/initializers/inflections.rb +15 -0
- data/spec/dummy/config/initializers/mime_types.rb +14 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +60 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/migrate/001_create_patrons.rb +53 -0
- data/spec/dummy/db/migrate/002_devise_create_users.rb +71 -0
- data/spec/dummy/db/migrate/005_create_manifestations.rb +59 -0
- data/spec/dummy/db/migrate/006_create_items.rb +28 -0
- data/spec/dummy/db/migrate/012_create_owns.rb +14 -0
- data/spec/dummy/db/migrate/015_create_creates.rb +14 -0
- data/spec/dummy/db/migrate/041_create_roles.rb +13 -0
- data/spec/dummy/db/migrate/047_create_produces.rb +14 -0
- data/spec/dummy/db/migrate/059_create_libraries.rb +30 -0
- data/spec/dummy/db/migrate/073_create_carrier_types.rb +11 -0
- data/spec/dummy/db/migrate/077_create_user_groups.rb +12 -0
- data/spec/dummy/db/migrate/080_create_library_groups.rb +21 -0
- data/spec/dummy/db/migrate/112_create_frequencies.rb +12 -0
- data/spec/dummy/db/migrate/117_create_form_of_works.rb +12 -0
- data/spec/dummy/db/migrate/20080830154109_create_realizes.rb +15 -0
- data/spec/dummy/db/migrate/20080830172106_create_exemplifies.rb +15 -0
- data/spec/dummy/db/migrate/20080905191442_create_patron_types.rb +12 -0
- data/spec/dummy/db/migrate/20081023092436_create_search_engines.rb +17 -0
- data/spec/dummy/db/migrate/20081025083323_create_countries.rb +28 -0
- data/spec/dummy/db/migrate/20081025083905_create_languages.rb +23 -0
- data/spec/dummy/db/migrate/20090719201843_create_extents.rb +12 -0
- data/spec/dummy/db/migrate/20090720091106_create_medium_of_performances.rb +12 -0
- data/spec/dummy/db/migrate/20090720091429_create_content_types.rb +12 -0
- data/spec/dummy/db/migrate/20090812151902_create_patron_relationship_types.rb +12 -0
- data/spec/dummy/db/migrate/20091025080447_create_licenses.rb +12 -0
- data/spec/dummy/db/migrate/20091202124834_create_versions.rb +18 -0
- data/spec/dummy/db/migrate/20100211105551_add_admin_networks_to_library_group.rb +9 -0
- data/spec/dummy/db/migrate/20100326024214_add_date_index_to_resource.rb +11 -0
- data/spec/dummy/db/migrate/20100502171926_add_latitude_and_longitude_to_library.rb +11 -0
- data/spec/dummy/db/migrate/20100525124311_create_manifestation_relationships.rb +13 -0
- data/spec/dummy/db/migrate/20100606065209_create_user_has_roles.rb +12 -0
- data/spec/dummy/db/migrate/20100606073747_create_patron_relationships.rb +13 -0
- data/spec/dummy/db/migrate/20100607044753_create_manifestation_relationship_types.rb +12 -0
- data/spec/dummy/db/migrate/20100627193848_add_enju_access_key_to_user.rb +10 -0
- data/spec/dummy/db/migrate/20100814091104_add_position_to_patron_relationship.rb +11 -0
- data/spec/dummy/db/migrate/20100919121500_drop_user_email_unique_index.rb +11 -0
- data/spec/dummy/db/migrate/20101103090330_add_title_to_patron.rb +9 -0
- data/spec/dummy/db/migrate/20101103090457_rename_manifestation_identifier_to_identifier.rb +9 -0
- data/spec/dummy/db/migrate/20101212070145_add_acquired_at_to_item.rb +9 -0
- data/spec/dummy/db/migrate/20101228081401_rename_postal_code_to_zip_code.rb +11 -0
- data/spec/dummy/db/migrate/20110115022329_add_position_to_library_group.rb +9 -0
- data/spec/dummy/db/migrate/20110222073537_add_url_to_library_group.rb +9 -0
- data/spec/dummy/db/migrate/20110301035123_add_pub_date_to_manifestation.rb +9 -0
- data/spec/dummy/db/migrate/20110301121550_add_birth_date_and_death_date_to_patron.rb +11 -0
- data/spec/dummy/db/migrate/20110318183304_add_valid_period_for_new_user_to_user_group.rb +13 -0
- data/spec/dummy/db/migrate/20110619064807_add_edition_string_to_manifestation.rb +9 -0
- data/spec/dummy/db/migrate/20110627122938_add_number_of_day_to_notify_overdue_to_user_group.rb +13 -0
- data/spec/dummy/db/migrate/20110916053430_rename_manifestation_number_list_to_number_string.rb +13 -0
- data/spec/dummy/db/migrate/20110916091020_add_volume_number_to_manifestation.rb +13 -0
- data/spec/dummy/db/migrate/20110927135845_add_missing_since_to_item.rb +9 -0
- data/spec/dummy/db/migrate/20111103221239_rename_manifestation_identifier_to_manifestation_identifier.rb +9 -0
- data/spec/dummy/db/migrate/20111124110059_create_create_types.rb +12 -0
- data/spec/dummy/db/migrate/20111124110319_create_realize_types.rb +12 -0
- data/spec/dummy/db/migrate/20111124110355_create_produce_types.rb +12 -0
- data/spec/dummy/db/migrate/20111124112131_add_create_type_to_create.rb +7 -0
- data/spec/dummy/db/migrate/20120105074911_add_isil_to_library.rb +5 -0
- data/spec/dummy/db/migrate/20120319120638_add_content_type_id_to_manifestation.rb +6 -0
- data/spec/dummy/db/migrate/20120410104851_add_year_of_publication_to_manifestation.rb +5 -0
- data/spec/dummy/db/migrate/20120413225628_add_fingerprint_to_manifestation.rb +5 -0
- data/spec/dummy/db/migrate/20120415164821_add_attachment_meta_to_manifestation.rb +5 -0
- data/spec/dummy/db/migrate/20120418081407_add_month_of_publication_to_manifestation.rb +5 -0
- data/spec/dummy/db/migrate/20120426034355_add_unique_index_to_item_identifier.rb +11 -0
- data/spec/dummy/db/migrate/20120426042730_add_unique_index_to_manifestation_identifier.rb +11 -0
- data/spec/dummy/db/schema.rb +564 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/lib/enju_leaf/calculate_stat.rb +30 -0
- data/spec/dummy/lib/enju_leaf/expire_editable_fragment.rb +30 -0
- data/spec/dummy/lib/enju_leaf/expire_fragment_cache.rb +17 -0
- data/spec/dummy/lib/enju_leaf/import_file.rb +13 -0
- data/spec/dummy/lib/enju_leaf/localized_name.rb +13 -0
- data/spec/dummy/lib/enju_leaf/master_model.rb +19 -0
- data/spec/dummy/lib/enju_leaf/url_validator.rb +10 -0
- data/spec/dummy/lib/enju_leaf.rb +8 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +25 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/dummy/tmp/cache/4F7/F90/default_role +0 -0
- data/spec/dummy/tmp/cache/6E4/420/search_engine_all +0 -0
- data/spec/factories/manifestation.rb +6 -0
- data/spec/factories/user.rb +34 -0
- data/spec/fixtures/carrier_types.yml +51 -0
- data/spec/fixtures/creates.yml +66 -0
- data/spec/fixtures/exemplifies.yml +156 -0
- data/spec/fixtures/items.yml +262 -0
- data/spec/fixtures/libraries.yml +109 -0
- data/spec/fixtures/library_groups.yml +36 -0
- data/spec/fixtures/manifestations.yml +2024 -0
- data/spec/fixtures/patron_types.yml +41 -0
- data/spec/fixtures/patrons.yml +338 -0
- data/spec/fixtures/produces.yml +150 -0
- data/spec/fixtures/realizes.yml +87 -0
- data/spec/fixtures/roles.yml +21 -0
- data/spec/fixtures/user_has_roles.yml +41 -0
- data/spec/fixtures/users.yml +93 -0
- data/spec/spec_helper.rb +38 -0
- data/spec/support/controller_macros.rb +48 -0
- data/spec/support/devise.rb +4 -0
- metadata +290 -6
- data/test/enju_oai_test.rb +0 -7
- 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,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
|
+
|