iqvoc 4.13.2 → 4.14.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +6 -8
- data/Gemfile.lock +381 -331
- data/app/aides/inline_data_helper.rb +3 -3
- data/app/aides/skos_exporter.rb +1 -1
- data/app/assets/javascripts/iqvoc/iqvoc.js +0 -20
- data/app/assets/stylesheets/iqvoc/_manifest.scss +1 -0
- data/app/assets/stylesheets/iqvoc/_search_results.scss +14 -0
- data/app/controllers/collections/versions_controller.rb +12 -47
- data/app/controllers/collections_controller.rb +15 -8
- data/app/controllers/concepts/alphabetical_controller.rb +1 -1
- data/app/controllers/concepts/hierarchical_controller.rb +9 -13
- data/app/controllers/concepts/versions_controller.rb +13 -48
- data/app/controllers/concepts_controller.rb +19 -15
- data/app/controllers/concepts_movement_controller.rb +1 -1
- data/app/controllers/dashboard_controller.rb +5 -5
- data/app/controllers/imports_controller.rb +9 -6
- data/app/controllers/reverse_matches_controller.rb +2 -4
- data/app/controllers/search_results_controller.rb +13 -19
- data/app/helpers/application_helper.rb +0 -8
- data/app/helpers/link_helper.rb +13 -9
- data/app/helpers/rdf_helper.rb +9 -5
- data/app/jobs/reverse_match_job.rb +8 -4
- data/app/models/ability.rb +7 -7
- data/app/models/collection/base.rb +17 -8
- data/app/models/concept/base.rb +17 -7
- data/app/models/concept/relation/base.rb +1 -1
- data/app/models/concept/relation/reverse_relation_extension.rb +9 -5
- data/app/models/concerns/search_extension.rb +0 -17
- data/app/models/concerns/versioning.rb +1 -31
- data/app/models/dataset/adaptors/iqvoc/alphabetical_search_adaptor.rb +2 -2
- data/app/models/dataset/adaptors/iqvoc/http_adaptor.rb +2 -2
- data/app/models/dataset/adaptors/iqvoc/search_adaptor.rb +2 -2
- data/app/models/export.rb +1 -1
- data/app/models/label/base.rb +5 -5
- data/app/models/note/base.rb +1 -1
- data/app/models/user.rb +2 -0
- data/app/uploaders/rdf_uploader.rb +1 -1
- data/app/views/collections/_data.html.erb +2 -2
- data/app/views/collections/show_unpublished.html.erb +3 -11
- data/app/views/concepts/notifications/_referenced_concepts.html.erb +0 -1
- data/app/views/concepts/show_published.html.erb +2 -0
- data/app/views/concepts/show_unpublished.html.erb +5 -11
- data/app/views/dashboard/_table.html.erb +0 -8
- data/app/views/pages/version.html.erb +1 -1
- data/app/views/partials/concept/_edit_link_base.html.erb +2 -2
- data/app/views/partials/concept/relation/_edit_base.html.erb +13 -10
- data/app/views/search_results/_detailed_search.html.erb +27 -0
- data/app/views/search_results/_form.html.erb +21 -9
- data/app/views/search_results/index.html.erb +4 -4
- data/app/views/search_results/sections/_change_note.html.erb +28 -25
- data/app/views/search_results/sections/_collection.html.erb +5 -5
- data/app/views/search_results/sections/_datasets.html.erb +8 -20
- data/app/views/search_results/sections/_klass.html.erb +7 -9
- data/app/views/search_results/sections/_languages.html.erb +4 -14
- data/app/views/search_results/sections/_mode.html.erb +8 -10
- data/app/views/search_results/sections/_options.html.erb +6 -8
- data/app/views/search_results/sections/_terms.html.erb +13 -10
- data/app/views/search_results/sections/_type.html.erb +13 -13
- data/config/application.rb +1 -1
- data/config/boot.rb +1 -1
- data/config/database.yml +21 -15
- data/config/database.yml.postgresql +1 -1
- data/config/engine.rb +1 -0
- data/config/initializers/active_record.rb +2 -0
- data/config/initializers/content_security_policy.rb +21 -26
- data/config/initializers/filter_parameter_logging.rb +4 -2
- data/config/initializers/inflections.rb +4 -4
- data/config/initializers/iqvoc.rb +1 -0
- data/config/locales/de.yml +13 -18
- data/config/locales/en.yml +13 -18
- data/config/locales/pt.yml +0 -7
- data/config/routes.rb +0 -4
- data/db/migrate/20231012135837_remove_locked_by.rb +6 -0
- data/db/schema.rb +31 -34
- data/iqvoc.gemspec +7 -5
- data/lib/iqvoc/configuration/concept.rb +2 -0
- data/lib/iqvoc/configuration/core.rb +4 -0
- data/lib/iqvoc/configuration/instance_configuration.rb +2 -2
- data/lib/iqvoc/environments/development.rb +5 -2
- data/lib/iqvoc/environments/production.rb +7 -28
- data/lib/iqvoc/environments/test.rb +1 -1
- data/lib/iqvoc/version.rb +1 -1
- data/test/controllers/concepts_movement_controller_test.rb +0 -2
- data/test/controllers/reverse_match_test.rb +1 -1
- data/test/integration/collection_browsing_test.rb +45 -0
- data/test/integration/collection_circularity_test.rb +3 -3
- data/test/integration/concept_collection_assignment_test.rb +1 -1
- data/test/integration/create_concept_test.rb +15 -0
- data/test/integration/reverse_match_job_test.rb +39 -7
- data/test/integration/search_test.rb +9 -9
- data/test/integration/version_page_test.rb +26 -0
- data/test/models/concept_test.rb +37 -0
- data/test/models/deep_cloning_test.rb +9 -7
- data/test/test_helper.rb +3 -0
- metadata +81 -67
- data/app/views/search_results/sections/_note.html.erb +0 -6
- data/bin/bundle +0 -3
- data/bin/delayed_job +0 -5
- data/bin/rails +0 -4
- data/bin/rake +0 -4
- data/bin/setup +0 -36
- data/bin/update +0 -31
- data/bin/yarn +0 -17
data/config/locales/en.yml
CHANGED
@@ -75,7 +75,6 @@ en:
|
|
75
75
|
of: of
|
76
76
|
ops: Oops!
|
77
77
|
pending: "Loading…"
|
78
|
-
translation_missing_for: "translation missing for"
|
79
78
|
type_to_search: "Type to search"
|
80
79
|
hint_csv_input: "Multiple values can be entered comma-separated."
|
81
80
|
form_errors: "Errors"
|
@@ -219,10 +218,10 @@ en:
|
|
219
218
|
search_results:
|
220
219
|
header: "Search"
|
221
220
|
inflectionals: "inflectionals"
|
222
|
-
contains: "
|
223
|
-
ends_with: "
|
224
|
-
begins_with: "
|
225
|
-
exact: "
|
221
|
+
contains: "contain keyword"
|
222
|
+
ends_with: "end with keyword"
|
223
|
+
begins_with: "start with keyword"
|
224
|
+
exact: "exactly match"
|
226
225
|
regexp: "regular expression (advanced)"
|
227
226
|
search_term: "Search term(s)"
|
228
227
|
note: with note
|
@@ -236,23 +235,25 @@ en:
|
|
236
235
|
other: "Your search for <strong>%{query}</strong> yielded the following %{count} results."
|
237
236
|
no_results_found: "Your search yielded no results."
|
238
237
|
submit: "Search"
|
238
|
+
detailed_search: "Detailed search"
|
239
239
|
type: "type"
|
240
240
|
used_as: "used as"
|
241
241
|
expired: "include expired?"
|
242
|
-
language: "
|
242
|
+
language: "Language"
|
243
243
|
all: "all"
|
244
244
|
none: "none"
|
245
|
-
in: "
|
246
|
-
for: "
|
247
|
-
mode: "
|
245
|
+
in: "Search contains"
|
246
|
+
for: "Search in"
|
247
|
+
mode: "Search results"
|
248
248
|
datasets: "External sources"
|
249
249
|
change_note:
|
250
|
+
all: "Creation or update date"
|
250
251
|
type: "type"
|
251
252
|
created: "creation date"
|
252
253
|
modified: "modification date"
|
253
254
|
date: "Date range"
|
254
|
-
date_from: '
|
255
|
-
date_to: '
|
255
|
+
date_from: 'From'
|
256
|
+
date_to: 'To'
|
256
257
|
user_sessions:
|
257
258
|
header: "Login"
|
258
259
|
login: "Login"
|
@@ -301,7 +302,6 @@ en:
|
|
301
302
|
delete_copy: "Delete copy"
|
302
303
|
delete_confirm: "Do you really want to delete this copy?"
|
303
304
|
versioning_mode: "Create new version"
|
304
|
-
unlock: "Unlock"
|
305
305
|
preview_new_version: "Preview of the version in editing"
|
306
306
|
consistency_check: "Check consistency"
|
307
307
|
current_revision: "Current revision %{rev}"
|
@@ -318,7 +318,6 @@ en:
|
|
318
318
|
dashboard:
|
319
319
|
type: "Type"
|
320
320
|
value: "Name"
|
321
|
-
locking_user: "Locked by"
|
322
321
|
follow_up: "Follow up"
|
323
322
|
updated_at: "Updated at"
|
324
323
|
to_review: "Submission for review"
|
@@ -388,11 +387,7 @@ en:
|
|
388
387
|
published_with_warning: "Instance has been successfully published, but it has no relations!"
|
389
388
|
merged_delete_error: "Label could not be deleted."
|
390
389
|
merged_publishing_error: "Instance could not be published - please consult the consistency check."
|
391
|
-
branched: "Instance copy has been created
|
392
|
-
locked: "Instance has been locked."
|
393
|
-
lock_error: "Instance is already locked."
|
394
|
-
unlocked: "Instance has been unlocked."
|
395
|
-
unlock_error: "Instance has been alraedy unlocked."
|
390
|
+
branched: "Instance copy has been created."
|
396
391
|
to_review_success: "Sent to review."
|
397
392
|
to_review_error: "Can't send to review."
|
398
393
|
new_version_blank_error: "A new version does not yet exist!"
|
data/config/locales/pt.yml
CHANGED
@@ -70,7 +70,6 @@ pt:
|
|
70
70
|
checked_out: "Verificado"
|
71
71
|
of: de
|
72
72
|
pending: "Carregando…"
|
73
|
-
translation_missing_for: "tradução faltando para"
|
74
73
|
type_to_search: "Digite para buscar"
|
75
74
|
hint_csv_input: " Vários valores podem ser inseridos separados por vírgula."
|
76
75
|
form_errors: "Erros"
|
@@ -234,7 +233,6 @@ pt:
|
|
234
233
|
delete: "Excluir cópia"
|
235
234
|
delete_confirm: "Você realmente deseja excluir esta cópia?"
|
236
235
|
versioning_mode: "Criar nova versão"
|
237
|
-
unlock: "Destravar"
|
238
236
|
preview_new_version: "Pré-visualização da versão em alteração"
|
239
237
|
consistency_check: "Verificar consistência"
|
240
238
|
current_revision: "Revisão atual %{rev}"
|
@@ -250,7 +248,6 @@ pt:
|
|
250
248
|
dashboard:
|
251
249
|
type: "Tipo"
|
252
250
|
value: "Nome"
|
253
|
-
locking_user: "Travado por"
|
254
251
|
follow_up: "Reapresentar"
|
255
252
|
updated_at: "Atualizado em"
|
256
253
|
to_review: "Submissão para revisão"
|
@@ -301,10 +298,6 @@ pt:
|
|
301
298
|
merged_delete_error: "Não foi possível excluir o rótulo!"
|
302
299
|
merged_publishing_error: "Não foi possível lançar a instância!"
|
303
300
|
branched: "Cópia da instância foi criada e travada."
|
304
|
-
locked: "Instância foi travada."
|
305
|
-
lock_error: "Instância já foi travada!"
|
306
|
-
unlocked: "Instância foi destravada."
|
307
|
-
unlock_error: "Instância já foi destravada!"
|
308
301
|
to_review_success: "Enviado para revisão com sucesso."
|
309
302
|
to_review_error: "Não foi possível enviar para revisão."
|
310
303
|
new_version_blank_error: "Ainda não existe uma nova versão!"
|
data/config/routes.rb
CHANGED
@@ -51,8 +51,6 @@ Rails.application.routes.draw do
|
|
51
51
|
|
52
52
|
post 'concepts/:origin/branch' => 'concepts/versions#branch', as: 'concept_versions_branch'
|
53
53
|
post 'concepts/:origin/merge' => 'concepts/versions#merge', as: 'concept_versions_merge'
|
54
|
-
post 'concepts/:origin/lock' => 'concepts/versions#lock', as: 'concept_versions_lock'
|
55
|
-
post 'concepts/:origin/unlock' => 'concepts/versions#unlock', as: 'concept_versions_unlock'
|
56
54
|
post 'concepts/:origin/to_review' => 'concepts/versions#to_review', as: 'concept_versions_to_review'
|
57
55
|
get 'concepts/:origin/consistency_check' => 'concepts/versions#consistency_check', as: 'concept_versions_consistency_check'
|
58
56
|
|
@@ -60,8 +58,6 @@ Rails.application.routes.draw do
|
|
60
58
|
|
61
59
|
post 'collections/:origin/branch' => 'collections/versions#branch', as: 'collection_versions_branch'
|
62
60
|
post 'collections/:origin/merge' => 'collections/versions#merge', as: 'collection_versions_merge'
|
63
|
-
post 'collections/:origin/lock' => 'collections/versions#lock', as: 'collection_versions_lock'
|
64
|
-
post 'collections/:origin/unlock' => 'collections/versions#unlock', as: 'collection_versions_unlock'
|
65
61
|
post 'collections/:origin/to_review' => 'collections/versions#to_review', as: 'collection_versions_to_review'
|
66
62
|
get 'collections/:origin/consistency_check' => 'collections/versions#consistency_check', as: 'collection_versions_consistency_check'
|
67
63
|
|
data/db/schema.rb
CHANGED
@@ -10,8 +10,7 @@
|
|
10
10
|
#
|
11
11
|
# It's strongly recommended that you check this file into your version control system.
|
12
12
|
|
13
|
-
ActiveRecord::Schema.define(version:
|
14
|
-
|
13
|
+
ActiveRecord::Schema[7.0].define(version: 2023_10_12_135837) do
|
15
14
|
# These are extensions that must be enabled in order to support this database
|
16
15
|
enable_extension "plpgsql"
|
17
16
|
|
@@ -27,8 +26,8 @@ ActiveRecord::Schema.define(version: 2022_01_07_114201) do
|
|
27
26
|
t.string "type"
|
28
27
|
t.integer "owner_id"
|
29
28
|
t.integer "target_id"
|
30
|
-
t.datetime "created_at"
|
31
|
-
t.datetime "updated_at"
|
29
|
+
t.datetime "created_at", precision: nil
|
30
|
+
t.datetime "updated_at", precision: nil
|
32
31
|
t.integer "rank", default: 100
|
33
32
|
t.index ["owner_id", "target_id"], name: "ix_concept_relations_fk"
|
34
33
|
end
|
@@ -39,13 +38,12 @@ ActiveRecord::Schema.define(version: 2022_01_07_114201) do
|
|
39
38
|
t.integer "rev", default: 1
|
40
39
|
t.date "published_at"
|
41
40
|
t.integer "published_version_id"
|
42
|
-
t.integer "locked_by"
|
43
41
|
t.date "expired_at"
|
44
42
|
t.date "follow_up"
|
45
43
|
t.boolean "to_review"
|
46
44
|
t.date "rdf_updated_at"
|
47
|
-
t.datetime "created_at"
|
48
|
-
t.datetime "updated_at"
|
45
|
+
t.datetime "created_at", precision: nil
|
46
|
+
t.datetime "updated_at", precision: nil
|
49
47
|
t.boolean "top_term", default: false
|
50
48
|
t.index ["origin"], name: "ix_concepts_on_origin"
|
51
49
|
t.index ["published_version_id"], name: "ix_concepts_publ_version_id"
|
@@ -61,13 +59,13 @@ ActiveRecord::Schema.define(version: 2022_01_07_114201) do
|
|
61
59
|
t.integer "attempts", default: 0, null: false
|
62
60
|
t.text "handler", null: false
|
63
61
|
t.text "last_error"
|
64
|
-
t.datetime "run_at"
|
65
|
-
t.datetime "locked_at"
|
66
|
-
t.datetime "failed_at"
|
62
|
+
t.datetime "run_at", precision: nil
|
63
|
+
t.datetime "locked_at", precision: nil
|
64
|
+
t.datetime "failed_at", precision: nil
|
67
65
|
t.string "locked_by"
|
68
66
|
t.string "queue"
|
69
|
-
t.datetime "created_at"
|
70
|
-
t.datetime "updated_at"
|
67
|
+
t.datetime "created_at", precision: nil
|
68
|
+
t.datetime "updated_at", precision: nil
|
71
69
|
t.string "error_message"
|
72
70
|
t.string "delayed_reference_type"
|
73
71
|
t.integer "delayed_reference_id"
|
@@ -85,9 +83,9 @@ ActiveRecord::Schema.define(version: 2022_01_07_114201) do
|
|
85
83
|
t.boolean "success", default: false
|
86
84
|
t.integer "file_type"
|
87
85
|
t.string "token"
|
88
|
-
t.datetime "created_at"
|
89
|
-
t.datetime "updated_at"
|
90
|
-
t.datetime "finished_at"
|
86
|
+
t.datetime "created_at", precision: nil
|
87
|
+
t.datetime "updated_at", precision: nil
|
88
|
+
t.datetime "finished_at", precision: nil
|
91
89
|
t.string "default_namespace"
|
92
90
|
t.index ["user_id"], name: "index_exports_on_user_id"
|
93
91
|
end
|
@@ -96,9 +94,9 @@ ActiveRecord::Schema.define(version: 2022_01_07_114201) do
|
|
96
94
|
t.integer "user_id"
|
97
95
|
t.text "output"
|
98
96
|
t.boolean "success", default: false
|
99
|
-
t.datetime "created_at"
|
100
|
-
t.datetime "updated_at"
|
101
|
-
t.datetime "finished_at"
|
97
|
+
t.datetime "created_at", precision: nil
|
98
|
+
t.datetime "updated_at", precision: nil
|
99
|
+
t.datetime "finished_at", precision: nil
|
102
100
|
t.string "import_file"
|
103
101
|
t.boolean "publish"
|
104
102
|
t.string "default_namespace"
|
@@ -109,8 +107,8 @@ ActiveRecord::Schema.define(version: 2022_01_07_114201) do
|
|
109
107
|
t.string "type"
|
110
108
|
t.integer "owner_id"
|
111
109
|
t.integer "target_id"
|
112
|
-
t.datetime "created_at"
|
113
|
-
t.datetime "updated_at"
|
110
|
+
t.datetime "created_at", precision: nil
|
111
|
+
t.datetime "updated_at", precision: nil
|
114
112
|
t.index ["owner_id", "target_id", "type"], name: "ix_labelings_fk_type"
|
115
113
|
t.index ["type"], name: "ix_labelings_on_type"
|
116
114
|
end
|
@@ -120,8 +118,8 @@ ActiveRecord::Schema.define(version: 2022_01_07_114201) do
|
|
120
118
|
t.string "origin", limit: 4000
|
121
119
|
t.string "language"
|
122
120
|
t.string "value", limit: 1024
|
123
|
-
t.datetime "created_at"
|
124
|
-
t.datetime "updated_at"
|
121
|
+
t.datetime "created_at", precision: nil
|
122
|
+
t.datetime "updated_at", precision: nil
|
125
123
|
t.date "published_at"
|
126
124
|
t.index ["language"], name: "ix_labels_on_language"
|
127
125
|
t.index ["origin"], name: "ix_labels_on_origin"
|
@@ -131,8 +129,8 @@ ActiveRecord::Schema.define(version: 2022_01_07_114201) do
|
|
131
129
|
t.integer "concept_id"
|
132
130
|
t.string "type"
|
133
131
|
t.string "value"
|
134
|
-
t.datetime "created_at"
|
135
|
-
t.datetime "updated_at"
|
132
|
+
t.datetime "created_at", precision: nil
|
133
|
+
t.datetime "updated_at", precision: nil
|
136
134
|
t.index ["concept_id", "type"], name: "ix_matches_fk_type"
|
137
135
|
t.index ["type"], name: "ix_matches_on_type"
|
138
136
|
end
|
@@ -148,8 +146,8 @@ ActiveRecord::Schema.define(version: 2022_01_07_114201) do
|
|
148
146
|
t.integer "note_id"
|
149
147
|
t.string "predicate", limit: 50
|
150
148
|
t.string "value", limit: 1024
|
151
|
-
t.datetime "created_at"
|
152
|
-
t.datetime "updated_at"
|
149
|
+
t.datetime "created_at", precision: nil
|
150
|
+
t.datetime "updated_at", precision: nil
|
153
151
|
t.string "namespace", limit: 50
|
154
152
|
t.string "language"
|
155
153
|
t.index ["note_id"], name: "ix_note_annotations_fk"
|
@@ -160,8 +158,8 @@ ActiveRecord::Schema.define(version: 2022_01_07_114201) do
|
|
160
158
|
t.string "language", limit: 2
|
161
159
|
t.string "value", limit: 4000
|
162
160
|
t.string "type", limit: 50
|
163
|
-
t.datetime "created_at"
|
164
|
-
t.datetime "updated_at"
|
161
|
+
t.datetime "created_at", precision: nil
|
162
|
+
t.datetime "updated_at", precision: nil
|
165
163
|
t.integer "owner_id"
|
166
164
|
t.string "owner_type", null: false
|
167
165
|
t.integer "position"
|
@@ -176,8 +174,8 @@ ActiveRecord::Schema.define(version: 2022_01_07_114201) do
|
|
176
174
|
t.string "email"
|
177
175
|
t.string "crypted_password"
|
178
176
|
t.boolean "active"
|
179
|
-
t.datetime "created_at"
|
180
|
-
t.datetime "updated_at"
|
177
|
+
t.datetime "created_at", precision: nil
|
178
|
+
t.datetime "updated_at", precision: nil
|
181
179
|
t.string "password_salt"
|
182
180
|
t.string "persistence_token"
|
183
181
|
t.string "perishable_token"
|
@@ -187,9 +185,9 @@ ActiveRecord::Schema.define(version: 2022_01_07_114201) do
|
|
187
185
|
t.text "comment"
|
188
186
|
t.integer "login_count", default: 0, null: false
|
189
187
|
t.integer "failed_login_count", default: 0, null: false
|
190
|
-
t.datetime "last_request_at"
|
191
|
-
t.datetime "current_login_at"
|
192
|
-
t.datetime "last_login_at"
|
188
|
+
t.datetime "last_request_at", precision: nil
|
189
|
+
t.datetime "current_login_at", precision: nil
|
190
|
+
t.datetime "last_login_at", precision: nil
|
193
191
|
t.string "current_login_ip"
|
194
192
|
t.string "last_login_ip"
|
195
193
|
end
|
@@ -198,7 +196,6 @@ ActiveRecord::Schema.define(version: 2022_01_07_114201) do
|
|
198
196
|
add_foreign_key "collection_members", "concepts", column: "target_id", on_update: :cascade
|
199
197
|
add_foreign_key "concept_relations", "concepts", column: "owner_id", on_update: :cascade
|
200
198
|
add_foreign_key "concept_relations", "concepts", column: "target_id", on_update: :cascade
|
201
|
-
add_foreign_key "concepts", "users", column: "locked_by", on_update: :cascade, on_delete: :nullify
|
202
199
|
add_foreign_key "exports", "users", on_update: :cascade, on_delete: :nullify
|
203
200
|
add_foreign_key "imports", "users", on_update: :cascade, on_delete: :nullify
|
204
201
|
add_foreign_key "labelings", "concepts", column: "owner_id", on_update: :cascade
|
data/iqvoc.gemspec
CHANGED
@@ -13,9 +13,9 @@ Gem::Specification.new do |s|
|
|
13
13
|
s.description = 'iQvoc - a SKOS(-XL) vocabulary management system built on the Semantic Web'
|
14
14
|
s.license = 'Apache-2.0'
|
15
15
|
|
16
|
-
s.add_dependency 'rails', '~>
|
17
|
-
s.add_dependency 'puma'
|
18
|
-
s.add_dependency 'bootsnap'
|
16
|
+
s.add_dependency 'rails', '~> 7.0.8'
|
17
|
+
s.add_dependency 'puma'
|
18
|
+
s.add_dependency 'bootsnap'
|
19
19
|
s.add_dependency 'bundler'
|
20
20
|
s.add_dependency 'kaminari'
|
21
21
|
s.add_dependency 'authlogic'
|
@@ -24,7 +24,7 @@ Gem::Specification.new do |s|
|
|
24
24
|
s.add_dependency 'iq_rdf'
|
25
25
|
s.add_dependency 'json'
|
26
26
|
s.add_dependency 'rails_autolink'
|
27
|
-
s.add_dependency 'faraday'
|
27
|
+
s.add_dependency 'faraday'
|
28
28
|
s.add_dependency 'faraday_middleware'
|
29
29
|
s.add_dependency 'bootstrap_form', '~> 4.0'
|
30
30
|
s.add_dependency 'iq_triplestorage'
|
@@ -34,14 +34,16 @@ Gem::Specification.new do |s|
|
|
34
34
|
s.add_dependency 'deep_cloneable'
|
35
35
|
s.add_dependency 'apipie-rails'
|
36
36
|
s.add_dependency 'maruku'
|
37
|
+
s.add_dependency 'net-http'
|
37
38
|
s.add_dependency 'database_cleaner', '~> 1.8.5'
|
38
39
|
s.add_dependency 'delayed_job_active_record'
|
39
40
|
s.add_dependency 'carrierwave'
|
41
|
+
s.add_dependency 'carrierwave-i18n'
|
40
42
|
s.add_dependency 'rack-mini-profiler'
|
41
43
|
s.add_dependency 'faucet_pipeline_rails'
|
42
44
|
|
43
45
|
s.files = %w(LICENSE README.md CHANGELOG.md Gemfile Gemfile.lock Rakefile iqvoc.gemspec) +
|
44
|
-
Dir.glob('{app,
|
46
|
+
Dir.glob('{app,config,db,lib}/**/*')
|
45
47
|
s.test_files = Dir['{test}/**/*']
|
46
48
|
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
47
49
|
s.require_paths = ['lib']
|
@@ -12,6 +12,7 @@ module Iqvoc
|
|
12
12
|
:broader_relation_class_name, :further_relation_class_names,
|
13
13
|
:pref_labeling_class_name,
|
14
14
|
:alt_labeling_class_name,
|
15
|
+
:hidden_labeling_class_name,
|
15
16
|
:match_class_names,
|
16
17
|
:note_class_names,
|
17
18
|
:notation_class_names,
|
@@ -27,6 +28,7 @@ module Iqvoc
|
|
27
28
|
|
28
29
|
self.pref_labeling_class_name = 'Labeling::SKOS::PrefLabel'
|
29
30
|
self.alt_labeling_class_name = 'Labeling::SKOS::AltLabel'
|
31
|
+
self.hidden_labeling_class_name = 'Labeling::SKOS::HiddenLabel'
|
30
32
|
|
31
33
|
self.note_class_names = [
|
32
34
|
Iqvoc.change_note_class_name,
|
@@ -11,6 +11,7 @@ module Iqvoc
|
|
11
11
|
:default_rdf_namespace_helper_modules,
|
12
12
|
:default_rdf_namespace_helper_methods,
|
13
13
|
:rdf_namespaces,
|
14
|
+
:rdf_show_change_notes,
|
14
15
|
:change_note_class_name,
|
15
16
|
:first_level_class_configuration_modules,
|
16
17
|
:navigation_items,
|
@@ -103,6 +104,9 @@ module Iqvoc
|
|
103
104
|
iqvoc: 'http://try.iqvoc.net/schema#'
|
104
105
|
}
|
105
106
|
|
107
|
+
# This flag determines if the changes notes should be included in the RDF representation of a Concept/Label/Collection.
|
108
|
+
self.rdf_show_change_notes = true
|
109
|
+
|
106
110
|
# The class to use for automatic generation of change notes on every save
|
107
111
|
self.change_note_class_name = 'Note::SKOS::ChangeNote'
|
108
112
|
|
@@ -116,8 +116,8 @@ module Iqvoc
|
|
116
116
|
if value == nil
|
117
117
|
raise TypeError, 'nil values not supported'
|
118
118
|
end
|
119
|
-
|
120
|
-
unless [TrueClass, FalseClass, String,
|
119
|
+
|
120
|
+
unless [TrueClass, FalseClass, String, Integer, Float, Array].include?(value.class)
|
121
121
|
raise TypeError, 'complex values not supported'
|
122
122
|
end
|
123
123
|
end
|
@@ -16,15 +16,18 @@ module Iqvoc::Environments
|
|
16
16
|
# Show full error reports.
|
17
17
|
config.consider_all_requests_local = true
|
18
18
|
|
19
|
+
# Enable server timing
|
20
|
+
config.server_timing = true
|
21
|
+
|
19
22
|
# Enable/disable caching. By default caching is disabled.
|
20
23
|
# Run rails dev:cache to toggle caching.
|
21
|
-
if Rails.root.join(
|
24
|
+
if Rails.root.join("tmp/caching-dev.txt").exist?
|
22
25
|
config.action_controller.perform_caching = true
|
23
26
|
config.action_controller.enable_fragment_cache_logging = true
|
24
27
|
|
25
28
|
config.cache_store = :memory_store
|
26
29
|
config.public_file_server.headers = {
|
27
|
-
|
30
|
+
"Cache-Control" => "public, max-age=#{2.days.to_i}"
|
28
31
|
}
|
29
32
|
else
|
30
33
|
config.action_controller.perform_caching = false
|
@@ -24,22 +24,22 @@ module Iqvoc::Environments
|
|
24
24
|
|
25
25
|
# Disable serving static files from the `/public` folder by default since
|
26
26
|
# Apache or NGINX already handles this.
|
27
|
-
config.public_file_server.enabled = ENV[
|
27
|
+
config.public_file_server.enabled = ENV["RAILS_SERVE_STATIC_FILES"].present?
|
28
28
|
|
29
29
|
# Enable serving of images, stylesheets, and JavaScripts from an asset server.
|
30
|
-
# config.asset_host =
|
30
|
+
# config.asset_host = "http://assets.example.com"
|
31
31
|
|
32
32
|
# Specifies the header that your server uses for sending files.
|
33
|
-
# config.action_dispatch.x_sendfile_header =
|
34
|
-
# config.action_dispatch.x_sendfile_header =
|
33
|
+
# config.action_dispatch.x_sendfile_header = "X-Sendfile" # for Apache
|
34
|
+
# config.action_dispatch.x_sendfile_header = "X-Accel-Redirect" # for NGINX
|
35
35
|
|
36
36
|
# Store uploaded files on the local file system (see config/storage.yml for options).
|
37
37
|
config.active_storage.service = :local
|
38
38
|
|
39
39
|
# Mount Action Cable outside main process or domain.
|
40
40
|
# config.action_cable.mount_path = nil
|
41
|
-
# config.action_cable.url =
|
42
|
-
# config.action_cable.allowed_request_origins = [
|
41
|
+
# config.action_cable.url = "wss://example.com/cable"
|
42
|
+
# config.action_cable.allowed_request_origins = [ "http://example.com", /http:\/\/example.*/ ]
|
43
43
|
|
44
44
|
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
|
45
45
|
# config.force_ssl = true
|
@@ -82,7 +82,7 @@ module Iqvoc::Environments
|
|
82
82
|
|
83
83
|
# Use a different logger for distributed setups.
|
84
84
|
# require "syslog/logger"
|
85
|
-
# config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new
|
85
|
+
# config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new "app-name")
|
86
86
|
|
87
87
|
if ENV["RAILS_LOG_TO_STDOUT"].present?
|
88
88
|
logger = ActiveSupport::Logger.new(STDOUT)
|
@@ -92,26 +92,5 @@ module Iqvoc::Environments
|
|
92
92
|
|
93
93
|
# Do not dump schema after migrations.
|
94
94
|
config.active_record.dump_schema_after_migration = false
|
95
|
-
|
96
|
-
# Inserts middleware to perform automatic connection switching.
|
97
|
-
# The `database_selector` hash is used to pass options to the DatabaseSelector
|
98
|
-
# middleware. The `delay` is used to determine how long to wait after a write
|
99
|
-
# to send a subsequent read to the primary.
|
100
|
-
#
|
101
|
-
# The `database_resolver` class is used by the middleware to determine which
|
102
|
-
# database is appropriate to use based on the time delay.
|
103
|
-
#
|
104
|
-
# The `database_resolver_context` class is used by the middleware to set
|
105
|
-
# timestamps for the last write to the primary. The resolver uses the context
|
106
|
-
# class timestamps to determine how long to wait before reading from the
|
107
|
-
# replica.
|
108
|
-
#
|
109
|
-
# By default Rails will store a last write timestamp in the session. The
|
110
|
-
# DatabaseSelector middleware is designed as such you can define your own
|
111
|
-
# strategy for connection switching and pass that into the middleware through
|
112
|
-
# these configuration options.
|
113
|
-
# config.active_record.database_selector = { delay: 2.seconds }
|
114
|
-
# config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver
|
115
|
-
# config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
|
116
95
|
end
|
117
96
|
end
|
@@ -15,7 +15,7 @@ module Iqvoc::Environments
|
|
15
15
|
# Configure public file server for tests with Cache-Control for performance.
|
16
16
|
config.public_file_server.enabled = true
|
17
17
|
config.public_file_server.headers = {
|
18
|
-
|
18
|
+
"Cache-Control" => "public, max-age=#{1.hour.to_i}"
|
19
19
|
}
|
20
20
|
|
21
21
|
# Show full error reports and disable caching.
|
data/lib/iqvoc/version.rb
CHANGED
@@ -0,0 +1,45 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# Copyright 2011-2022 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
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), '../integration_test_helper')
|
18
|
+
|
19
|
+
class CollectionBrowsingTest < ActionDispatch::IntegrationTest
|
20
|
+
setup do
|
21
|
+
login('administrator')
|
22
|
+
|
23
|
+
@indoor = Iqvoc::Collection.base_class.new.publish.tap do |c|
|
24
|
+
RDFAPI.devour c, 'skos:prefLabel', '"Indoors"@en'
|
25
|
+
c.save
|
26
|
+
end
|
27
|
+
|
28
|
+
@outdoor = Iqvoc::Collection.base_class.new.publish.tap do |c|
|
29
|
+
RDFAPI.devour c, 'skos:prefLabel', '"Outdoors"@en'
|
30
|
+
c.save
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
test 'collection listing' do
|
35
|
+
visit collections_path(lang: 'en')
|
36
|
+
assert page.has_content?("#{@indoor.pref_label}")
|
37
|
+
assert page.has_content?("#{@outdoor.pref_label}")
|
38
|
+
end
|
39
|
+
|
40
|
+
test 'showing published collection' do
|
41
|
+
visit collection_path(@indoor, lang: 'en')
|
42
|
+
assert page.has_content?('Collections')
|
43
|
+
assert page.has_content?("#{@indoor.pref_label}")
|
44
|
+
end
|
45
|
+
end
|
@@ -20,11 +20,11 @@ class CollectionCircularityTest < ActionDispatch::IntegrationTest
|
|
20
20
|
setup do
|
21
21
|
login('administrator')
|
22
22
|
|
23
|
-
@coll1 = Iqvoc::Collection.base_class.new.
|
23
|
+
@coll1 = Iqvoc::Collection.base_class.new.tap { |c| c.save }
|
24
24
|
RDFAPI.devour @coll1, 'skos:prefLabel', '"coll1"@en'
|
25
|
-
@coll2 = Iqvoc::Collection.base_class.new.
|
25
|
+
@coll2 = Iqvoc::Collection.base_class.new.tap { |c| c.save }
|
26
26
|
RDFAPI.devour @coll2, 'skos:prefLabel', '"coll2"@en'
|
27
|
-
@coll3 = Iqvoc::Collection.base_class.new.
|
27
|
+
@coll3 = Iqvoc::Collection.base_class.new.tap { |c| c.save }
|
28
28
|
RDFAPI.devour @coll3, 'skos:prefLabel', '"coll3"@en'
|
29
29
|
|
30
30
|
@concept1 = Concept::SKOS::Base.new.publish.tap { |c| c.save }
|
@@ -43,7 +43,7 @@ class ConceptCollectionAssignmentTest < ActionDispatch::IntegrationTest
|
|
43
43
|
visit concept_path(concept, lang: 'en', format: 'html')
|
44
44
|
|
45
45
|
click_link_or_button 'Create new version'
|
46
|
-
assert page.has_content? 'Instance copy has been created
|
46
|
+
assert page.has_content? 'Instance copy has been created.'
|
47
47
|
collection_origins = [@sports_coll, @hobbies_coll].map(&:origin).join(', ')
|
48
48
|
fill_in 'concept_assigned_collection_origins', with: collection_origins
|
49
49
|
|
@@ -30,6 +30,21 @@ class CreateConceptTest < ActionDispatch::IntegrationTest
|
|
30
30
|
save_check_and_publish
|
31
31
|
end
|
32
32
|
|
33
|
+
test 'send to review with inconsistent concept' do
|
34
|
+
login('administrator')
|
35
|
+
visit dashboard_path(lang: 'en')
|
36
|
+
click_link_or_button 'New Concept'
|
37
|
+
|
38
|
+
# Create invalid preflabel
|
39
|
+
fill_in 'concept_labelings_by_text_labeling_skos_pref_labels_en', with: 'Foo,Foo'
|
40
|
+
click_link_or_button 'Save'
|
41
|
+
|
42
|
+
# Consistency check should run when sending the concept to review.
|
43
|
+
click_link_or_button 'Send to review'
|
44
|
+
assert page.has_content? 'Instance is inconsistent.'
|
45
|
+
assert page.has_content? 'There must be only one preferred Label per language.'
|
46
|
+
end
|
47
|
+
|
33
48
|
private
|
34
49
|
|
35
50
|
def save_check_and_publish
|