iqvoc 4.0.1 → 4.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. data/CHANGELOG.md +5 -0
  2. data/README.md +1 -1
  3. data/app/assets/stylesheets/iqvoc/components.css.scss +6 -0
  4. data/app/controllers/concepts_controller.rb +8 -5
  5. data/app/helpers/concepts_helper.rb +5 -1
  6. data/app/helpers/dashboard_helper.rb +2 -2
  7. data/app/helpers/navigation_helper.rb +10 -0
  8. data/app/models/collection/member/base.rb +5 -0
  9. data/app/models/collection/member/skos/base.rb +37 -0
  10. data/app/models/collection/skos/base.rb +35 -0
  11. data/app/models/collection/unordered.rb +1 -1
  12. data/app/views/collections/_form.html.erb +3 -1
  13. data/app/views/concepts/_form.html.erb +3 -1
  14. data/app/views/concepts/sidebars/_singular.html.erb +1 -0
  15. data/app/views/dashboard/index.html.erb +2 -2
  16. data/app/views/errors/not_found.html.erb +2 -5
  17. data/app/views/layouts/_navigation.html.erb +1 -1
  18. data/config/locales/de.yml +4 -3
  19. data/config/locales/en.yml +3 -2
  20. data/db/schema.rb +1 -10
  21. data/lib/iqvoc/configuration/collection.rb +7 -1
  22. data/lib/iqvoc/skos_importer.rb +7 -2
  23. data/lib/iqvoc/version.rb +1 -1
  24. data/test/unit/hygiene_test.rb +1 -1
  25. data/test/unit/skos_import_test.rb +67 -0
  26. metadata +26 -145
  27. data/public/assets/ajax-loader-dada1fbb71d7fb80d8dde7a031ae6cd0.gif +0 -0
  28. data/public/assets/ajax-loader.gif +0 -0
  29. data/public/assets/arrow_down-07c5dea12928d65fcc31c08279366170.gif +0 -0
  30. data/public/assets/arrow_down.gif +0 -0
  31. data/public/assets/arrow_up-51ede92c113b9a870e7a306907360ba8.gif +0 -0
  32. data/public/assets/arrow_up.gif +0 -0
  33. data/public/assets/bootstrap/bootstrap-2012a68e8267282c0a2c177d7005ae6d.css +0 -9
  34. data/public/assets/bootstrap/bootstrap-2012a68e8267282c0a2c177d7005ae6d.css.gz +0 -0
  35. data/public/assets/bootstrap/bootstrap-2c6144df0bc0f1c9958a69dd77b4f2c2.js +0 -19
  36. data/public/assets/bootstrap/bootstrap-2c6144df0bc0f1c9958a69dd77b4f2c2.js.gz +0 -0
  37. data/public/assets/bootstrap/bootstrap-responsive-609b376f4bb032588c054b563d4bca1f.css +0 -9
  38. data/public/assets/bootstrap/bootstrap-responsive-609b376f4bb032588c054b563d4bca1f.css.gz +0 -0
  39. data/public/assets/bootstrap/bootstrap-responsive.css +0 -9
  40. data/public/assets/bootstrap/bootstrap-responsive.css.gz +0 -0
  41. data/public/assets/bootstrap/bootstrap.css +0 -9
  42. data/public/assets/bootstrap/bootstrap.css.gz +0 -0
  43. data/public/assets/bootstrap/bootstrap.js +0 -19
  44. data/public/assets/bootstrap/bootstrap.js.gz +0 -0
  45. data/public/assets/bootstrap/glyphicons-halflings-0e7ff93d8f48fe1f5f762e4312e78da7.png +0 -0
  46. data/public/assets/bootstrap/glyphicons-halflings-white-ef3d5b8d6a297804352b4a46fdb5466d.png +0 -0
  47. data/public/assets/bootstrap/glyphicons-halflings-white.png +0 -0
  48. data/public/assets/bootstrap/glyphicons-halflings.png +0 -0
  49. data/public/assets/excanvas-41add5296511313d9ceaddebef8ca888.js +0 -14
  50. data/public/assets/excanvas-41add5296511313d9ceaddebef8ca888.js.gz +0 -0
  51. data/public/assets/excanvas.js +0 -14
  52. data/public/assets/excanvas.js.gz +0 -0
  53. data/public/assets/file-58ce0b58f19dfe871b25270e98cff66c.gif +0 -0
  54. data/public/assets/file.gif +0 -0
  55. data/public/assets/folder-5c5b1fd2f1ece710f9159f05cc2aaaa8.gif +0 -0
  56. data/public/assets/folder-closed-8b61fc55011d534f0216c1150994f229.gif +0 -0
  57. data/public/assets/folder-closed.gif +0 -0
  58. data/public/assets/folder.gif +0 -0
  59. data/public/assets/html5-e59131c9bbee37c5d248ab5563f80112.js +0 -3
  60. data/public/assets/html5-e59131c9bbee37c5d248ab5563f80112.js.gz +0 -0
  61. data/public/assets/html5.js +0 -3
  62. data/public/assets/html5.js.gz +0 -0
  63. data/public/assets/iqvoc/ie_fixes-6a106c21d979ccdd1f6bf1cb129a0e69.css +0 -1
  64. data/public/assets/iqvoc/ie_fixes-6a106c21d979ccdd1f6bf1cb129a0e69.css.gz +0 -0
  65. data/public/assets/iqvoc/ie_fixes.css +0 -1
  66. data/public/assets/iqvoc/ie_fixes.css.gz +0 -0
  67. data/public/assets/iqvoc/visualization-85d0de8ba646bf7ba8c05255f38e19e6.js +0 -4
  68. data/public/assets/iqvoc/visualization-85d0de8ba646bf7ba8c05255f38e19e6.js.gz +0 -0
  69. data/public/assets/iqvoc/visualization.js +0 -4
  70. data/public/assets/iqvoc/visualization.js.gz +0 -0
  71. data/public/assets/iqvoc_logo-316859a511c646918fe75e92fa0bf6ac.png +0 -0
  72. data/public/assets/iqvoc_logo.png +0 -0
  73. data/public/assets/jit_rgraph-887e8bf5872bfb759cec78efe5e6c62e.js +0 -25
  74. data/public/assets/jit_rgraph-887e8bf5872bfb759cec78efe5e6c62e.js.gz +0 -0
  75. data/public/assets/jit_rgraph.js +0 -25
  76. data/public/assets/jit_rgraph.js.gz +0 -0
  77. data/public/assets/jquery-ui/ui-bg_flat_0_aaaaaa_40x100-a1eb3e0764573ed4b261ca742ed96ac3.png +0 -0
  78. data/public/assets/jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  79. data/public/assets/jquery-ui/ui-bg_flat_55_fbec88_40x100-439ee8e6c8ce855f43ed4d7b90684720.png +0 -0
  80. data/public/assets/jquery-ui/ui-bg_flat_55_fbec88_40x100.png +0 -0
  81. data/public/assets/jquery-ui/ui-bg_glass_75_d0e5f5_1x400-9357836db77954d0d8c5feb259635223.png +0 -0
  82. data/public/assets/jquery-ui/ui-bg_glass_75_d0e5f5_1x400.png +0 -0
  83. data/public/assets/jquery-ui/ui-bg_glass_85_dfeffc_1x400-7beb11d1590fb2fb1ef5c754100a078a.png +0 -0
  84. data/public/assets/jquery-ui/ui-bg_glass_85_dfeffc_1x400.png +0 -0
  85. data/public/assets/jquery-ui/ui-bg_glass_95_fef1ec_1x400-c723e9a2b50006c6054836a10b76bb84.png +0 -0
  86. data/public/assets/jquery-ui/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  87. data/public/assets/jquery-ui/ui-bg_gloss-wave_55_5c9ccc_500x100-cb26f48ac4912c23ce301c69c474d306.png +0 -0
  88. data/public/assets/jquery-ui/ui-bg_gloss-wave_55_5c9ccc_500x100.png +0 -0
  89. data/public/assets/jquery-ui/ui-bg_inset-hard_100_f5f8f9_1x100-519299e2aa31bffdd4fed34b4fac603d.png +0 -0
  90. data/public/assets/jquery-ui/ui-bg_inset-hard_100_f5f8f9_1x100.png +0 -0
  91. data/public/assets/jquery-ui/ui-bg_inset-hard_100_fcfdfd_1x100-27e08524d3d56bb59e354435b663c3ac.png +0 -0
  92. data/public/assets/jquery-ui/ui-bg_inset-hard_100_fcfdfd_1x100.png +0 -0
  93. data/public/assets/jquery-ui/ui-icons_217bc0_256x240-ed26778199d8722ae064038a1e841bc8.png +0 -0
  94. data/public/assets/jquery-ui/ui-icons_217bc0_256x240.png +0 -0
  95. data/public/assets/jquery-ui/ui-icons_2e83ff_256x240-94086d0ce953eb0887ab1b8140903af9.png +0 -0
  96. data/public/assets/jquery-ui/ui-icons_2e83ff_256x240.png +0 -0
  97. data/public/assets/jquery-ui/ui-icons_469bdd_256x240-188717a27b4d5504885a03e4ad8e34d1.png +0 -0
  98. data/public/assets/jquery-ui/ui-icons_469bdd_256x240.png +0 -0
  99. data/public/assets/jquery-ui/ui-icons_6da8d5_256x240-8f5b417c5604f1b7b5965c98754c33b9.png +0 -0
  100. data/public/assets/jquery-ui/ui-icons_6da8d5_256x240.png +0 -0
  101. data/public/assets/jquery-ui/ui-icons_cd0a0a_256x240-8b44e266bdc1f57f1393579591f89222.png +0 -0
  102. data/public/assets/jquery-ui/ui-icons_cd0a0a_256x240.png +0 -0
  103. data/public/assets/jquery-ui/ui-icons_d8e7f3_256x240-1b415e411069df902e6f417cc014172c.png +0 -0
  104. data/public/assets/jquery-ui/ui-icons_d8e7f3_256x240.png +0 -0
  105. data/public/assets/jquery-ui/ui-icons_f9bd01_256x240-4553d0576c0498ca4c776aa77aa80833.png +0 -0
  106. data/public/assets/jquery-ui/ui-icons_f9bd01_256x240.png +0 -0
  107. data/public/assets/json2-fedf627b8fba2c78ab3d5cae6e76914d.js +0 -157
  108. data/public/assets/json2-fedf627b8fba2c78ab3d5cae6e76914d.js.gz +0 -0
  109. data/public/assets/json2.js +0 -157
  110. data/public/assets/json2.js.gz +0 -0
  111. data/public/assets/manifest-c97d5faf4a7e78bd05753f8155b4995d.css +0 -51
  112. data/public/assets/manifest-c97d5faf4a7e78bd05753f8155b4995d.css.gz +0 -0
  113. data/public/assets/manifest-cd131c4bf01ad6a09c034157c8cba00a.js +0 -21
  114. data/public/assets/manifest-cd131c4bf01ad6a09c034157c8cba00a.js.gz +0 -0
  115. data/public/assets/manifest.css +0 -51
  116. data/public/assets/manifest.css.gz +0 -0
  117. data/public/assets/manifest.js +0 -21
  118. data/public/assets/manifest.js.gz +0 -0
  119. data/public/assets/manifest.yml +0 -59
  120. data/public/assets/minus-1d0fae0720bab52bd98598218e8345c0.gif +0 -0
  121. data/public/assets/minus.gif +0 -0
  122. data/public/assets/plus-1a29e46532f839ed9c977ef4613d079f.gif +0 -0
  123. data/public/assets/plus.gif +0 -0
  124. data/public/assets/spinner_16x16-17dcf941457ae4e702f4600e714b21c1.gif +0 -0
  125. data/public/assets/spinner_16x16.gif +0 -0
  126. data/public/assets/spinner_24x24-78c707c1921b93962ea5edd7f4a74134.gif +0 -0
  127. data/public/assets/spinner_24x24.gif +0 -0
  128. data/public/assets/treeview-black-c46d96020e5d79c652af0fb0c6656384.gif +0 -0
  129. data/public/assets/treeview-black-line-0903c58efd34c3203d132e6f873049f6.gif +0 -0
  130. data/public/assets/treeview-black-line.gif +0 -0
  131. data/public/assets/treeview-black.gif +0 -0
  132. data/public/assets/treeview-default-ee6298d311205d21dc57c01c0696df70.gif +0 -0
  133. data/public/assets/treeview-default-line-2c4106cfd4d322c6e6565f80702c27cb.gif +0 -0
  134. data/public/assets/treeview-default-line.gif +0 -0
  135. data/public/assets/treeview-default.gif +0 -0
  136. data/public/assets/treeview-famfamfam-20dfef13cd5fd1e08fb61ee68eb9d3fa.gif +0 -0
  137. data/public/assets/treeview-famfamfam-line-a02cce2b80977e066df83137aae71fa8.gif +0 -0
  138. data/public/assets/treeview-famfamfam-line.gif +0 -0
  139. data/public/assets/treeview-famfamfam.gif +0 -0
  140. data/public/assets/treeview-gray-01bfdcd116e081e23daf13024fd3e4e0.gif +0 -0
  141. data/public/assets/treeview-gray-line-029b3a7b92ed10ea6c4b6289cb9fa0e3.gif +0 -0
  142. data/public/assets/treeview-gray-line.gif +0 -0
  143. data/public/assets/treeview-gray.gif +0 -0
  144. data/public/assets/treeview-red-2a5abbce598d05c864d845998381eef6.gif +0 -0
  145. data/public/assets/treeview-red-line-f51e6c30aa3b0ff856900ba85d769f1c.gif +0 -0
  146. data/public/assets/treeview-red-line.gif +0 -0
  147. data/public/assets/treeview-red.gif +0 -0
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 4.0.2
2
+
3
+ * Support for collections in SKOS importer (@fgimenez)
4
+ * Bugfixes
5
+
1
6
  ## 4.0.1 (2012-06-20)
