enju_oai 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. data/app/views/manifestations/list_identifiers.oai.builder +1 -1
  2. data/app/views/manifestations/list_records.oai.builder +1 -1
  3. data/lib/enju_oai/oai_controller.rb +32 -0
  4. data/lib/enju_oai/version.rb +1 -1
  5. data/spec/controllers/manifestations_controller_spec.rb +45 -0
  6. data/spec/dummy/README.rdoc +261 -0
  7. data/spec/dummy/Rakefile +7 -0
  8. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  9. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  10. data/spec/dummy/app/controllers/application_controller.rb +76 -0
  11. data/spec/dummy/app/controllers/manifestations_controller.rb +519 -0
  12. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  13. data/spec/dummy/app/models/ability.rb +29 -0
  14. data/spec/dummy/app/models/carrier_type.rb +33 -0
  15. data/spec/dummy/app/models/create.rb +38 -0
  16. data/spec/dummy/app/models/exemplify.rb +45 -0
  17. data/spec/dummy/app/models/item.rb +276 -0
  18. data/spec/dummy/app/models/manifestation.rb +631 -0
  19. data/spec/dummy/app/models/patron.rb +290 -0
  20. data/spec/dummy/app/models/produce.rb +39 -0
  21. data/spec/dummy/app/models/realize.rb +38 -0
  22. data/spec/dummy/app/models/role.rb +46 -0
  23. data/spec/dummy/app/models/search_engine.rb +51 -0
  24. data/spec/dummy/app/models/user.rb +94 -0
  25. data/spec/dummy/app/models/user_has_role.rb +4 -0
  26. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  27. data/spec/dummy/config/application.rb +57 -0
  28. data/spec/dummy/config/boot.rb +10 -0
  29. data/spec/dummy/config/configatron/cucumber.rb +4 -0
  30. data/spec/dummy/config/configatron/defaults.rb +28 -0
  31. data/spec/dummy/config/configatron/development.rb +4 -0
  32. data/spec/dummy/config/configatron/production.rb.sample +12 -0
  33. data/spec/dummy/config/configatron/test.rb +7 -0
  34. data/spec/dummy/config/database.yml +25 -0
  35. data/spec/dummy/config/environment.rb +5 -0
  36. data/spec/dummy/config/environments/development.rb +37 -0
  37. data/spec/dummy/config/environments/production.rb +67 -0
  38. data/spec/dummy/config/environments/test.rb +37 -0
  39. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  40. data/spec/dummy/config/initializers/configatron.rb +2 -0
  41. data/spec/dummy/config/initializers/devise.rb +209 -0
  42. data/spec/dummy/config/initializers/inflections.rb +15 -0
  43. data/spec/dummy/config/initializers/mime_types.rb +14 -0
  44. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  45. data/spec/dummy/config/initializers/session_store.rb +8 -0
  46. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  47. data/spec/dummy/config/locales/en.yml +5 -0
  48. data/spec/dummy/config/routes.rb +60 -0
  49. data/spec/dummy/config.ru +4 -0
  50. data/spec/dummy/db/migrate/001_create_patrons.rb +53 -0
  51. data/spec/dummy/db/migrate/002_devise_create_users.rb +71 -0
  52. data/spec/dummy/db/migrate/005_create_manifestations.rb +59 -0
  53. data/spec/dummy/db/migrate/006_create_items.rb +28 -0
  54. data/spec/dummy/db/migrate/012_create_owns.rb +14 -0
  55. data/spec/dummy/db/migrate/015_create_creates.rb +14 -0
  56. data/spec/dummy/db/migrate/041_create_roles.rb +13 -0
  57. data/spec/dummy/db/migrate/047_create_produces.rb +14 -0
  58. data/spec/dummy/db/migrate/059_create_libraries.rb +30 -0
  59. data/spec/dummy/db/migrate/073_create_carrier_types.rb +11 -0
  60. data/spec/dummy/db/migrate/077_create_user_groups.rb +12 -0
  61. data/spec/dummy/db/migrate/080_create_library_groups.rb +21 -0
  62. data/spec/dummy/db/migrate/112_create_frequencies.rb +12 -0
  63. data/spec/dummy/db/migrate/117_create_form_of_works.rb +12 -0
  64. data/spec/dummy/db/migrate/20080830154109_create_realizes.rb +15 -0
  65. data/spec/dummy/db/migrate/20080830172106_create_exemplifies.rb +15 -0
  66. data/spec/dummy/db/migrate/20080905191442_create_patron_types.rb +12 -0
  67. data/spec/dummy/db/migrate/20081023092436_create_search_engines.rb +17 -0
  68. data/spec/dummy/db/migrate/20081025083323_create_countries.rb +28 -0
  69. data/spec/dummy/db/migrate/20081025083905_create_languages.rb +23 -0
  70. data/spec/dummy/db/migrate/20090719201843_create_extents.rb +12 -0
  71. data/spec/dummy/db/migrate/20090720091106_create_medium_of_performances.rb +12 -0
  72. data/spec/dummy/db/migrate/20090720091429_create_content_types.rb +12 -0
  73. data/spec/dummy/db/migrate/20090812151902_create_patron_relationship_types.rb +12 -0
  74. data/spec/dummy/db/migrate/20091025080447_create_licenses.rb +12 -0
  75. data/spec/dummy/db/migrate/20091202124834_create_versions.rb +18 -0
  76. data/spec/dummy/db/migrate/20100211105551_add_admin_networks_to_library_group.rb +9 -0
  77. data/spec/dummy/db/migrate/20100326024214_add_date_index_to_resource.rb +11 -0
  78. data/spec/dummy/db/migrate/20100502171926_add_latitude_and_longitude_to_library.rb +11 -0
  79. data/spec/dummy/db/migrate/20100525124311_create_manifestation_relationships.rb +13 -0
  80. data/spec/dummy/db/migrate/20100606065209_create_user_has_roles.rb +12 -0
  81. data/spec/dummy/db/migrate/20100606073747_create_patron_relationships.rb +13 -0
  82. data/spec/dummy/db/migrate/20100607044753_create_manifestation_relationship_types.rb +12 -0
  83. data/spec/dummy/db/migrate/20100627193848_add_enju_access_key_to_user.rb +10 -0
  84. data/spec/dummy/db/migrate/20100814091104_add_position_to_patron_relationship.rb +11 -0
  85. data/spec/dummy/db/migrate/20100919121500_drop_user_email_unique_index.rb +11 -0
  86. data/spec/dummy/db/migrate/20101103090330_add_title_to_patron.rb +9 -0
  87. data/spec/dummy/db/migrate/20101103090457_rename_manifestation_identifier_to_identifier.rb +9 -0
  88. data/spec/dummy/db/migrate/20101212070145_add_acquired_at_to_item.rb +9 -0
  89. data/spec/dummy/db/migrate/20101228081401_rename_postal_code_to_zip_code.rb +11 -0
  90. data/spec/dummy/db/migrate/20110115022329_add_position_to_library_group.rb +9 -0
  91. data/spec/dummy/db/migrate/20110222073537_add_url_to_library_group.rb +9 -0
  92. data/spec/dummy/db/migrate/20110301035123_add_pub_date_to_manifestation.rb +9 -0
  93. data/spec/dummy/db/migrate/20110301121550_add_birth_date_and_death_date_to_patron.rb +11 -0
  94. data/spec/dummy/db/migrate/20110318183304_add_valid_period_for_new_user_to_user_group.rb +13 -0
  95. data/spec/dummy/db/migrate/20110619064807_add_edition_string_to_manifestation.rb +9 -0
  96. data/spec/dummy/db/migrate/20110627122938_add_number_of_day_to_notify_overdue_to_user_group.rb +13 -0
  97. data/spec/dummy/db/migrate/20110916053430_rename_manifestation_number_list_to_number_string.rb +13 -0
  98. data/spec/dummy/db/migrate/20110916091020_add_volume_number_to_manifestation.rb +13 -0
  99. data/spec/dummy/db/migrate/20110927135845_add_missing_since_to_item.rb +9 -0
  100. data/spec/dummy/db/migrate/20111103221239_rename_manifestation_identifier_to_manifestation_identifier.rb +9 -0
  101. data/spec/dummy/db/migrate/20111124110059_create_create_types.rb +12 -0
  102. data/spec/dummy/db/migrate/20111124110319_create_realize_types.rb +12 -0
  103. data/spec/dummy/db/migrate/20111124110355_create_produce_types.rb +12 -0
  104. data/spec/dummy/db/migrate/20111124112131_add_create_type_to_create.rb +7 -0
  105. data/spec/dummy/db/migrate/20120105074911_add_isil_to_library.rb +5 -0
  106. data/spec/dummy/db/migrate/20120319120638_add_content_type_id_to_manifestation.rb +6 -0
  107. data/spec/dummy/db/migrate/20120410104851_add_year_of_publication_to_manifestation.rb +5 -0
  108. data/spec/dummy/db/migrate/20120413225628_add_fingerprint_to_manifestation.rb +5 -0
  109. data/spec/dummy/db/migrate/20120415164821_add_attachment_meta_to_manifestation.rb +5 -0
  110. data/spec/dummy/db/migrate/20120418081407_add_month_of_publication_to_manifestation.rb +5 -0
  111. data/spec/dummy/db/migrate/20120426034355_add_unique_index_to_item_identifier.rb +11 -0
  112. data/spec/dummy/db/migrate/20120426042730_add_unique_index_to_manifestation_identifier.rb +11 -0
  113. data/spec/dummy/db/schema.rb +564 -0
  114. data/spec/dummy/db/test.sqlite3 +0 -0
  115. data/spec/dummy/lib/enju_leaf/calculate_stat.rb +30 -0
  116. data/spec/dummy/lib/enju_leaf/expire_editable_fragment.rb +30 -0
  117. data/spec/dummy/lib/enju_leaf/expire_fragment_cache.rb +17 -0
  118. data/spec/dummy/lib/enju_leaf/import_file.rb +13 -0
  119. data/spec/dummy/lib/enju_leaf/localized_name.rb +13 -0
  120. data/spec/dummy/lib/enju_leaf/master_model.rb +19 -0
  121. data/spec/dummy/lib/enju_leaf/url_validator.rb +10 -0
  122. data/spec/dummy/lib/enju_leaf.rb +8 -0
  123. data/spec/dummy/public/404.html +26 -0
  124. data/spec/dummy/public/422.html +26 -0
  125. data/spec/dummy/public/500.html +25 -0
  126. data/spec/dummy/public/favicon.ico +0 -0
  127. data/spec/dummy/script/rails +6 -0
  128. data/spec/dummy/tmp/cache/4F7/F90/default_role +0 -0
  129. data/spec/dummy/tmp/cache/6E4/420/search_engine_all +0 -0
  130. data/spec/factories/manifestation.rb +6 -0
  131. data/spec/factories/user.rb +34 -0
  132. data/spec/fixtures/carrier_types.yml +51 -0
  133. data/spec/fixtures/creates.yml +66 -0
  134. data/spec/fixtures/exemplifies.yml +156 -0
  135. data/spec/fixtures/items.yml +262 -0
  136. data/spec/fixtures/libraries.yml +109 -0
  137. data/spec/fixtures/library_groups.yml +36 -0
  138. data/spec/fixtures/manifestations.yml +2024 -0
  139. data/spec/fixtures/patron_types.yml +41 -0
  140. data/spec/fixtures/patrons.yml +338 -0
  141. data/spec/fixtures/produces.yml +150 -0
  142. data/spec/fixtures/realizes.yml +87 -0
  143. data/spec/fixtures/roles.yml +21 -0
  144. data/spec/fixtures/user_has_roles.yml +41 -0
  145. data/spec/fixtures/users.yml +93 -0
  146. data/spec/spec_helper.rb +38 -0
  147. data/spec/support/controller_macros.rb +48 -0
  148. data/spec/support/devise.rb +4 -0
  149. metadata +290 -6
  150. data/test/enju_oai_test.rb +0 -7
  151. data/test/test_helper.rb +0 -15
