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,276 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
class Item < ActiveRecord::Base
|
3
|
+
scope :on_shelf, where('shelf_id != 1')
|
4
|
+
scope :on_web, where(:shelf_id => 1)
|
5
|
+
has_one :exemplify
|
6
|
+
has_one :manifestation, :through => :exemplify
|
7
|
+
has_many :owns
|
8
|
+
has_many :patrons, :through => :owns
|
9
|
+
belongs_to :shelf, :counter_cache => true, :validate => true
|
10
|
+
delegate :display_name, :to => :shelf, :prefix => true
|
11
|
+
belongs_to :bookstore, :validate => true
|
12
|
+
has_many :donates
|
13
|
+
has_many :donors, :through => :donates, :source => :patron
|
14
|
+
belongs_to :required_role, :class_name => 'Role', :foreign_key => 'required_role_id', :validate => true
|
15
|
+
has_one :resource_import_result
|
16
|
+
belongs_to :budget_type
|
17
|
+
has_one :accept
|
18
|
+
|
19
|
+
validates_associated :shelf, :bookstore
|
20
|
+
validates :manifestation_id, :presence => true, :on => :create
|
21
|
+
validates :item_identifier, :allow_blank => true, :uniqueness => true,
|
22
|
+
:format => {:with => /\A[0-9A-Za-z_]+\Z/}
|
23
|
+
validates :url, :url => true, :allow_blank => true, :length => {:maximum => 255}
|
24
|
+
|
25
|
+
searchable do
|
26
|
+
text :item_identifier, :note, :title, :creator, :contributor, :publisher
|
27
|
+
string :item_identifier
|
28
|
+
string :library do
|
29
|
+
shelf.library.name if shelf
|
30
|
+
end
|
31
|
+
integer :required_role_id
|
32
|
+
integer :manifestation_id do
|
33
|
+
manifestation.id if manifestation
|
34
|
+
end
|
35
|
+
integer :shelf_id
|
36
|
+
integer :patron_ids, :multiple => true
|
37
|
+
time :created_at
|
38
|
+
time :updated_at
|
39
|
+
end
|
40
|
+
|
41
|
+
attr_accessor :library_id, :manifestation_id
|
42
|
+
|
43
|
+
if defined?(EnjuCirculation)
|
44
|
+
FOR_CHECKOUT_CIRCULATION_STATUS = [
|
45
|
+
'Available On Shelf',
|
46
|
+
'On Loan',
|
47
|
+
'Waiting To Be Reshelved'
|
48
|
+
]
|
49
|
+
FOR_CHECKOUT_USE_RESTRICTION = [
|
50
|
+
'Available For Supply Without Return',
|
51
|
+
'Limited Circulation, Long Loan Period',
|
52
|
+
'Limited Circulation, Short Loan Period',
|
53
|
+
'No Reproduction',
|
54
|
+
'Overnight Only',
|
55
|
+
'Renewals Not Permitted',
|
56
|
+
'Supervision Required',
|
57
|
+
'Term Loan',
|
58
|
+
'User Signature Required',
|
59
|
+
'Limited Circulation, Normal Loan Period'
|
60
|
+
]
|
61
|
+
scope :for_checkout, includes(:circulation_status, :use_restriction).where(
|
62
|
+
'circulation_statuses.name' => FOR_CHECKOUT_CIRCULATION_STATUS,
|
63
|
+
'use_restrictions.name' => FOR_CHECKOUT_USE_RESTRICTION
|
64
|
+
).where('item_identifier IS NOT NULL')
|
65
|
+
scope :removed, includes(:circulation_status).where('circulation_statuses.name' => 'Removed')
|
66
|
+
has_many :checkouts
|
67
|
+
has_many :reserves
|
68
|
+
has_many :reserved_patrons, :through => :reserves, :class_name => 'Patron'
|
69
|
+
has_many :checked_items, :dependent => :destroy
|
70
|
+
has_many :baskets, :through => :checked_items
|
71
|
+
belongs_to :circulation_status, :validate => true
|
72
|
+
belongs_to :checkout_type
|
73
|
+
has_many :lending_policies, :dependent => :destroy
|
74
|
+
has_one :item_has_use_restriction, :dependent => :destroy
|
75
|
+
has_one :use_restriction, :through => :item_has_use_restriction
|
76
|
+
validates_associated :circulation_status, :checkout_type
|
77
|
+
validates_presence_of :circulation_status, :checkout_type
|
78
|
+
before_save :set_use_restriction
|
79
|
+
searchable do
|
80
|
+
integer :circulation_status_id
|
81
|
+
end
|
82
|
+
attr_accessor :use_restriction_id
|
83
|
+
|
84
|
+
def set_circulation_status
|
85
|
+
self.circulation_status = CirculationStatus.where(:name => 'In Process').first if self.circulation_status.nil?
|
86
|
+
end
|
87
|
+
|
88
|
+
def set_use_restriction
|
89
|
+
if self.use_restriction_id
|
90
|
+
self.use_restriction = UseRestriction.where(:id => self.use_restriction_id).first
|
91
|
+
else
|
92
|
+
return if use_restriction
|
93
|
+
self.use_restriction = UseRestriction.where(:name => 'Limited Circulation, Normal Loan Period').first
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def checkout_status(user)
|
98
|
+
user.user_group.user_group_has_checkout_types.where(:checkout_type_id => self.checkout_type.id).first
|
99
|
+
end
|
100
|
+
|
101
|
+
def reserved?
|
102
|
+
return true if manifestation.next_reservation
|
103
|
+
false
|
104
|
+
end
|
105
|
+
|
106
|
+
def rent?
|
107
|
+
return true if self.checkouts.not_returned.select(:item_id).detect{|checkout| checkout.item_id == self.id}
|
108
|
+
false
|
109
|
+
end
|
110
|
+
|
111
|
+
def reserved_by_user?(user)
|
112
|
+
if manifestation.next_reservation
|
113
|
+
return true if manifestation.next_reservation.user == user
|
114
|
+
end
|
115
|
+
false
|
116
|
+
end
|
117
|
+
|
118
|
+
def available_for_checkout?
|
119
|
+
if circulation_status.name == 'On Loan'
|
120
|
+
false
|
121
|
+
else
|
122
|
+
manifestation.items.for_checkout.include?(self)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def checkout!(user)
|
127
|
+
self.circulation_status = CirculationStatus.where(:name => 'On Loan').first
|
128
|
+
if self.reserved_by_user?(user)
|
129
|
+
manifestation.next_reservation.update_attributes(:checked_out_at => Time.zone.now)
|
130
|
+
manifestation.next_reservation.sm_complete!
|
131
|
+
end
|
132
|
+
save!
|
133
|
+
end
|
134
|
+
|
135
|
+
def checkin!
|
136
|
+
self.circulation_status = CirculationStatus.where(:name => 'Available On Shelf').first
|
137
|
+
save(:validate => false)
|
138
|
+
end
|
139
|
+
|
140
|
+
def retain(librarian)
|
141
|
+
Item.transaction do
|
142
|
+
reservation = manifestation.next_reservation
|
143
|
+
unless reservation.nil?
|
144
|
+
reservation.item = self
|
145
|
+
reservation.sm_retain!
|
146
|
+
reservation.send_message(librarian)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def lending_rule(user)
|
152
|
+
lending_policies.where(:user_group_id => user.user_group.id).first
|
153
|
+
end
|
154
|
+
|
155
|
+
def not_for_loan?
|
156
|
+
!manifestation.items.for_checkout.include?(self)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
if defined?(EnjuInventory)
|
161
|
+
has_many :inventories, :dependent => :destroy
|
162
|
+
has_many :inventory_files, :through => :inventories
|
163
|
+
searchable do
|
164
|
+
integer :inventory_file_ids, :multiple => true
|
165
|
+
end
|
166
|
+
|
167
|
+
def self.inventory_items(inventory_file, mode = 'not_on_shelf')
|
168
|
+
item_ids = Item.select(:id).collect(&:id)
|
169
|
+
inventory_item_ids = inventory_file.items.select('items.id').collect(&:id)
|
170
|
+
case mode
|
171
|
+
when 'not_on_shelf'
|
172
|
+
Item.where(:id => (item_ids - inventory_item_ids))
|
173
|
+
when 'not_in_catalog'
|
174
|
+
Item.where(:id => (inventory_item_ids - item_ids))
|
175
|
+
end
|
176
|
+
rescue
|
177
|
+
nil
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
if defined?(EnjuQuestion)
|
182
|
+
has_many :answer_has_items, :dependent => :destroy
|
183
|
+
has_many :answers, :through => :answer_has_items
|
184
|
+
end
|
185
|
+
|
186
|
+
if defined?(EnjuInterLibraryLoan)
|
187
|
+
has_many :inter_library_loans, :dependent => :destroy
|
188
|
+
def inter_library_loaned?
|
189
|
+
true if self.inter_library_loans.size > 0
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
def self.per_page
|
194
|
+
10
|
195
|
+
end
|
196
|
+
|
197
|
+
def title
|
198
|
+
manifestation.try(:original_title)
|
199
|
+
end
|
200
|
+
|
201
|
+
def creator
|
202
|
+
manifestation.try(:creator)
|
203
|
+
end
|
204
|
+
|
205
|
+
def contributor
|
206
|
+
manifestation.try(:contributor)
|
207
|
+
end
|
208
|
+
|
209
|
+
def publisher
|
210
|
+
manifestation.try(:publisher)
|
211
|
+
end
|
212
|
+
|
213
|
+
def shelf_name
|
214
|
+
shelf.name
|
215
|
+
end
|
216
|
+
|
217
|
+
def hold?(library)
|
218
|
+
return true if self.shelf.library == library
|
219
|
+
false
|
220
|
+
end
|
221
|
+
|
222
|
+
def owned(patron)
|
223
|
+
owns.where(:patron_id => patron.id).first
|
224
|
+
end
|
225
|
+
|
226
|
+
def library_url
|
227
|
+
"#{LibraryGroup.site_config.url}libraries/#{self.shelf.library.name}"
|
228
|
+
end
|
229
|
+
|
230
|
+
def manifestation_url
|
231
|
+
Addressable::URI.parse("#{LibraryGroup.site_config.url}manifestations/#{self.manifestation.id}").normalize.to_s if self.manifestation
|
232
|
+
end
|
233
|
+
|
234
|
+
def deletable?
|
235
|
+
if circulation_status.name == 'Removed'
|
236
|
+
return false
|
237
|
+
else
|
238
|
+
if defined?(EnjuCirculation)
|
239
|
+
checkouts.not_returned.empty?
|
240
|
+
else
|
241
|
+
true
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
|
248
|
+
# == Schema Information
|
249
|
+
#
|
250
|
+
# Table name: items
|
251
|
+
#
|
252
|
+
# id :integer not null, primary key
|
253
|
+
# call_number :string(255)
|
254
|
+
# item_identifier :string(255)
|
255
|
+
# circulation_status_id :integer default(5), not null
|
256
|
+
# checkout_type_id :integer default(1), not null
|
257
|
+
# created_at :datetime not null
|
258
|
+
# updated_at :datetime not null
|
259
|
+
# deleted_at :datetime
|
260
|
+
# shelf_id :integer default(1), not null
|
261
|
+
# include_supplements :boolean default(FALSE), not null
|
262
|
+
# checkouts_count :integer default(0), not null
|
263
|
+
# owns_count :integer default(0), not null
|
264
|
+
# note :text
|
265
|
+
# url :string(255)
|
266
|
+
# price :integer
|
267
|
+
# lock_version :integer default(0), not null
|
268
|
+
# required_role_id :integer default(1), not null
|
269
|
+
# state :string(255)
|
270
|
+
# required_score :integer default(0), not null
|
271
|
+
# acquired_at :datetime
|
272
|
+
# bookstore_id :integer
|
273
|
+
# missing_since :datetime
|
274
|
+
# budget_type_id :integer
|
275
|
+
#
|
276
|
+
|