labimotion 1.4.1 → 2.0.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/lib/labimotion/apis/generic_element_api.rb +1 -0
  3. data/lib/labimotion/apis/generic_klass_api.rb +3 -2
  4. data/lib/labimotion/apis/labimotion_api.rb +13 -0
  5. data/lib/labimotion/apis/standard_api.rb +26 -0
  6. data/lib/labimotion/apis/standard_layer_api.rb +100 -0
  7. data/lib/labimotion/apis/vocabulary_api.rb +107 -0
  8. data/lib/labimotion/entities/dataset_entity.rb +2 -1
  9. data/lib/labimotion/entities/properties_entity.rb +167 -55
  10. data/lib/labimotion/entities/segment_entity.rb +1 -0
  11. data/lib/labimotion/entities/vocabulary_entity.rb +39 -0
  12. data/lib/labimotion/helpers/element_helpers.rb +8 -6
  13. data/lib/labimotion/helpers/param_helpers.rb +137 -82
  14. data/lib/labimotion/helpers/segment_helpers.rb +1 -1
  15. data/lib/labimotion/helpers/vocabulary_helpers.rb +16 -0
  16. data/lib/labimotion/libs/converter.rb +13 -33
  17. data/lib/labimotion/libs/data/vocab/Standard.json +385 -0
  18. data/lib/labimotion/libs/data/vocab/System.json +131 -0
  19. data/lib/labimotion/libs/nmr_mapper.rb +2 -1
  20. data/lib/labimotion/libs/sample_association.rb +4 -0
  21. data/lib/labimotion/libs/vocabulary_handler.rb +118 -0
  22. data/lib/labimotion/models/concerns/attachment_converter.rb +5 -4
  23. data/lib/labimotion/models/concerns/datasetable.rb +1 -0
  24. data/lib/labimotion/models/concerns/segmentable.rb +2 -0
  25. data/lib/labimotion/models/std_layer.rb +9 -0
  26. data/lib/labimotion/models/std_layers_revision.rb +9 -0
  27. data/lib/labimotion/models/vocabulary.rb +12 -0
  28. data/lib/labimotion/version.rb +1 -1
  29. data/lib/labimotion.rb +10 -0
  30. metadata +20 -5
