umlaut 3.0.0alpha1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. data/LICENSE +7 -0
  2. data/README.md +49 -0
  3. data/Rakefile +37 -0
  4. data/app/assets/images/error.gif +0 -0
  5. data/app/assets/images/export_bg_bot.gif +0 -0
  6. data/app/assets/images/export_bg_mid.gif +0 -0
  7. data/app/assets/images/export_bg_top.gif +0 -0
  8. data/app/assets/images/famfamfam/book_open.png +0 -0
  9. data/app/assets/images/famfamfam/cross.png +0 -0
  10. data/app/assets/images/famfamfam/page_sound.gif +0 -0
  11. data/app/assets/images/famfamfam/page_text.gif +0 -0
  12. data/app/assets/images/famfamfam/page_up.gif +0 -0
  13. data/app/assets/images/famfamfam/page_white.png +0 -0
  14. data/app/assets/images/famfamfam/readme.html +1495 -0
  15. data/app/assets/images/famfamfam/tiny_cross.png +0 -0
  16. data/app/assets/images/frame_remove.gif +0 -0
  17. data/app/assets/images/ico_go.gif +0 -0
  18. data/app/assets/images/jhu_findit.gif +0 -0
  19. data/app/assets/images/list_closed.png +0 -0
  20. data/app/assets/images/list_open.png +0 -0
  21. data/app/assets/images/more_info.gif +0 -0
  22. data/app/assets/images/rails.png +0 -0
  23. data/app/assets/images/request.gif +0 -0
  24. data/app/assets/images/spinner.gif +0 -0
  25. data/app/assets/javascripts/umlaut/ajax_windows.js +35 -0
  26. data/app/assets/javascripts/umlaut/ensure_window_size.js.erb +34 -0
  27. data/app/assets/javascripts/umlaut/expand_contract_toggle.js +25 -0
  28. data/app/assets/javascripts/umlaut/search_autocomplete.js +46 -0
  29. data/app/assets/javascripts/umlaut/simple_visible_toggle.js +8 -0
  30. data/app/assets/javascripts/umlaut/update_html.js +152 -0
  31. data/app/assets/javascripts/umlaut.js +17 -0
  32. data/app/assets/stylesheets/umlaut.css +857 -0
  33. data/app/controllers/application_controller.rb +14 -0
  34. data/app/controllers/export_email_controller.rb +123 -0
  35. data/app/controllers/js_helper_controller.rb +10 -0
  36. data/app/controllers/link_router_controller.rb +87 -0
  37. data/app/controllers/open_search_controller.rb +9 -0
  38. data/app/controllers/resolve_controller.rb +288 -0
  39. data/app/controllers/resource_controller.rb +83 -0
  40. data/app/controllers/search_controller.rb +328 -0
  41. data/app/controllers/search_methods/sfx3.rb +148 -0
  42. data/app/controllers/search_methods/sfx4.rb +257 -0
  43. data/app/controllers/search_methods/sfx_api.rb +47 -0
  44. data/app/controllers/store_controller.rb +64 -0
  45. data/app/controllers/umlaut/controller_behavior.rb +20 -0
  46. data/app/controllers/umlaut/controller_logic.rb +96 -0
  47. data/app/controllers/umlaut/error_handling.rb +48 -0
  48. data/app/controllers/umlaut_controller.rb +112 -0
  49. data/app/helpers/application_helper.rb +4 -0
  50. data/app/helpers/emailer_helper.rb +43 -0
  51. data/app/helpers/export_email_helper.rb +34 -0
  52. data/app/helpers/open_search_helper.rb +7 -0
  53. data/app/helpers/resolve_helper.rb +225 -0
  54. data/app/helpers/search_helper.rb +50 -0
  55. data/app/helpers/umlaut/footer_helper.rb +64 -0
  56. data/app/helpers/umlaut/helper.rb +62 -0
  57. data/app/helpers/umlaut/html_head_helper.rb +37 -0
  58. data/app/helpers/umlaut/url_generation.rb +77 -0
  59. data/app/mailers/emailer.rb +48 -0
  60. data/app/models/clickthrough.rb +2 -0
  61. data/app/models/collection.rb +259 -0
  62. data/app/models/crossref_lookup.rb +2 -0
  63. data/app/models/dispatched_service.rb +58 -0
  64. data/app/models/permalink.rb +29 -0
  65. data/app/models/referent.rb +473 -0
  66. data/app/models/referent_value.rb +14 -0
  67. data/app/models/request.rb +449 -0
  68. data/app/models/service_response.rb +179 -0
  69. data/app/models/service_store.rb +59 -0
  70. data/app/models/service_type_value.rb +58 -0
  71. data/app/models/service_wave.rb +150 -0
  72. data/app/models/sfx_db/az_additional_title.rb +11 -0
  73. data/app/models/sfx_db/az_letter_group.rb +11 -0
  74. data/app/models/sfx_db/az_title.rb +38 -0
  75. data/app/models/sfx_db/az_title_v2.rb +34 -0
  76. data/app/models/sfx_db/isbn.rb +12 -0
  77. data/app/models/sfx_db/issn.rb +12 -0
  78. data/app/models/sfx_db/object.rb +35 -0
  79. data/app/models/sfx_db/object_portfolio.rb +6 -0
  80. data/app/models/sfx_db/publisher.rb +10 -0
  81. data/app/models/sfx_db/sfx_db_base.rb +54 -0
  82. data/app/models/sfx_db/target.rb +9 -0
  83. data/app/models/sfx_db/target_service.rb +10 -0
  84. data/app/models/sfx_db/title.rb +10 -0
  85. data/app/models/sfx_db.rb +10 -0
  86. data/app/models/sfx_url.rb +35 -0
  87. data/app/views/emailer/citation.text.erb +28 -0
  88. data/app/views/emailer/short_citation.text.erb +8 -0
  89. data/app/views/export_email/_email.html.erb +25 -0
  90. data/app/views/export_email/_send_email.html.erb +3 -0
  91. data/app/views/export_email/_send_txt.html.erb +3 -0
  92. data/app/views/export_email/_txt.html.erb +62 -0
  93. data/app/views/export_email/email.html.erb +3 -0
  94. data/app/views/export_email/send_email.html.erb +1 -0
  95. data/app/views/export_email/send_txt.html.erb +1 -0
  96. data/app/views/export_email/txt.html.erb +3 -0
  97. data/app/views/js_helper/loader.erb.js +13 -0
  98. data/app/views/layouts/umlaut.html.erb +52 -0
  99. data/app/views/open_search/index.html.erb +9 -0
  100. data/app/views/resolve/_api_in_progress.xml.erb +21 -0
  101. data/app/views/resolve/_background_progress.html.erb +51 -0
  102. data/app/views/resolve/_background_updater.html.erb +38 -0
  103. data/app/views/resolve/_citation.html.erb +87 -0
  104. data/app/views/resolve/_coins.html.erb +1 -0
  105. data/app/views/resolve/_compact_citation.html.erb +33 -0
  106. data/app/views/resolve/_cover_image.html.erb +35 -0
  107. data/app/views/resolve/_fulltext.html.erb +55 -0
  108. data/app/views/resolve/_help.html.erb +17 -0
  109. data/app/views/resolve/_holding.html.erb +91 -0
  110. data/app/views/resolve/_related_items.html.erb +35 -0
  111. data/app/views/resolve/_search_inside.html.erb +62 -0
  112. data/app/views/resolve/_section_display.html.erb +49 -0
  113. data/app/views/resolve/_service_errors.html.erb +29 -0
  114. data/app/views/resolve/_standard_response_item.html.erb +89 -0
  115. data/app/views/resolve/api.xml.builder +72 -0
  116. data/app/views/resolve/background_status.html.erb +26 -0
  117. data/app/views/resolve/index.html.erb +73 -0
  118. data/app/views/resolve/partial_html_sections.xml.erb +30 -0
  119. data/app/views/search/_a_to_z.html.erb +6 -0
  120. data/app/views/search/_citation.html.erb +94 -0
  121. data/app/views/search/_pager.html.erb +60 -0
  122. data/app/views/search/books.html.erb +103 -0
  123. data/app/views/search/journal_search.html.erb +90 -0
  124. data/app/views/search/journals.html.erb +167 -0
  125. data/app/views/search/opensearch_description.rxml +10 -0
  126. data/app/views/testing/index.html.erb +1 -0
  127. data/app/views/umlaut/README +5 -0
  128. data/app/views/umlaut/error.html.erb +45 -0
  129. data/db/migrate/01_umlaut_init.rb +113 -0
  130. data/db/orig_fixed_data/service_type_values.yml +120 -0
  131. data/db/seeds.rb +7 -0
  132. data/lib/CronTab.rb +192 -0
  133. data/lib/aws_product_sign.rb +146 -0
  134. data/lib/exlibris/aleph/patron.rb +64 -0
  135. data/lib/exlibris/aleph/record.rb +54 -0
  136. data/lib/exlibris/aleph/rest_api.rb +29 -0
  137. data/lib/exlibris/primo/holding.rb +192 -0
  138. data/lib/exlibris/primo/rsrc.rb +17 -0
  139. data/lib/exlibris/primo/searcher.rb +276 -0
  140. data/lib/exlibris/primo/source/aleph.rb +46 -0
  141. data/lib/exlibris/primo/source/distribution/nyu_aleph.rb +323 -0
  142. data/lib/exlibris/primo/toc.rb +17 -0
  143. data/lib/exlibris/primo_ws.rb +140 -0
  144. data/lib/generators/templates/umlaut_services.yml +237 -0
  145. data/lib/generators/umlaut/asset_hooks_generator.rb +44 -0
  146. data/lib/generators/umlaut/install_generator.rb +110 -0
  147. data/lib/hip3/bib.rb +291 -0
  148. data/lib/hip3/bib_searcher.rb +302 -0
  149. data/lib/hip3/custom_field_lookup.rb +44 -0
  150. data/lib/hip3/holding.rb +50 -0
  151. data/lib/hip3/item.rb +65 -0
  152. data/lib/hip3/receipt.rb +7 -0
  153. data/lib/hip3/serial_copy.rb +82 -0
  154. data/lib/holding.rb +32 -0
  155. data/lib/marc_helper.rb +254 -0
  156. data/lib/metadata_helper.rb +312 -0
  157. data/lib/opensearch_feed.rb +398 -0
  158. data/lib/opensearch_query.rb +98 -0
  159. data/lib/referent_filter.rb +16 -0
  160. data/lib/referent_filters/dissertation_catch.rb +45 -0
  161. data/lib/section_renderer.rb +503 -0
  162. data/lib/service.rb +336 -0
  163. data/lib/service_adaptors/ajax_export.rb +37 -0
  164. data/lib/service_adaptors/amazon.rb +412 -0
  165. data/lib/service_adaptors/blacklight.rb +327 -0
  166. data/lib/service_adaptors/book_finder.rb +40 -0
  167. data/lib/service_adaptors/bx.rb +51 -0
  168. data/lib/service_adaptors/cover_thing.rb +73 -0
  169. data/lib/service_adaptors/elsevier_cover.rb +57 -0
  170. data/lib/service_adaptors/email_export.rb +10 -0
  171. data/lib/service_adaptors/ezproxy.rb +171 -0
  172. data/lib/service_adaptors/google_book_search.rb +442 -0
  173. data/lib/service_adaptors/gpo.rb +124 -0
  174. data/lib/service_adaptors/hathi_trust.rb +308 -0
  175. data/lib/service_adaptors/hip3_service.rb +150 -0
  176. data/lib/service_adaptors/hip_holding_search.rb +237 -0
  177. data/lib/service_adaptors/internet_archive.rb +488 -0
  178. data/lib/service_adaptors/isbn_db.rb +86 -0
  179. data/lib/service_adaptors/isi.rb +258 -0
  180. data/lib/service_adaptors/jcr.rb +146 -0
  181. data/lib/service_adaptors/opac.rb +351 -0
  182. data/lib/service_adaptors/open_library.rb +316 -0
  183. data/lib/service_adaptors/open_library_cover.rb +73 -0
  184. data/lib/service_adaptors/primo_service.rb +392 -0
  185. data/lib/service_adaptors/primo_source.rb +78 -0
  186. data/lib/service_adaptors/pubmed.rb +133 -0
  187. data/lib/service_adaptors/request_to_fixture.rb +68 -0
  188. data/lib/service_adaptors/scopus.rb +295 -0
  189. data/lib/service_adaptors/sfx-new.rb +557 -0
  190. data/lib/service_adaptors/sfx.rb +566 -0
  191. data/lib/service_adaptors/sfx_backchannel_record.rb +69 -0
  192. data/lib/service_adaptors/txt_holding_export.rb +32 -0
  193. data/lib/service_adaptors/ulrichs_cover.rb +57 -0
  194. data/lib/service_adaptors/ulrichs_link.rb +47 -0
  195. data/lib/service_adaptors/worldcat.rb +116 -0
  196. data/lib/service_adaptors/worldcat_identities.rb +591 -0
  197. data/lib/tasks/umlaut.rake +134 -0
  198. data/lib/umlaut/default_configuration.rb +5 -0
  199. data/lib/umlaut/routes.rb +136 -0
  200. data/lib/umlaut/version.rb +3 -0
  201. data/lib/umlaut.rb +37 -0
  202. data/lib/umlaut_configurable.rb +343 -0
  203. data/lib/umlaut_http.rb +100 -0
  204. data/lib/xml_schema_helper.rb +109 -0
  205. data/test/dummy/Rakefile +7 -0
  206. data/test/dummy/app/assets/javascripts/application.js +13 -0
  207. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  208. data/test/dummy/app/controllers/application_controller.rb +3 -0
  209. data/test/dummy/app/controllers/umlaut_controller.rb +112 -0
  210. data/test/dummy/app/helpers/application_helper.rb +2 -0
  211. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  212. data/test/dummy/config/application.rb +45 -0
  213. data/test/dummy/config/boot.rb +10 -0
  214. data/test/dummy/config/database-jhu.yml +44 -0
  215. data/test/dummy/config/database.yml +25 -0
  216. data/test/dummy/config/environment.rb +5 -0
  217. data/test/dummy/config/environments/development.rb +34 -0
  218. data/test/dummy/config/environments/production.rb +60 -0
  219. data/test/dummy/config/environments/test.rb +39 -0
  220. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  221. data/test/dummy/config/initializers/inflections.rb +10 -0
  222. data/test/dummy/config/initializers/mime_types.rb +5 -0
  223. data/test/dummy/config/initializers/secret_token.rb +7 -0
  224. data/test/dummy/config/initializers/session_store.rb +8 -0
  225. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  226. data/test/dummy/config/locales/en.yml +5 -0
  227. data/test/dummy/config/routes.rb +61 -0
  228. data/test/dummy/config/umlaut_services.yml +237 -0
  229. data/test/dummy/config.ru +4 -0
  230. data/test/dummy/db/migrate/20111228211210_umlaut_init.rb +113 -0
  231. data/test/dummy/db/schema.rb +124 -0
  232. data/test/dummy/log/development.log +12981 -0
  233. data/test/dummy/log/production.log +0 -0
  234. data/test/dummy/public/404.html +26 -0
  235. data/test/dummy/public/422.html +26 -0
  236. data/test/dummy/public/500.html +26 -0
  237. data/test/dummy/public/favicon.ico +0 -0
  238. data/test/dummy/script/rails +6 -0
  239. data/test/dummy/tmp/cache/assets/C5F/340/sprockets%2F99692920160b7a279b86a80415b79db7 +0 -0
  240. data/test/dummy/tmp/cache/assets/C70/4D0/sprockets%2F034ad2036e623081bd352800786dfe80 +0 -0
  241. data/test/dummy/tmp/cache/assets/C73/920/sprockets%2Fd371318f22900492fd180f17c5e2a504 +9268 -0
  242. data/test/dummy/tmp/cache/assets/C80/980/sprockets%2Fc94807409c1523d43e18d25f35d93c41 +0 -0
  243. data/test/dummy/tmp/cache/assets/C8F/780/sprockets%2Fe47e28558116fb5f8038754e60d1961d +11769 -0
  244. data/test/dummy/tmp/cache/assets/CAA/EB0/sprockets%2F1d179210e8b76f1ea63c802688a015e4 +9271 -0
  245. data/test/dummy/tmp/cache/assets/CBB/9C0/sprockets%2F706f28923fb754cad04b9107c89986a1 +0 -0
  246. data/test/dummy/tmp/cache/assets/CBF/B60/sprockets%2F08ca89671549936265dcb673bf02e36f +0 -0
  247. data/test/dummy/tmp/cache/assets/CC9/9F0/sprockets%2F306166316e2cafd13c15e62b51a2339d +0 -0
  248. data/test/dummy/tmp/cache/assets/CF6/F20/sprockets%2F5b2ffa1103079dfd555197838f87a99f +0 -0
  249. data/test/dummy/tmp/cache/assets/CF7/2B0/sprockets%2F25a7c73655bd3598173b39d9f98bcd46 +862 -0
  250. data/test/dummy/tmp/cache/assets/CFE/080/sprockets%2F37fe9f4255baddbd549a659914929398 +0 -0
  251. data/test/dummy/tmp/cache/assets/D22/060/sprockets%2F9aec77b768e91a802d284271c58e2f7e +21357 -0
  252. data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  253. data/test/dummy/tmp/cache/assets/D33/6D0/sprockets%2F500129c57f1146e556ec3aacd6cd38c1 +0 -0
  254. data/test/dummy/tmp/cache/assets/D33/FD0/sprockets%2F2ba0b4e6334a77b923e5f770381bb2bf +0 -0
  255. data/test/dummy/tmp/cache/assets/D42/C20/sprockets%2Fbcf14e437b1582bf93b77670acf8e090 +21353 -0
  256. data/test/dummy/tmp/cache/assets/D50/A30/sprockets%2F7d8b294ac433db5d056538f8cf7c66b9 +0 -0
  257. data/test/dummy/tmp/cache/assets/D54/ED0/sprockets%2F71c9fa01091d432b131da3bb73faf3d4 +872 -0
  258. data/test/dummy/tmp/cache/assets/D65/590/sprockets%2Fc1bb92fc3406a126b7dd302edc96d629 +0 -0
  259. data/test/dummy/tmp/cache/assets/D71/6B0/sprockets%2Fde558b71b494cf09b1bf055c8dff0353 +0 -0
  260. data/test/dummy/tmp/cache/assets/D72/610/sprockets%2Fa8c708eeb30ef93de34d755d4f45d023 +859 -0
  261. data/test/dummy/tmp/cache/assets/D76/AD0/sprockets%2Fe2158cde93188cf5ab6457bc6d6602ec +0 -0
  262. data/test/dummy/tmp/cache/assets/D7A/E40/sprockets%2F9622ffcc499a57627cd1bb18fe31b8e4 +11772 -0
  263. data/test/dummy/tmp/cache/assets/D84/210/sprockets%2Fabd0103ccec2b428ac62c94e4c40b384 +0 -0
  264. data/test/dummy/tmp/cache/assets/D9B/770/sprockets%2F8aacf02eb7dbb0949704b28f27b87e0b +0 -0
  265. data/test/dummy/tmp/cache/assets/DA6/A80/sprockets%2F92e26d8e58d5bcc8b8f6c25d1b05b9c1 +0 -0
  266. data/test/dummy/tmp/cache/assets/DE8/790/sprockets%2Fd1333bde2b9aafcc712d11dd09ab35d8 +0 -0
  267. data/test/dummy/tmp/cache/assets/DF7/F30/sprockets%2F7bc16c4109b17fabe29f8ddbbf732d1c +374 -0
  268. data/test/dummy/tmp/cache/assets/E03/570/sprockets%2F493bdc0ac14cd4f57fdfe4253f992bde +0 -0
  269. data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  270. data/test/dummy/tmp/cache/assets/E0B/4B0/sprockets%2F7988df51a61c81ce6ede4a2d4c8cce4f +377 -0
  271. data/test/dummy/tmp/cache/assets/E5F/960/sprockets%2Fdc007b6cad5c7ef08e33ec28cfff0ef6 +0 -0
  272. data/test/fixtures/dispatched_services.yml +5 -0
  273. data/test/fixtures/permalinks.yml +5 -0
  274. data/test/fixtures/referent_values.yml +1734 -0
  275. data/test/fixtures/referents.yml +156 -0
  276. data/test/fixtures/requests.yml +284 -0
  277. data/test/fixtures/service_responses.yml +5 -0
  278. data/test/fixtures/sfx_urls.yml +4 -0
  279. data/test/performance/browsing_test.rb +9 -0
  280. data/test/test_helper.rb +10 -0
  281. data/test/umlaut_test.rb +7 -0
  282. data/test/unit/aleph_patron_test.rb +39 -0
  283. data/test/unit/aleph_record_benchmarks.rb +28 -0
  284. data/test/unit/aleph_record_test.rb +30 -0
  285. data/test/unit/aws_product_sign_test.rb +93 -0
  286. data/test/unit/collection_test.rb +76 -0
  287. data/test/unit/google_book_search_test.rb +101 -0
  288. data/test/unit/primo_searcher_test.rb +403 -0
  289. data/test/unit/primo_service_test.rb +939 -0
  290. data/test/unit/primo_ws_test.rb +131 -0
  291. data/test/unit/service_response_test.rb +9 -0
  292. data/test/unit/service_test.rb +33 -0
  293. metadata +580 -0
