iqvoc 3.2.3

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 (376) hide show
  1. data/Gemfile +69 -0
  2. data/Gemfile.lock +134 -0
  3. data/LICENSE +13 -0
  4. data/README.md +68 -0
  5. data/Rakefile +23 -0
  6. data/app/controllers/application_controller.rb +125 -0
  7. data/app/controllers/collections/hierarchical_controller.rb +44 -0
  8. data/app/controllers/collections_controller.rb +124 -0
  9. data/app/controllers/concepts/alphabetical_controller.rb +39 -0
  10. data/app/controllers/concepts/hierarchical_controller.rb +74 -0
  11. data/app/controllers/concepts/untranslated_controller.rb +38 -0
  12. data/app/controllers/concepts/versions_controller.rb +119 -0
  13. data/app/controllers/concepts_controller.rb +174 -0
  14. data/app/controllers/dashboard_controller.rb +43 -0
  15. data/app/controllers/pages_controller.rb +22 -0
  16. data/app/controllers/rdf_controller.rb +43 -0
  17. data/app/controllers/search_results_controller.rb +101 -0
  18. data/app/controllers/triple_store_syncs_controller.rb +45 -0
  19. data/app/controllers/user_sessions_controller.rb +48 -0
  20. data/app/controllers/users_controller.rb +81 -0
  21. data/app/helpers/application_helper.rb +60 -0
  22. data/app/helpers/concepts_helper.rb +86 -0
  23. data/app/helpers/dashboard_helper.rb +46 -0
  24. data/app/helpers/rdf_helper.rb +63 -0
  25. data/app/helpers/search_results_helper.rb +32 -0
  26. data/app/models/collection/base.rb +161 -0
  27. data/app/models/collection/member/base.rb +23 -0
  28. data/app/models/collection/member/collection.rb +33 -0
  29. data/app/models/collection/member/concept.rb +33 -0
  30. data/app/models/collection/unordered.rb +18 -0
  31. data/app/models/concept/base.rb +418 -0
  32. data/app/models/concept/relation/base.rb +95 -0
  33. data/app/models/concept/relation/reverse_relation_extension.rb +49 -0
  34. data/app/models/concept/relation/skos/base.rb +37 -0
  35. data/app/models/concept/relation/skos/broader/base.rb +41 -0
  36. data/app/models/concept/relation/skos/broader/mono.rb +28 -0
  37. data/app/models/concept/relation/skos/broader/poly.rb +23 -0
  38. data/app/models/concept/relation/skos/narrower/base.rb +37 -0
  39. data/app/models/concept/relation/skos/related.rb +21 -0
  40. data/app/models/concept/skos/base.rb +28 -0
  41. data/app/models/label/base.rb +98 -0
  42. data/app/models/label/skos/base.rb +27 -0
  43. data/app/models/labeling/base.rb +81 -0
  44. data/app/models/labeling/skos/alt_label.rb +21 -0
  45. data/app/models/labeling/skos/base.rb +99 -0
  46. data/app/models/labeling/skos/hidden_label.rb +25 -0
  47. data/app/models/labeling/skos/pref_label.rb +30 -0
  48. data/app/models/match/base.rb +57 -0
  49. data/app/models/match/skos/base.rb +23 -0
  50. data/app/models/match/skos/broad_match.rb +21 -0
  51. data/app/models/match/skos/close_match.rb +21 -0
  52. data/app/models/match/skos/exact_match.rb +21 -0
  53. data/app/models/match/skos/mapping_relation.rb +21 -0
  54. data/app/models/match/skos/narrow_match.rb +21 -0
  55. data/app/models/match/skos/related_match.rb +21 -0
  56. data/app/models/note/annotated/base.rb +29 -0
  57. data/app/models/note/base.rb +127 -0
  58. data/app/models/note/skos/base.rb +52 -0
  59. data/app/models/note/skos/change_note.rb +38 -0
  60. data/app/models/note/skos/definition.rb +33 -0
  61. data/app/models/note/skos/editorial_note.rb +21 -0
  62. data/app/models/note/skos/example.rb +21 -0
  63. data/app/models/note/skos/history_note.rb +21 -0
  64. data/app/models/note/skos/scope_note.rb +21 -0
  65. data/app/models/origin_mapping.rb +58 -0
  66. data/app/models/rdf_store.rb +96 -0
  67. data/app/models/search_extension.rb +58 -0
  68. data/app/models/user.rb +49 -0
  69. data/app/models/user_session.rb +23 -0
  70. data/app/views/collections/_collection.html.erb +10 -0
  71. data/app/views/collections/_form.html.erb +47 -0
  72. data/app/views/collections/edit.html.erb +11 -0
  73. data/app/views/collections/index.html.erb +12 -0
  74. data/app/views/collections/new.html.erb +7 -0
  75. data/app/views/collections/show.html.erb +53 -0
  76. data/app/views/collections/show.iqrdf +22 -0
  77. data/app/views/concepts/_base_data.html.erb +72 -0
  78. data/app/views/concepts/_close_match.html.erb +16 -0
  79. data/app/views/concepts/_show_head.html.erb +23 -0
  80. data/app/views/concepts/_visualization.html.erb +9 -0
  81. data/app/views/concepts/alphabetical/_pref_labeling.html.erb +6 -0
  82. data/app/views/concepts/alphabetical/index.html.erb +17 -0
  83. data/app/views/concepts/edit.html.erb +32 -0
  84. data/app/views/concepts/hierarchical/_treeview.html.erb +20 -0
  85. data/app/views/concepts/hierarchical/index.html.erb +5 -0
  86. data/app/views/concepts/index.iqrdf +24 -0
  87. data/app/views/concepts/new.html.erb +3 -0
  88. data/app/views/concepts/show_published.html.erb +16 -0
  89. data/app/views/concepts/show_unpublished.html.erb +43 -0
  90. data/app/views/concepts/untranslated/index.html.erb +23 -0
  91. data/app/views/dashboard/index.html.erb +47 -0
  92. data/app/views/errors/access_denied.html.erb +3 -0
  93. data/app/views/errors/multiple_choices.html.erb +11 -0
  94. data/app/views/errors/not_found.html.erb +8 -0
  95. data/app/views/kaminari/_page.html.erb +6 -0
  96. data/app/views/kaminari/_paginator.html.erb +15 -0
  97. data/app/views/layouts/_controls.html.erb +37 -0
  98. data/app/views/layouts/_header.html.erb +1 -0
  99. data/app/views/layouts/_navigation.html.erb +27 -0
  100. data/app/views/layouts/_sections.html.erb +8 -0
  101. data/app/views/layouts/application.html.erb +83 -0
  102. data/app/views/pages/about.html.erb +77 -0
  103. data/app/views/partials/_rdf_logo.html.erb +4 -0
  104. data/app/views/partials/collection/_member.html.erb +14 -0
  105. data/app/views/partials/collection_label/_search_result.html.erb +5 -0
  106. data/app/views/partials/concept/_edit_link_base.html.erb +4 -0
  107. data/app/views/partials/concept/_inline_base.html.erb +4 -0
  108. data/app/views/partials/concept/_new_link_base.html.erb +4 -0
  109. data/app/views/partials/concept/relation/_base.html.erb +8 -0
  110. data/app/views/partials/concept/relation/_edit_base.html.erb +15 -0
  111. data/app/views/partials/concept/relation/skos/_narrower.html.erb +12 -0
  112. data/app/views/partials/concept/relation/skos/broader/_mono.html.erb +28 -0
  113. data/app/views/partials/concept/relation/skos/broader/_poly.html.erb +14 -0
  114. data/app/views/partials/labeling/skos/_base.html.erb +17 -0
  115. data/app/views/partials/labeling/skos/_edit_base.html.erb +7 -0
  116. data/app/views/partials/labeling/skos/_search_result.html.erb +12 -0
  117. data/app/views/partials/match/_base.html.erb +13 -0
  118. data/app/views/partials/match/_edit_base.html.erb +6 -0
  119. data/app/views/partials/note/_base.html.erb +15 -0
  120. data/app/views/partials/note/_edit_base.html.erb +28 -0
  121. data/app/views/partials/note/_note.html.erb +14 -0
  122. data/app/views/partials/note/_search_result.html.erb +8 -0
  123. data/app/views/partials/note/skos/_edit_change_note.html.erb +47 -0
  124. data/app/views/partials/note/skos/definition/_search_result.html.erb +8 -0
  125. data/app/views/rdf/show_concept.iqrdf +5 -0
  126. data/app/views/search_results/_head_contents.html.erb +4 -0
  127. data/app/views/search_results/_rdf_links.html.erb +4 -0
  128. data/app/views/search_results/index.html.erb +92 -0
  129. data/app/views/search_results/index.iqrdf +33 -0
  130. data/app/views/triple_store_syncs/new.html.erb +7 -0
  131. data/app/views/user_sessions/new.html.erb +11 -0
  132. data/app/views/users/_form.html.erb +45 -0
  133. data/app/views/users/_user_preference.html.erb +12 -0
  134. data/app/views/users/edit.html.erb +14 -0
  135. data/app/views/users/index.html.erb +29 -0
  136. data/app/views/users/new.html.erb +13 -0
  137. data/config/application.rb +82 -0
  138. data/config/boot.rb +29 -0
  139. data/config/database.template.yml +43 -0
  140. data/config/database.yml +40 -0
  141. data/config/deploy/common.rb +79 -0
  142. data/config/deploy/ec2.rb +43 -0
  143. data/config/deploy/history.rb +29 -0
  144. data/config/deploy/innoq.rb +37 -0
  145. data/config/deploy.rb +72 -0
  146. data/config/engine.rb +25 -0
  147. data/config/environment.rb +21 -0
  148. data/config/environments/development.rb +74 -0
  149. data/config/environments/production.rb +65 -0
  150. data/config/environments/production.template.rb +65 -0
  151. data/config/environments/production_internal.rb +65 -0
  152. data/config/environments/test.rb +51 -0
  153. data/config/initializers/action_view.rb +23 -0
  154. data/config/initializers/active_record.rb +18 -0
  155. data/config/initializers/backtrace_silencers.rb +23 -0
  156. data/config/initializers/inflections.rb +26 -0
  157. data/config/initializers/iqvoc.rb +50 -0
  158. data/config/initializers/jdbc.rb +23 -0
  159. data/config/initializers/kaminari_config.rb +8 -0
  160. data/config/initializers/language.rb +6 -0
  161. data/config/initializers/mime_types.rb +24 -0
  162. data/config/initializers/secret_token.rb +29 -0
  163. data/config/initializers/secret_token.rb.template +29 -0
  164. data/config/initializers/session_store.rb +24 -0
  165. data/config/locales/activerecord.de.yml +135 -0
  166. data/config/locales/activerecord.en.yml +135 -0
  167. data/config/locales/authlogic.de.yml +38 -0
  168. data/config/locales/authlogic.en.yml +38 -0
  169. data/config/locales/de.yml +326 -0
  170. data/config/locales/defaults.de.yml +153 -0
  171. data/config/locales/en.yml +332 -0
  172. data/config/routes.rb +53 -0
  173. data/config/warble.rb +158 -0
  174. data/db/iqvoc_test.sqlite3 +0 -0
  175. data/db/migrate/20100927101502_create_schema.rb +174 -0
  176. data/db/migrate/20101125141218_add_collection_tables.rb +32 -0
  177. data/db/migrate/20101129161528_add_type_to_collections.rb +24 -0
  178. data/db/migrate/20101202094602_add_origin_to_collections.rb +25 -0
  179. data/db/migrate/20101202135420_rename_collection_contents_to_collection_members.rb +25 -0
  180. data/db/migrate/20101208103531_add_type_to_collection_contents.rb +27 -0
  181. data/db/migrate/20101210153916_add_indexes_to_collections.rb +25 -0
  182. data/db/migrate/20110204121244_create_collection_labels.rb +32 -0
  183. data/db/migrate/20110208084250_change_origin_lengths.rb +27 -0
  184. data/db/migrate/20110328124300_discard_collection_specifics.rb +27 -0
  185. data/db/migrate/20110408120357_remove_classifications_and_classifiers.rb +32 -0
  186. data/db/migrate/20110408120740_remove_xl_specfic_stuff.rb +39 -0
  187. data/db/migrate/20110420133640_change_value_in_notes.rb +8 -0
  188. data/db/migrate/20110427120534_add_published_at_to_labels.rb +9 -0
  189. data/db/migrate/20110510162719_use_mono_hierarchy_instead_of_poly_hierarchy.rb +13 -0
  190. data/db/migrate/20110512132624_extend_notes_value_field_length.rb +8 -0
  191. data/db/migrate/20110525103100_separate_note_annotation_predicates.rb +38 -0
  192. data/db/migrate/20110615134040_change_umt_note_annotations_to_dct.rb +9 -0
  193. data/db/schema.rb +127 -0
  194. data/db/seeds.rb +37 -0
  195. data/iqvoc.gemspec +27 -0
  196. data/lib/engine_tasks/assets.rake +49 -0
  197. data/lib/engine_tasks/db.rake +18 -0
  198. data/lib/engine_tasks/release.rake +118 -0
  199. data/lib/iqvoc/ability.rb +44 -0
  200. data/lib/iqvoc/data_helper.rb +27 -0
  201. data/lib/iqvoc/deep_cloning.rb +92 -0
  202. data/lib/iqvoc/rdf_helper.rb +67 -0
  203. data/lib/iqvoc/skos_importer.rb +144 -0
  204. data/lib/iqvoc/version.rb +19 -0
  205. data/lib/iqvoc/versioning.rb +151 -0
  206. data/lib/iqvoc.rb +228 -0
  207. data/lib/maker.rb +144 -0
  208. data/lib/ojdbc14.jar +0 -0
  209. data/lib/string.rb +23 -0
  210. data/lib/tasks/importer.rake +16 -0
  211. data/lib/tasks/jdbc.rake +24 -0
  212. data/public/404.html +26 -0
  213. data/public/422.html +26 -0
  214. data/public/500.html +26 -0
  215. data/public/favicon.ico +0 -0
  216. data/public/images/iqvoc/add.png +0 -0
  217. data/public/images/iqvoc/arrow_down.gif +0 -0
  218. data/public/images/iqvoc/arrow_up.gif +0 -0
  219. data/public/images/iqvoc/footer.png +0 -0
  220. data/public/images/iqvoc/go_there.png +0 -0
  221. data/public/images/iqvoc/header.png +0 -0
  222. data/public/images/iqvoc/header_long.png +0 -0
  223. data/public/images/iqvoc/iqvoc.png +0 -0
  224. data/public/images/iqvoc/note_add.png +0 -0
  225. data/public/images/iqvoc/note_delete.png +0 -0
  226. data/public/images/iqvoc/note_edit.png +0 -0
  227. data/public/images/iqvoc/ok.png +0 -0
  228. data/public/images/iqvoc/rails.png +0 -0
  229. data/public/images/iqvoc/rdf_flyer.gif +0 -0
  230. data/public/images/iqvoc/red_arrow.png +0 -0
  231. data/public/images/iqvoc/remove.png +0 -0
  232. data/public/images/iqvoc/shadow.png +0 -0
  233. data/public/images/iqvoc/spinner.gif +0 -0
  234. data/public/images/iqvoc/tokenizer_delete.png +0 -0
  235. data/public/images/iqvoc/tokenizer_pencile.png +0 -0
  236. data/public/images/iqvoc/tokenizer_show.png +0 -0
  237. data/public/images/iqvoc/unfinished.png +0 -0
  238. data/public/javascripts/iqvoc/application.js +123 -0
  239. data/public/javascripts/iqvoc/entityselect.js +121 -0
  240. data/public/javascripts/iqvoc/excanvas.js +35 -0
  241. data/public/javascripts/iqvoc/iqvoc.js +118 -0
  242. data/public/javascripts/iqvoc/jit_rgraph.js +153 -0
  243. data/public/javascripts/iqvoc/jquery-1.6.2.min.js +18 -0
  244. data/public/javascripts/iqvoc/jquery-treeview/changelog.txt +29 -0
  245. data/public/javascripts/iqvoc/jquery-treeview/demo/async.html +44 -0
  246. data/public/javascripts/iqvoc/jquery-treeview/demo/bg.gif +0 -0
  247. data/public/javascripts/iqvoc/jquery-treeview/demo/demo.js +43 -0
  248. data/public/javascripts/iqvoc/jquery-treeview/demo/images.html +56 -0
  249. data/public/javascripts/iqvoc/jquery-treeview/demo/index.html +340 -0
  250. data/public/javascripts/iqvoc/jquery-treeview/demo/large.html +559 -0
  251. data/public/javascripts/iqvoc/jquery-treeview/demo/prerendered.html +621 -0
  252. data/public/javascripts/iqvoc/jquery-treeview/demo/screen.css +24 -0
  253. data/public/javascripts/iqvoc/jquery-treeview/demo/simple.html +82 -0
  254. data/public/javascripts/iqvoc/jquery-treeview/demo/source.php +87 -0
  255. data/public/javascripts/iqvoc/jquery-treeview/demo/source.phps +87 -0
  256. data/public/javascripts/iqvoc/jquery-treeview/images/ajax-loader.gif +0 -0
  257. data/public/javascripts/iqvoc/jquery-treeview/images/file.gif +0 -0
  258. data/public/javascripts/iqvoc/jquery-treeview/images/folder-closed.gif +0 -0
  259. data/public/javascripts/iqvoc/jquery-treeview/images/folder.gif +0 -0
  260. data/public/javascripts/iqvoc/jquery-treeview/images/minus.gif +0 -0
  261. data/public/javascripts/iqvoc/jquery-treeview/images/plus.gif +0 -0
  262. data/public/javascripts/iqvoc/jquery-treeview/images/treeview-black-line.gif +0 -0
  263. data/public/javascripts/iqvoc/jquery-treeview/images/treeview-black.gif +0 -0
  264. data/public/javascripts/iqvoc/jquery-treeview/images/treeview-default-line.gif +0 -0
  265. data/public/javascripts/iqvoc/jquery-treeview/images/treeview-default.gif +0 -0
  266. data/public/javascripts/iqvoc/jquery-treeview/images/treeview-famfamfam-line.gif +0 -0
  267. data/public/javascripts/iqvoc/jquery-treeview/images/treeview-famfamfam.gif +0 -0
  268. data/public/javascripts/iqvoc/jquery-treeview/images/treeview-gray-line.gif +0 -0
  269. data/public/javascripts/iqvoc/jquery-treeview/images/treeview-gray.gif +0 -0
  270. data/public/javascripts/iqvoc/jquery-treeview/images/treeview-red-line.gif +0 -0
  271. data/public/javascripts/iqvoc/jquery-treeview/images/treeview-red.gif +0 -0
  272. data/public/javascripts/iqvoc/jquery-treeview/jquery.treeview.async.js +82 -0
  273. data/public/javascripts/iqvoc/jquery-treeview/jquery.treeview.css +75 -0
  274. data/public/javascripts/iqvoc/jquery-treeview/jquery.treeview.js +251 -0
  275. data/public/javascripts/iqvoc/jquery-treeview/jquery.treeview.min.js +15 -0
  276. data/public/javascripts/iqvoc/jquery-treeview/jquery.treeview.pack.js +16 -0
  277. data/public/javascripts/iqvoc/jquery-treeview/lib/jquery.cookie.js +92 -0
  278. data/public/javascripts/iqvoc/jquery-treeview/lib/jquery.js +3363 -0
  279. data/public/javascripts/iqvoc/jquery-treeview/todo +8 -0
  280. data/public/javascripts/iqvoc/jquery-ui-1.8.13.custom.js +3229 -0
  281. data/public/javascripts/iqvoc/jquery-ui-1.8.13.custom.min.js +163 -0
  282. data/public/javascripts/iqvoc/jquery-ui.datepicker-de.js +22 -0
  283. data/public/javascripts/iqvoc/json2.js +480 -0
  284. data/public/javascripts/iqvoc/langselect.js +73 -0
  285. data/public/javascripts/iqvoc/rails.js +132 -0
  286. data/public/javascripts/iqvoc/storage.js +122 -0
  287. data/public/javascripts/iqvoc/visualization.js +321 -0
  288. data/public/robots.txt +5 -0
  289. data/public/stylesheets/iqvoc/blueprint/ie.css +35 -0
  290. data/public/stylesheets/iqvoc/blueprint/plugins/buttons/icons/cross.png +0 -0
  291. data/public/stylesheets/iqvoc/blueprint/plugins/buttons/icons/key.png +0 -0
  292. data/public/stylesheets/iqvoc/blueprint/plugins/buttons/icons/tick.png +0 -0
  293. data/public/stylesheets/iqvoc/blueprint/plugins/buttons/readme.txt +32 -0
  294. data/public/stylesheets/iqvoc/blueprint/plugins/buttons/screen.css +97 -0
  295. data/public/stylesheets/iqvoc/blueprint/plugins/fancy-type/readme.txt +14 -0
  296. data/public/stylesheets/iqvoc/blueprint/plugins/fancy-type/screen.css +71 -0
  297. data/public/stylesheets/iqvoc/blueprint/plugins/link-icons/icons/doc.png +0 -0
  298. data/public/stylesheets/iqvoc/blueprint/plugins/link-icons/icons/email.png +0 -0
  299. data/public/stylesheets/iqvoc/blueprint/plugins/link-icons/icons/external.png +0 -0
  300. data/public/stylesheets/iqvoc/blueprint/plugins/link-icons/icons/feed.png +0 -0
  301. data/public/stylesheets/iqvoc/blueprint/plugins/link-icons/icons/im.png +0 -0
  302. data/public/stylesheets/iqvoc/blueprint/plugins/link-icons/icons/pdf.png +0 -0
  303. data/public/stylesheets/iqvoc/blueprint/plugins/link-icons/icons/visited.png +0 -0
  304. data/public/stylesheets/iqvoc/blueprint/plugins/link-icons/icons/xls.png +0 -0
  305. data/public/stylesheets/iqvoc/blueprint/plugins/link-icons/readme.txt +18 -0
  306. data/public/stylesheets/iqvoc/blueprint/plugins/link-icons/screen.css +40 -0
  307. data/public/stylesheets/iqvoc/blueprint/plugins/rtl/readme.txt +10 -0
  308. data/public/stylesheets/iqvoc/blueprint/plugins/rtl/screen.css +110 -0
  309. data/public/stylesheets/iqvoc/blueprint/print.css +29 -0
  310. data/public/stylesheets/iqvoc/blueprint/screen.css +258 -0
  311. data/public/stylesheets/iqvoc/blueprint/src/forms.css +65 -0
  312. data/public/stylesheets/iqvoc/blueprint/src/grid.css +280 -0
  313. data/public/stylesheets/iqvoc/blueprint/src/grid.png +0 -0
  314. data/public/stylesheets/iqvoc/blueprint/src/ie.css +76 -0
  315. data/public/stylesheets/iqvoc/blueprint/src/print.css +85 -0
  316. data/public/stylesheets/iqvoc/blueprint/src/reset.css +45 -0
  317. data/public/stylesheets/iqvoc/blueprint/src/typography.css +106 -0
  318. data/public/stylesheets/iqvoc/forms.css +71 -0
  319. data/public/stylesheets/iqvoc/images/back.png +0 -0
  320. data/public/stylesheets/iqvoc/images/branch.png +0 -0
  321. data/public/stylesheets/iqvoc/images/categ.png +0 -0
  322. data/public/stylesheets/iqvoc/images/categ_open.png +0 -0
  323. data/public/stylesheets/iqvoc/images/go_there.png +0 -0
  324. data/public/stylesheets/iqvoc/images/iqvoc.png +0 -0
  325. data/public/stylesheets/iqvoc/images/leaf_end.png +0 -0
  326. data/public/stylesheets/iqvoc/images/leaf_end_filled.png +0 -0
  327. data/public/stylesheets/iqvoc/images/leaf_mid.png +0 -0
  328. data/public/stylesheets/iqvoc/images/leaf_mid_filled.png +0 -0
  329. data/public/stylesheets/iqvoc/images/leaf_nothing.png +0 -0
  330. data/public/stylesheets/iqvoc/images/leaf_only.png +0 -0
  331. data/public/stylesheets/iqvoc/images/leaf_only_filled.png +0 -0
  332. data/public/stylesheets/iqvoc/images/leaf_top.png +0 -0
  333. data/public/stylesheets/iqvoc/images/leaf_top_filled.png +0 -0
  334. data/public/stylesheets/iqvoc/images/nothing.png +0 -0
  335. data/public/stylesheets/iqvoc/images/top_01.png +0 -0
  336. data/public/stylesheets/iqvoc/images/trunk.png +0 -0
  337. data/public/stylesheets/iqvoc/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  338. data/public/stylesheets/iqvoc/images/ui-bg_flat_55_fbec88_40x100.png +0 -0
  339. data/public/stylesheets/iqvoc/images/ui-bg_glass_75_d0e5f5_1x400.png +0 -0
  340. data/public/stylesheets/iqvoc/images/ui-bg_glass_85_dfeffc_1x400.png +0 -0
  341. data/public/stylesheets/iqvoc/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  342. data/public/stylesheets/iqvoc/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png +0 -0
  343. data/public/stylesheets/iqvoc/images/ui-bg_inset-hard_100_f5f8f9_1x100.png +0 -0
  344. data/public/stylesheets/iqvoc/images/ui-bg_inset-hard_100_fcfdfd_1x100.png +0 -0
  345. data/public/stylesheets/iqvoc/images/ui-icons_217bc0_256x240.png +0 -0
  346. data/public/stylesheets/iqvoc/images/ui-icons_2e83ff_256x240.png +0 -0
  347. data/public/stylesheets/iqvoc/images/ui-icons_469bdd_256x240.png +0 -0
  348. data/public/stylesheets/iqvoc/images/ui-icons_6da8d5_256x240.png +0 -0
  349. data/public/stylesheets/iqvoc/images/ui-icons_cd0a0a_256x240.png +0 -0
  350. data/public/stylesheets/iqvoc/images/ui-icons_d8e7f3_256x240.png +0 -0
  351. data/public/stylesheets/iqvoc/images/ui-icons_f9bd01_256x240.png +0 -0
  352. data/public/stylesheets/iqvoc/iqvoc.css +477 -0
  353. data/public/stylesheets/iqvoc/jquery-ui-1.8.13.custom.css +415 -0
  354. data/public/stylesheets/iqvoc/widgets.css +81 -0
  355. data/test/factories.rb +74 -0
  356. data/test/integration/alphabetical_test.rb +53 -0
  357. data/test/integration/authentication_test.rb +41 -0
  358. data/test/integration/browse_concepts_and_labels_test.rb +61 -0
  359. data/test/integration/browse_static_pages_test.rb +29 -0
  360. data/test/integration/client_augmentation_test.rb +42 -0
  361. data/test/integration/client_edit_concept_test.rb +72 -0
  362. data/test/integration/collection_circularity_test.rb +110 -0
  363. data/test/integration/concept_test.rb +61 -0
  364. data/test/integration/edit_concepts_test.rb +40 -0
  365. data/test/integration/note_annotations_test.rb +86 -0
  366. data/test/integration/search_test.rb +205 -0
  367. data/test/integration/tree_test.rb +31 -0
  368. data/test/integration/untranslated_test.rb +60 -0
  369. data/test/integration_test_helper.rb +45 -0
  370. data/test/performance/browsing_test.rb +25 -0
  371. data/test/test_helper.rb +29 -0
  372. data/test/unit/concept_test.rb +93 -0
  373. data/test/unit/note_test.rb +32 -0
  374. data/test/unit/origin_mapping_test.rb +70 -0
  375. data/test/unit/skos_import_test.rb +100 -0
  376. metadata +522 -0