@@ -0,0 +1,385 @@
1
+ [
2
+ {
3
+ "identifier": "std-atmosphere",
4
+ "name": "atmosphere",
5
+ "label": "Atmosphere",
6
+ "field_type": "text",
7
+ "ontology": {
8
+ "id": "ncit:class:http://purl.obolibrary.org/obo/NCIT_C54711",
9
+ "iri": "http://purl.obolibrary.org/obo/NCIT_C54711",
10
+ "short_form": "NCIT_C54711",
11
+ "obo_id": "NCIT:C54711",
12
+ "label": "Atmosphere",
13
+ "description": [
14
+ "Non-SI unit of pressure equal to 101 325 Pa."
15
+ ],
16
+ "ontology_name": "ncit",
17
+ "ontology_prefix": "NCIT",
18
+ "type": "class"
19
+ },
20
+ "source": "Standard"
21
+ },
22
+ {
23
+ "identifier": "std-calibration",
24
+ "name": "calibration",
25
+ "label": "Calibration",
26
+ "field_type": "text",
27
+ "ontology": {
28
+ "id": "ncit:class:http://purl.obolibrary.org/obo/NCIT_C69187",
29
+ "iri": "http://purl.obolibrary.org/obo/NCIT_C69187",
30
+ "short_form": "NCIT_C69187",
31
+ "obo_id": "NCIT:C69187",
32
+ "label": "Calibration",
33
+ "description": [
34
+ "The act of checking or adjusting (by comparison with a standard) the accuracy of a measuring instrument."
35
+ ],
36
+ "ontology_name": "ncit",
37
+ "ontology_prefix": "NCIT",
38
+ "type": "class"
39
+ },
40
+ "source": "Standard"
41
+ },
42
+ {
43
+ "identifier": "std-coating",
44
+ "name": "coating",
45
+ "label": "Coating",
46
+ "field_type": "text",
47
+ "ontology": {
48
+ "id": "afo:class:http://purl.allotrope.org/ontologies/process#AFP_0001986",
49
+ "iri": "http://purl.allotrope.org/ontologies/process#AFP_0001986",
50
+ "short_form": "AFP_0001986",
51
+ "obo_id": "AFP:0001986",
52
+ "label": "coating",
53
+ "description": [
54
+ "The application of a thin cover to a material. [CHMO]"
55
+ ],
56
+ "ontology_name": "afo",
57
+ "ontology_prefix": "AFO",
58
+ "type": "class"
59
+ },
60
+ "source": "Standard"
61
+ },
62
+ {
63
+ "identifier": "std-coating_material",
64
+ "name": "coating_material",
65
+ "label": "Coating Material",
66
+ "field_type": "text",
67
+ "ontology": {
68
+ "id": "ncit:class:http://purl.obolibrary.org/obo/NCIT_C172794",
69
+ "iri": "http://purl.obolibrary.org/obo/NCIT_C172794",
70
+ "short_form": "NCIT_C172794",
71
+ "obo_id": "NCIT:C172794",
72
+ "label": "Coating Material",
73
+ "description": [
74
+ "A layer of material covering the surface of a device."
75
+ ],
76
+ "ontology_name": "ncit",
77
+ "ontology_prefix": "NCIT",
78
+ "type": "class"
79
+ },
80
+ "source": "Standard"
81
+ },
82
+ {
83
+ "identifier": "std-wavelength",
84
+ "name": "wavelength",
85
+ "label": "Wavelength",
86
+ "field_type": "text",
87
+ "ontology": {
88
+ "id": "ncit:class:http://purl.obolibrary.org/obo/NCIT_C48158",
89
+ "iri": "http://purl.obolibrary.org/obo/NCIT_C48158",
90
+ "short_form": "NCIT_C48158",
91
+ "obo_id": "NCIT:C48158",
92
+ "label": "Wavelength",
93
+ "description": [
94
+ "The distance (measured in the direction of propagation) between two points in the same phase in consecutive cycles of a wave."
95
+ ],
96
+ "ontology_name": "ncit",
97
+ "ontology_prefix": "NCIT",
98
+ "type": "class"
99
+ },
100
+ "source": "Standard"
101
+ },
102
+ {
103
+ "identifier": "std-sample_size",
104
+ "name": "sample_size",
105
+ "label": "Sample Size",
106
+ "field_type": "text",
107
+ "ontology": {
108
+ "id": "ncit:class:http://purl.obolibrary.org/obo/NCIT_C53190",
109
+ "iri": "http://purl.obolibrary.org/obo/NCIT_C53190",
110
+ "short_form": "NCIT_C53190",
111
+ "obo_id": "NCIT:C53190",
112
+ "label": "Sample Size",
113
+ "ontology_name": "ncit",
114
+ "ontology_prefix": "NCIT",
115
+ "type": "class"
116
+ },
117
+ "source": "Standard"
118
+ },
119
+ {
120
+ "identifier": "std-instrument",
121
+ "name": "instrument",
122
+ "label": "Instrument",
123
+ "field_type": "text",
124
+ "ontology": {
125
+ "id": "nmrcv:class:http://nmrML.org/nmrCV#NMR:1000463",
126
+ "iri": "http://nmrML.org/nmrCV#NMR:1000463",
127
+ "short_form": "NMR:1000463",
128
+ "label": "instrument",
129
+ "description": [
130
+ "Description of the instrument or the mass spectrometer."
131
+ ],
132
+ "ontology_name": "nmrcv",
133
+ "ontology_prefix": "NMRCV",
134
+ "type": "class"
135
+ },
136
+ "source": "Standard"
137
+ },
138
+ {
139
+ "identifier": "std-irr_freq",
140
+ "name": "irr_freq",
141
+ "label": "Irradiation frequency",
142
+ "field_type": "text",
143
+ "ontology": {
144
+ "id": "nmrcv:class:http://nmrML.org/nmrCV#NMR:1000463",
145
+ "iri": "http://nmrML.org/nmrCV#NMR:1000463",
146
+ "short_form": "NMR:1000463",
147
+ "label": "instrument",
148
+ "description": [
149
+ "Description of the instrument or the mass spectrometer."
150
+ ],
151
+ "ontology_name": "nmrcv",
152
+ "ontology_prefix": "NMRCV",
153
+ "type": "class"
154
+ },
155
+ "source": "Standard"
156
+ },
157
+ {
158
+ "identifier": "std-num_scans",
159
+ "name": "num_scans",
160
+ "label": "Number of scans",
161
+ "field_type": "text",
162
+ "ontology": {
163
+ "id": "nmrcv:class:http://nmrML.org/nmrCV#NMR:1400087",
164
+ "iri": "http://nmrML.org/nmrCV#NMR:1400087",
165
+ "short_form": "NMR:1400087",
166
+ "label": "number of scans",
167
+ "description": [
168
+ "def: The number of repeat scans performed and summed to create the data set for an NMR sample."
169
+ ],
170
+ "ontology_name": "nmrcv",
171
+ "ontology_prefix": "NMRCV",
172
+ "type": "class"
173
+ },
174
+ "source": "Standard"
175
+ },
176
+ {
177
+ "identifier": "std-sample_ph",
178
+ "name": "sample_ph",
179
+ "label": "Sample pH",
180
+ "field_type": "text",
181
+ "ontology": {
182
+ "id": "nmrcv:class:http://nmrML.org/nmrCV#NMR:1000019",
183
+ "iri": "http://nmrML.org/nmrCV#NMR:1000019",
184
+ "short_form": "NMR:1000019",
185
+ "label": "sample pH",
186
+ "ontology_name": "nmrcv",
187
+ "ontology_prefix": "NMRCV",
188
+ "type": "class"
189
+ },
190
+ "source": "Standard"
191
+ },
192
+ {
193
+ "identifier": "std-pulse_seq",
194
+ "name": "pulse_seq",
195
+ "label": "NMR pulse sequence",
196
+ "field_type": "text",
197
+ "ontology": {
198
+ "id": "nmrcv:class:http://nmrML.org/nmrCV#NMR:1400037",
199
+ "iri": "http://nmrML.org/nmrCV#NMR:1400037",
200
+ "short_form": "NMR:1400037",
201
+ "label": "NMR pulse sequence",
202
+ "description": [
203
+ "def: A sequence of excitation pulses.",
204
+ "http://www.bmrb.wisc.edu/tools/choose_pulse_info.php"
205
+ ],
206
+ "ontology_name": "nmrcv",
207
+ "ontology_prefix": "NMRCV",
208
+ "type": "class"
209
+ },
210
+ "source": "Standard"
211
+ },
212
+ {
213
+ "identifier": "std-sample_conc",
214
+ "name": "sample_conc",
215
+ "label": "sample concentration",
216
+ "field_type": "text",
217
+ "ontology": {
218
+ "id": "nmrcv:class:http://nmrML.org/nmrCV#NMR:1000006",
219
+ "iri": "http://nmrML.org/nmrCV#NMR:1000006",
220
+ "short_form": "NMR:1000006",
221
+ "label": "sample concentration",
222
+ "description": [
223
+ "Concentration of sample in picomol/ul, femtomol/ul or attomol/ul solution used."
224
+ ],
225
+ "ontology_name": "nmrcv",
226
+ "ontology_prefix": "NMRCV",
227
+ "type": "class"
228
+ },
229
+ "source": "Standard"
230
+ },
231
+ {
232
+ "identifier": "std-scan_range",
233
+ "name": "scan_range",
234
+ "label": "scan range",
235
+ "field_type": "text",
236
+ "ontology": {
237
+ "id": "afo:class:http://purl.allotrope.org/ontologies/result#AFR_0001957",
238
+ "iri": "http://purl.allotrope.org/ontologies/result#AFR_0001957",
239
+ "short_form": "AFR_0001957",
240
+ "obo_id": "AFR:0001957",
241
+ "label": "detector scan rate setting",
242
+ "description": [
243
+ "A detector setting that sets the frequency of scans per time unit. [Allotrope]"
244
+ ],
245
+ "ontology_name": "afo",
246
+ "ontology_prefix": "AFO",
247
+ "type": "class"
248
+ },
249
+ "source": "Standard"
250
+ },
251
+ {
252
+ "identifier": "std-software_name",
253
+ "name": "software_name",
254
+ "label": "Software Name",
255
+ "field_type": "text",
256
+ "ontology": {
257
+ "id": "ncit:class:http://purl.obolibrary.org/obo/NCIT_C150832",
258
+ "iri": "http://purl.obolibrary.org/obo/NCIT_C150832",
259
+ "short_form": "NCIT_C150832",
260
+ "obo_id": "NCIT:C150832",
261
+ "label": "Software Name",
262
+ "description": [
263
+ "The literal identifier of the software program."
264
+ ],
265
+ "ontology_name": "ncit",
266
+ "ontology_prefix": "NCIT",
267
+ "type": "class"
268
+ },
269
+ "source": "Standard"
270
+ },
271
+ {
272
+ "identifier": "std-software_ver",
273
+ "name": "software_ver",
274
+ "label": "Software Version",
275
+ "field_type": "text",
276
+ "ontology": {
277
+ "id": "ncit:class:http://purl.obolibrary.org/obo/NCIT_C111093",
278
+ "iri": "http://purl.obolibrary.org/obo/NCIT_C111093",
279
+ "short_form": "NCIT_C111093",
280
+ "obo_id": "NCIT:C111093",
281
+ "label": "Software Version",
282
+ "description": [
283
+ "A form or variant of software; one of a sequence of copies of a software program, each incorporating new modifications."
284
+ ],
285
+ "ontology_name": "ncit",
286
+ "ontology_prefix": "NCIT",
287
+ "type": "class"
288
+ },
289
+ "source": "Standard"
290
+ },
291
+ {
292
+ "identifier": "std-solvent",
293
+ "name": "nmr_solvent",
294
+ "label": "NMR Solvent",
295
+ "field_type": "text",
296
+ "ontology": {
297
+ "id": "nmrcv:class:http://nmrML.org/nmrCV#NMR:1000330",
298
+ "iri": "http://nmrML.org/nmrCV#NMR:1000330",
299
+ "short_form": "NMR:1000330",
300
+ "label": "NMR solvent",
301
+ "description": [
302
+ "Use Chebi entities here."
303
+ ],
304
+ "ontology_name": "nmrcv",
305
+ "ontology_prefix": "NMRCV",
306
+ "type": "class"
307
+ },
308
+ "source": "Standard"
309
+ },
310
+ {
311
+ "identifier": "std-sample_volume",
312
+ "name": "sample_volume",
313
+ "label": "sample volume",
314
+ "field_type": "text",
315
+ "ontology": {
316
+ "id": "nmrcv:class:http://nmrML.org/nmrCV#NMR:1000005",
317
+ "iri": "http://nmrML.org/nmrCV#NMR:1000005",
318
+ "short_form": "NMR:1000005",
319
+ "label": "sample volume",
320
+ "description": [
321
+ "Total volume of solution used."
322
+ ],
323
+ "ontology_name": "nmrcv",
324
+ "ontology_prefix": "NMRCV",
325
+ "type": "class"
326
+ },
327
+ "source": "Standard"
328
+ },
329
+ {
330
+ "identifier": "std-solvent_info",
331
+ "name": "solvent_info",
332
+ "label": "NMR solvent information",
333
+ "field_type": "text",
334
+ "ontology": {
335
+ "id": "nmrcv:class:http://nmrML.org/nmrCV#NMR:1002010",
336
+ "iri": "http://nmrML.org/nmrCV#NMR:1002010",
337
+ "short_form": "NMR:1002010",
338
+ "label": "NMR solvent information",
339
+ "ontology_name": "nmrcv",
340
+ "ontology_prefix": "NMRCV",
341
+ "type": "class"
342
+ },
343
+ "source": "Standard"
344
+ },
345
+ {
346
+ "identifier": "std-sample_tube",
347
+ "name": "sample_tube",
348
+ "label": "NMR sample tube",
349
+ "field_type": "text",
350
+ "ontology": {
351
+ "id": "nmrcv:class:http://nmrML.org/nmrCV#NMR:1400132",
352
+ "iri": "http://nmrML.org/nmrCV#NMR:1400132",
353
+ "short_form": "NMR:1400132",
354
+ "label": "NMR sample tube",
355
+ "description": [
356
+ "http://en.wikipedia.org/wiki/NMR_tube",
357
+ "sortal dimensions are Vendor, Size (Diameter, length), Material (glass, quarz, pyrex ...), Frequency, Concentricity, OD and ID",
358
+ "The sample-tube holds the NMR sample and sits in the NMR probe. It is usually a glass tube of 5-20mm diameter."
359
+ ],
360
+ "ontology_name": "nmrcv",
361
+ "ontology_prefix": "NMRCV",
362
+ "type": "class"
363
+ },
364
+ "source": "Standard"
365
+ },
366
+ {
367
+ "identifier": "temperature",
368
+ "name": "Temperature",
369
+ "label": "Temperature",
370
+ "field_type": "text",
371
+ "ontology": {
372
+ "id": "nmrcv:class:http://nmrML.org/nmrCV#NMR:1400025",
373
+ "iri": "http://nmrML.org/nmrCV#NMR:1400025",
374
+ "short_form": "NMR:1400025",
375
+ "label": "sample temperature in magnet",
376
+ "description": [
377
+ "def: The temperature of an NMR sample whilst in the magnet of an NMR instrument."
378
+ ],
379
+ "ontology_name": "nmrcv",
380
+ "ontology_prefix": "NMRCV",
381
+ "type": "class"
382
+ },
383
+ "source": "Standard"
384
+ }
385
+ ]
@@ -0,0 +1,131 @@
1
+ [
2
+ {
3
+ "id": 1,
4
+ "identifier": "dateTime-create",
5
+ "name": "create_time",
6
+ "label": "Create Time",
7
+ "field_type": "datetime",
8
+ "opid": 9,
9
+ "term_id": "NCIT_C164483",
10
+ "ontology": {
11
+ "id": "ncit:class:http://purl.obolibrary.org/obo/NCIT_C164483",
12
+ "iri": "http://purl.obolibrary.org/obo/NCIT_C164483",
13
+ "type": "class",
14
+ "label": "Created Date",
15
+ "obo_id": "NCIT:C164483",
16
+ "short_form": "NCIT_C164483",
17
+ "description": [
18
+ "The date on which the activity or entity is created."
19
+ ],
20
+ "ontology_name": "ncit",
21
+ "ontology_prefix": "NCIT"
22
+ },
23
+ "source": "System",
24
+ "voc": {
25
+ "source": "System"
26
+ }
27
+ },
28
+ {
29
+ "id": 2,
30
+ "identifier": "dateTime-update",
31
+ "name": "update_time",
32
+ "label": "Update Time",
33
+ "field_type": "datetime",
34
+ "opid": 9,
35
+ "term_id": "NCIT_C25164",
36
+ "ontology": {
37
+ "id": "ncit:class:http://purl.obolibrary.org/obo/NCIT_C25710",
38
+ "iri": "http://purl.obolibrary.org/obo/NCIT_C25710",
39
+ "short_form": "NCIT_C25710",
40
+ "obo_id": "NCIT:C25710",
41
+ "label": "Update",
42
+ "description": [
43
+ "Make current; supply with recent information or technology."
44
+ ],
45
+ "ontology_name": "ncit",
46
+ "ontology_prefix": "NCIT",
47
+ "type": "class"
48
+ },
49
+ "source": "System",
50
+ "voc": {
51
+ "source": "System"
52
+ }
53
+ },
54
+ {
55
+ "id": 4,
56
+ "identifier": "user-name",
57
+ "name": "creator",
58
+ "label": "Creator",
59
+ "field_type": "text",
60
+ "opid": 9,
61
+ "term_id": "NCIT_C42628",
62
+ "ontology": {
63
+ "id": "ncit:class:http://purl.obolibrary.org/obo/NCIT_C42628",
64
+ "iri": "http://purl.obolibrary.org/obo/NCIT_C42628",
65
+ "type": "class",
66
+ "label": "Created By",
67
+ "obo_id": "NCIT:C42628",
68
+ "short_form": "NCIT_C42628",
69
+ "description": [
70
+ "Indicates the person or authoritative body who brought the item into existence."
71
+ ],
72
+ "ontology_name": "ncit",
73
+ "ontology_prefix": "NCIT"
74
+ },
75
+ "source": "User",
76
+ "voc": {
77
+ "source": "User"
78
+ }
79
+ },
80
+ {
81
+ "id": 2,
82
+ "identifier": "element-id",
83
+ "name": "element_id",
84
+ "label": "Element Id",
85
+ "field_type": "text",
86
+ "opid": 9,
87
+ "term_id": "NCIT_C25364",
88
+ "source": "Element",
89
+ "voc": {
90
+ "source": "Element"
91
+ }
92
+ },
93
+ {
94
+ "id": 5,
95
+ "identifier": "element-name",
96
+ "name": "element_name",
97
+ "label": "Element Name",
98
+ "field_type": "text",
99
+ "opid": 8,
100
+ "term_id": "NCIT_C42694",
101
+ "source": "Element",
102
+ "voc": {
103
+ "source": "Element"
104
+ }
105
+ },
106
+ {
107
+ "id": 3,
108
+ "identifier": "element-short_label",
109
+ "name": "element_short_label",
110
+ "label": "Element Short Label",
111
+ "field_type": "text",
112
+ "opid": 9,
113
+ "term_id": "NCIT_C45561",
114
+ "source": "Element",
115
+ "voc": {
116
+ "source": "Element"
117
+ }
118
+ },
119
+ {
120
+ "id": 3,
121
+ "identifier": "element-class",
122
+ "name": "element_class",
123
+ "label": "Element Class",
124
+ "field_type": "text",
125
+ "opid": 9,
126
+ "source": "Element",
127
+ "voc": {
128
+ "source": "Element"
129
+ }
130
+ }
131
+ ]
@@ -13,7 +13,7 @@ module Labimotion
13
13
  result = is_brucker_binary(id)