@@ -0,0 +1,11 @@
1
+ module SfxDb
2
+ class AzAdditionalTitle < SfxDbBase
3
+ self.table_name = 'AZ_TITLE_SEARCH_VER3'
4
+ self.primary_key = 'AZ_TITLE_SEARCH_VER3_ID'
5
+
6
+ belongs_to :az_title,
7
+ :foreign_key => 'AZ_TITLE_VER3_ID',
8
+ :class_name => "SfxDb::AzTitle"
9
+
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module SfxDb
2
+ class AzLetterGroup < SfxDbBase
3
+ self.table_name = 'AZ_LETTER_GROUP_VER3'
4
+ self.primary_key = 'AZ_LETTER_GROUP_VER3_ID'
5
+
6
+ belongs_to :az_title,
7
+ :foreign_key => 'AZ_TITLE_VER3_ID',
8
+ :class_name => "SfxDb::AzTitle"
9
+
10
+ end
11
+ end
@@ -0,0 +1,38 @@
1
+ module SfxDb
2
+ class AzTitle < SfxDbBase
3
+ self.table_name = 'AZ_TITLE_VER3'
4
+ self.primary_key = 'AZ_TITLE_VER3_ID'
5
+
6
+ belongs_to :object,
7
+ :foreign_key => 'OBJECT_ID',
8
+ :class_name => "SfxDb::Object"
9
+
10
+ has_many :az_additional_titles,
11
+ :foreign_key => 'AZ_TITLE_VER3_ID'
12
+ has_many :az_letter_groups,
13
+ :foreign_key => 'AZ_TITLE_VER3_ID'
14
+
15
+
16
+ def to_context_object
17
+ #require 'openurl'
18
+ co = OpenURL::ContextObject.new
19
+ # Make sure it uses a journal type referent please, that's what we've
20
+ # got here.
21
+ co.referent = OpenURL::ContextObjectEntity.new_from_format( 'info:ofi/fmt:xml:xsd:journal' )
22
+
23
+
24
+ co.referent.set_metadata('jtitle', self.TITLE_DISPLAY)
25
+ co.referent.set_metadata('object_id', self.OBJECT_ID.to_s)
26
+
27
+ # Add publisher stuff, if possible.
28
+ pub = self.object ? self.object.publishers.first : nil
29
+ if ( pub )
30
+ co.referent.set_metadata('pub', pub.PUBLISHER_DISPLAY )
31
+ co.referent.set_metadata('place', pub.PLACE_OF_PUBLICATION_DISPLAY)
32
+ end
33
+
34
+ return co
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,34 @@
1
+ # The SFX A-Z "version 2" title table.
2
+
3
+ module SfxDb
4
+ class AzTitleV2 < SfxDbBase
5
+ self.table_name = 'AZ_TITLE'
6
+ self.primary_key = 'OBJECT_ID' # This is a lie, it's really a compound pk, but it works anyway for what we need. Rails doesn't do compound pks formally.
7
+
8
+ belongs_to :object,
9
+ :foreign_key => 'OBJECT_ID',
10
+ :class_name => "SfxDb::Object"
11
+
12
+
13
+
14
+ def to_context_object
15
+ co = OpenURL::ContextObject.new
16
+ # Make sure it uses a journal type referent please, that's what we've
17
+ # got here.
18
+ co.referent = OpenURL::ContextObjectEntity.new_from_format( 'info:ofi/fmt:xml:xsd:journal' )
19
+
20
+ co.referent.set_metadata('jtitle', self.TITLE_DISPLAY)
21
+ co.referent.set_metadata('object_id', self.OBJECT_ID.to_s)
22
+
23
+ # Add publisher stuff, if possible.
24
+ pub = self.object.publishers.first
25
+ if ( pub )
26
+ co.referent.set_metadata('pub', pub.PUBLISHER_DISPLAY )
27
+ co.referent.set_metadata('place', pub.PLACE_OF_PUBLICATION_DISPLAY)
28
+ end
29
+
30
+ return co
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,12 @@
1
+ module SfxDb
2
+ class Isbn < SfxDbBase
3
+ self.table_name = "ISBN"
4
+ self.primary_key = "ISBN_INTERNAL_ID"
5
+
6
+ belongs_to :object,
7
+ :foreign_key => 'OBJECT_ID',
8
+ :class_name => "SfxDb::Object"
9
+
10
+
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module SfxDb
2
+ class Issn < SfxDbBase
3
+ self.table_name = "ISSN"
4
+ self.primary_key = "ISSN_INTERNAL_ID"
5
+
6
+ belongs_to :object,
7
+ :foreign_key => 'OBJECT_ID',
8
+ :class_name => "SfxDb::Object"
9
+
10
+
11
+ end
12
+ end
@@ -0,0 +1,35 @@
1
+ module SfxDb
2
+ class Object < SfxDbBase
3
+ self.table_name = "OBJECT"
4
+ self.primary_key = "OBJECT_ID"
5
+
6
+ #has_many :issns,
7
+ # :foreign_key => 'OBJECT_ID'
8
+ has_many :titles,
9
+ :foreign_key => 'OBJECT_ID',
10
+ :class_name => 'SfxDb::Title'
11
+
12
+ has_many :publishers,
13
+ :foreign_key => 'OBJECT_ID',
14
+ :class_name => 'SfxDb::Publisher'
15
+
16
+ has_many :az_titles,
17
+ :foreign_key=>'OBJECT_ID',
18
+ :class_name => 'SfxDb::AzTitle'
19
+
20
+ has_many :primary_isbns,
21
+ :class_name => 'SfxDb::Isbn',
22
+ :foreign_key => 'OBJECT_ID',
23
+ :conditions => "ISBN_HIERARCHY = 'PRIMARY'"
24
+
25
+ has_many :primary_issns,
26
+ :class_name => 'SfxDb::Issn',
27
+ :foreign_key => 'OBJECT_ID',
28
+ :conditions => "ISSN_HIERARCHY = 'PRIMARY'"
29
+
30
+ has_many :main_titles,
31
+ :class_name => 'SfxDb::Title',
32
+ :foreign_key => 'OBJECT_ID',
33
+ :conditions => "TITLE_TYPE = 'main'"
34
+ end
35
+ end
@@ -0,0 +1,6 @@
1
+ module SfxDb
2
+ class ObjectPortfolio < SfxDbBase
3
+ self.table_name = 'OBJECT_PORTFOLIO'
4
+ self.primary_key = 'INTERNAL_ID'
5
+ end
6
+ end
@@ -0,0 +1,10 @@
1
+ module SfxDb
2
+ class Publisher < SfxDbBase
3
+ self.table_name = "PUBLISHER"
4
+ self.primary_key = "PUBLISHER_INTERNAL_ID"
5
+
6
+ belongs_to :object,
7
+ :foreign_key => 'OBJECT_ID',
8
+ :class_name => "SfxDb::Object"
9
+ end
10
+ end
@@ -0,0 +1,54 @@
1
+ module SfxDb
2
+ class SfxDbBase < ActiveRecord::Base
3
+ # This guy uses a different db connection. We can establish that here, on
4
+ # class-load. Please define an sfx_db database in databases.yml!
5
+ # Some utility methods are also located in this class.
6
+ begin
7
+ if SfxDb.connection_configured?
8
+ self.establish_connection :sfx_db
9
+ end
10
+ rescue ActiveRecord::ActiveRecordError => e
11
+ # Make it more descriptive for the newbies.
12
+ new_e = e.class.new(e.message + ": SfxDb classes require you to specify a database connection called sfx_db in your config/databases.yml.")
13
+ new_e.set_backtrace( e.backtrace )
14
+ raise new_e
15
+ end
16
+
17
+ # All SfxDb things are read-only!
18
+ def readonly?()
19
+ return true
20
+ end
21
+
22
+ # Atttempts to extract all URLs that SFX knows about from the db.
23
+ # This process is not 100%, becuase of the way SFX calculates URLs
24
+ # on the fly. We are only grabbing them from the db--and even the
25
+ # way they are stored in the db is hard for us to grab reliably!
26
+ # So this is really just a kind of guess heuristic in a bunch
27
+ # of ways.
28
+ # But we do our best, and use this to load the SfxUrl model.
29
+ def self.fetch_sfx_urls
30
+ # Fetch all target services that look like they might have a URL
31
+ # in the parse param, and that are active. We know this misses ones
32
+ # that are just active for certain institutes! Known defect.
33
+ target_services = TargetService.find(:all, :conditions => "PARSE_PARAM like '%.%' and AVAILABILITY ='ACTIVE'")
34
+
35
+ # Same with object portfolios, which can also have urls hidden in em
36
+ object_portfolios = ObjectPortfolio.find(:all, :conditions => "PARSE_PARAM like '%.%' and AVAILABILITY = 'ACTIVE'")
37
+
38
+ urls = []
39
+ (target_services + object_portfolios).each do |db_row|
40
+ parse_param = db_row.PARSE_PARAM
41
+
42
+ # Try to get things that look sort of like URLs out. Brutal force,
43
+ # sorry.
44
+ url_re = Regexp.new('(https?://\S+\.\S+)(\s|$)')
45
+ urls.concat( parse_param.scan( url_re ).collect {|matches| matches[0]} )
46
+
47
+ end
48
+ urls.uniq!
49
+ return urls
50
+ end
51
+
52
+
53
+ end
54
+ end
@@ -0,0 +1,9 @@
1
+ module SfxDb
2
+ class Target < SfxDbBase
3
+ self.table_name = 'TARGET'
4
+ self.primary_key = 'INTERNAL_ID'
5
+
6
+ has_many :target_services,
7
+ :foreign_key => 'TARGET'
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ module SfxDb
2
+ class TargetService < SfxDbBase
3
+ self.table_name = 'TARGET_SERVICE'
4
+ self.primary_key = 'INTERNAL_ID'
5
+
6
+ belongs_to :target,
7
+ :foreign_key => 'TARGET',
8
+ :class_name => "SfxDb::Target"
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module SfxDb
2
+ class Title < SfxDbBase
3
+ self.table_name = 'TITLE'
4
+ self.primary_key = 'TITLE_INTERNAL_ID'
5
+
6
+ belongs_to :object,
7
+ :foreign_key => 'OBJECT_ID',
8
+ :class_name => "SfxDb::Object"
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module SfxDb
2
+ # Was an sfx_db connection set in database.yml to connect
3
+ # directly to sfx?
4
+ def self.connection_configured?
5
+ config = ActiveRecord::Base.configurations["sfx_db"]
6
+ return (! config.blank? &&
7
+ ! config['adapter'].blank?)
8
+ end
9
+ end
10
+
@@ -0,0 +1,35 @@
1
+ # Just an indexed list of URLs extracted from SFX, urls we believe are
2
+ # sfx-controlled. Kind of an ugly hack, kind of duplicates the local journal
3
+ # index if in use, but we need it to suppress catalog URLs if they duplicate
4
+ # what SFX ought to control.
5
+ class SfxUrl < ActiveRecord::Base
6
+
7
+ # Pass in a string, we tell you if we think SFX controls this URL--
8
+ # that is, if the SFX KB handles resources at this URL, or not.
9
+ # It's really just a guess for a bunch of reasons, but best we can
10
+ # do. We just check hostname, which could create false positives.
11
+ # Checking entire URL won't work.
12
+ # Lots of things in SFX could create false negatives.
13
+ def self.sfx_controls_url?(url)
14
+ ActiveRecord::Base.connection_pool.with_connection do
15
+ # Does it match any of our supplementary configged strings or regexps?
16
+ UmlautController.umlaut_config.lookup!("sfx.additional_sfx_controlled_urls", []).each do |test|
17
+ '===' # will match a regexp or equality on a string
18
+ return true if test === url
19
+ end
20
+
21
+ begin
22
+ uri = URI.parse(url)
23
+ rescue
24
+ # Bad uri in catalog? Fine, we don't know SFX controls it.
25
+ return false;
26
+ end
27
+ host = uri.host
28
+
29
+ # If URI was malformed, just punt and say no.
30
+ return false unless host
31
+
32
+ return SfxUrl.find(:all, :conditions => ["url = ?", host]).length > 0
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,28 @@
1
+ Title: <%= @title%>
2
+ <%
3
+ unless @user_request.title_level_citation?
4
+ puts brief_citation(@user_request)
5
+ end
6
+ unless @fulltexts.nil? or @fulltexts.empty? %>
7
+
8
+
9
+ Electronic Versions:
10
+
11
+ <%
12
+ @fulltexts.each do |fulltext|
13
+ view_data = fulltext.view_data %>
14
+ * <%= view_data[:display_text] %>: <%= view_data[:url] %>
15
+
16
+ <%
17
+ end
18
+ end
19
+ unless @holdings.nil? or @holdings.empty? %>
20
+
21
+
22
+ Holdings:
23
+
24
+ <% @holdings.each do |holding| %>
25
+ <% target = holding.view_data %>
26
+ * <%= raw(target[:collection_str]) %> <%= raw(target[:call_number]) %> <%= raw(target[:status]) %>
27
+ <% end %>
28
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <%= @call_number%>
2
+ <%= @location%>
3
+ <% unless @user_request.title_level_citation? %>
4
+ <%= brief_citation(@user_request) %>
5
+ <% else %>
6
+ <%= @title%>
7
+ <% end -%>
8
+
@@ -0,0 +1,25 @@
1
+ <%
2
+ unless @user_request.nil?
3
+ cite = @user_request.referent.to_citation %>
4
+
5
+ <div class="inner_modal_dialog">
6
+ <%= form_tag({:controller => "export_email", :action => "send_email", :id => params[:id]}, :class => "modal_dialog_form" ) do %>
7
+ <h2>Email the title and locations</h2>
8
+
9
+ <div class="formError">
10
+ <%= @error || flash[:error] %>
11
+ </div>
12
+
13
+ <h3><strong>Title:</strong> <%= h(cite[:title]) %>/<%= h(cite[:author]) %></h3>
14
+ <div>
15
+ <%= label_tag 'email', 'Enter your email address:' %>
16
+ <%= text_field_tag 'email', params[:email] %>
17
+ </div>
18
+ <div class="section">
19
+ <%= submit_tag 'Send!' %>
20
+ </div>
21
+ <%
22
+ end
23
+ end
24
+ %>
25
+ </div>
@@ -0,0 +1,3 @@
1
+ <h2>Sent</h2>
2
+
3
+ <div id="email_success" class="success small_indent">Sent to <%= @email %>.</div>
@@ -0,0 +1,3 @@
1
+ <h2>Sent</h2>
2
+
3
+ <div id="txt_success" class="success small_indent">Sent to <%= @number %>.</div>
@@ -0,0 +1,62 @@
1
+ <%
2
+ unless @user_request.nil?
3
+ %>
4
+
5
+ <div class="inner_modal_dialog send_to_txt">
6
+ <%= form_tag( {:controller => "export_email", :action => "send_txt", :id => params[:id]}, :class => "modal_dialog_form" ) do %>
7
+ <h2>Send the title and location of an item to your mobile phone</h2>
8
+
9
+ <div class="formError">
10
+ <%= @error || flash[:error] %>
11
+ </div>
12
+
13
+ <h3><strong>Title:</strong>
14
+ <%= h(brief_citation(@user_request)) %>
15
+ </h3>
16
+ <div class="section">
17
+ <%= label_tag('number', 'Enter your mobile phone number:') %>
18
+
19
+ <%= text_field_tag('number', params[:number], :size => 14) %>
20
+ <p class="smallText"><em>10 digit US cell phone number</em></p>
21
+ </div>
22
+
23
+ <div class="section">
24
+ <%= label_tag('provider', 'Select your provider:') %>
25
+ <%
26
+ providers = @svc_response.service.instance_variable_get("@providers")
27
+ %>
28
+ <%= select_tag "provider", options_for_select(providers.sort, params[:provider]) %>
29
+ </div>
30
+ <%
31
+ holdings = @user_request.get_service_type('holding', {})
32
+ %>
33
+ <div class="section">
34
+ <p>Choose the item you want to send:</p>
35
+ <ul>
36
+ <%
37
+ holdings.each do |p|
38
+ target = p.view_data
39
+ %>
40
+ <li>
41
+ <%= radio_button_tag 'holding', p.id, (params[:holding].to_s == p.id.to_s) || holdings.length == 1 %>
42
+ <%= label_tag "holding_#{p.id}", formatted_html_holding_status(target) %>
43
+ </li>
44
+ <%
45
+ end
46
+ %>
47
+ </ul>
48
+ </div>
49
+
50
+
51
+ <div class="section">
52
+ <p class="smallText"><em>Note: charges may apply if your service plan does not cover unlimited texting</em></p>
53
+
54
+ <%= submit_tag 'Send!' %>
55
+
56
+
57
+ </div>
58
+ <%
59
+ end
60
+ end
61
+ %>
62
+ </div>