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,9 @@
1
+ class AddPublishedAtToLabels < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :labels, "published_at", :date unless column_exists? :labels, "published_at"
4
+ end
5
+
6
+ def self.down
7
+ remove_column :labels, "published_at"
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ class UseMonoHierarchyInsteadOfPolyHierarchy < ActiveRecord::Migration
2
+ def self.up
3
+ ActiveRecord::Base.transaction do
4
+ Concept::Relation::Base.update_all("type = 'Concept::Relation::SKOS::Broader::Mono'", :type => 'Concept::Relation::SKOS::Broader::Poly')
5
+ end
6
+ end
7
+
8
+ def self.down
9
+ ActiveRecord::Base.transaction do
10
+ Concept::Relation::Base.update_all("type = 'Concept::Relation::SKOS::Broader::Poly'", :type => 'Concept::Relation::SKOS::Broader::Mono')
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ class ExtendNotesValueFieldLength < ActiveRecord::Migration
2
+ def self.up
3
+ change_column :notes, :value, :string, :limit => 4000
4
+ end
5
+
6
+ def self.down
7
+ end
8
+ end
@@ -0,0 +1,38 @@
1
+ class SeparateNoteAnnotationPredicates < ActiveRecord::Migration
2
+ def self.up
3
+ rename_column :note_annotations, :identifier, :predicate
4
+ add_column :note_annotations, :namespace, :string, :limit => 50
5
+
6
+ total = Note::Annotated::Base.count
7
+ i = 0
8
+
9
+ puts "starting #{total} note annotation conversions..."
10
+ reset = "\r" + "\e[0K" # adapted from http://snippets.dzone.com/posts/show/3760
11
+
12
+ Note::Annotated::Base.find_each do |annotation|
13
+ print "#{reset}#{i += 1} / #{total}"
14
+
15
+ old_identifier = annotation.predicate
16
+ namespace, predicate = old_identifier.split(":", 2)
17
+ annotation.predicate = predicate
18
+ annotation.namespace = namespace
19
+ annotation.save!
20
+
21
+ $stdout.flush
22
+ end
23
+
24
+ print "#{reset}"
25
+ $stdout.flush
26
+ puts "note annotation conversion complete"
27
+ end
28
+
29
+ def self.down
30
+ Note::Annotated::Base.find_each do |annotation|
31
+ identifier = [annotation.namespace, annotation.predicate].join(":")
32
+ annotation.predicate = identifier
33
+ annotation.save!
34
+ end
35
+ rename_column :note_annotations, :predicate, :identifier
36
+ remove_column :note_annotations, :namespace
37
+ end
38
+ end
@@ -0,0 +1,9 @@
1
+ class ChangeUmtNoteAnnotationsToDct < ActiveRecord::Migration
2
+ def self.up
3
+ Note::Annotated::Base.update_all({:namespace => "dct", :predicate => "creator"}, {:namespace => "umt", :predicate => "editor"})
4
+ end
5
+
6
+ def self.down
7
+ Note::Annotated::Base.update_all({:namespace => "umt", :predicate => "editor"}, {:namespace => "dct", :predicate => "creator"})
8
+ end
9
+ end
data/db/schema.rb ADDED
@@ -0,0 +1,127 @@
1
+ # This file is auto-generated from the current state of the database. Instead
2
+ # of editing this file, please use the migrations feature of Active Record to
3
+ # incrementally modify your database, and then regenerate this schema definition.
4
+ #
5
+ # Note that this schema.rb definition is the authoritative source for your
6
+ # database schema. If you need to create the application database on another
7
+ # system, you should be using db:schema:load, not running all the migrations
8
+ # from scratch. The latter is a flawed and unsustainable approach (the more migrations
9
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
10
+ #
11
+ # It's strongly recommended to check this file into your version control system.
12
+
13
+ ActiveRecord::Schema.define(:version => 20110615134040) do
14
+
15
+ create_table "collection_members", :force => true do |t|
16
+ t.integer "collection_id"
17
+ t.integer "target_id"
18
+ t.string "type"
19
+ end
20
+
21
+ add_index "collection_members", ["collection_id", "target_id", "type"], :name => "ix_collections_fk_type"
22
+
23
+ create_table "concept_relations", :force => true do |t|
24
+ t.string "type"
25
+ t.integer "owner_id"
26
+ t.integer "target_id"
27
+ t.datetime "created_at"
28
+ t.datetime "updated_at"
29
+ end
30
+
31
+ add_index "concept_relations", ["owner_id", "target_id"], :name => "ix_concept_relations_fk"
32
+
33
+ create_table "concepts", :force => true do |t|
34
+ t.string "type"
35
+ t.string "origin", :limit => 4000
36
+ t.integer "rev", :default => 1
37
+ t.date "published_at"
38
+ t.integer "published_version_id"
39
+ t.integer "locked_by"
40
+ t.date "expired_at"
41
+ t.date "follow_up"
42
+ t.boolean "to_review"
43
+ t.date "rdf_updated_at"
44
+ t.datetime "created_at"
45
+ t.datetime "updated_at"
46
+ end
47
+
48
+ add_index "concepts", ["origin"], :name => "ix_concepts_on_origin", :length => {"origin"=>255}
49
+ add_index "concepts", ["published_version_id"], :name => "ix_concepts_publ_version_id"
50
+
51
+ create_table "labelings", :force => true do |t|
52
+ t.string "type"
53
+ t.integer "owner_id"
54
+ t.integer "target_id"
55
+ t.datetime "created_at"
56
+ t.datetime "updated_at"
57
+ end
58
+
59
+ add_index "labelings", ["owner_id", "target_id", "type"], :name => "ix_labelings_fk_type"
60
+ add_index "labelings", ["type"], :name => "ix_labelings_on_type"
61
+
62
+ create_table "labels", :force => true do |t|
63
+ t.string "type"
64
+ t.string "origin", :limit => 4000
65
+ t.string "language"
66
+ t.string "value", :limit => 1024
67
+ t.datetime "created_at"
68
+ t.datetime "updated_at"
69
+ t.date "published_at"
70
+ end
71
+
72
+ add_index "labels", ["language"], :name => "ix_labels_on_language"
73
+ add_index "labels", ["origin"], :name => "ix_labels_on_origin", :length => {"origin"=>255}
74
+ add_index "labels", ["value"], :name => "ix_labels_on_value", :length => {"value"=>255}
75
+
76
+ create_table "matches", :force => true do |t|
77
+ t.integer "concept_id"
78
+ t.string "type"
79
+ t.string "value"
80
+ t.datetime "created_at"
81
+ t.datetime "updated_at"
82
+ end
83
+
84
+ add_index "matches", ["concept_id", "type"], :name => "ix_matches_fk_type"
85
+ add_index "matches", ["type"], :name => "ix_matches_on_type"
86
+
87
+ create_table "note_annotations", :force => true do |t|
88
+ t.integer "note_id"
89
+ t.string "predicate", :limit => 50
90
+ t.string "value", :limit => 1024
91
+ t.datetime "created_at"
92
+ t.datetime "updated_at"
93
+ t.string "namespace", :limit => 50
94
+ end
95
+
96
+ add_index "note_annotations", ["note_id"], :name => "ix_note_annotations_fk"
97
+
98
+ create_table "notes", :force => true do |t|
99
+ t.string "language", :limit => 2
100
+ t.string "value", :limit => 4000
101
+ t.string "type", :limit => 50
102
+ t.datetime "created_at"
103
+ t.datetime "updated_at"
104
+ t.integer "owner_id"
105
+ t.string "owner_type", :null => false
106
+ end
107
+
108
+ add_index "notes", ["language"], :name => "ix_notes_on_language"
109
+ add_index "notes", ["owner_id", "owner_type", "type"], :name => "ix_notes_fk_type"
110
+ add_index "notes", ["type"], :name => "ix_notes_on_type"
111
+
112
+ create_table "users", :force => true do |t|
113
+ t.string "forename"
114
+ t.string "surname"
115
+ t.string "email"
116
+ t.string "crypted_password"
117
+ t.boolean "active"
118
+ t.datetime "created_at"
119
+ t.datetime "updated_at"
120
+ t.string "password_salt"
121
+ t.string "persistence_token"
122
+ t.string "perishable_token"
123
+ t.string "role"
124
+ t.string "telephone_number"
125
+ end
126
+
127
+ end
data/db/seeds.rb ADDED
@@ -0,0 +1,37 @@
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
+ if User.where(:email => 'admin@iqvoc').none?
18
+ User.create!(
19
+ :forename => 'Admin',
20
+ :surname => 'Istrator',
21
+ :email => 'admin@iqvoc',
22
+ :password => 'admin',
23
+ :password_confirmation => 'admin',
24
+ :active => true,
25
+ :role => "administrator")
26
+ end
27
+
28
+ if User.where(:email => 'demo@iqvoc').none?
29
+ User.create!(
30
+ :forename => 'Demo',
31
+ :surname => 'User',
32
+ :email => 'demo@iqvoc',
33
+ :password => 'cooluri',
34
+ :password_confirmation => 'cooluri',
35
+ :active => true,
36
+ :role => "reader")
37
+ end
data/iqvoc.gemspec ADDED
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require 'iqvoc/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "iqvoc"
7
+ s.version = Iqvoc::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Robert Glaser", "Till Schulte-Coerne", "Frederik Dohr"]
10
+ s.email = ["robert.glaser@innoq.com", "till.schulte-coerne@innoq.com"]
11
+ s.homepage = "http://innoq.com"
12
+ s.summary = "iQvoc"
13
+ s.description = "iQvoc - a SKOS(-XL) vocabulary management system built on the Semantic Web"
14
+
15
+ s.add_dependency 'rails', '~> 3.0.9'
16
+ s.add_dependency 'bundler'
17
+ s.add_dependency 'kaminari'
18
+ s.add_dependency 'authlogic'
19
+ s.add_dependency 'cancan'
20
+ s.add_dependency 'iq_rdf', '~> 0.0.14'
21
+ s.add_dependency 'json'
22
+
23
+ s.files = %w(LICENSE README.md Gemfile Gemfile.lock Rakefile iqvoc.gemspec) + Dir.glob("{app,config,db,public,lib,test}/**/*")
24
+ s.test_files = Dir.glob("{test}/**/*")
25
+ s.executables = Dir.glob("{bin}/**/*")
26
+ s.require_paths = ["lib"]
27
+ end
@@ -0,0 +1,49 @@
1
+ require 'fileutils'
2
+
3
+ namespace :iqvoc do
4
+ namespace :assets do
5
+
6
+ def Iqvoc.for_static_folders
7
+ engine_public_dir = Iqvoc::Engine.find_root_with_flag("public").join('public')
8
+ app_public_dir = Rails.public_path
9
+
10
+ if File.directory?(app_public_dir)
11
+ %w(stylesheets javascripts images fonts).each do |specific_dir|
12
+ source_common_dir = File.join(engine_public_dir, specific_dir, "iqvoc")
13
+ if File.exist?(source_common_dir)
14
+ target_common_dir = File.join(app_public_dir, specific_dir, "iqvoc")
15
+ FileUtils.mkdir_p(File.join(app_public_dir, specific_dir))
16
+
17
+ yield(source_common_dir, target_common_dir)
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ desc "Create symlinks to public stylesheets, javascripts, fonts and images folders in engine"
24
+ task :link do
25
+ Iqvoc.for_static_folders do |source_common_dir, target_common_dir|
26
+ File.unlink(target_common_dir) if File.symlink?(target_common_dir) && ENV['force'] == "true"
27
+ if !File.exists?(target_common_dir)
28
+ puts "Linking #{source_common_dir} -> #{target_common_dir}"
29
+ File.symlink(source_common_dir, target_common_dir)
30
+ else
31
+ puts "Symlink #{target_common_dir} already exists!"
32
+ end
33
+ end
34
+ end
35
+
36
+ desc "Copy public stylesheets, javascripts, fonts and images folders in engine to the public directory of this application"
37
+ task :copy do
38
+ Iqvoc.for_static_folders do |source_common_dir, target_common_dir|
39
+ if !File.exists?(File.join(target_common_dir, "engine"))
40
+ puts "Copying #{source_common_dir} -> #{target_common_dir}"
41
+ FileUtils.cp_r(source_common_dir, target_common_dir)
42
+ else
43
+ puts "Directory #{File.join(target_common_dir, "vendor")} already exists!"
44
+ end
45
+ end
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,18 @@
1
+ namespace :iqvoc do
2
+ namespace :db do
3
+
4
+ desc "Migrate the database through scripts in db/migrate and update db/schema.rb by invoking db:schema:dump. Target specific version with VERSION=x. Turn off output with VERBOSE=false."
5
+ task :migrate => :environment do
6
+ ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
7
+ ActiveRecord::Migrator.migrate(Iqvoc::Engine.find_root_with_flag("db").join('db/migrate'), ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
8
+ Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
9
+ end
10
+
11
+ desc "Load seeds (task is idempotent)"
12
+ task :seed => :environment do
13
+ Iqvoc::Engine.load_seed
14
+ end
15
+
16
+ end
17
+ end
18
+
@@ -0,0 +1,118 @@
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
+ namespace :iqvoc do
18
+ namespace :release do
19
+
20
+ desc "Build a production ready release to tmp/release (or to RELEASE_PATH). Use the parameter RUBY_CMD to speficy weather to use ruby or jruby to bundle the release."
21
+ task :build => :environment do
22
+ ENV['RELEASE_PATH'] ||= Rails.root.join('tmp/release')
23
+ ENV['RUBY_CMD'] ||= RUBY_PLATFORM == 'java' ? "jruby" : "ruby"
24
+
25
+ Rake::Task["iqvoc:release:initialize"].invoke
26
+ Rake::Task["iqvoc:release:bundle"].invoke
27
+ Rake::Task["iqvoc:release:iqvoc_assets"].invoke
28
+ Rake::Task["iqvoc:release:finalize"].invoke
29
+ puts "Release complete: #{ENV['RELEASE_PATH']}"
30
+ end
31
+
32
+ task :initialize do
33
+ path = File.expand_path(ENV['RELEASE_PATH'] || raise("You have to specify RELEASE_PATH"))
34
+
35
+ FileUtils.rm_rf(path) if File.directory?(path)
36
+ FileUtils.mkdir path
37
+
38
+ git_remotes = `git remote show origin`
39
+ raise "Couldn't read Fetch URL from #{git_remotes}" unless git_remotes.match(/Fetch URL: (.+)$/)
40
+ fetch_url = $1
41
+
42
+ git_remote_branches = `git branch -r`
43
+ raise "Couldn't read remote branches from #{git_remote_branches}" unless git_remote_branches.match(/origin\/.+/)
44
+ git_remote_branches.match(/(origin\/.+)\n/m)
45
+ branches = $1.squish.gsub("origin/", "").split(" ")
46
+
47
+ git_heroku_remote = `git remote -v`.split(/\n/).select{|s| s =~ /^heroku/}.map{|s| s.squish.split(" ").second}.first
48
+ puts "Found heroku remote '#{git_heroku_remote}'" if git_heroku_remote
49
+
50
+ branch = nil
51
+ while true
52
+ STDOUT.print "Enter branch name [master]: "
53
+ branch = (STDIN.gets.presence || 'master').gsub(/\n/, "")
54
+ break if branches.include?(branch)
55
+ puts "Branch must be one of #{branches.inspect}"
56
+ end
57
+
58
+ `git clone -b #{branch} #{fetch_url} #{path}`
59
+
60
+ FileUtils.cd(path) do
61
+
62
+ # Defuse the git repository
63
+ `git remote rm origin` # Nobody should push this back into our holy repository
64
+ `git remote add heroku #{git_heroku_remote}` if git_heroku_remote
65
+
66
+ end
67
+
68
+ end
69
+
70
+ task :bundle do
71
+ path = File.expand_path(ENV['RELEASE_PATH'] || raise("You have to specify RELEASE_PATH"))
72
+ gemfile = File.join(path, "Gemfile")
73
+ ruby_cmd = ENV['RUBY_CMD'].presence || raise("You have to specify RUBY_CMD")
74
+
75
+ Bundler.with_clean_env do
76
+ FileUtils.cd(path) do
77
+
78
+ if (File.exist?('Gemfile.production'))
79
+ FileUtils.cp('Gemfile.production', 'Gemfile')
80
+
81
+ FileUtils.rm('Gemfile.lock') if File.exist?('Gemfile.lock')
82
+
83
+ # We'll have to "rebundle" the Gemfile.lock
84
+ puts "Gemfile was replaced by Gemfile.production. Rebundling Gemfile.lock..."
85
+ puts `#{ruby_cmd} -S bundle install --path=vendor/bundle --gemfile=#{gemfile} --without=development:test`
86
+ end
87
+
88
+ puts `#{ruby_cmd} -S bundle install --deployment --gemfile=#{gemfile}`
89
+ end
90
+ end
91
+ end
92
+
93
+ task :iqvoc_assets do
94
+ path = File.expand_path(ENV['RELEASE_PATH'] || raise("You have to specify RELEASE_PATH"))
95
+ gemfile = File.join(path, "Gemfile")
96
+ ruby_cmd = ENV['RUBY_CMD'].presence || raise("You have to specify RUBY_CMD")
97
+
98
+ Bundler.with_clean_env do
99
+ FileUtils.cd(path) do
100
+
101
+ puts `export BUNDLE_GEMFILE='#{gemfile}' && #{ruby_cmd} -S bundle exec rake iqvoc:assets:copy`
102
+
103
+ end
104
+ end
105
+ end
106
+
107
+ task :finalize do
108
+ path = File.expand_path(ENV['RELEASE_PATH'] || raise("You have to specify RELEASE_PATH"))
109
+
110
+ FileUtils.cd(path) do
111
+ `git add *`
112
+ `git commit -m 'iqvoc:release:build: Packed release'`
113
+ end
114
+
115
+ end
116
+
117
+ end
118
+ end
@@ -0,0 +1,44 @@
1
+ module Iqvoc
2
+ class Ability
3
+ include CanCan::Ability
4
+
5
+ @@if_published = lambda { |o| o.published? }
6
+
7
+ def initialize(user = nil)
8
+
9
+ can :read, ::Collection::Base
10
+
11
+ can :read, [::Concept::Base, ::Label::Base], &@@if_published
12
+
13
+ if user # Every logged in user ...
14
+ can :use, :dashboard
15
+
16
+ if user.owns_role?(:editor) || user.owns_role?(:publisher) || user.owns_role?(:administrator) # Editors and above ...
17
+ can :manage, ::Collection::Base
18
+
19
+ can :read, [::Concept::Base, ::Label::Base]
20
+ can :create, [::Concept::Base, ::Label::Base]
21
+ can [:update, :destroy, :unlock], [::Concept::Base, ::Label::Base], :locked_by => user.id, :published_at => nil
22
+ can :lock, [::Concept::Base, ::Label::Base], :locked_by => nil, :published_at => nil
23
+ can [:check_consistency, :send_to_review], [::Concept::Base, ::Label::Base], :published_at => nil
24
+ can :branch, [::Concept::Base, ::Label::Base], &@@if_published
25
+ end
26
+
27
+ if user.owns_role?(:publisher) || user.owns_role?(:administrator) # Publishers and above ...
28
+ can :merge, [::Concept::Base, ::Label::Base], :published_at => nil
29
+ end
30
+
31
+ if user.owns_role?(:administrator) # Admins ...
32
+ can [:update, :destroy, :unlock], [::Concept::Base, ::Label::Base], :published_at => nil # Mustn't be locked by myself
33
+
34
+ can :manage, User
35
+
36
+ can :full_export, ::Concept::Base
37
+ end
38
+
39
+ end
40
+
41
+ end
42
+
43
+ end
44
+ end
@@ -0,0 +1,27 @@
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
+ module Iqvoc
18
+ class InlineDataHelper # TODO: Module should have the same name as the file! "Helper" has an other meaning in Rails. I would suggest "InlineData".
19
+
20
+ # TODO: Non class constants should be written UPPER_CASE
21
+
22
+ # delimiters for strings representing a list of values
23
+ Joiner = ", "
24
+ Splitter = /[,\n] */
25
+
26
+ end
27
+ end
@@ -0,0 +1,92 @@
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
+ module Iqvoc
18
+ module DeepCloning
19
+
20
+ def self.included(base) #:nodoc:
21
+ base.alias_method_chain :clone, :deep_cloning
22
+ end
23
+
24
+ # clones an ActiveRecord model.
25
+ # if passed the :include option, it will deep clone the given associations
26
+ # if passed the :except option, it won't clone the given attributes
27
+ #
28
+ # === Usage:
29
+ #
30
+ # ==== Cloning a model without an attribute
31
+ # pirate.clone :except => :name
32
+ #
33
+ # ==== Cloning a model without multiple attributes
34
+ # pirate.clone :except => [:name, :nick_name]
35
+ # ==== Cloning one single association
36
+ # pirate.clone :include => :mateys
37
+ #
38
+ # ==== Cloning multiple associations
39
+ # pirate.clone :include => [:mateys, :treasures]
40
+ #
41
+ # ==== Cloning really deep
42
+ # pirate.clone :include => {:treasures => :gold_pieces}
43
+ #
44
+ # ==== Cloning really deep with multiple associations
45
+ # pirate.clone :include => [:mateys, {:treasures => :gold_pieces}]
46
+ #
47
+ # ==== Cloning multiple associations - but only the join table entries without cloning the associated objects themselves
48
+ # pirate.clone :include_association => [:matey_ids, :treasure_ids]
49
+ #
50
+ def clone_with_deep_cloning options = {}
51
+ kopy = clone_without_deep_cloning
52
+
53
+ if options[:except]
54
+ Array(options[:except]).each do |attribute|
55
+ kopy.write_attribute(attribute, attributes_from_column_definition[attribute.to_s])
56
+ end
57
+ end
58
+
59
+ if options[:include_association]
60
+ Array(options[:include_association]).each do |association_attribute|
61
+ kopy.send("#{association_attribute}=", self.send("#{association_attribute}"))
62
+ end
63
+ end
64
+
65
+ if options[:include]
66
+ Array(options[:include]).each do |association, deep_associations|
67
+ if (association.kind_of? Hash)
68
+ deep_associations = association[association.keys.first]
69
+ association = association.keys.first
70
+ end
71
+ opts = deep_associations.blank? ? {} : {:include => deep_associations}
72
+ association_reflection = self.class.reflect_on_association(association)
73
+ cloned_object = case association_reflection.macro
74
+ when :belongs_to, :has_one
75
+ self.send(association) && self.send(association).clone(opts)
76
+ when :has_many, :has_and_belongs_to_many
77
+ fk = association_reflection.options[:foreign_key]# || self.class.to_s.underscore
78
+ self.send(association).collect do |obj|
79
+ cloned_obj = obj.clone(opts)
80
+ cloned_obj.send("#{fk}=", kopy) unless fk.blank?
81
+ cloned_obj
82
+ end
83
+ end
84
+ kopy.send("#{association}=", cloned_object)
85
+ end
86
+ end
87
+
88
+ return kopy
89
+ end
90
+
91
+ end
92
+ end