14
14
  if result[:is_bagit] == true
15
15
  att.update_column(:con_state, Labimotion::ConState::CONVERTED)
16
- Labimotion::Converter.metadata(id)
16
+ Labimotion::Converter.metadata(id, current_user)
17
17
  Labimotion::ConState::COMPLETED
18
18
  elsif result[:metadata] == nil
19
19
  Labimotion::ConState::NONE
@@ -256,6 +256,7 @@ module Labimotion
256
256
  new_prop[Labimotion::Prop::LAYERS]['set'][Labimotion::Prop::FIELDS][idx] = fi
257
257
  end
258
258
  end
259
+ new_prop = Labimotion::VocabularyHandler.update_vocabularies(new_prop, current_user, element)
259
260
  dataset.properties = new_prop
260
261
  dataset.save!
261
262
  end
@@ -78,6 +78,8 @@ module Labimotion
78
78
  field_samples = layer[Labimotion::Prop::FIELDS].select { |ss| ss['type'] == Labimotion::FieldType::DRAG_SAMPLE }
79
79
  field_samples.each do |field|
80
80
  idx = properties[Labimotion::Prop::LAYERS][key][Labimotion::Prop::FIELDS].index(field)
81
+ return if field.is_a?(String) || properties.is_a?(String)
82
+
81
83
  sid = field.dig('value', 'el_id')