2
7
 
3
8
  * Rails application template
data/README.md CHANGED
@@ -48,7 +48,7 @@ in the Gemfile and Cedar does not support a custom `BUNDLE_WITHOUT` config like
48
48
 
49
49
  ### Custom
50
50
 
51
- We recommend running [iQvoc as a Rails engine](https://github.com/innoq/iqvoc/wiki/iQvoc-as-a-Rails-Engine).
51
+ We recommend running [iQvoc as a Rails engine](https://github.com/innoq/iqvoc/wiki/iQvoc-as-a-Rails-Engine).
52
52
  Running the cloned source code is possible but any modifications would require a fork.
53
53
 
54
54
  1. Configure your database via `config/database.template.yml`. Don't forget to rename it to `database.yml`
@@ -2,6 +2,12 @@ tr.highlightable {
2
2
  cursor: pointer;
3
3
  }
4
4
 
5
+ table.dashboard {
6
+ th {
7
+ white-space: nowrap;
8
+ }
9
+ }
10
+
5
11
  .alert {
6
12
  p {
7
13
  margin: 0 0 10px 0;
@@ -64,19 +64,22 @@ class ConceptsController < ApplicationController
64
64
  format.json do
65
65
  # When in single query mode, AR handles ALL includes to be loaded by that
66
66
  # one query. We don't want that! So let's do it manually :-)
67
- ActiveRecord::Associations::Preloader.new(@concept,
68
- [:labels,
69
- { :relations => { :target => [:labelings, :relations] } }]).run
67
+ ActiveRecord::Associations::Preloader.new(@concept, [:labels,
68
+ { :relations => { :target => [:labelings, :relations] } }]).run
70
69
 
70
+ published_relations = lambda { |concept|
71
+ return concept.relations.includes(:target).
72
+ merge(Iqvoc::Concept.base_class.published)
73
+ }
71
74
  concept_data = {
72
75
  :origin => @concept.origin,
73
76
  :labels => @concept.labelings.map { |ln| labeling_as_json(ln) },
74
- :relations => @concept.relations.map { |relation|
77
+ :relations => published_relations.call(@concept).map { |relation|
75
78
  concept = relation.target
76
79
  {
77
80
  :origin => concept.origin,
78
81
  :labels => concept.labelings.map { |ln| labeling_as_json(ln) },
79
- :relations => concept.relations.length
82
+ :relations => published_relations.call(concept).count
80
83
  }
81
84
  }
82
85
  }
@@ -84,7 +84,11 @@ module ConceptsHelper
84
84
  # Renders a partial taken from the .partial_name method of the objects
85
85
  # associated to the concept.
86
86
  def render_concept_association(hash, concept, association_class, further_options = {})
87
- html = render(association_class.partial_name(concept), further_options.merge(:concept => concept, :klass => association_class))
87
+ html = if association_class.respond_to?(:hidden?) && association_class.hidden?(concept)
88
+ ""
89
+ else
90
+ render(association_class.partial_name(concept), further_options.merge(:concept => concept, :klass => association_class))
91
+ end
88
92
  # Convert the already safely buffered string back to a regular one
89
93
  # in order to be able to modify it with squish
90
94
  if String.new(html).squish.present?
@@ -18,9 +18,9 @@ module DashboardHelper
18
18
 
19
19
  def sorting_controls_for(name)
20
20
  content_tag :span, :class => "sorting-controls" do
21
- link_to(image_tag("arrow_down.gif", :class => "arrow_down"),
21
+ link_to(image_tag("arrow_up.gif", :class => "arrow_up"),
22
22
  dashboard_path(:order => "asc", :by => name.to_s)) +
23
- link_to(image_tag("arrow_up.gif", :class => "arrow_up"),
23
+ link_to(image_tag("arrow_down.gif", :class => "arrow_down"),
24
24
  dashboard_path(:order => "desc", :by => name.to_s))
25
25
  end
26
26
  end
@@ -55,4 +55,14 @@ module NavigationHelper
55
55
  content_tag :li, content, :class => css_class
56
56
  end
57
57
 
58
+ def quick_search_class
59
+ klass = if Labeling.const_defined?(:SKOSXL)
60
+ Labeling::SKOSXL::Base
61
+ else
62
+ Labeling::SKOS::Base
63
+ end
64
+
65
+ klass.name.parameterize
66
+ end
67
+
58
68
  end
@@ -18,6 +18,11 @@ class Collection::Member::Base < ActiveRecord::Base
18
18
 
19
19
  self.table_name = 'collection_members'
20
20
 
21
+ class_attribute :rdf_namespace, :rdf_predicate
22
+ self.rdf_namespace = nil
23
+ self.rdf_predicate = nil
24
+
21
25
  belongs_to :collection, :class_name => 'Collection::Base'
26
+ belongs_to :target, :class_name => 'Concept::Base'
22
27
 
23
28
  end
@@ -0,0 +1,37 @@
1
+ # encoding: UTF-8
2
+
3
+ # Copyright 2012 Hola, S.L.
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 Collection::Member::SKOS::Base < Collection::Member::Base
18
+
19
+ self.rdf_namespace = "skos"
20
+ self.rdf_predicate = "member"
21
+
22
+ def self.build_from_rdf(subject, predicate, object)
23
+ raise "Labeling::SKOS::Base#build_from_rdf: Subject (#{subject}) must be a Collection." unless subject.is_a?(Collection::Base)
24
+ raise "Labeling::SKOS::Base#build_from_rdf: Object (#{object}) must be a Collection or Concept." unless object.is_a?(Collection::Base) or object.is_a?(Concept::Base)
25
+
26
+ if subject.send(:members).select{|rel| rel.collection_id == subject.id || rel.target == object}.empty?
27
+ subject.send(:members) << self.new(:target => object)
28
+ if object.is_a?(Collection::Base)
29
+ subject.send(:subcollections) << object
30
+ end
31
+ end
32
+
33
+ if object.send(:collections).select{|coll| coll.id == subject.id}.empty?
34
+ object.send(:collections) << subject
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,35 @@
1
+ # encoding: UTF-8
2
+
3
+ # Copyright 2012 Hola, S.L.
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 Collection::SKOS::Base < Collection::Base
18
+
19
+ self.rdf_namespace = "skos"
20
+ self.rdf_class = "Collection"
21
+
22
+ def build_rdf_subject(document, controller, &block)
23
+ ns = IqRdf::Namespace.find_namespace_class(self.rdf_namespace)
24
+ raise "Namespace '#{base_namespace}' is not defined in IqRdf document." unless ns
25
+ subject = IqRdf.build_uri(self.origin, ns.build_uri(self.rdf_class), &block)
26
+
27
+ # ensure skos:Collection type is present
28
+ unless self.rdf_namespace == "skos" && self.rdf_class == "Collection"
29
+ subject.Rdf.build_predicate("type", IqRdf::Skos.build_uri("Collection"))
30
+ end
31
+
32
+ return subject
33
+ end
34
+
35
+ end
@@ -14,5 +14,5 @@
14
14
  # See the License for the specific language governing permissions and
15
15
  # limitations under the License.
16
16
 
17
- class Collection::Unordered < Collection::Base
17
+ class Collection::Unordered < Collection::SKOS::Base
18
18
  end
@@ -7,7 +7,9 @@
7
7
  <%= simple_form_for collection, :as => :concept, :url => collection.new_record? ? collections_path : collection_path(collection), :html => { :class => 'form-horizontal' } do |f| %>
8
8
  <fieldset>
9
9
  <legend><%= t 'txt.views.layouts.sections.labels' %></legend>
10
- <p><%= t 'txt.common.hint_csv_input' %></p>
10
+ <% if not Iqvoc.const_defined?(:SKOSXL) %>
11
+ <p><%= t 'txt.common.hint_csv_input' %></p>
12
+ <% end %>
11
13
  <%- Iqvoc::Concept.labeling_classes.each do |labeling_class, languages| -%>
12
14
  <%- languages.each do |language| -%>
13
15
  <%= render labeling_class.edit_partial_name(@collection), :f => f,
@@ -18,7 +18,9 @@
18
18
  <!-- Labelings -->
19
19
  <fieldset>
20
20
  <legend><%= Labeling::Base.model_name.human(:count => 2) %></legend>
21
- <p><%= t 'txt.common.hint_csv_input' %></p>
21
+ <% if not Iqvoc.const_defined?(:SKOSXL) %>
22
+ <p><%= t 'txt.common.hint_csv_input' %></p>
23
+ <% end %>
22
24
  <%- Iqvoc::Concept.labeling_classes.each do |labeling_class, languages| -%>
23
25
  <%- languages.each do |language| -%>
24
26
  <%= render labeling_class.edit_partial_name(concept), :f => f,
@@ -1,6 +1,7 @@
1
1
  <%- published_param = concept.published? ? nil : "0" -%>
2
2
 
3
3
  <%= sidebar do %>
4
+ <%= sidebar_item :icon => 'share', :text => t('txt.models.concept.uri'), :path => concept_url(concept.origin, :format => nil, :published => published_param, :lang => nil) %>
4
5
  <%= sidebar_header t('txt.common.representations') %>
5
6
  <%= sidebar_item :icon => 'share', :text => 'HTML', :path => rdf_url(concept.origin, :format => :html, :published => published_param, :lang => nil) %>
6
7
  <%= sidebar_item :icon => 'share', :text => 'RDF/XML', :path => rdf_url(concept.origin, :format => :rdf, :published => published_param, :lang => nil), :id => 'rdf_link_xml' %>
@@ -1,6 +1,6 @@
1
1
  <%= page_header :title => 'Dashboard' %>
2
2
 
3
- <table class="table">
3
+ <table class="table dashboard">
4
4
  <thead>
5
5
  <tr>
6
6
  <th><%= t("txt.views.dashboard.type") %><%= sorting_controls_for(:class) %></th>
@@ -38,4 +38,4 @@
38
38
  </table>
39
39
 
40
40
  <%= paginate @items %>
41
- <%= render 'sidebar' %>
41
+ <%= render 'dashboard/sidebar' %>
@@ -1,8 +1,5 @@
1
- <h2><strong><%= t("txt.views.errors.not_found.header") %></strong></h2>
1
+ <h1><%= t("txt.views.errors.not_found.header") %></h1>
2
2
 
3
3
  <p><em><%= @exception.message %></em></p>
4
4
 
5
- <p><%= t("txt.views.errors.not_found.tip") %></p>
6
- <div class="embedded_form">
7
- <%= render :file => 'search_results/index' %>
8
- </div>
5
+ <p><%= raw t("txt.views.errors.not_found.tip", :link => link_to(t("txt.views.navigation.search"), search_path)) %></p>
@@ -17,7 +17,7 @@
17
17
  <%= render 'layouts/controls' %>
18
18
 
19
19
  <%= form_tag search_path, :method => :get, :class => "navbar-search pull-right" do %>
20
- <input type="hidden" name="t" value="labeling-skos-base">
20
+ <input type="hidden" name="t" value="<%= quick_search_class %>">
21
21
  <input type="hidden" name="qt" value="exact">
22
22
  <input type="hidden" name="for" value="all">
23
23
  <input type="hidden" name="l[]" value="<%= I18n.locale %>">
@@ -93,7 +93,7 @@ de:
93
93
  unavailable: "Fehlende Übersetzungen für die Hauptsprache nicht verfügbar."
94
94
  hierarchical_concepts:
95
95
  concepts:
96
- expired_at: "Abgelaufen am %{date}"
96
+ expired_at: "abgelaufen am %{date}"
97
97
  select: "Bitte wählen Sie ein %{concept_class_name} aus der unten aufgeführten Liste."
98
98
  new: "Neues %{concept_class_name}"
99
99
  pref_label: "Bevorzugtes Label"
@@ -108,7 +108,7 @@ de:
108
108
  versionview: "Versionsansicht für Label"
109
109
  follow_up: "Wiedervorlage"
110
110
  endings: "Endungen"
111
- expired_at: "Abgelaufen am"
111
+ expired_at: "abgelaufen am"
112
112
  label_already_exists: "Es gibt bereits ein Label mit der eingegebenen Vorlageform"
113
113
  edit:
114
114
  header: "Bearbeitung von Label"
@@ -197,7 +197,7 @@ de:
197
197
  message: "Ihr Benutzerkonto besitzt keine ausreichenden Rechte, um diese Seite anzuzeigen."
198
198
  not_found:
199
199
  header: "Nicht gefunden"
200
- tip: "Nutzen Sie die Suchfunktion, um Inhalte zu finden:"
200
+ tip: "Nutzen Sie die %{link}, um Inhalte zu finden."
201
201
  versioning:
202
202
  edit_mode: "Bearbeitung fortsetzen"
203
203
  to_edit_mode: "In Bearbeitung versetzen"
@@ -326,6 +326,7 @@ de:
326
326
  version_error: "Es existieren schon zwei Versionen dieses Labels"
327
327
  value_error: "Die Vorlageform muss ausgefüllt sein!"
328
328
  concept:
329
+ uri: "Konzept-URI"
329
330
  origin_error: "Origin ungültig!"
330
331
  version_error: "Es existieren schon zwei Versionen dieses Konzepts"
331
332
  no_pref_label_error: "Es muss mindestens ein bevorzugtes Label angegeben werden."
@@ -116,7 +116,7 @@ en:
116
116
  versionview: "Version display of Label"
117
117
  follow_up: "Follow up"
118
118
  endings: "Endings"
119
- expired_at: "Expired at"
119
+ expired_at: "expired at"
120
120
  label_already_exists: "There already exists a label with the value"
121
121
  edit:
122
122
  header: "Editing of label"
@@ -205,7 +205,7 @@ en:
205
205
  message: "Your user account has insufficient permissions to display this page."
206
206
  not_found:
207
207
  header: "Not found"
208
- tip: "You may want to use the search function to find content:"
208
+ tip: "You may want to use %{link} to find content."
209
209
  versioning:
210
210
  edit_mode: "Continue editing"
211
211
  to_edit_mode: "Start editing"
@@ -333,6 +333,7 @@ en:
333
333
  version_error: "New Label version already exists."
334
334
  value_error: "Literal form must be given."
335
335
  concept:
336
+ uri: "Concept URI"
336
337
  origin_error: "Invalid origin."
337
338
  version_error: "New Concept version already exists."
338
339
  no_pref_label_error: "At least one preferred label must be specified."
data/db/schema.rb CHANGED
@@ -11,7 +11,7 @@
11
11
  #
12
12
  # It's strongly recommended to check this file into your version control system.
13
13
 
14
- ActiveRecord::Schema.define(:version => 20120601094501) do
14
+ ActiveRecord::Schema.define(:version => 20120326102037) do
15
15
 
16
16
  create_table "collection_members", :force => true do |t|
17
17
  t.integer "collection_id"
@@ -117,15 +117,6 @@ ActiveRecord::Schema.define(:version => 20120601094501) do
117
117
  add_index "notes", ["owner_id", "owner_type", "type"], :name => "ix_notes_fk_type"
118
118
  add_index "notes", ["type"], :name => "ix_notes_on_type"
119
119
 
120
- create_table "page_requests", :force => true do |t|
121
- t.string "path"
122
- t.float "page_duration"
123
- t.float "view_duration"
124
- t.float "db_duration"
125
- t.datetime "created_at", :null => false
126
- t.datetime "updated_at", :null => false
127
- end
128
-
129
120
  create_table "users", :force => true do |t|
130
121
  t.string "forename"
131
122
  t.string "surname"
@@ -6,15 +6,21 @@ module Iqvoc
6
6
  extend ActiveSupport::Concern
7
7
 
8
8
  included do
9
- mattr_accessor :base_class_name
9
+ mattr_accessor :base_class_name, :member_class_names
10
10
 
11
11
  self.base_class_name = 'Collection::Unordered'
12
+
13
+ self.member_class_names = ['Collection::Member::SKOS::Base']
12
14
  end
13
15
 
14
16
  module ClassMethods
15
17
  def base_class
16
18
  base_class_name.constantize
17
19
  end
20
+
21
+ def member_classes
22
+ member_class_names.map(&:constantize)
23
+ end
18
24
  end
19
25
 
20
26
  end
@@ -1,11 +1,12 @@
1
1
  module Iqvoc
2
2
  class SkosImporter
3
3
 
4
- FIRST_LEVEL_OBJECT_CLASSES = [Iqvoc::Concept.base_class]
4
+ FIRST_LEVEL_OBJECT_CLASSES = [Iqvoc::Concept.base_class, Iqvoc::Collection.base_class]
5
5
  SECOND_LEVEL_OBJECT_CLASSES = Iqvoc::Concept.labeling_classes.keys +
6
6
  Iqvoc::Concept.note_classes +
7
7
  Iqvoc::Concept.relation_classes +
8
- Iqvoc::Concept.match_classes
8
+ Iqvoc::Concept.match_classes +
9
+ Iqvoc::Collection.member_classes
9
10
 
10
11
  def initialize(file, default_namespace_url, logger = Rails.logger)
11
12
 
@@ -72,6 +73,9 @@ module Iqvoc
72
73
  end
73
74
 
74
75
  def import_first_level_objects(types, subject, predicate, object)
76
+ @logger.debug "types: #{types}"
77
+ @logger.debug "predicate: #{predicate}"
78
+ @logger.debug "subject: #{subject}"
75
79
  if (predicate == "rdf:type" && types[object] && subject =~ /^:(.+)$/)
76
80
  # We've found a subject definition with a class we know and which is in our responsibility (":")
77
81
  origin = $1
@@ -86,6 +90,7 @@ module Iqvoc
86
90
  @seen_first_level_objects[origin] = types[object].create!(:origin => origin)
87
91
  end
88
92
  end
93
+
89
94
  end
90
95
 
91
96
  def import_second_level_objects(types, subject, predicate, object)
data/lib/iqvoc/version.rb CHANGED
@@ -15,5 +15,5 @@
15
15
  # limitations under the License.
16
16
 
17
17
  module Iqvoc
18
- VERSION = "4.0.1"
18
+ VERSION = "4.0.2"
19
19
  end
@@ -21,7 +21,7 @@ class HygieneTest < ActiveSupport::TestCase
21
21
  end
22
22
 
23
23
  test "mixed whitespace" do
24
- tab = " "
24
+ tab = "\t"
25
25
  space = " "
26
26
  assert_no_occurrence "#{space}#{tab}\|#{tab}#{space}", "mixed whitespace", true
27
27
  end
@@ -97,5 +97,72 @@ class SkosImportTest < ActiveSupport::TestCase
97
97
  assert_nil Iqvoc::Concept.base_class.by_origin("1").last
98
98
  assert_not_nil Iqvoc::Concept.base_class.by_origin("_1").last
99
99
  end
100
+ end
100
101
 
102
+ class SkosCollectionImportTest < ActiveSupport::TestCase
103
+ setup do
104
+ Iqvoc::Concept.pref_labeling_class_name = 'Labeling::SKOS::PrefLabel'
105
+
106
+ Iqvoc.config.register_setting("languages.pref_labeling", ["de", "en"])
107
+ Iqvoc.config.register_setting("languages.further_labelings.Labeling::SKOS::AltLabel", ["de", "en"])
108
+ end
109
+
110
+ TEST_DATA = (<<-DATA
111
+ <http://www.example.com/land-animal> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2008/05/skos#Collection> .
112
+ <http://www.example.com/land-animal> <http://www.w3.org/2008/05/skos#prefLabel> "Landtier"@de .
113
+ <http://www.example.com/land-animal> <http://www.w3.org/2008/05/skos#prefLabel> "Land animal"@en .
114
+ <http://www.example.com/legged-animal> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2008/05/skos#Collection> .
115
+ <http://www.example.com/legged-animal> <http://www.w3.org/2008/05/skos#prefLabel> "Vierbeinige Tier"@de .
116
+ <http://www.example.com/legged-animal> <http://www.w3.org/2008/05/skos#prefLabel> "Four legged animal"@en .
117
+ <http://www.example.com/cow> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2008/05/skos#Concept> .
118
+ <http://www.example.com/cow> <http://www.w3.org/2008/05/skos#prefLabel> "Kuh"@de .
119
+ <http://www.example.com/cow> <http://www.w3.org/2008/05/skos#prefLabel> "Cow"@en .
120
+ <http://www.example.com/snake> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2008/05/skos#Concept> .
121
+ <http://www.example.com/snake> <http://www.w3.org/2008/05/skos#prefLabel> "Schlange"@de .
122
+ <http://www.example.com/snake> <http://www.w3.org/2008/05/skos#prefLabel> "Snake"@en .
123
+ <http://www.example.com/donkey> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2008/05/skos#Concept> .
124
+ <http://www.example.com/donkey> <http://www.w3.org/2008/05/skos#prefLabel> "Esel"@de .
125
+ <http://www.example.com/donkey> <http://www.w3.org/2008/05/skos#prefLabel> "Donkey"@en .
126
+ <http://www.example.com/legged-animal> <http://www.w3.org/2004/02/skos/core#member> <http://www.example.com/cow> .
127
+ <http://www.example.com/legged-animal> <http://www.w3.org/2004/02/skos/core#member> <http://www.example.com/donkey> .
128
+ <http://www.example.com/land-animal> <http://www.w3.org/2004/02/skos/core#member> <http://www.example.com/legged-animal> .
129
+ <http://www.example.com/land-animal> <http://www.w3.org/2004/02/skos/core#member> <http://www.example.com/snake> .
130
+ DATA
131
+ ).split("\n")
132
+
133
+ test "basic importer functionality" do
134
+ assert_difference('Collection::Base.count', 2) do
135
+ Iqvoc::SkosImporter.new(TEST_DATA, "http://www.example.com/")
136
+ end
137
+ concepts = {}
138
+ ["cow", "donkey", "snake"].each do |origin|
139
+ concepts[origin] = Iqvoc::Concept.base_class.by_origin(origin).last
140
+ assert_not_nil(concepts[origin], "Couldn't find concept '#{origin}'.")
141
+ assert concepts[origin].published?, "Concept '#{origin}' wasn't published."
142
+ end
143
+
144
+ collections = {}
145
+ ["land-animal", "legged-animal"].each do |origin|
146
+ collections[origin] = Iqvoc::Collection.base_class.by_origin(origin).last
147
+ assert_not_nil(collections[origin], "Couldn't find collections '#{origin}'.")
148
+ assert collections[origin].published?, "collections '#{origin}' wasn't published."
149
+ end
150
+
151
+ collection_with_member = concepts["cow"].collections.first
152
+ assert_not_nil collection_with_member
153
+
154
+ concept_member = collections["land-animal"].members.first
155
+ assert_not_nil concept_member
156
+ end
157
+
158
+ test "subcollections importer functionality" do
159
+ assert_difference('Collection::Base.count', 2) do
160
+ Iqvoc::SkosImporter.new(TEST_DATA, "http://www.example.com/")
161
+ end
162
+
163
+ collection_with_subcollections = Iqvoc::Collection.base_class.by_origin("land-animal").last
164
+ assert_not_nil collection_with_subcollections
165
+ assert_not_nil collection_with_subcollections.subcollections.first
166
+ end
101
167
  end
168
+