@@ -0,0 +1,74 @@
1
+ # encoding: UTF-8
2
+
3
+ # Copyright 2011 innoQ Deutschland GmbH
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ class Concepts::HierarchicalController < ConceptsController
18
+ skip_before_filter :require_user
19
+
20
+ def index
21
+ authorize! :read, Iqvoc::Concept.base_class
22
+
23
+ scope = if params[:published] == '0'
24
+ Iqvoc::Concept.base_class.editor_selectable
25
+ else
26
+ Iqvoc::Concept.base_class.published
27
+ end
28
+
29
+ # if params[:broader] is given, the action is handling the reversed tree
30
+ @concepts = case params[:root]
31
+ when /\d+/
32
+ root_concept = Iqvoc::Concept.base_class.find(params[:root])
33
+ if params[:broader]
34
+ scope.
35
+ includes(:narrower_relations, :broader_relations). # D A N G E R: the order matters!!! See the following where
36
+ where(Concept::Relation::Base.arel_table[:target_id].eq(root_concept.id))
37
+ else
38
+ scope.
39
+ includes(:broader_relations, :narrower_relations). # D A N G E R: the order matters!!! See the following where
40
+ where(Concept::Relation::Base.arel_table[:target_id].eq(root_concept.id))
41
+ end
42
+ else
43
+ if params[:broader]
44
+ scope.broader_tops.includes(:broader_relations)
45
+ else
46
+ scope.tops.includes(:narrower_relations)
47
+ end
48
+ end
49
+ # When in single query mode, AR handles ALL includes to be loaded by that
50
+ # one query. We don't want that! So let's do it manually :-)
51
+ Iqvoc::Concept.base_class.send(:preload_associations, @concepts, Iqvoc::Concept.base_class.default_includes + [:pref_labels])
52
+
53
+ @concepts.sort! do |a, b|
54
+ a.pref_label.to_s <=> b.pref_label.to_s
55
+ end
56
+
57
+ respond_to do |format|
58
+ format.html
59
+ format.json do # Treeview data
60
+ @concepts.map! do |c|
61
+ {
62
+ :id => c.id,
63
+ :url => concept_path(:id => c, :format => :html),
64
+ :text => CGI.escapeHTML(c.pref_label.to_s),
65
+ :hasChildren => (params[:broader] ? c.broader_relations.any? : c.narrower_relations.any?),
66
+ :additionalText => (" (#{c.additional_info})" if c.additional_info.present?)
67
+ }
68
+ end
69
+ render :json => @concepts.to_json
70
+ end
71
+ end
72
+ end
73
+
74
+ end
@@ -0,0 +1,38 @@
1
+ # encoding: UTF-8
2
+
3
+ # Copyright 2011 innoQ Deutschland GmbH
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ # TODO: This class (including the view) should not exist! Please move this back
18
+ # into the alphabetical_controller. The only difference between those two
19
+ # controllers is the scope used. Use if statements or published methods instead.
20
+ # "DRYness"
21
+ class Concepts::UntranslatedController < ConceptsController
22
+ skip_before_filter :require_user
23
+
24
+ def index
25
+ authorize! :read, Concept::Base
26
+
27
+ scope = Iqvoc::Concept.pref_labeling_class.label_class.
28
+ begins_with(params[:letter]).
29
+ missing_translation(I18n.locale, Iqvoc::Concept.pref_labeling_languages.first)
30
+
31
+ if I18n.locale == Iqvoc::Concept.pref_labeling_languages.first # TODO: Should be 404!
32
+ flash[:error] = I18n.t("txt.views.untranslated_concepts.unavailable")
33
+ else
34
+ @labels = scope.order("LOWER(labels.value)").page(params[:page])
35
+ end
36
+ end
37
+
38
+ end
@@ -0,0 +1,119 @@
1
+ # encoding: UTF-8
2
+
3
+ # Copyright 2011 innoQ Deutschland GmbH
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ class Concepts::VersionsController < ApplicationController
18
+
19
+ def merge
20
+ current_concept = Iqvoc::Concept.base_class.by_origin(params[:origin]).published.last
21
+ new_version = Iqvoc::Concept.base_class.by_origin(params[:origin]).unpublished.last
22
+ raise ActiveRecord::RecordNotFound.new("Couldn't find unpublished concept with origin '#{params[:origin]}'") unless new_version
23
+
24
+ authorize! :merge, new_version
25
+
26
+ ActiveRecord::Base.transaction do
27
+ if current_concept.blank? || current_concept.destroy
28
+ new_version.publish
29
+ new_version.unlock
30
+ if new_version.valid_with_full_validation?
31
+ new_version.save
32
+ if RdfStore.update(rdf_url(:id => new_version, :format => :ttl), concept_url(:id => new_version, :format => :ttl))
33
+ new_version.update_attribute(:rdf_updated_at, 1.seconds.since)
34
+ end
35
+ flash[:notice] = t("txt.controllers.versioning.published")
36
+ redirect_to concept_path(:id => new_version)
37
+ else
38
+ flash[:error] = t("txt.controllers.versioning.merged_publishing_error")
39
+ redirect_to concept_path(:published => 0, :id => new_version)
40
+ end
41
+ else
42
+ flash[:error] = t("txt.controllers.versioning.merged_delete_error")
43
+ redirect_to concept_path(:published => 0, :id => new_version)
44
+ end
45
+ end
46
+ end
47
+
48
+ def branch
49
+ current_concept = Iqvoc::Concept.base_class.by_origin(params[:origin]).published.last
50
+ raise ActiveRecord::RecordNotFound.new("Couldn't find published concept with origin '#{params[:origin]}'") unless current_concept
51
+ raise "There is already an unpublished version for Concept '#{params[:origin]}'" if Iqvoc::Concept.base_class.by_origin(params[:origin]).unpublished.last
52
+
53
+ authorize! :branch, current_concept
54
+
55
+ new_version = nil
56
+ ActiveRecord::Base.transaction do
57
+ new_version = current_concept.branch(current_user)
58
+ new_version.save!
59
+ end
60
+ flash[:notice] = t("txt.controllers.versioning.branched")
61
+ redirect_to edit_concept_path(:published => 0, :id => new_version)
62
+ end
63
+
64
+ def lock
65
+ new_version = Iqvoc::Concept.base_class.by_origin(params[:origin]).unpublished.last
66
+ raise ActiveRecord::RecordNotFound.new("Couldn't find unpublished concept with origin '#{params[:origin]}'") unless new_version
67
+ raise "Concept with origin '#{params[:origin]}' has already been locked." if new_version.locked?
68
+
69
+ authorize! :lock, new_version
70
+
71
+ new_version.lock_by_user(current_user.id)
72
+ new_version.save!
73
+
74
+ flash[:notice] = t("txt.controllers.versioning.locked")
75
+ redirect_to edit_concept_path(:published => 0, :id => new_version)
76
+ end
77
+
78
+ def unlock
79
+ new_version = Iqvoc::Concept.base_class.by_origin(params[:origin]).unpublished.last
80
+ raise ActiveRecord::RecordNotFound.new("Couldn't find unpublished concept with origin '#{params[:origin]}'") unless new_version
81
+ raise "Concept with origin '#{params[:origin]}' wasn't locked." unless new_version.locked?
82
+
83
+ authorize! :unlock, new_version
84
+
85
+ new_version.unlock
86
+ new_version.save!
87
+
88
+ flash[:notice] = t("txt.controllers.versioning.unlocked")
89
+ redirect_to concept_path(:published => 0, :id => new_version)
90
+ end
91
+
92
+ def consistency_check
93
+ concept = Iqvoc::Concept.base_class.by_origin(params[:origin]).unpublished.last
94
+ raise ActiveRecord::RecordNotFound unless concept
95
+
96
+ authorize! :check_consistency, concept
97
+
98
+ if concept.valid_with_full_validation?
99
+ flash[:notice] = t("txt.controllers.versioning.consistency_check_success")
100
+ redirect_to concept_path(:published => 0, :id => concept)
101
+ else
102
+ flash[:error] = t("txt.controllers.versioning.consistency_check_error")
103
+ redirect_to edit_concept_path(:published => 0, :id => concept, :full_consistency_check => "1")
104
+ end
105
+ end
106
+
107
+ def to_review
108
+ concept = Iqvoc::Concept.base_class.by_origin(params[:origin]).unpublished.last
109
+ raise ActiveRecord::RecordNotFound unless concept
110
+
111
+ authorize! :send_to_review, concept
112
+
113
+ concept.to_review
114
+ concept.save!
115
+ flash[:notice] = t("txt.controllers.versioning.to_review_success")
116
+ redirect_to concept_path(:published => 0, :id => concept)
117
+ end
118
+
119
+ end
@@ -0,0 +1,174 @@
1
+ # encoding: UTF-8
2
+
3
+ # Copyright 2011 innoQ Deutschland GmbH
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ class ConceptsController < ApplicationController
18
+ skip_before_filter :require_user
19
+
20
+ def index
21
+ authorize! :read, Concept::Base
22
+
23
+ respond_to do |format|
24
+ format.json do # Search for widget
25
+ @concepts = Iqvoc::Concept.base_class.editor_selectable.with_pref_labels.merge(Label::Base.by_query_value("#{params[:query]}%")).all
26
+ response = []
27
+ @concepts.each { |concept| response << concept_widget_data(concept)}
28
+
29
+ render :json => response
30
+ end
31
+ format.all do # RDF full export
32
+ authorize! :full_export, Concept::Base
33
+ end
34
+ end
35
+ end
36
+
37
+ def show
38
+ scope = Iqvoc::Concept.base_class.
39
+ by_origin(params[:id]).
40
+ with_associations
41
+ published = params[:published] == '1' || !params[:published]
42
+ if published
43
+ scope = scope.published
44
+ @new_concept_version = Iqvoc::Concept.base_class.by_origin(params[:id]).unpublished.last
45
+ else
46
+ scope = scope.unpublished
47
+ end
48
+
49
+ @concept = scope.last
50
+ raise ActiveRecord::RecordNotFound unless @concept
51
+
52
+ authorize! :read, @concept
53
+
54
+ respond_to do |format|
55
+ format.html do
56
+ # When in single query mode, AR handles ALL includes to be loaded by that
57
+ # one query. We don't want that! So let's do it manually :-)
58
+ Concept::Base.send(:preload_associations, @concept, Iqvoc::Concept.base_class.default_includes +
59
+ [:collection_members => {:collection => :labels},
60
+ :broader_relations => {:target => [:pref_labels, :broader_relations]},
61
+ :narrower_relations => {:target => [:pref_labels, :narrower_relations]}])
62
+
63
+ published ? render('show_published') : render('show_unpublished')
64
+ end
65
+ format.json do
66
+ # When in single query mode, AR handles ALL includes to be loaded by that
67
+ # one query. We don't want that! So let's do it manually :-)
68
+ Concept::Base.send(:preload_associations, @concept, [:labels,
69
+ { :relations => { :target => [:labelings, :relations] } }])
70
+
71
+ concept_data = {
72
+ :origin => @concept.origin,
73
+ :labels => @concept.labelings.map { |ln| labeling_as_json(ln) },
74
+ :relations => @concept.relations.map { |relation|
75
+ concept = relation.target
76
+ {
77
+ :origin => concept.origin,
78
+ :labels => concept.labelings.map { |ln| labeling_as_json(ln) },
79
+ :relations => concept.relations.length
80
+ }
81
+ }
82
+ }
83
+ render :json => concept_data
84
+ end
85
+ format.ttl
86
+ end
87
+ end
88
+
89
+ def new
90
+ authorize! :create, Iqvoc::Concept.base_class
91
+
92
+ @concept = Iqvoc::Concept.base_class.new
93
+
94
+ Iqvoc::Concept.note_class_names.each do |note_class_name|
95
+ @concept.send(note_class_name.to_relation_name).build if @concept.send(note_class_name.to_relation_name).empty?
96
+ end
97
+ end
98
+
99
+ def create
100
+ authorize! :create, Iqvoc::Concept.base_class
101
+
102
+ @concept = Iqvoc::Concept.base_class.new(params[:concept])
103
+ if @concept.save
104
+ flash[:notice] = I18n.t("txt.controllers.versioned_concept.success")
105
+ redirect_to concept_path(:published => 0, :id => @concept.origin)
106
+ else
107
+ flash.now[:error] = I18n.t("txt.controllers.versioned_concept.error")
108
+ render :new
109
+ end
110
+ end
111
+
112
+ def edit
113
+ @concept = Iqvoc::Concept.base_class.by_origin(params[:id]).unpublished.last
114
+ raise ActiveRecord::RecordNotFound unless @concept
115
+
116
+ authorize! :update, @concept
117
+
118
+ @association_objects_in_editing_mode = @concept.associated_objects_in_editing_mode
119
+
120
+ if params[:full_consistency_check]
121
+ @concept.valid_with_full_validation?
122
+ end
123
+
124
+ Iqvoc::Concept.note_class_names.each do |note_class_name|
125
+ @concept.send(note_class_name.to_relation_name).build if @concept.send(note_class_name.to_relation_name).empty?
126
+ end
127
+ end
128
+
129
+ def update
130
+ @concept = Iqvoc::Concept.base_class.by_origin(params[:id]).unpublished.last
131
+ raise ActiveRecord::RecordNotFound unless @concept
132
+
133
+ authorize! :update, @concept
134
+
135
+ if @concept.update_attributes(params[:concept])
136
+ flash[:notice] = I18n.t("txt.controllers.versioned_concept.update_success")
137
+ redirect_to concept_path(:published => 0, :id => @concept)
138
+ else
139
+ flash.now[:error] = I18n.t("txt.controllers.versioned_concept.update_error")
140
+ render :action => :edit
141
+ end
142
+ end
143
+
144
+ def destroy
145
+ @new_concept = Iqvoc::Concept.base_class.by_origin(params[:id]).unpublished.last
146
+ raise ActiveRecord::RecordNotFound unless @new_concept
147
+
148
+ authorize! :destroy, @new_concept
149
+
150
+ if @new_concept.destroy
151
+ flash[:notice] = I18n.t("txt.controllers.concept_versions.delete")
152
+ redirect_to dashboard_path
153
+ else
154
+ flash[:notice] = I18n.t("txt.controllers.concept_versions.delete_error")
155
+ redirect_to concept_path(:published => 0, :id => @new_concept)
156
+ end
157
+ end
158
+
159
+ protected
160
+
161
+ # TODO: Find a method name matching the behaviour of the method
162
+ def labeling_as_json(labeling)
163
+ label = labeling.target
164
+ return {
165
+ :origin => label.origin,
166
+ :reltype => labeling.type.to_relation_name,
167
+ :value => label.value,
168
+ :lang => label.language
169
+ # TODO: relations (XL only)
170
+ }
171
+ end
172
+
173
+ end
174
+
@@ -0,0 +1,43 @@
1
+ # encoding: UTF-8
2
+
3
+ # Copyright 2011 innoQ Deutschland GmbH
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ class DashboardController < ApplicationController
18
+
19
+ def index
20
+ authorize! :use, :dashboard
21
+
22
+ @items = []
23
+ Iqvoc.first_level_classes.each do |klass|
24
+ @items += klass.for_dashboard.all
25
+ end
26
+
27
+ factor = params[:order] == "desc" ? -1 : 1
28
+
29
+ if ['class', 'locking_user', 'follow_up', 'updated_at', 'state'].include?(params[:by])
30
+ @items.sort! do |x, y|
31
+ xval, yval = x.send(params[:by]), y.send(params[:by])
32
+ xval = xval.to_s.downcase unless xval.is_a?(Date)
33
+ yval = yval.to_s.downcase unless yval.is_a?(Date)
34
+ (xval <=> yval) * factor
35
+ end
36
+ else
37
+ @items.sort! { |x,y| (x.to_s.downcase <=> y.to_s.downcase) * factor } rescue nil
38
+ end
39
+
40
+ @items = Kaminari.paginate_array(@items).page(params[:page])
41
+ end
42
+
43
+ end
@@ -0,0 +1,22 @@
1
+ # encoding: UTF-8
2
+
3
+ # Copyright 2011 innoQ Deutschland GmbH
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ class PagesController < ApplicationController
18
+ skip_before_filter :require_user
19
+
20
+ # TODO: Some kind of authorization is missing here!
21
+ # (even everybody has the right in the Ability)
22
+ end
@@ -0,0 +1,43 @@
1
+ # encoding: UTF-8
2
+
3
+ # Copyright 2011 innoQ Deutschland GmbH
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ class RdfController < ApplicationController
18
+
19
+ skip_before_filter :require_user
20
+ skip_before_filter :set_locale
21
+
22
+ def show
23
+ scope = if (params[:published] == "0")
24
+ Iqvoc::Concept.base_class.scoped.unpublished
25
+ else
26
+ Iqvoc::Concept.base_class.scoped.published
27
+ end
28
+ if @concept = scope.by_origin(params[:id]).with_associations.last
29
+ respond_to do |format|
30
+ format.html {
31
+ redirect_to concept_url(:id => @concept.origin, :published => params[:published])
32
+ }
33
+ format.any {
34
+ authorize! :read, @concept
35
+ render "show_concept"
36
+ }
37
+ end
38
+ else
39
+ raise ActiveRecord::RecordNotFound.new("Coulnd't find either a concept matching '#{params[:id]}'.")
40
+ end
41
+ end
42
+
43
+ end
@@ -0,0 +1,101 @@
1
+ # encoding: UTF-8
2
+
3
+ # Copyright 2011 innoQ Deutschland GmbH
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ class SearchResultsController < ApplicationController
18
+ skip_before_filter :require_user
19
+
20
+ def index
21
+ authorize! :read, Concept::Base # TODO: I think a :search right would be
22
+ # better here because you're able to serach more than only concepts.
23
+
24
+ self.class.prepare_basic_variables(self)
25
+
26
+ # Map short params to their log representation
27
+ {:t => :type, :q => :query, :l => :languages, :qt => :query_type, :c => :collection_origin}.each do |short, long|
28
+ params[long] ||= params[short]
29
+ end
30
+
31
+ # Select first type by default
32
+ params[:type] = Iqvoc.searchable_class_names.first.parameterize unless params[:type]
33
+
34
+ # Delete parameters which should not be included into generated urls (e.g.
35
+ # in rdf views)
36
+ request.query_parameters.delete("commit")
37
+ request.query_parameters.delete("utf8")
38
+
39
+ if params[:query]
40
+ if params[:query].blank? && params[:collection_origin].blank?
41
+ flash.now[:error] = I18n.t('txt.controllers.search_results.insufficient_data')
42
+ render :action => 'index', :status => 422
43
+ return
44
+ end
45
+
46
+ # Special treatment for the "nil language"
47
+ params[:languages] << nil if params[:languages].is_a?(Array) && params[:languages].include?("none")
48
+
49
+ # Ensure a valid class was selected
50
+ unless type_class_index = Iqvoc.searchable_class_names.map(&:parameterize).index(params[:type].parameterize)
51
+ raise "'#{params[:type]}' is not a valid / configured searchable class! Must be one of " + Iqvoc.searchable_class_names.join(', ')
52
+ end
53
+ klass = Iqvoc.searchable_class_names[type_class_index].constantize
54
+
55
+ query_size = params[:query].split(/\r\n/).size
56
+
57
+ if klass.forces_multi_query? || (klass.supports_multi_query? && query_size > 1)
58
+ @multi_query = true
59
+ @results = klass.multi_query(params)
60
+ # TODO: Add a worst case limit here; e.g. when on page 2 (per_page == 50)
61
+ # each sub-query has to return 100 objects at most.
62
+ @klass = klass
63
+ else
64
+ @multi_query = false
65
+ @results = klass.single_query(params)
66
+ end
67
+
68
+ if @multi_query
69
+ @results = Kaminari.paginate_array(@results)
70
+ logger.debug("Using multi query mode")
71
+ else
72
+ logger.debug("Using single query mode")
73
+ end
74
+
75
+ @results = @results.page(params[:page])
76
+
77
+ if params[:limit] and Iqvoc.unlimited_search_results
78
+ @results = @results.per(params[:limit].to_i)
79
+ end
80
+
81
+ respond_to do |format|
82
+ format.html
83
+ format.ttl { render('search_results/index.iqrdf') }
84
+ format.rdf { render('search_results/index.iqrdf') }
85
+ end
86
+
87
+ end
88
+ end
89
+
90
+ def self.prepare_basic_variables(controller)
91
+ langs = (Iqvoc.available_languages + Iqvoc::Concept.labeling_class_names.values.flatten).uniq.each_with_object({}) do |lang_sym, hsh|
92
+ lang_sym ||= "none"
93
+ hsh[lang_sym.to_s] = I18n.t("languages.#{lang_sym.to_s}", :default => lang_sym.to_s)
94
+ end
95
+ controller.instance_variable_set(:@available_languages, langs)
96
+
97
+ collections = Iqvoc::Collection.base_class.includes(:pref_labels).all
98
+ controller.instance_variable_set(:@collections, collections)
99
+ end
100
+
101
+ end
@@ -0,0 +1,45 @@
1
+ # encoding: UTF-8
2
+
3
+ # Copyright 2011 innoQ Deutschland GmbH
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ class TripleStoreSyncsController < ApplicationController
18
+
19
+ # TODO: This must definitely be rebuild!
20
+
21
+ def new
22
+ authorize! :use, :dashboard # TODO
23
+ end
24
+
25
+ def create
26
+ authorize! :use, :dashboard # TODO
27
+
28
+ time = Time.now
29
+
30
+ rdf_helper = Object.new.extend(RdfHelper)
31
+
32
+ Concept::Base.published.unsynced.find_each do |concept|
33
+ concept.update_attribute(:rdf_updated_at, time) if RdfStore.mass_import(concept.rdf_uri, rdf_helper.render_ttl_for_concept(concept))
34
+ end
35
+
36
+ Label::Base.published.unsynced.find_each do |label|
37
+ label.update_attribute(:rdf_updated_at, time) if RdfStore.mass_import(label.rdf_uri, rdf_helper.render_ttl_for_label(label))
38
+ end
39
+
40
+ flash.now[:notice] = I18n.t("txt.controllers.triple_store_syncs.success")
41
+
42
+ render :action => "new"
43
+ end
44
+
45
+ end