labimotion 1.4.1 → 2.0.0.rc2

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 (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