82
84
  next if sid.blank?
83
85
 
@@ -100,6 +102,8 @@ module Labimotion
100
102
  field_elements = layer[Labimotion::Prop::FIELDS].select { |ss| ss['type'] == Labimotion::FieldType::DRAG_ELEMENT }
101
103
  field_elements.each do |field|
102
104
  idx = properties[Labimotion::Prop::LAYERS][key][Labimotion::Prop::FIELDS].index(field)
105
+ next if field['value'].is_a?(String)
106
+
103
107
  sid = field.dig('value', 'el_id')
104
108
  next if element.nil? || sid.blank? || sid == element.id
105
109
 
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Labimotion
4
+ class VocabularyHandler
5
+ class << self
6
+ def update_vocabularies(properties, current_user, element)
7
+ properties[Labimotion::Prop::LAYERS].each do |key, layer|
8
+ update_layer_vocabularies(layer, key, properties, current_user, element)
9
+ end
10
+ properties
11
+ rescue StandardError => e
12
+ Labimotion.log_exception(e, current_user)
13
+ properties
14
+ end
15
+
16
+ def load_all_vocabularies
17
+ load_from_files + load_from_database
18
+ end
19
+
20
+ def load_app_vocabularies
21
+ load_from_files
22
+ end
23
+
24
+ private
25
+
26
+ def update_layer_vocabularies(layer, key, properties, current_user, element)
27
+ field_vocabularies = layer[Labimotion::Prop::FIELDS].select { |field| field['is_voc'] }
28
+ field_vocabularies.each do |field|
29
+ idx = layer[Labimotion::Prop::FIELDS].index(field)
30
+ val = get_vocabulary_value(field, current_user, element)
31
+ update_field_value(properties, key, idx, val) if val.present?
32
+ end
33
+ end
34
+
35
+ def get_vocabulary_value(field, current_user, element)
36
+ case field['source']
37
+ when 'System'
38
+ get_system_value(field)
39
+ when 'User'
40
+ get_user_value(field, current_user)
41
+ when 'Element'
42
+ get_element_value(field, element)
43
+ when 'Segment'
44
+ get_segment_value(field, element)
45
+ when 'Dataset'
46
+ # TODO: Implement Dataset logic here
47
+ nil
48
+ end
49
+ end
50
+
51
+ def get_system_value(field)
52
+ current_time = Time.now.strftime('%d/%m/%Y %H:%M')
53
+ case field['identifier']
54
+ when 'dateTime-update'
55
+ current_time
56
+ when 'dateTime-create'
57
+ current_time if field['value'].blank?
58
+ end
59
+ end
60
+
61
+ def get_user_value(field, current_user)
62
+ current_user.name if field['identifier'] == 'user-name' && current_user.present?
63
+ end
64
+
65
+ def get_element_value(field, element)
66
+ case field['identifier']
67
+ when 'element-id'
68
+ element.id.to_s
69
+ when 'element-short_label'
70
+ element.short_label if element.has_attribute?(:short_label)
71
+ when 'element-name'
72
+ element.name if element.has_attribute?(:name)
73
+ when 'element-class'
74
+ element.class.name === 'Labimotion::Element' ? element.element_klass.label : element.class.name
75
+ else
76
+ ek = element.element_klass
77
+ return if ek.nil? || ek.identifier != field['source_id']
78
+
79
+ el_prop = element.properties
80
+ fields = el_prop[Labimotion::Prop::LAYERS][field['layer_id']][Labimotion::Prop::FIELDS]
81
+ fields.find { |ss| ss['field'] == field['field_id'] }&.dig('value')
82
+ end
83
+ end
84
+
85
+ def get_segment_value(field, element)
86
+ segments = element.segments.joins(:segment_klass).find_by('segment_klasses.identifier = ?', field['source_id'])
87
+ return if segments.nil?
88
+
89
+ seg_prop = segments.properties
90
+ fields = seg_prop[Labimotion::Prop::LAYERS][field['layer_id']][Labimotion::Prop::FIELDS]
91
+ fields.find { |ss| ss['field'] == field['field_id'] }&.dig('value')
92
+ end
93
+
94
+ def update_field_value(properties, key, idx, val)
95
+ properties[Labimotion::Prop::LAYERS][key][Labimotion::Prop::FIELDS][idx]['value'] = val
96
+ properties
97
+ end
98
+
99
+ def load_from_files
100
+ merged_data = []
101
+ merged_data.concat(load_json_file('System.json'))
102
+ merged_data.concat(load_json_file('Standard.json'))
103
+ merged_data
104
+ end
105
+
106
+ def load_json_file(filename)
107
+ file_path = File.join(__dir__, 'data', 'vocab', filename)
108
+ file_content = File.read(file_path)
109
+ JSON.parse(file_content)
110
+ end
111
+
112
+ def load_from_database
113
+ vocabularies = Labimotion::Vocabulary.all.sort_by(&:name)
114
+ Labimotion::VocabularyEntity.represent(vocabularies, serializable: true)
115
+ end
116
+ end
117
+ end
118
+ end