@@ -0,0 +1,631 @@
1
+ class Manifestation < ActiveRecord::Base
2
+ scope :periodical_master, where(:periodical => false)
3
+ scope :periodical_children, where(:periodical => true)
4
+ has_many :creates, :dependent => :destroy, :foreign_key => 'work_id'
5
+ has_many :creators, :through => :creates, :source => :patron
6
+ has_many :realizes, :dependent => :destroy, :foreign_key => 'expression_id'
7
+ has_many :contributors, :through => :realizes, :source => :patron
8
+ has_many :produces, :dependent => :destroy, :foreign_key => 'manifestation_id'
9
+ has_many :publishers, :through => :produces, :source => :patron
10
+ has_many :exemplifies, :foreign_key => 'manifestation_id'
11
+ has_many :items, :through => :exemplifies #, :foreign_key => 'manifestation_id'
12
+ has_many :children, :foreign_key => 'parent_id', :class_name => 'ManifestationRelationship', :dependent => :destroy
13
+ has_many :parents, :foreign_key => 'child_id', :class_name => 'ManifestationRelationship', :dependent => :destroy
14
+ has_many :derived_manifestations, :through => :children, :source => :child
15
+ has_many :original_manifestations, :through => :parents, :source => :parent
16
+ has_many :picture_files, :as => :picture_attachable, :dependent => :destroy
17
+ belongs_to :language
18
+ belongs_to :carrier_type
19
+ belongs_to :manifestation_content_type, :class_name => 'ContentType', :foreign_key => 'content_type_id'
20
+ has_one :series_has_manifestation, :dependent => :destroy
21
+ has_one :series_statement, :through => :series_has_manifestation
22
+ belongs_to :manifestation_relationship_type
23
+ belongs_to :frequency
24
+ belongs_to :required_role, :class_name => 'Role', :foreign_key => 'required_role_id', :validate => true
25
+ has_one :resource_import_result
26
+
27
+ searchable do
28
+ text :title, :default_boost => 2 do
29
+ titles
30
+ end
31
+ text :fulltext, :note, :creator, :contributor, :publisher, :description
32
+ text :item_identifier do
33
+ items.collect(&:item_identifier)
34
+ end
35
+ string :title, :multiple => true
36
+ # text フィールドだと区切りのない文字列の index が上手く作成
37
+ #できなかったので。 downcase することにした。
38
+ #他の string 項目も同様の問題があるので、必要な項目は同様の処置が必要。
39
+ string :connect_title do
40
+ title.join('').gsub(/\s/, '').downcase
41
+ end
42
+ string :connect_creator do
43
+ creator.join('').gsub(/\s/, '').downcase
44
+ end
45
+ string :connect_publisher do
46
+ publisher.join('').gsub(/\s/, '').downcase
47
+ end
48
+ string :isbn, :multiple => true do
49
+ [isbn, isbn10, wrong_isbn]
50
+ end
51
+ string :issn
52
+ string :lccn
53
+ string :nbn
54
+ string :carrier_type do
55
+ carrier_type.name
56
+ end
57
+ string :library, :multiple => true do
58
+ items.map{|i| i.shelf.library.name}
59
+ end
60
+ string :language do
61
+ language.try(:name)
62
+ end
63
+ string :item_identifier, :multiple => true do
64
+ items.collect(&:item_identifier)
65
+ end
66
+ string :shelf, :multiple => true do
67
+ items.collect{|i| "#{i.shelf.library.name}_#{i.shelf.name}"}
68
+ end
69
+ time :created_at
70
+ time :updated_at
71
+ time :deleted_at
72
+ time :date_of_publication
73
+ integer :creator_ids, :multiple => true
74
+ integer :contributor_ids, :multiple => true
75
+ integer :publisher_ids, :multiple => true
76
+ integer :item_ids, :multiple => true
77
+ integer :original_manifestation_ids, :multiple => true
78
+ integer :required_role_id
79
+ integer :height
80
+ integer :width
81
+ integer :depth
82
+ integer :volume_number, :multiple => true
83
+ integer :issue_number, :multiple => true
84
+ integer :serial_number, :multiple => true
85
+ integer :start_page
86
+ integer :end_page
87
+ integer :number_of_pages
88
+ float :price
89
+ integer :series_statement_id do
90
+ series_has_manifestation.try(:series_statement_id)
91
+ end
92
+ boolean :repository_content
93
+ # for OpenURL
94
+ text :aulast do
95
+ creators.map{|creator| creator.last_name}
96
+ end
97
+ text :aufirst do
98
+ creators.map{|creator| creator.first_name}
99
+ end
100
+ # OTC start
101
+ string :creator, :multiple => true do
102
+ creator.map{|au| au.gsub(' ', '')}
103
+ end
104
+ text :au do
105
+ creator
106
+ end
107
+ text :atitle do
108
+ title if original_manifestations.present? # 親がいることが条件
109
+ end
110
+ text :btitle do
111
+ title if frequency_id == 1 # 発行頻度1が単行本
112
+ end
113
+ text :jtitle do
114
+ if frequency_id != 1 # 雑誌の場合
115
+ title
116
+ else # 雑誌以外(雑誌の記事も含む)
117
+ titles = []
118
+ original_manifestations.each do |m|
119
+ if m.frequency_id != 1
120
+ titles << m.title
121
+ end
122
+ end
123
+ titles.flatten
124
+ end
125
+ end
126
+ text :isbn do # 前方一致検索のためtext指定を追加
127
+ [isbn, isbn10, wrong_isbn]
128
+ end
129
+ text :issn # 前方一致検索のためtext指定を追加
130
+ #text :ndl_jpno do
131
+ # TODO 詳細不明
132
+ #end
133
+ #string :ndl_dpid do
134
+ # TODO 詳細不明
135
+ #end
136
+ # OTC end
137
+ string :sort_title
138
+ boolean :periodical do
139
+ periodical?
140
+ end
141
+ boolean :periodical_master do
142
+ periodical_master?
143
+ end
144
+ time :acquired_at
145
+ end
146
+
147
+ enju_oai
148
+
149
+ validates_presence_of :original_title, :carrier_type, :language
150
+ validates_associated :carrier_type, :language
151
+ validates :start_page, :numericality => true, :allow_blank => true
152
+ validates :end_page, :numericality => true, :allow_blank => true
153
+ validates :isbn, :uniqueness => true, :allow_blank => true, :unless => proc{|manifestation| manifestation.series_statement}
154
+ validates :nbn, :uniqueness => true, :allow_blank => true
155
+ validates :manifestation_identifier, :uniqueness => true, :allow_blank => true
156
+ validates :pub_date, :format => {:with => /^\[{0,1}\d+([\/-]\d{0,2}){0,2}\]{0,1}$/}, :allow_blank => true
157
+ validates :access_address, :url => true, :allow_blank => true, :length => {:maximum => 255}
158
+ validate :check_isbn, :check_issn, :check_lccn, :unless => :during_import
159
+ validates :issue_number, :numericality => {:greater_than => 0}, :allow_blank => true
160
+ validates :volume_number, :numericality => {:greater_than => 0}, :allow_blank => true
161
+ validates :serial_number, :numericality => {:greater_than => 0}, :allow_blank => true
162
+ validates :edition, :numericality => {:greater_than => 0}, :allow_blank => true
163
+ before_validation :set_wrong_isbn, :check_issn, :check_lccn, :if => :during_import
164
+ before_validation :convert_isbn, :if => :isbn_changed?
165
+ after_create :clear_cached_numdocs
166
+ before_save :set_date_of_publication
167
+ before_save :set_periodical
168
+ after_save :index_series_statement
169
+ after_destroy :index_series_statement
170
+ normalize_attributes :manifestation_identifier, :pub_date, :isbn, :issn, :nbn, :lccn, :original_title
171
+ attr_accessor :during_import, :series_statement_id
172
+
173
+ def self.per_page
174
+ 10
175
+ end
176
+
177
+ def check_isbn
178
+ if isbn.present?
179
+ unless ISBN_Tools.is_valid?(isbn)
180
+ errors.add(:isbn)
181
+ end
182
+ end
183
+ end
184
+
185
+ def check_issn
186
+ self.issn = ISBN_Tools.cleanup(issn)
187
+ if issn.present?
188
+ unless StdNum::ISSN.valid?(issn)
189
+ errors.add(:issn)
190
+ end
191
+ end
192
+ end
193
+
194
+ def check_lccn
195
+ if lccn.present?
196
+ unless StdNum::LCCN.valid?(lccn)
197
+ errors.add(:lccn)
198
+ end
199
+ end
200
+ end
201
+
202
+ def set_wrong_isbn
203
+ if isbn.present?
204
+ unless ISBN_Tools.is_valid?(isbn)
205
+ self.wrong_isbn
206
+ self.isbn = nil
207
+ end
208
+ end
209
+ end
210
+
211
+ def convert_isbn
212
+ num = ISBN_Tools.cleanup(isbn) if isbn
213
+ if num
214
+ if num.length == 10
215
+ self.isbn10 = num
216
+ self.isbn = ISBN_Tools.isbn10_to_isbn13(num)
217
+ elsif num.length == 13
218
+ self.isbn10 = ISBN_Tools.isbn13_to_isbn10(num)
219
+ end
220
+ end
221
+ end
222
+
223
+ def set_date_of_publication
224
+ return if pub_date.blank?
225
+ date = nil
226
+ pub_date_string = pub_date.gsub(/[\[\]]/, '')
227
+
228
+ while date.nil? do
229
+ pub_date_string += '-01'
230
+ break if date =~ /-01-01-01$/
231
+ begin
232
+ date = Time.zone.parse(pub_date_string)
233
+ rescue ArgumentError
234
+ date = nil
235
+ rescue TZInfo::AmbiguousTime
236
+ date = nil
237
+ self.year_of_publication = pub_date_string.to_i if pub_date_string =~ /^\d+$/
238
+ break
239
+ end
240
+ end
241
+
242
+ if date
243
+ self.year_of_publication = date.year
244
+ self.month_of_publication = date.month
245
+ if date.year > 0
246
+ self.date_of_publication = date
247
+ end
248
+ end
249
+ end
250
+
251
+ def self.cached_numdocs
252
+ Rails.cache.fetch("manifestation_search_total"){Manifestation.search.total}
253
+ end
254
+
255
+ def clear_cached_numdocs
256
+ Rails.cache.delete("manifestation_search_total")
257
+ end
258
+
259
+ def parent_of_series
260
+ original_manifestations
261
+ end
262
+
263
+ def number_of_pages
264
+ if self.start_page and self.end_page
265
+ page = self.end_page.to_i - self.start_page.to_i + 1
266
+ end
267
+ end
268
+
269
+ def titles
270
+ title = []
271
+ title << original_title.to_s.strip
272
+ title << title_transcription.to_s.strip
273
+ title << title_alternative.to_s.strip
274
+ title << volume_number_string
275
+ title << issue_number_string
276
+ title << serial_number.to_s
277
+ title << edition_string
278
+ title << series_statement.titles if series_statement
279
+ #title << original_title.wakati
280
+ #title << title_transcription.wakati rescue nil
281
+ #title << title_alternative.wakati rescue nil
282
+ title.flatten
283
+ end
284
+
285
+ def url
286
+ #access_address
287
+ "#{LibraryGroup.site_config.url}#{self.class.to_s.tableize}/#{self.id}"
288
+ end
289
+
290
+ def set_series_statement(series_statement)
291
+ if series_statement
292
+ self.series_statement_id = series_statement.id
293
+ if periodical?
294
+ set_serial_information(series_statement)
295
+ else
296
+ self.original_title = series_statement.original_title
297
+ self.title_transcription = series_statement.title_transcription
298
+ end
299
+ end
300
+ end
301
+
302
+ def creator
303
+ creators.collect(&:name).flatten
304
+ end
305
+
306
+ def contributor
307
+ contributors.collect(&:name).flatten
308
+ end
309
+
310
+ def publisher
311
+ publishers.collect(&:name).flatten
312
+ end
313
+
314
+ def title
315
+ titles
316
+ end
317
+
318
+ def hyphenated_isbn
319
+ ISBN_Tools.hyphenate(isbn)
320
+ end
321
+
322
+ # TODO: よりよい推薦方法
323
+ def self.pickup(keyword = nil)
324
+ return nil if self.cached_numdocs < 5
325
+ manifestation = nil
326
+ # TODO: ヒット件数が0件のキーワードがあるときに指摘する
327
+ response = Manifestation.search(:include => [:creators, :contributors, :publishers, :items]) do
328
+ fulltext keyword if keyword
329
+ order_by(:random)
330
+ paginate :page => 1, :per_page => 1
331
+ end
332
+ manifestation = response.results.first
333
+ end
334
+
335
+ def extract_text
336
+ return nil unless attachment.path
337
+ # TODO: S3 support
338
+ response = `curl "#{Sunspot.config.solr.url}/update/extract?&extractOnly=true&wt=ruby" --data-binary @#{attachment.path} -H "Content-type:text/html"`
339
+ self.fulltext = eval(response)[""]
340
+ save(:validate => false)
341
+ end
342
+
343
+ def created(patron)
344
+ creates.where(:patron_id => patron.id).first
345
+ end
346
+
347
+ def realized(patron)
348
+ realizes.where(:patron_id => patron.id).first
349
+ end
350
+
351
+ def produced(patron)
352
+ produces.where(:patron_id => patron.id).first
353
+ end
354
+
355
+ def sort_title
356
+ if title_transcription
357
+ NKF.nkf('-w --katakana', title_transcription)
358
+ else
359
+ original_title
360
+ end
361
+ end
362
+
363
+ def self.find_by_isbn(isbn)
364
+ if ISBN_Tools.is_valid?(isbn)
365
+ ISBN_Tools.cleanup!(isbn)
366
+ if isbn.size == 10
367
+ Manifestation.where(:isbn => ISBN_Tools.isbn10_to_isbn13(isbn)).first || Manifestation.where(:isbn => isbn).first
368
+ else
369
+ Manifestation.where(:isbn => isbn).first || Manifestation.where(:isbn => ISBN_Tools.isbn13_to_isbn10(isbn)).first
370
+ end
371
+ end
372
+ end
373
+
374
+ def index_series_statement
375
+ series_statement.try(:index)
376
+ end
377
+
378
+ def acquired_at
379
+ items.order(:acquired_at).first.try(:acquired_at)
380
+ end
381
+
382
+ def set_periodical
383
+ unless series_statement
384
+ series_statement = SeriesStatement.where(:id => series_statement_id).first
385
+ end
386
+ end
387
+
388
+ def root_of_series?
389
+ return true if series_statement.try(:root_manifestation) == self
390
+ false
391
+ end
392
+
393
+ def periodical_master?
394
+ if series_statement
395
+ return true if series_statement.periodical and root_of_series?
396
+ end
397
+ false
398
+ end
399
+
400
+ def periodical?
401
+ if new_record?
402
+ series = SeriesStatement.where(:id => series_statement_id).first
403
+ else
404
+ series = series_statement
405
+ end
406
+ if series.try(:periodical)
407
+ return true unless root_of_series?
408
+ end
409
+ false
410
+ end
411
+
412
+ def web_item
413
+ items.where(:shelf_id => Shelf.web.id).first
414
+ end
415
+
416
+ if defined?(EnjuCirculation)
417
+ include EnjuCirculation::Manifestation
418
+ has_many :reserves, :foreign_key => :manifestation_id
419
+
420
+ searchable do
421
+ boolean :reservable do
422
+ items.for_checkout.exists?
423
+ end
424
+ end
425
+ end
426
+
427
+ if defined?(EnjuSubject)
428
+ has_many :work_has_subjects, :foreign_key => 'work_id', :dependent => :destroy
429
+ has_many :subjects, :through => :work_has_subjects
430
+
431
+ searchable do
432
+ text :subject do
433
+ (subjects.collect(&:term) + subjects.collect(&:term_transcription)).compact
434
+ end
435
+ string :subject, :multiple => true do
436
+ (subjects.collect(&:term) + subjects.collect(&:term_transcription)).compact
437
+ end
438
+ string :classification, :multiple => true do
439
+ classifications.collect(&:category)
440
+ end
441
+ integer :subject_ids, :multiple => true
442
+ end
443
+
444
+ def classifications
445
+ subjects.collect(&:classifications).flatten
446
+ end
447
+ end
448
+
449
+ if defined?(EnjuBookmark)
450
+ has_many :bookmarks, :include => :tags, :dependent => :destroy, :foreign_key => :manifestation_id
451
+ has_many :users, :through => :bookmarks
452
+
453
+ searchable do
454
+ string :tag, :multiple => true do
455
+ tags.collect(&:name)
456
+ end
457
+ text :tag do
458
+ tags.collect(&:name)
459
+ end
460
+ end
461
+
462
+ def bookmarked?(user)
463
+ return true if user.bookmarks.where(:url => url).first
464
+ false
465
+ end
466
+
467
+ def tags
468
+ if self.bookmarks.first
469
+ self.bookmarks.tag_counts
470
+ else
471
+ []
472
+ end
473
+ end
474
+ end
475
+
476
+ if defined?(EnjuQuestion)
477
+ def questions(options = {})
478
+ id = self.id
479
+ options = {:page => 1, :per_page => Question.per_page}.merge(options)
480
+ page = options[:page]
481
+ per_page = options[:per_page]
482
+ user = options[:user]
483
+ Question.search do
484
+ with(:manifestation_id).equal_to id
485
+ any_of do
486
+ unless user.try(:has_role?, 'Librarian')
487
+ with(:shared).equal_to true
488
+ # with(:username).equal_to user.try(:username)
489
+ end
490
+ end
491
+ paginate :page => page, :per_page => per_page
492
+ end.results
493
+ end
494
+ end
495
+
496
+ def set_patron_role_type(patron_lists, options = {:scope => :creator})
497
+ patron_lists.each do |patron_list|
498
+ name_and_role = patron_list[:full_name].split('||')
499
+ patron = Patron.where(:full_name => name_and_role[0]).first
500
+ next unless patron
501
+ type = name_and_role[1].to_s.strip
502
+
503
+ case options[:scope]
504
+ when :creator
505
+ type = 'author' if type.blank?
506
+ role_type = CreateType.where(:name => type).first
507
+ create = Create.where(:work_id => self.id, :patron_id => patron.id).first
508
+ if create
509
+ create.create_type = role_type
510
+ create.save(:validate => false)
511
+ end
512
+ when :publisher
513
+ type = 'publisher' if role_type.blank?
514
+ produce = Produce.where(:manifestation_id => self.id, :patron_id => patron.id).first
515
+ if produce
516
+ produce.produce_type = ProduceType.where(:name => type).first
517
+ produce.save(:validate => false)
518
+ end
519
+ else
520
+ raise "#{options[:scope]} is not supported!"
521
+ end
522
+ end
523
+ end
524
+
525
+ private
526
+ def set_serial_information(series_statement = nil)
527
+ return nil unless series_statement.try(:periodical?)
528
+ manifestation = series_statement.last_issue
529
+
530
+ if manifestation
531
+ self.original_title = manifestation.original_title
532
+ self.title_transcription = manifestation.title_transcription
533
+ self.title_alternative = manifestation.title_alternative
534
+ self.issn = series_statement.issn
535
+ # TODO: 雑誌ごとに巻・号・通号のパターンを設定できるようにする
536
+ if manifestation.serial_number.to_i > 0
537
+ self.serial_number = manifestation.serial_number.to_i + 1
538
+ if manifestation.issue_number.to_i > 0
539
+ self.issue_number = manifestation.issue_number.to_i + 1
540
+ else
541
+ self.issue_number = manifestation.issue_number
542
+ end
543
+ self.volume_number = manifestation.volume_number
544
+ else
545
+ if manifestation.issue_number.to_i > 0
546
+ self.issue_number = manifestation.issue_number.to_i + 1
547
+ self.volume_number = manifestation.volume_number
548
+ else
549
+ if manifestation.volume_number.to_i > 0
550
+ self.volume_number = manifestation.volume_number.to_i + 1
551
+ end
552
+ end
553
+ end
554
+ end
555
+ self
556
+ end
557
+ end
558
+
559
+ # == Schema Information
560
+ #
561
+ # Table name: manifestations
562
+ #
563
+ # id :integer not null, primary key
564
+ # original_title :text not null
565
+ # title_alternative :text
566
+ # title_transcription :text
567
+ # classification_number :string(255)
568
+ # manifestation_identifier :string(255)
569
+ # date_of_publication :datetime
570
+ # date_copyrighted :datetime
571
+ # created_at :datetime not null
572
+ # updated_at :datetime not null
573
+ # deleted_at :datetime
574
+ # access_address :string(255)
575
+ # language_id :integer default(1), not null
576
+ # carrier_type_id :integer default(1), not null
577
+ # extent_id :integer default(1), not null
578
+ # start_page :integer
579
+ # end_page :integer
580
+ # height :integer
581
+ # width :integer
582
+ # depth :integer
583
+ # isbn :string(255)
584
+ # isbn10 :string(255)
585
+ # wrong_isbn :string(255)
586
+ # nbn :string(255)
587
+ # lccn :string(255)
588
+ # oclc_number :string(255)
589
+ # issn :string(255)
590
+ # price :integer
591
+ # fulltext :text
592
+ # volume_number_string :string(255)
593
+ # issue_number_string :string(255)
594
+ # serial_number_string :string(255)
595
+ # edition :integer
596
+ # note :text
597
+ # repository_content :boolean default(FALSE), not null
598
+ # lock_version :integer default(0), not null
599
+ # required_role_id :integer default(1), not null
600
+ # state :string(255)
601
+ # required_score :integer default(0), not null
602
+ # frequency_id :integer default(1), not null
603
+ # subscription_master :boolean default(FALSE), not null
604
+ # ipaper_id :integer
605
+ # ipaper_access_key :string(255)
606
+ # attachment_file_name :string(255)
607
+ # attachment_content_type :string(255)
608
+ # attachment_file_size :integer
609
+ # attachment_updated_at :datetime
610
+ # title_alternative_transcription :text
611
+ # description :text
612
+ # abstract :text
613
+ # available_at :datetime
614
+ # valid_until :datetime
615
+ # date_submitted :datetime
616
+ # date_accepted :datetime
617
+ # date_caputured :datetime
618
+ # ndl_bib_id :string(255)
619
+ # pub_date :string(255)
620
+ # edition_string :string(255)
621
+ # volume_number :integer
622
+ # issue_number :integer
623
+ # serial_number :integer
624
+ # ndc :string(255)
625
+ # content_type_id :integer default(1)
626
+ # year_of_publication :integer
627
+ # attachment_fingerprint :string(255)
628
+ # attachment_meta :text
629
+ # month_of_publication :integer
630
+ #
631
+