labimotion 1.5.0.rc6 → 1.5.0.rc8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/labimotion/apis/vocabulary_api.rb +0 -2
- data/lib/labimotion/entities/dataset_entity.rb +0 -49
- data/lib/labimotion/entities/properties_entity.rb +168 -76
- data/lib/labimotion/entities/segment_entity.rb +1 -0
- data/lib/labimotion/entities/vocabulary_entity.rb +0 -2
- data/lib/labimotion/libs/converter.rb +13 -34
- data/lib/labimotion/libs/data/vocab/Standard.json +25 -1
- data/lib/labimotion/libs/data/vocab/System.json +12 -0
- data/lib/labimotion/libs/nmr_mapper.rb +1 -1
- data/lib/labimotion/libs/vocabulary_handler.rb +95 -79
- data/lib/labimotion/models/concerns/attachment_converter.rb +1 -1
- data/lib/labimotion/version.rb +1 -1
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5a54a18e3c64bb9446ecf6c57aa2755d9ab0921a2571aa734615faa40f46d19d
|
4
|
+
data.tar.gz: 03a66fbf2e025ac855831349888ab941b7a2059a02557c473c4654eaceb62601
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fb9af61e157bc3c89b8b32d3fe51aa580d6a684c8348029e6b291e65d0f1876f48279f09bd291dc40194cb2a1c84cc84c6ea3beac5092f34ce1b2d6fd64db52b
|
7
|
+
data.tar.gz: cde31727f46f71e4803cc933f56e1f73785f87f9ab928a010299dc7c33dbdd504907cc31aa73bdc81000bf1774a60095a23860ae4e7d6b0ffdd29046612615da
|
@@ -74,10 +74,8 @@ module Labimotion
|
|
74
74
|
# end
|
75
75
|
vocabularies = Labimotion::VocabularyHandler.load_app_vocabularies
|
76
76
|
merged_data = Labimotion::FieldKlassEntity.represent(vocabularies, serializable: true)
|
77
|
-
# byebug
|
78
77
|
# list = Labimotion::Vocabulary.all.sort_by { |e| e.name }
|
79
78
|
# present list, with: Labimotion::VocabularyEntity, root: 'klass'
|
80
|
-
# byebug
|
81
79
|
merged_data
|
82
80
|
rescue StandardError => e
|
83
81
|
Labimotion.log_exception(e, current_user)
|
@@ -13,54 +13,5 @@ module Labimotion
|
|
13
13
|
object&.dataset_klass&.label
|
14
14
|
end
|
15
15
|
|
16
|
-
|
17
|
-
def root_element
|
18
|
-
object&.element&.root_element
|
19
|
-
end
|
20
|
-
|
21
|
-
def properties
|
22
|
-
properties = object&.properties || {}
|
23
|
-
properties[Labimotion::Prop::LAYERS].keys.each do |key|
|
24
|
-
layer = properties[Labimotion::Prop::LAYERS][key] || {}
|
25
|
-
return properties if layer.empty? || layer[Labimotion::Prop::FIELDS].nil?
|
26
|
-
|
27
|
-
field_vocs = layer[Labimotion::Prop::FIELDS].select { |ss| ss['is_voc'] == true }
|
28
|
-
field_vocs.each do |field|
|
29
|
-
idx = properties[Labimotion::Prop::LAYERS][key][Labimotion::Prop::FIELDS].index(field)
|
30
|
-
next if idx.nil?
|
31
|
-
|
32
|
-
case field['source']
|
33
|
-
when Labimotion::Prop::ELEMENT
|
34
|
-
if field['identifier'] == 'element.name'
|
35
|
-
byebug
|
36
|
-
properties[Labimotion::Prop::LAYERS][key][Labimotion::Prop::FIELDS][idx]['value'] = root_element&.name
|
37
|
-
# dic[field.identifier] = currentElement.name
|
38
|
-
|
39
|
-
end
|
40
|
-
when Labimotion::Prop::SEGMENT
|
41
|
-
segs = root_element&.segments&.select { |ss| field['source_id'] == ss.segment_klass&.identifier }
|
42
|
-
next if segs.empty? || field['layer_id'].blank? || field['field_id'].blank?
|
43
|
-
|
44
|
-
seg = segs&.first
|
45
|
-
seg_fields = seg.properties.dig(Labimotion::Prop::LAYERS, field['layer_id'], Labimotion::Prop::FIELDS).select { |ff| ff['field'] == field['field_id'] }
|
46
|
-
seg_field = seg_fields&.first
|
47
|
-
properties[Labimotion::Prop::LAYERS][key][Labimotion::Prop::FIELDS][idx]['value'] = seg_field['value']
|
48
|
-
when Labimotion::Prop::DATASET
|
49
|
-
byebug
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
# layer[Labimotion::Prop::FIELDS].each do |field|
|
54
|
-
# end
|
55
|
-
end
|
56
|
-
|
57
|
-
# byebug
|
58
|
-
# layers = properties['layers']
|
59
|
-
|
60
|
-
# properties['vocabularies'].each_with_object({}) do |v, h|
|
61
|
-
# h[v['name']] = v['value']
|
62
|
-
# end
|
63
|
-
properties
|
64
|
-
end
|
65
16
|
end
|
66
17
|
end
|
@@ -1,82 +1,163 @@
|
|
1
1
|
require 'labimotion/entities/application_entity'
|
2
2
|
|
3
|
-
# Entity module
|
4
3
|
module Labimotion
|
5
4
|
class PropertiesEntity < Labimotion::ApplicationEntity
|
6
|
-
|
7
|
-
# TODO: Refactor this method to something more readable/understandable
|
8
5
|
def properties
|
6
|
+
process_layers do |key, layer|
|
7
|
+
process_fields(key, layer)
|
8
|
+
end
|
9
|
+
object.properties
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def process_layers
|
9
15
|
(object&.properties.is_a?(Hash) && object.properties[Labimotion::Prop::LAYERS]&.keys || []).each do |key|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
# field_vocabularies.each do |field|
|
14
|
-
# idx = object.properties[Labimotion::Prop::LAYERS][key][Labimotion::Prop::FIELDS].index(field)
|
15
|
-
# if field['identifier'] == '7c30cd4f-aef4-433a-946e-d0f81f8918f1'
|
16
|
-
# if properties['klass'] == 'Dataset'
|
17
|
-
# container = object&.element_type.constantize.find_by(id: object&.element_id)
|
18
|
-
# element = container.root.containable
|
19
|
-
# if field['source'] == 'Segment'
|
20
|
-
# byebug
|
21
|
-
# segments = element.segments.joins(:segment_klass).find_by('segment_klasses.identifier = ?', field['source_id'])
|
22
|
-
# seg_prop = segments.properties
|
23
|
-
# fields = seg_prop[Labimotion::Prop::LAYERS][field['layer_id']][Labimotion::Prop::FIELDS].select { |ss| ss['field'] == field['field_id'] }
|
24
|
-
# val = fields.first['value']
|
25
|
-
# object.properties[Labimotion::Prop::LAYERS][key][Labimotion::Prop::FIELDS][idx]['value'] = val
|
26
|
-
# end
|
27
|
-
# end
|
28
|
-
# # object.properties[Labimotion::Prop::LAYERS][key][Labimotion::Prop::FIELDS][idx]['value'] = Time.now.strftime('%d/%m/%Y %H:%M')
|
29
|
-
# end
|
30
|
-
# end
|
31
|
-
|
32
|
-
field_sample_molecules = object.properties[Labimotion::Prop::LAYERS][key][Labimotion::Prop::FIELDS].select { |ss| ss['type'] == Labimotion::FieldType::DRAG_SAMPLE || ss['type'] == Labimotion::FieldType::DRAG_MOLECULE }
|
33
|
-
field_sample_molecules.each do |field|
|
34
|
-
idx = object.properties[Labimotion::Prop::LAYERS][key][Labimotion::Prop::FIELDS].index(field)
|
35
|
-
sid = field.dig('value', 'el_id')
|
36
|
-
next unless sid.present?
|
37
|
-
|
38
|
-
el = field['type'] == Labimotion::FieldType::DRAG_SAMPLE ? Sample.find_by(id: sid) : Molecule.find_by(id: sid)
|
39
|
-
next unless el.present?
|
40
|
-
next unless object.properties.dig(Labimotion::Prop::LAYERS, key, Labimotion::Prop::FIELDS, idx, 'value').present?
|
41
|
-
|
42
|
-
object.properties[Labimotion::Prop::LAYERS][key][Labimotion::Prop::FIELDS][idx]['value']['el_label'] = el.short_label if field['type'] == Labimotion::FieldType::DRAG_SAMPLE
|
43
|
-
object.properties[Labimotion::Prop::LAYERS][key][Labimotion::Prop::FIELDS][idx]['value']['el_tip'] = el.short_label if field['type'] == Labimotion::FieldType::DRAG_SAMPLE
|
44
|
-
object.properties[Labimotion::Prop::LAYERS][key][Labimotion::Prop::FIELDS][idx]['value']['el_svg'] = field['type'] == Labimotion::FieldType::DRAG_SAMPLE ? el.get_svg_path : File.join('/images', 'molecules', el&.molecule_svg_file || 'nosvg')
|
45
|
-
end
|
16
|
+
yield(key, object.properties[Labimotion::Prop::LAYERS][key])
|
17
|
+
end
|
18
|
+
end
|
46
19
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
20
|
+
def process_fields(key, layer)
|
21
|
+
process_sample_and_molecule_fields(key, layer)
|
22
|
+
process_reaction_fields(key, layer)
|
23
|
+
process_table_fields(key, layer)
|
24
|
+
process_voc_fields(key, layer)
|
25
|
+
end
|
52
26
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
27
|
+
def process_sample_and_molecule_fields(key, layer)
|
28
|
+
select_fields(layer, [Labimotion::FieldType::DRAG_SAMPLE, Labimotion::FieldType::DRAG_MOLECULE]).each do |field, idx|
|
29
|
+
update_sample_or_molecule_field(key, field, idx)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def process_reaction_fields(key, layer)
|
34
|
+
select_fields(layer, [Labimotion::FieldType::SYS_REACTION]).each do |field, idx|
|
35
|
+
update_reaction_field(key, field, idx)
|
36
|
+
end
|
37
|
+
end
|
58
38
|
|
59
|
-
|
60
|
-
|
39
|
+
def process_table_fields(key, layer)
|
40
|
+
select_fields(layer, [Labimotion::FieldType::TABLE]).each do |field, idx|
|
41
|
+
update_table_field(key, field, idx)
|
42
|
+
end
|
43
|
+
end
|
61
44
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
45
|
+
def process_voc_fields(key, layer)
|
46
|
+
select_fields(layer, nil, true).each do |field, idx|
|
47
|
+
update_voc_field(key, field, idx)
|
48
|
+
end
|
49
|
+
end
|
66
50
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
51
|
+
def select_fields(layer, types = nil, is_voc = false)
|
52
|
+
fields = layer[Labimotion::Prop::FIELDS]
|
53
|
+
fields = fields.select { |f| types.include?(f['type']) } if types
|
54
|
+
fields = fields.select { |f| f['is_voc'] == true } if is_voc
|
55
|
+
fields.map { |f| [f, fields.index(f)] }
|
56
|
+
end
|
57
|
+
|
58
|
+
def update_sample_or_molecule_field(key, field, idx)
|
59
|
+
sid = field.dig('value', 'el_id')
|
60
|
+
return unless sid.present?
|
71
61
|
|
72
|
-
|
73
|
-
|
62
|
+
el = field['type'] == Labimotion::FieldType::DRAG_SAMPLE ? Sample.find_by(id: sid) : Molecule.find_by(id: sid)
|
63
|
+
return unless el.present? && object.properties.dig(Labimotion::Prop::LAYERS, key, Labimotion::Prop::FIELDS, idx, 'value').present?
|
64
|
+
|
65
|
+
update_field_value(key, idx, {
|
66
|
+
'el_label' => el.short_label,
|
67
|
+
'el_tip' => el.short_label,
|
68
|
+
'el_svg' => field['type'] == Labimotion::FieldType::DRAG_SAMPLE ? el.get_svg_path : File.join('/images', 'molecules', el&.molecule_svg_file || 'nosvg')
|
69
|
+
})
|
70
|
+
end
|
71
|
+
|
72
|
+
def update_reaction_field(key, field, idx)
|
73
|
+
sid = field.dig('value', 'el_id')
|
74
|
+
return unless sid.present?
|
75
|
+
|
76
|
+
el = Reaction.find_by(id: sid)
|
77
|
+
if el.blank?
|
78
|
+
update_field_value(key, idx, { 'el_tip' => 'ERROR', 'el_svg' => '' })
|
79
|
+
return
|
80
|
+
end
|
74
81
|
|
75
|
-
|
76
|
-
|
82
|
+
return unless object.properties.dig(Labimotion::Prop::LAYERS, key, Labimotion::Prop::FIELDS, idx, 'value').present?
|
83
|
+
|
84
|
+
update_field_value(key, idx, {
|
85
|
+
'el_label' => el.short_label,
|
86
|
+
'el_tip' => el.short_label,
|
87
|
+
'el_svg' => el.reaction_svg_file
|
88
|
+
})
|
89
|
+
end
|
90
|
+
|
91
|
+
def update_table_field(key, field, idx)
|
92
|
+
return unless field['sub_values'].present? && field[Labimotion::Prop::SUBFIELDS].present?
|
93
|
+
|
94
|
+
field_table_molecules = field[Labimotion::Prop::SUBFIELDS].select { |ss| ss['type'] == Labimotion::FieldType::DRAG_MOLECULE }
|
95
|
+
object.properties[Labimotion::Prop::LAYERS][key][Labimotion::Prop::FIELDS][idx] = set_table(field, field_table_molecules, Labimotion::Prop::MOLECULE) if field_table_molecules.present?
|
96
|
+
|
97
|
+
field_table_samples = field[Labimotion::Prop::SUBFIELDS].select { |ss| ss['type'] == Labimotion::FieldType::DRAG_SAMPLE }
|
98
|
+
object.properties[Labimotion::Prop::LAYERS][key][Labimotion::Prop::FIELDS][idx] = set_table(field, field_table_samples, Labimotion::Prop::SAMPLE) if field_table_samples.present?
|
99
|
+
end
|
100
|
+
|
101
|
+
def update_voc_field(key, field, idx)
|
102
|
+
root_element = get_root_element
|
103
|
+
|
104
|
+
case field['source']
|
105
|
+
when Labimotion::Prop::ELEMENT
|
106
|
+
update_element_voc_field(key, field, idx, root_element)
|
107
|
+
when Labimotion::Prop::SEGMENT
|
108
|
+
update_segment_voc_field(key, field, idx, root_element)
|
109
|
+
when Labimotion::Prop::DATASET
|
110
|
+
update_dataset_voc_field(key, field, idx, root_element)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def get_root_element
|
115
|
+
case object.class.name
|
116
|
+
when Labimotion::Prop::L_ELEMENT
|
117
|
+
object
|
118
|
+
when Labimotion::Prop::L_SEGMENT
|
119
|
+
object&.element
|
120
|
+
when Labimotion::Prop::L_DATASET
|
121
|
+
object&.element&.root_element
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def update_element_voc_field(key, field, idx, root_element)
|
126
|
+
if field['identifier'] == 'element.name'
|
127
|
+
update_field_value(key, idx, root_element&.name)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def update_segment_voc_field(key, field, idx, root_element)
|
132
|
+
segs = root_element&.segments&.select { |ss| field['source_id'] == ss.segment_klass&.identifier }
|
133
|
+
return if segs.empty? || field['layer_id'].blank? || field['field_id'].blank?
|
134
|
+
|
135
|
+
seg = segs&.first
|
136
|
+
seg_fields = seg.properties.dig(Labimotion::Prop::LAYERS, field['layer_id'], Labimotion::Prop::FIELDS).select { |ff| ff['field'] == field['field_id'] }
|
137
|
+
seg_field = seg_fields&.first
|
138
|
+
update_field_value(key, idx, seg_field['value'])
|
139
|
+
end
|
140
|
+
|
141
|
+
def update_dataset_voc_field(key, field, idx, root_element)
|
142
|
+
dk = DatasetKlass.find_by(identifier: field["source_id"])
|
143
|
+
dk["ols_term_id"]
|
144
|
+
anas = root_element.analyses.select { |ana| ana.extended_metadata["kind"].split("|")&.first&.strip == dk["ols_term_id"] }
|
145
|
+
anas.each do |ana|
|
146
|
+
ana.children.each do |cds|
|
147
|
+
next unless cds.dataset.present?
|
148
|
+
|
149
|
+
ds_prop = cds.dataset.properties
|
150
|
+
ds_fields = ds_prop.dig(Labimotion::Prop::LAYERS, field['layer_id'], Labimotion::Prop::FIELDS).select { |ff| ff['field'] == field['field_id'] }
|
151
|
+
ds_field = ds_fields&.first
|
152
|
+
if object.properties[Labimotion::Prop::LAYERS][key].present? && ds_field['value'].present?
|
153
|
+
update_field_value(key, idx, ds_field['value'])
|
154
|
+
end
|
77
155
|
end
|
78
156
|
end
|
79
|
-
|
157
|
+
end
|
158
|
+
|
159
|
+
def update_field_value(key, idx, value)
|
160
|
+
object.properties[Labimotion::Prop::LAYERS][key][Labimotion::Prop::FIELDS][idx]['value'] = value
|
80
161
|
end
|
81
162
|
|
82
163
|
def set_table(field, field_table_objs, obj)
|
@@ -90,23 +171,34 @@ module Labimotion
|
|
90
171
|
|
91
172
|
case obj
|
92
173
|
when Labimotion::Prop::MOLECULE
|
93
|
-
sub_value
|
94
|
-
sub_value[col_id]['value']['el_inchikey'] = find_obj.inchikey
|
95
|
-
sub_value[col_id]['value']['el_smiles'] = find_obj.cano_smiles
|
96
|
-
sub_value[col_id]['value']['el_iupac'] = find_obj.iupac_name
|
97
|
-
sub_value[col_id]['value']['el_molecular_weight'] = find_obj.molecular_weight
|
174
|
+
update_molecule_sub_value(sub_value, col_id, find_obj)
|
98
175
|
when Labimotion::Prop::SAMPLE
|
99
|
-
sub_value
|
100
|
-
sub_value[col_id]['value']['el_label'] = find_obj.short_label
|
101
|
-
sub_value[col_id]['value']['el_short_label'] = find_obj.short_label
|
102
|
-
sub_value[col_id]['value']['el_name'] = find_obj.name
|
103
|
-
sub_value[col_id]['value']['el_external_label'] = find_obj.external_label
|
104
|
-
sub_value[col_id]['value']['el_molecular_weight'] = find_obj.decoupled ? find_obj.molecular_mass : find_obj.molecule.molecular_weight
|
176
|
+
update_sample_sub_value(sub_value, col_id, find_obj)
|
105
177
|
end
|
106
178
|
end
|
107
179
|
end
|
108
180
|
field
|
109
181
|
end
|
110
182
|
|
183
|
+
def update_molecule_sub_value(sub_value, col_id, find_obj)
|
184
|
+
sub_value[col_id]['value'].merge!({
|
185
|
+
'el_svg' => File.join('/images', 'molecules', find_obj.molecule_svg_file),
|
186
|
+
'el_inchikey' => find_obj.inchikey,
|
187
|
+
'el_smiles' => find_obj.cano_smiles,
|
188
|
+
'el_iupac' => find_obj.iupac_name,
|
189
|
+
'el_molecular_weight' => find_obj.molecular_weight
|
190
|
+
})
|
191
|
+
end
|
192
|
+
|
193
|
+
def update_sample_sub_value(sub_value, col_id, find_obj)
|
194
|
+
sub_value[col_id]['value'].merge!({
|
195
|
+
'el_svg' => find_obj.get_svg_path,
|
196
|
+
'el_label' => find_obj.short_label,
|
197
|
+
'el_short_label' => find_obj.short_label,
|
198
|
+
'el_name' => find_obj.name,
|
199
|
+
'el_external_label' => find_obj.external_label,
|
200
|
+
'el_molecular_weight' => find_obj.decoupled ? find_obj.molecular_mass : find_obj.molecule.molecular_weight
|
201
|
+
})
|
202
|
+
end
|
111
203
|
end
|
112
|
-
end
|
204
|
+
end
|
@@ -17,13 +17,11 @@ module Labimotion
|
|
17
17
|
# end
|
18
18
|
|
19
19
|
expose :voc do |obj|
|
20
|
-
## byebug
|
21
20
|
voc = (obj[:properties] && obj[:properties]['voc']) || {}
|
22
21
|
|
23
22
|
case voc['source']
|
24
23
|
when Labimotion::Prop::ELEMENT
|
25
24
|
if voc['identifier'] == 'element.name'
|
26
|
-
# byebug
|
27
25
|
# voc['source_name'] = ElementKlass.find_by(identifier: voc['source_id'])&.name
|
28
26
|
end
|
29
27
|
when Labimotion::Prop::SEGMENT
|
@@ -28,7 +28,7 @@ module Labimotion
|
|
28
28
|
dsr = []
|
29
29
|
ols = nil
|
30
30
|
Zip::File.open(att.attachment_attacher.file.url) do |zip_file|
|
31
|
-
res = Labimotion::Converter.collect_metadata(zip_file) if att.filename.split('.')&.last == 'zip'
|
31
|
+
res = Labimotion::Converter.collect_metadata(zip_file, current_user) if att.filename.split('.')&.last == 'zip'
|
32
32
|
ols = res[:o] unless res&.dig(:o).nil?
|
33
33
|
dsr.push(res[:d]) unless res&.dig(:d).nil?
|
34
34
|
end
|
@@ -92,7 +92,7 @@ module Labimotion
|
|
92
92
|
{ a: oa, f: folder }
|
93
93
|
end
|
94
94
|
|
95
|
-
def self.collect_metadata(zip_file) # rubocop: disable Metrics/PerceivedComplexity
|
95
|
+
def self.collect_metadata(zip_file, current_user = {}) # rubocop: disable Metrics/PerceivedComplexity
|
96
96
|
dsr = []
|
97
97
|
ols = nil
|
98
98
|
zip_file.each do |entry|
|
@@ -114,7 +114,7 @@ module Labimotion
|
|
114
114
|
{ d: dsr, o: ols }
|
115
115
|
end
|
116
116
|
|
117
|
-
def self.handle_response(oat, response) # rubocop: disable Metrics/PerceivedComplexity
|
117
|
+
def self.handle_response(oat, response, current_user = {}) # rubocop: disable Metrics/PerceivedComplexity
|
118
118
|
dsr = []
|
119
119
|
ols = nil
|
120
120
|
|
@@ -123,10 +123,9 @@ module Labimotion
|
|
123
123
|
tmp_file.write(response.parsed_response)
|
124
124
|
tmp_file.rewind
|
125
125
|
|
126
|
-
name = response&.headers && response&.headers['content-disposition']&.split('=')&.last
|
126
|
+
# name = response&.headers && response&.headers['content-disposition']&.split('=')&.last
|
127
127
|
filename = oat.filename
|
128
|
-
name = "#{File.basename(filename, '.*')}.zip"
|
129
|
-
|
128
|
+
name = "#{File.basename(filename, '.*')}.zip"
|
130
129
|
att = Attachment.new(
|
131
130
|
filename: name,
|
132
131
|
file_path: tmp_file.path,
|
@@ -140,7 +139,7 @@ module Labimotion
|
|
140
139
|
|
141
140
|
att.save! if att.valid?
|
142
141
|
|
143
|
-
process_ds(att.id)
|
142
|
+
process_ds(att.id, current_user)
|
144
143
|
rescue StandardError => e
|
145
144
|
raise e
|
146
145
|
ensure
|
@@ -148,7 +147,7 @@ module Labimotion
|
|
148
147
|
end
|
149
148
|
end
|
150
149
|
|
151
|
-
def self.process(data)
|
150
|
+
def self.process(data, current_user = {}) # rubocop: disable Metrics/PerceivedComplexity
|
152
151
|
return data[:a].con_state if data[:a]&.attachable_type != 'Container'
|
153
152
|
response = nil
|
154
153
|
begin
|
@@ -165,25 +164,25 @@ module Labimotion
|
|
165
164
|
)
|
166
165
|
end
|
167
166
|
if response.ok?
|
168
|
-
Labimotion::Converter.handle_response(data[:a], response)
|
167
|
+
Labimotion::Converter.handle_response(data[:a], response, current_user)
|
169
168
|
Labimotion::ConState::PROCESSED
|
170
169
|
else
|
171
170
|
Labimotion::Converter.logger.error ["Converter Response Error: id: [#{data[:a]&.id}], filename: [#{data[:a]&.filename}], response: #{response}"].join($INPUT_RECORD_SEPARATOR)
|
172
171
|
Labimotion::ConState::ERROR
|
173
172
|
end
|
174
173
|
rescue StandardError => e
|
175
|
-
Labimotion::Converter.logger.error ["process fail: #{id}", e.message, *e.backtrace].join($INPUT_RECORD_SEPARATOR)
|
174
|
+
Labimotion::Converter.logger.error ["process fail: #{data[:a]&.id}", e.message, *e.backtrace].join($INPUT_RECORD_SEPARATOR)
|
176
175
|
Labimotion::ConState::ERROR
|
177
176
|
ensure
|
178
177
|
FileUtils.rm_f(ofile)
|
179
178
|
end
|
180
179
|
end
|
181
180
|
|
182
|
-
def self.jcamp_converter(id)
|
181
|
+
def self.jcamp_converter(id, current_user = {})
|
183
182
|
data = Labimotion::Converter.vor_conv(id)
|
184
183
|
return if data.nil?
|
185
184
|
|
186
|
-
Labimotion::Converter.process(data)
|
185
|
+
Labimotion::Converter.process(data, current_user)
|
187
186
|
rescue StandardError => e
|
188
187
|
Labimotion::Converter.logger.error ["jcamp_converter fail: #{id}", e.message, *e.backtrace].join($INPUT_RECORD_SEPARATOR)
|
189
188
|
Labimotion::ConState::ERROR
|
@@ -243,27 +242,7 @@ module Labimotion
|
|
243
242
|
fi['device'] = ds[:device] || ds[:value]
|
244
243
|
new_prop[Labimotion::Prop::LAYERS][ds[:layer]][Labimotion::Prop::FIELDS][idx] = fi
|
245
244
|
end
|
246
|
-
new_prop.dig(Labimotion::Prop::LAYERS, 'general', Labimotion::Prop::FIELDS)&.each_with_index do |fi, idx|
|
247
|
-
if fi['field'] == 'creator' && current_user.present?
|
248
|
-
fi['value'] = current_user.name
|
249
|
-
fi['system'] = current_user.name
|
250
|
-
new_prop[Labimotion::Prop::LAYERS]['general'][Labimotion::Prop::FIELDS][idx] = fi
|
251
|
-
end
|
252
|
-
end
|
253
245
|
element = Container.find(dataset.element_id)&.root_element
|
254
|
-
element.present? && element&.class&.name == 'Sample' && new_prop.dig(Labimotion::Prop::LAYERS, 'sample_details', Labimotion::Prop::FIELDS)&.each_with_index do |fi, idx|
|
255
|
-
if fi['field'] == 'id'
|
256
|
-
fi['value'] = element.id
|
257
|
-
fi['system'] = element.id
|
258
|
-
new_prop[Labimotion::Prop::LAYERS]['sample_details'][Labimotion::Prop::FIELDS][idx] = fi
|
259
|
-
end
|
260
|
-
|
261
|
-
if fi['field'] == 'label'
|
262
|
-
fi['value'] = element.short_label
|
263
|
-
fi['system'] = element.short_label
|
264
|
-
new_prop[Labimotion::Prop::LAYERS]['sample_details'][Labimotion::Prop::FIELDS][idx] = fi
|
265
|
-
end
|
266
|
-
end
|
267
246
|
new_prop = Labimotion::VocabularyHandler.update_vocabularies(new_prop, current_user, element)
|
268
247
|
dataset.properties = new_prop
|
269
248
|
dataset.save!
|
@@ -326,13 +305,13 @@ module Labimotion
|
|
326
305
|
res
|
327
306
|
end
|
328
307
|
|
329
|
-
def self.metadata(id)
|
308
|
+
def self.metadata(id, current_user)
|
330
309
|
att = Attachment.find(id)
|
331
310
|
return if att.nil? || att.attachable_id.nil? || att.attachable_type != Labimotion::Prop::CONTAINER
|
332
311
|
|
333
312
|
ds = Labimotion::Dataset.find_by(element_type: Labimotion::Prop::CONTAINER, element_id: att.attachable_id)
|
334
313
|
att.update_column(:con_state, Labimotion::ConState::COMPLETED) if ds.present?
|
335
|
-
process_ds(att.id) if ds.nil?
|
314
|
+
process_ds(att.id, current_user) if ds.nil?
|
336
315
|
end
|
337
316
|
end
|
338
317
|
end
|
@@ -5,8 +5,20 @@
|
|
5
5
|
"name": "Solvent",
|
6
6
|
"label": "NMR Solvent",
|
7
7
|
"field_type": "text",
|
8
|
-
"opid":
|
8
|
+
"opid": 0,
|
9
9
|
"term_id": "NMR:1000330",
|
10
|
+
"ontology": {
|
11
|
+
"id": "nmrcv:class:http://nmrML.org/nmrCV#NMR:1000330",
|
12
|
+
"iri": "http://nmrML.org/nmrCV#NMR:1000330",
|
13
|
+
"short_form": "NMR:1000330",
|
14
|
+
"label": "NMR solvent",
|
15
|
+
"description": [
|
16
|
+
"Use Chebi entities here."
|
17
|
+
],
|
18
|
+
"ontology_name": "nmrcv",
|
19
|
+
"ontology_prefix": "NMRCV",
|
20
|
+
"type": "class"
|
21
|
+
},
|
10
22
|
"source": "Standard"
|
11
23
|
},
|
12
24
|
{
|
@@ -17,6 +29,18 @@
|
|
17
29
|
"field_type": "text",
|
18
30
|
"opid": 0,
|
19
31
|
"term_id": "NMR:1400025",
|
32
|
+
"ontology": {
|
33
|
+
"id": "nmrcv:class:http://nmrML.org/nmrCV#NMR:1400025",
|
34
|
+
"iri": "http://nmrML.org/nmrCV#NMR:1400025",
|
35
|
+
"short_form": "NMR:1400025",
|
36
|
+
"label": "sample temperature in magnet",
|
37
|
+
"description": [
|
38
|
+
"def: The temperature of an NMR sample whilst in the magnet of an NMR instrument."
|
39
|
+
],
|
40
|
+
"ontology_name": "nmrcv",
|
41
|
+
"ontology_prefix": "NMRCV",
|
42
|
+
"type": "class"
|
43
|
+
},
|
20
44
|
"source": "Standard"
|
21
45
|
}
|
22
46
|
]
|
@@ -115,5 +115,17 @@
|
|
115
115
|
"voc": {
|
116
116
|
"source": "Element"
|
117
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
|
+
}
|
118
130
|
}
|
119
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
|
@@ -2,95 +2,111 @@
|
|
2
2
|
|
3
3
|
module Labimotion
|
4
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
|
5
25
|
|
6
|
-
|
7
|
-
|
8
|
-
layer = properties[Labimotion::Prop::LAYERS][key]
|
9
|
-
field_vocabularies = layer[Labimotion::Prop::FIELDS].select { |ss| ss['is_voc'] == true && ss['opid'] == 9}
|
26
|
+
def update_layer_vocabularies(layer, key, properties, current_user, element)
|
27
|
+
field_vocabularies = layer[Labimotion::Prop::FIELDS].select { |field| field['is_voc'] && field['opid'] == 9 }
|
10
28
|
field_vocabularies.each do |field|
|
11
|
-
idx =
|
12
|
-
val =
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
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
|
+
return current_user.name if field['identifier'] == 'user.name' && current_user.present?
|
63
|
+
end
|
26
64
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
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.class'
|
72
|
+
if element.class.name === 'Labimotion::Element'
|
73
|
+
element.element_klass.label
|
74
|
+
else
|
75
|
+
element.class.name
|
32
76
|
end
|
33
|
-
# case field['identifier']
|
34
|
-
# when 'dateTime.now'
|
35
|
-
# val = Time.now.strftime('%d/%m/%Y %H:%M')
|
36
|
-
# when 'user.name'
|
37
|
-
# val = current_user.name
|
38
|
-
# when 'element.id'
|
39
|
-
# val = element.id.to_s
|
40
|
-
# when 'element.short_label'
|
41
|
-
# val = element.short_label
|
42
|
-
# end
|
43
|
-
# ontology = {
|
44
|
-
# id: "ncit:class:http://purl.obolibrary.org/obo/#{field['term_id']}",
|
45
|
-
# iri: "http://purl.obolibrary.org/obo/#{field['term_id']}",
|
46
|
-
# type: "class",
|
47
|
-
# label: field['name'],
|
48
|
-
# obo_id: field['term_id'],
|
49
|
-
# short_form: field['term_id'],
|
50
|
-
# description: field['label'],
|
51
|
-
# }
|
52
|
-
# properties[Labimotion::Prop::LAYERS][key][Labimotion::Prop::FIELDS][idx]['ontology'] = ontology if ontology.present?
|
53
|
-
properties[Labimotion::Prop::LAYERS][key][Labimotion::Prop::FIELDS][idx]['value'] = val if val.present?
|
54
|
-
## properties[Labimotion::Prop::LAYERS][key][Labimotion::Prop::FIELDS][idx]['placeholder'] = val if val.present?
|
55
77
|
end
|
56
78
|
end
|
57
|
-
properties
|
58
|
-
rescue StandardError => e
|
59
|
-
Labimotion.log_exception(e, current_user)
|
60
|
-
properties
|
61
|
-
end
|
62
79
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
file_data + db_data
|
67
|
-
end
|
80
|
+
def get_segment_value(field, element)
|
81
|
+
segments = element.segments.joins(:segment_klass).find_by('segment_klasses.identifier = ?', field['source_id'])
|
82
|
+
return if segments.nil?
|
68
83
|
|
69
|
-
|
70
|
-
|
71
|
-
|
84
|
+
seg_prop = segments.properties
|
85
|
+
fields = seg_prop[Labimotion::Prop::LAYERS][field['layer_id']][Labimotion::Prop::FIELDS]
|
86
|
+
fields.find { |ss| ss['field'] == field['field_id'] }&.dig('value')
|
87
|
+
end
|
72
88
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
sys_json = File.join(__dir__, 'data', 'vocab', 'System.json')
|
77
|
-
# byebug
|
78
|
-
file_content = File.read(sys_json)
|
79
|
-
json_data = JSON.parse(file_content)
|
80
|
-
merged_data.concat(json_data)
|
89
|
+
def update_field_value(properties, key, idx, val)
|
90
|
+
properties[Labimotion::Prop::LAYERS][key][Labimotion::Prop::FIELDS][idx]['value'] = val
|
91
|
+
end
|
81
92
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
93
|
+
def load_from_files
|
94
|
+
merged_data = []
|
95
|
+
merged_data.concat(load_json_file('System.json'))
|
96
|
+
merged_data.concat(load_json_file('Standard.json'))
|
97
|
+
merged_data
|
98
|
+
end
|
88
99
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
100
|
+
def load_json_file(filename)
|
101
|
+
file_path = File.join(__dir__, 'data', 'vocab', filename)
|
102
|
+
file_content = File.read(file_path)
|
103
|
+
JSON.parse(file_content)
|
104
|
+
end
|
93
105
|
|
94
|
-
|
106
|
+
def load_from_database
|
107
|
+
vocabularies = Labimotion::Vocabulary.all.sort_by(&:name)
|
108
|
+
Labimotion::VocabularyEntity.represent(vocabularies, serializable: true)
|
109
|
+
end
|
110
|
+
end
|
95
111
|
end
|
96
|
-
end
|
112
|
+
end
|
@@ -36,7 +36,7 @@ module Labimotion
|
|
36
36
|
self.con_state = Labimotion::Converter.jcamp_converter(id, current_user)
|
37
37
|
update_column(:con_state, con_state)
|
38
38
|
when Labimotion::ConState::CONVERTED
|
39
|
-
Labimotion::Converter.metadata(id)
|
39
|
+
Labimotion::Converter.metadata(id, current_user)
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
data/lib/labimotion/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: labimotion
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.5.0.
|
4
|
+
version: 1.5.0.rc8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chia-Lin Lin
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2024-
|
12
|
+
date: 2024-11-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -123,7 +123,10 @@ files:
|
|
123
123
|
homepage: https://github.com/LabIMotion/labimotion
|
124
124
|
licenses:
|
125
125
|
- AGPL-3.0
|
126
|
-
metadata:
|
126
|
+
metadata:
|
127
|
+
homepage_uri: https://github.com/LabIMotion/labimotion
|
128
|
+
source_code_uri: https://github.com/LabIMotion/labimotion
|
129
|
+
bug_tracker_uri: https://github.com/LabIMotion/labimotion/discussions
|
127
130
|
post_install_message:
|
128
131
|
rdoc_options: []
|
129
132
|
require_paths:
|