labimotion 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/labimotion/api.rb +19 -0
- data/lib/labimotion/apis/converter_api.rb +68 -0
- data/lib/labimotion/apis/generic_dataset_api.rb +50 -0
- data/lib/labimotion/apis/generic_element_api.rb +339 -0
- data/lib/labimotion/apis/labimotion_hub_api.rb +53 -0
- data/lib/labimotion/apis/segment_api.rb +144 -0
- data/lib/labimotion/entities/application_entity.rb +88 -0
- data/lib/labimotion/entities/dataset_entity.rb +16 -0
- data/lib/labimotion/entities/dataset_klass_entity.rb +9 -0
- data/lib/labimotion/entities/element_entity.rb +108 -0
- data/lib/labimotion/entities/element_klass_entity.rb +10 -0
- data/lib/labimotion/entities/element_revision_entity.rb +57 -0
- data/lib/labimotion/entities/eln_element_entity.rb +110 -0
- data/lib/labimotion/entities/generic_entity.rb +54 -0
- data/lib/labimotion/entities/generic_klass_entity.rb +14 -0
- data/lib/labimotion/entities/generic_public_entity.rb +25 -0
- data/lib/labimotion/entities/klass_revision_entity.rb +20 -0
- data/lib/labimotion/entities/segment_entity.rb +62 -0
- data/lib/labimotion/entities/segment_klass_entity.rb +8 -0
- data/lib/labimotion/entities/segment_revision_entity.rb +55 -0
- data/lib/labimotion/helpers/converter_helpers.rb +13 -0
- data/lib/labimotion/helpers/dataset_helpers.rb +38 -0
- data/lib/labimotion/helpers/element_helpers.rb +268 -0
- data/lib/labimotion/helpers/generic_helpers.rb +252 -0
- data/lib/labimotion/helpers/repository_helpers.rb +14 -0
- data/lib/labimotion/helpers/sample_association_helpers.rb +126 -0
- data/lib/labimotion/helpers/search_helpers.rb +62 -0
- data/lib/labimotion/helpers/segment_helpers.rb +97 -0
- data/lib/labimotion/libs/converter.rb +325 -0
- data/lib/labimotion/libs/export_dataset.rb +121 -0
- data/lib/labimotion/libs/nmr_mapper.rb +265 -0
- data/lib/labimotion/libs/nmr_mapper_repo.rb +263 -0
- data/lib/labimotion/libs/template_hub.rb +55 -0
- data/lib/labimotion/models/collections_element.rb +42 -0
- data/lib/labimotion/models/concerns/attachment_converter.rb +42 -0
- data/lib/labimotion/models/concerns/datasetable.rb +50 -0
- data/lib/labimotion/models/concerns/generic_klass_revisions.rb +39 -0
- data/lib/labimotion/models/concerns/generic_revisions.rb +43 -0
- data/lib/labimotion/models/concerns/segmentable.rb +74 -0
- data/lib/labimotion/models/dataset.rb +14 -0
- data/lib/labimotion/models/dataset_klass.rb +25 -0
- data/lib/labimotion/models/dataset_klasses_revision.rb +9 -0
- data/lib/labimotion/models/datasets_revision.rb +9 -0
- data/lib/labimotion/models/element.rb +121 -0
- data/lib/labimotion/models/element_klass.rb +25 -0
- data/lib/labimotion/models/element_klasses_revision.rb +9 -0
- data/lib/labimotion/models/elements_element.rb +11 -0
- data/lib/labimotion/models/elements_revision.rb +8 -0
- data/lib/labimotion/models/elements_sample.rb +11 -0
- data/lib/labimotion/models/segment.rb +14 -0
- data/lib/labimotion/models/segment_klass.rb +24 -0
- data/lib/labimotion/models/segment_klasses_revision.rb +9 -0
- data/lib/labimotion/models/segments_revision.rb +9 -0
- data/lib/labimotion/utils/con_state.rb +13 -0
- data/lib/labimotion/utils/export.rb +112 -0
- data/lib/labimotion/utils/import.rb +186 -0
- data/lib/labimotion/utils/search.rb +112 -0
- data/lib/labimotion/utils/serializer.rb +78 -0
- data/lib/labimotion/version.rb +6 -0
- data/lib/labimotion.rb +95 -0
- metadata +119 -0
@@ -0,0 +1,186 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Labimotion
|
4
|
+
class Import
|
5
|
+
|
6
|
+
def self.import_repo_segment_props(instances, attachments, attachable_uuid, fields)
|
7
|
+
primary_store = Rails.configuration.storage.primary_store
|
8
|
+
attachable = instances.fetch('Labimotion::Segment').fetch(attachable_uuid)
|
9
|
+
attachment = Attachment.where(id: attachments, filename: fields.fetch('identifier')).first
|
10
|
+
attachment.update!(
|
11
|
+
attachable_id: attachable.id,
|
12
|
+
attachable_type: 'SegmentProps',
|
13
|
+
con_state: Labimotion::ConState::NONE,
|
14
|
+
transferred: true,
|
15
|
+
aasm_state: fields.fetch('aasm_state'),
|
16
|
+
filename: fields.fetch('filename'),
|
17
|
+
content_type: fields.fetch('content_type'),
|
18
|
+
storage: primary_store
|
19
|
+
# checksum: fields.fetch('checksum'),
|
20
|
+
# created_at: fields.fetch('created_at'),
|
21
|
+
# updated_at: fields.fetch('updated_at')
|
22
|
+
)
|
23
|
+
|
24
|
+
properties = attachable.properties
|
25
|
+
properties['layers'].keys.each do |key|
|
26
|
+
layer = properties['layers'][key]
|
27
|
+
field_uploads = layer['fields'].select { |ss| ss['type'] == 'upload' }
|
28
|
+
field_uploads&.each do |upload|
|
29
|
+
idx = properties['layers'][key]['fields'].index(upload)
|
30
|
+
files = upload["value"] && upload["value"]["files"]
|
31
|
+
files&.each_with_index do |fi, fdx|
|
32
|
+
if properties['layers'][key]['fields'][idx]['value']['files'][fdx]['uid'] == fields.fetch('identifier')
|
33
|
+
properties['layers'][key]['fields'][idx]['value']['files'][fdx]['aid'] = attachment.id
|
34
|
+
properties['layers'][key]['fields'][idx]['value']['files'][fdx]['uid'] = attachment.identifier
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
attachable.update!(properties: properties)
|
40
|
+
attachment
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.import_datasets(data, instances, gt, current_user_id, &update_instances)
|
44
|
+
begin
|
45
|
+
data.fetch('Labimotion::Dataset', {}).each do |uuid, fields|
|
46
|
+
klass_id = fields['dataset_klass_id']
|
47
|
+
dk_obj = data.fetch('Labimotion::DatasetKlass', {})[klass_id]
|
48
|
+
dk_id = dk_obj['identifier']
|
49
|
+
element_uuid = fields.fetch('element_id')
|
50
|
+
element_type = fields.fetch('element_type')
|
51
|
+
element = instances.fetch(element_type).fetch(element_uuid)
|
52
|
+
|
53
|
+
dataset_klass = Labimotion::DatasetKlass.find_by(identifier: dk_id)
|
54
|
+
next if gt == true && dataset_klass.nil?
|
55
|
+
|
56
|
+
dkr = Labimotion::DatasetKlassesRevision.find_by(uuid: fields.fetch('klass_uuid'))
|
57
|
+
dataset_klass = dkr.dataset_klass if dataset_klass.nil? && dkr.present?
|
58
|
+
next if dataset_klass.nil? || dataset_klass.ols_term_id != dk_obj['ols_term_id']
|
59
|
+
|
60
|
+
dataset_klass = Labimotion::DatasetKlass.find_by(ols_term_id: dk_obj['ols_term_id']) if dataset_klass.nil?
|
61
|
+
next if dataset_klass.nil?
|
62
|
+
|
63
|
+
dataset = Labimotion::Dataset.create!(
|
64
|
+
fields.slice(
|
65
|
+
'properties', 'properties_release'
|
66
|
+
).merge(
|
67
|
+
## created_by: current_user_id,
|
68
|
+
element: element,
|
69
|
+
dataset_klass: dataset_klass,
|
70
|
+
uuid: SecureRandom.uuid,
|
71
|
+
klass_uuid: dkr&.uuid || dataset_klass.uuid
|
72
|
+
)
|
73
|
+
)
|
74
|
+
update_instances.call(uuid, dataset)
|
75
|
+
end
|
76
|
+
rescue StandardError => e
|
77
|
+
Rails.logger.error(e.backtrace)
|
78
|
+
raise
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.import_segments(data, instances, gt, current_user_id, &update_instances)
|
83
|
+
begin
|
84
|
+
data.fetch('Labimotion::Segment', {}).each do |uuid, fields|
|
85
|
+
klass_id = fields["segment_klass_id"]
|
86
|
+
sk_obj = data.fetch('Labimotion::SegmentKlass', {})[klass_id]
|
87
|
+
sk_id = sk_obj["identifier"]
|
88
|
+
ek_obj = data.fetch('Labimotion::ElementKlass').fetch(sk_obj["element_klass_id"])
|
89
|
+
element_klass = Labimotion::ElementKlass.find_by(name: ek_obj['name']) if ek_obj.present?
|
90
|
+
next if element_klass.nil? || ek_obj.nil? || ek_obj['is_generic'] == true
|
91
|
+
element_uuid = fields.fetch('element_id')
|
92
|
+
element_type = fields.fetch('element_type')
|
93
|
+
element = instances.fetch(element_type).fetch(element_uuid)
|
94
|
+
segment_klass = Labimotion::SegmentKlass.find_by(identifier: sk_id)
|
95
|
+
next if gt == true && segment_klass.nil?
|
96
|
+
|
97
|
+
skr = Labimotion::SegmentKlassesRevision.find_by(uuid: fields.fetch('klass_uuid'))
|
98
|
+
segment_klass = skr.segment_klass if segment_klass.nil? && skr.present?
|
99
|
+
|
100
|
+
# segment_klass = Labimotion::SegmentKlass.create!(sk_obj.slice(
|
101
|
+
# 'label',
|
102
|
+
# 'desc',
|
103
|
+
# 'properties_template',
|
104
|
+
# 'is_active',
|
105
|
+
# 'place',
|
106
|
+
# 'properties_release',
|
107
|
+
# 'uuid',
|
108
|
+
# 'identifier',
|
109
|
+
# 'sync_time'
|
110
|
+
# ).merge(
|
111
|
+
# element_klass: element_klass,
|
112
|
+
# created_by: current_user_id,
|
113
|
+
# released_at: DateTime.now
|
114
|
+
# )
|
115
|
+
# ) if segment_klass.nil?
|
116
|
+
|
117
|
+
next if segment_klass.nil?
|
118
|
+
|
119
|
+
segment = Labimotion::Segment.create!(
|
120
|
+
fields.slice(
|
121
|
+
'properties', 'properties_release'
|
122
|
+
).merge(
|
123
|
+
created_by: current_user_id,
|
124
|
+
element: element,
|
125
|
+
segment_klass: segment_klass,
|
126
|
+
uuid: SecureRandom.uuid,
|
127
|
+
klass_uuid: skr&.uuid || segment_klass.uuid
|
128
|
+
)
|
129
|
+
)
|
130
|
+
|
131
|
+
properties = segment.properties
|
132
|
+
properties['layers'].keys.each do |key|
|
133
|
+
layer = properties['layers'][key]
|
134
|
+
field_molecules = layer['fields'].select { |ss| ss['type'] == 'drag_molecule' }
|
135
|
+
field_molecules.each do |field|
|
136
|
+
idx = properties['layers'][key]['fields'].index(field)
|
137
|
+
id = field["value"] && field["value"]["el_id"] unless idx.nil?
|
138
|
+
mol = Molecule.find_or_create_by_molfile(data.fetch('Molecule')[id]['molfile']) unless id.nil?
|
139
|
+
unless mol.nil?
|
140
|
+
properties['layers'][key]['fields'][idx]['value']['el_id'] = mol.id
|
141
|
+
properties['layers'][key]['fields'][idx]['value']['el_tip'] = "#{mol.inchikey}@@#{mol.cano_smiles}"
|
142
|
+
properties['layers'][key]['fields'][idx]['value']['el_label'] = mol.iupac_name
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
field_tables = layer['fields'].select { |ss| ss['type'] == 'table' }
|
147
|
+
field_tables&.each do |field|
|
148
|
+
tidx = layer['fields'].index(field)
|
149
|
+
next unless field['sub_values'].present? && field['sub_fields'].present?
|
150
|
+
|
151
|
+
field_table_molecules = field['sub_fields'].select { |ss| ss['type'] == 'drag_molecule' }
|
152
|
+
if field_table_molecules.present?
|
153
|
+
col_ids = field_table_molecules.map { |x| x.values[0] }
|
154
|
+
col_ids.each do |col_id|
|
155
|
+
field['sub_values'].each_with_index do |sub_value, vdx|
|
156
|
+
next unless sub_value[col_id].present? && sub_value[col_id]['value'].present? && sub_value[col_id]['value']['el_id'].present?
|
157
|
+
|
158
|
+
svalue = sub_value[col_id]['value']
|
159
|
+
next unless svalue['el_id'].present? && svalue['el_inchikey'].present?
|
160
|
+
|
161
|
+
tmol = Molecule.find_or_create_by_molfile(data.fetch('Molecule')[svalue['el_id']]['molfile']) unless svalue['el_id'].nil?
|
162
|
+
unless tmol.nil?
|
163
|
+
properties['layers'][key]['fields'][tidx]['sub_values'][vdx][col_id]['value']['el_id'] = tmol.id
|
164
|
+
properties['layers'][key]['fields'][tidx]['sub_values'][vdx][col_id]['value']['el_tip'] = "#{tmol.inchikey}@@#{tmol.cano_smiles}"
|
165
|
+
properties['layers'][key]['fields'][tidx]['sub_values'][vdx][col_id]['value']['el_label'] = tmol.cano_smiles
|
166
|
+
properties['layers'][key]['fields'][tidx]['sub_values'][vdx][col_id]['value']['el_smiles'] = tmol.cano_smiles
|
167
|
+
properties['layers'][key]['fields'][tidx]['sub_values'][vdx][col_id]['value']['el_iupac'] = tmol.iupac_name
|
168
|
+
properties['layers'][key]['fields'][tidx]['sub_values'][vdx][col_id]['value']['el_inchikey'] = tmol.inchikey
|
169
|
+
properties['layers'][key]['fields'][tidx]['sub_values'][vdx][col_id]['value']['el_svg'] = File.join('/images', 'molecules', tmol.molecule_svg_file)
|
170
|
+
properties['layers'][key]['fields'][tidx]['sub_values'][vdx][col_id]['value']['el_molecular_weight'] = tmol.molecular_weight
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
segment.update!(properties: properties)
|
178
|
+
update_instances.call(uuid, segment)
|
179
|
+
end
|
180
|
+
rescue StandardError => e
|
181
|
+
Rails.logger.error(e.backtrace)
|
182
|
+
raise
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Labimotion
|
4
|
+
class Search
|
5
|
+
|
6
|
+
def self.unique_element_layers(id)
|
7
|
+
Labimotion::ElementKlass.where(id: id).select("jsonb_object_keys((properties_release->>'layers')::jsonb) as keys").map(&:keys).uniq
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.unique_segment_layers(id)
|
11
|
+
Labimotion::SegmentKlass.where(id: id).select("jsonb_object_keys((properties_release->>'layers')::jsonb) as keys").map(&:keys).uniq
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.elements_search(params, current_user, c_id, dl)
|
15
|
+
collection = Collection.belongs_to_or_shared_by(current_user.id, current_user.group_ids).find(c_id)
|
16
|
+
element_scope = Labimotion::Element.joins(:collections_elements).where('collections_elements.collection_id = ?', collection.id).joins(:element_klass).where('element_klasses.id = elements.element_klass_id AND element_klasses.name = ?', params[:selection][:genericElName])
|
17
|
+
element_scope = element_scope.where('elements.name like (?)', "%#{params[:selection][:searchName]}%") if params[:selection][:searchName].present?
|
18
|
+
element_scope = element_scope.where('elements.short_label like (?)', "%#{params[:selection][:searchShowLabel]}%") if params[:selection][:searchShowLabel].present?
|
19
|
+
if params[:selection][:searchProperties].present?
|
20
|
+
unique_layers = Labimotion::Search.unique_element_layers(params[:selection] && params[:selection][:genericKlassId])
|
21
|
+
params[:selection][:searchProperties] && params[:selection][:searchProperties][:layers] && params[:selection][:searchProperties][:layers].keys.each do |lk|
|
22
|
+
layer = params[:selection][:searchProperties][:layers][lk]
|
23
|
+
reg_layer = /^#{lk}$|(^#{lk}\.)/
|
24
|
+
uni_keys = unique_layers.select { |uni_key| uni_key.match(reg_layer) }
|
25
|
+
qs = layer[:fields].select { |f| f[:value].present? || f[:type] == 'input-group' }
|
26
|
+
qs.each do |f|
|
27
|
+
query_field = {}
|
28
|
+
if f[:type] == 'input-group'
|
29
|
+
sfs = f[:sub_fields].map { |e| { "id": e[:id], "value": e[:value] } }
|
30
|
+
query_field = { "fields": [{ "field": f[:field].to_s, "sub_fields": sfs }] } unless sfs.empty?
|
31
|
+
elsif %w[checkbox integer system-defined].include? f[:type]
|
32
|
+
query_field = { "fields": [{ "field": f[:field].to_s, "value": f[:value] }] }
|
33
|
+
elsif %w[drag_element drag_molecule drag_sample].include? f[:type]
|
34
|
+
vfs = { "el_label": f[:value] }
|
35
|
+
query_field = { "fields": [{ "field": f[:field].to_s, "value": vfs }] } unless f[:value].empty?
|
36
|
+
else
|
37
|
+
query_field = { "fields": [{ "field": f[:field].to_s, "value": f[:value].to_s }] }
|
38
|
+
end
|
39
|
+
next unless query_field.present?
|
40
|
+
|
41
|
+
sqls = []
|
42
|
+
uni_keys.select { |uni_key| uni_key.match(reg_layer) }.each do |e|
|
43
|
+
sql = ActiveRecord::Base.send(:sanitize_sql_array, ["(properties->'layers' @> ?)", { "#{e}": query_field }.to_json])
|
44
|
+
sqls = sqls.push(sql)
|
45
|
+
end
|
46
|
+
element_scope = element_scope.where(sqls.join(' OR '))
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
element_scope
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.segments_search(ids, type)
|
54
|
+
eids = ids
|
55
|
+
seg_scope = Labimotion::Segment.where(element_type: type, element_id: ids)
|
56
|
+
if params[:selection][:segSearchProperties].present? && params[:selection][:segSearchProperties].length > 0
|
57
|
+
params[:selection][:segSearchProperties].each do |segmentSearch|
|
58
|
+
has_params = false
|
59
|
+
next unless segmentSearch[:id].present? && segmentSearch[:searchProperties].present? && segmentSearch[:searchProperties][:layers].present?
|
60
|
+
unique_layers = Labimotion::Search.unique_segment_layers(segmentSearch[:id])
|
61
|
+
segmentSearch[:searchProperties] && segmentSearch[:searchProperties][:layers] && segmentSearch[:searchProperties][:layers].keys.each do |lk|
|
62
|
+
layer = segmentSearch[:searchProperties][:layers][lk]
|
63
|
+
reg_layer = /^#{lk}$|(^#{lk}\.)/
|
64
|
+
uni_keys = unique_layers.select { |uni_key| uni_key.match(reg_layer) }
|
65
|
+
qs = layer[:fields].select { |f| f[:value].present? || f[:type] == 'input-group' }
|
66
|
+
qs.each do |f|
|
67
|
+
query_field = {}
|
68
|
+
if f[:type] == 'input-group'
|
69
|
+
sfs = f[:sub_fields].map { |e| { "id": e[:id], "value": e[:value] } }
|
70
|
+
query_field = { "fields": [{ "field": f[:field].to_s, "sub_fields": sfs }] } unless sfs.empty?
|
71
|
+
elsif %w[checkbox integer system-defined].include? f[:type]
|
72
|
+
query_field = { "fields": [{ "field": f[:field].to_s, "value": f[:value] }] }
|
73
|
+
elsif %w[drag_element drag_molecule drag_sample].include? f[:type]
|
74
|
+
vfs = { "el_label": f[:value] }
|
75
|
+
query_field = { "fields": [{ "field": f[:field].to_s, "value": vfs }] } unless f[:value].empty?
|
76
|
+
else
|
77
|
+
query_field = { "fields": [{ "field": f[:field].to_s, "value": f[:value].to_s }] }
|
78
|
+
end
|
79
|
+
next unless query_field.present?
|
80
|
+
|
81
|
+
has_params = true
|
82
|
+
|
83
|
+
sqls = []
|
84
|
+
uni_keys.select { |uni_key| uni_key.match(reg_layer) }.each do |e|
|
85
|
+
sql = ActiveRecord::Base.send(:sanitize_sql_array, ["(properties->'layers' @> ?)", { "#{e}": query_field }.to_json])
|
86
|
+
sqls = sqls.push(sql)
|
87
|
+
end
|
88
|
+
seg_scope = seg_scope.where(sqls.join(' OR '))
|
89
|
+
end
|
90
|
+
end
|
91
|
+
eids = (seg_scope.pluck(:element_id)) & eids if has_params == true
|
92
|
+
end
|
93
|
+
end
|
94
|
+
type.classify.constantize.where(id: eids)
|
95
|
+
end
|
96
|
+
|
97
|
+
def self.samples_search(c_id = @c_id)
|
98
|
+
sqls = []
|
99
|
+
sps = params[:selection][:searchProperties]
|
100
|
+
collection = Collection.belongs_to_or_shared_by(current_user.id, current_user.group_ids).find(c_id)
|
101
|
+
element_scope = Sample.joins(:collections_samples).where('collections_samples.collection_id = ?', collection.id)
|
102
|
+
return element_scope if sps.empty?
|
103
|
+
|
104
|
+
sps[:propCk].keys.each { |k| sqls.push(ActiveRecord::Base.send(:sanitize_sql_array, ["#{k} = (?)", sps[:propCk][k]])) if Sample.column_names.include?(k) } if sps[:propCk].present?
|
105
|
+
sps[:stereo].keys.each { |k| sqls.push(ActiveRecord::Base.send(:sanitize_sql_array, ['(stereo->> ? = ?)', k, sps[:stereo][k]])) } if sps[:stereo].present?
|
106
|
+
sps[:propTx].keys.each { |k| sqls = sqls.push(ActiveRecord::Base.send(:sanitize_sql, "#{k} like ('%#{sps[:propTx][k]}%')")) if Sample.column_names.include?(k) } if sps[:propTx].present?
|
107
|
+
element_scope = element_scope.where(sqls.join(' AND '))
|
108
|
+
element_scope
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Labimotion
|
4
|
+
class Serializer
|
5
|
+
def self.set_table(field, field_table_objs, obj)
|
6
|
+
col_ids = field_table_objs.map { |x| x.values[0] }
|
7
|
+
col_ids.each do |col_id|
|
8
|
+
field['sub_values'].each do |sub_value|
|
9
|
+
next unless sub_value[col_id].present? && sub_value[col_id]['value'].present? && sub_value[col_id]['value']['el_id'].present?
|
10
|
+
|
11
|
+
find_obj = obj.constantize.find_by(id: sub_value[col_id]['value']['el_id'])
|
12
|
+
next unless find_obj.present?
|
13
|
+
|
14
|
+
case obj
|
15
|
+
when 'Molecule'
|
16
|
+
sub_value[col_id]['value']['el_svg'] = File.join('/images', 'molecules', find_obj.molecule_svg_file)
|
17
|
+
sub_value[col_id]['value']['el_inchikey'] = find_obj.inchikey
|
18
|
+
sub_value[col_id]['value']['el_smiles'] = find_obj.cano_smiles
|
19
|
+
sub_value[col_id]['value']['el_iupac'] = find_obj.iupac_name
|
20
|
+
sub_value[col_id]['value']['el_molecular_weight'] = find_obj.molecular_weight
|
21
|
+
when 'Sample'
|
22
|
+
sub_value[col_id]['value']['el_svg'] = find_obj.get_svg_path
|
23
|
+
sub_value[col_id]['value']['el_label'] = find_obj.short_label
|
24
|
+
sub_value[col_id]['value']['el_short_label'] = find_obj.short_label
|
25
|
+
sub_value[col_id]['value']['el_name'] = find_obj.name
|
26
|
+
sub_value[col_id]['value']['el_external_label'] = find_obj.external_label
|
27
|
+
sub_value[col_id]['value']['el_molecular_weight'] = find_obj.decoupled ? find_obj.molecular_mass : find_obj.molecule.molecular_weight
|
28
|
+
sub_value[col_id]['value']['el_decoupled'] = find_obj.decoupled
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
field
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.element_properties(object)
|
36
|
+
object.properties['layers']&.keys.each do |key|
|
37
|
+
# layer = object.properties[key]
|
38
|
+
field_sample_molecules = object.properties['layers'][key]['fields'].select { |ss| %w[drag_sample drag_element drag_element].include?(ss['type']) }
|
39
|
+
field_sample_molecules.each do |field|
|
40
|
+
idx = object.properties['layers'][key]['fields'].index(field)
|
41
|
+
sid = field.dig('value') != '' && field.dig('value', 'el_id')
|
42
|
+
next unless sid.present?
|
43
|
+
|
44
|
+
case field['type']
|
45
|
+
when 'drag_sample'
|
46
|
+
el = Sample.find_by(id: sid)
|
47
|
+
when 'drag_molecule'
|
48
|
+
el = Molecule.find_by(id: sid)
|
49
|
+
when 'drag_element'
|
50
|
+
el = Labimotion::Element.find_by(id: sid)
|
51
|
+
end
|
52
|
+
next unless el.present?
|
53
|
+
next unless object.properties.dig('layers', key, 'fields', idx, 'value').present?
|
54
|
+
|
55
|
+
object.properties['layers'][key]['fields'][idx]['value']['el_label'] = el.short_label if %w[drag_sample drag_element].include?(field['type'])
|
56
|
+
object.properties['layers'][key]['fields'][idx]['value']['el_tip'] = el.short_label if %w[drag_sample].include?(field['type'])
|
57
|
+
object.properties['layers'][key]['fields'][idx]['value']['el_tip'] = "#{el.element_klass&.label}@@#{el.name}" if %w[drag_element].include?(field['type'])
|
58
|
+
object.properties['layers'][key]['fields'][idx]['value']['icon_name'] = el.element_klass&.icon_name || '' if %w[drag_element].include?(field['type'])
|
59
|
+
object.properties['layers'][key]['fields'][idx]['value']['el_svg'] = field['type'] == 'drag_sample' ? el.get_svg_path : File.join('/images', 'molecules', el.molecule_svg_file) if %w[drag_sample drag_molecule].include?(field['type'])
|
60
|
+
object.properties['layers'][key]['fields'][idx]['value']['el_decoupled'] = el.decoupled if %w[drag_sample].include?(field['type'])
|
61
|
+
end
|
62
|
+
|
63
|
+
field_tables = object.properties['layers'][key]['fields'].select { |ss| ss['type'] == 'table' }
|
64
|
+
field_tables.each do |field|
|
65
|
+
idx = object.properties['layers'][key]['fields'].index(field)
|
66
|
+
next unless field['sub_values'].present? && field['sub_fields'].present?
|
67
|
+
|
68
|
+
field_table_molecules = field['sub_fields'].select { |ss| ss['type'] == 'drag_molecule' }
|
69
|
+
object.properties['layers'][key]['fields'][idx] = set_table(field, field_table_molecules, 'Molecule') if field_table_molecules.present?
|
70
|
+
|
71
|
+
field_table_samples = field['sub_fields'].select { |ss| ss['type'] == 'drag_sample' }
|
72
|
+
object.properties['layers'][key]['fields'][idx] = set_table(field, field_table_samples, 'Sample') if field_table_samples.present?
|
73
|
+
end
|
74
|
+
end
|
75
|
+
object.properties
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
data/lib/labimotion.rb
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
# In your_gem_name.rb or main Ruby file
|
2
|
+
module Labimotion
|
3
|
+
|
4
|
+
autoload :VERSION, 'labimotion/version'
|
5
|
+
|
6
|
+
def self.logger
|
7
|
+
@@labimotion_logger ||= Logger.new(Rails.root.join('log/labimotion.log')) # rubocop:disable Style/ClassVars
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.log_exception(exception, current_user = {})
|
11
|
+
Labimotion.logger.error("version: #{Labimotion::VERSION}; #{Labimotion::IS_RAILS5}, (#{current_user&.id}) \n Exception: #{exception.message}")
|
12
|
+
Labimotion.logger.error(exception.backtrace.join("\n"))
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
######## APIs
|
17
|
+
autoload :GenericElementAPI, 'labimotion/apis/generic_element_api'
|
18
|
+
autoload :GenericDatasetAPI, 'labimotion/apis/generic_dataset_api'
|
19
|
+
autoload :SegmentAPI, 'labimotion/apis/segment_api'
|
20
|
+
autoload :LabimotionHubAPI, 'labimotion/apis/labimotion_hub_api'
|
21
|
+
autoload :ConverterAPI, 'labimotion/apis/converter_api'
|
22
|
+
|
23
|
+
######## Entities
|
24
|
+
autoload :ElementEntity, 'labimotion/entities/element_entity'
|
25
|
+
autoload :ElnElementEntity, 'labimotion/entities/eln_element_entity'
|
26
|
+
|
27
|
+
autoload :SegmentEntity, 'labimotion/entities/segment_entity'
|
28
|
+
autoload :DatasetEntity, 'labimotion/entities/dataset_entity'
|
29
|
+
|
30
|
+
autoload :GenericKlassEntity, 'labimotion/entities/generic_klass_entity'
|
31
|
+
autoload :ElementKlassEntity, 'labimotion/entities/element_klass_entity'
|
32
|
+
autoload :SegmentKlassEntity, 'labimotion/entities/segment_klass_entity'
|
33
|
+
autoload :DatasetKlassEntity, 'labimotion/entities/dataset_klass_entity'
|
34
|
+
|
35
|
+
autoload :GenericEntity, 'labimotion/entities/generic_entity'
|
36
|
+
autoload :GenericPublicEntity, 'labimotion/entities/generic_public_entity'
|
37
|
+
autoload :KlassRevisionEntity, 'labimotion/entities/klass_revision_entity'
|
38
|
+
autoload :ElementRevisionEntity, 'labimotion/entities/element_revision_entity'
|
39
|
+
autoload :SegmentRevisionEntity, 'labimotion/entities/segment_revision_entity'
|
40
|
+
## autoload :DatasetRevisionEntity, 'labimotion/entities/dataset_revision_entity'
|
41
|
+
|
42
|
+
######## Helpers
|
43
|
+
autoload :GenericHelpers, 'labimotion/helpers/generic_helpers'
|
44
|
+
autoload :ElementHelpers, 'labimotion/helpers/element_helpers'
|
45
|
+
autoload :SegmentHelpers, 'labimotion/helpers/segment_helpers'
|
46
|
+
autoload :DatasetHelpers, 'labimotion/helpers/dataset_helpers'
|
47
|
+
autoload :SearchHelpers, 'labimotion/helpers/search_helpers'
|
48
|
+
autoload :ConverterHelpers, 'labimotion/helpers/converter_helpers'
|
49
|
+
autoload :SampleAssociationHelpers, 'labimotion/helpers/sample_association_helpers'
|
50
|
+
autoload :RepositoryHelpers, 'labimotion/helpers/repository_helpers'
|
51
|
+
|
52
|
+
######## Libs
|
53
|
+
autoload :Converter, 'labimotion/libs/converter'
|
54
|
+
autoload :NmrMapper, 'labimotion/libs/nmr_mapper'
|
55
|
+
autoload :NmrMapperRepo, 'labimotion/libs/nmr_mapper_repo' ## for Chemotion Repository
|
56
|
+
autoload :TemplateHub, 'labimotion/libs/template_hub'
|
57
|
+
autoload :ExportDataset, 'labimotion/libs/export_dataset'
|
58
|
+
|
59
|
+
######## Utils
|
60
|
+
autoload :ConState, 'labimotion/utils/con_state'
|
61
|
+
autoload :Serializer, 'labimotion/utils/serializer'
|
62
|
+
autoload :Search, 'labimotion/utils/search'
|
63
|
+
autoload :Export, 'labimotion/utils/export'
|
64
|
+
autoload :Import, 'labimotion/utils/import'
|
65
|
+
|
66
|
+
######## Models
|
67
|
+
autoload :Element, 'labimotion/models/element'
|
68
|
+
autoload :Segment, 'labimotion/models/segment'
|
69
|
+
autoload :Dataset, 'labimotion/models/dataset'
|
70
|
+
|
71
|
+
autoload :ElementKlass, 'labimotion/models/element_klass'
|
72
|
+
autoload :SegmentKlass, 'labimotion/models/segment_klass'
|
73
|
+
autoload :DatasetKlass, 'labimotion/models/dataset_klass'
|
74
|
+
|
75
|
+
autoload :ElementsRevision, 'labimotion/models/elements_revision'
|
76
|
+
autoload :SegmentsRevision, 'labimotion/models/segments_revision'
|
77
|
+
autoload :DatasetsRevision, 'labimotion/models/datasets_revision'
|
78
|
+
|
79
|
+
autoload :ElementKlassesRevision, 'labimotion/models/element_klasses_revision'
|
80
|
+
autoload :SegmentKlassesRevision, 'labimotion/models/segment_klasses_revision'
|
81
|
+
autoload :DatasetKlassesRevision, 'labimotion/models/dataset_klasses_revision'
|
82
|
+
|
83
|
+
autoload :ElementsSample, 'labimotion/models/elements_sample'
|
84
|
+
autoload :ElementsElement, 'labimotion/models/elements_element'
|
85
|
+
autoload :CollectionsElement, 'labimotion/models/collections_element'
|
86
|
+
|
87
|
+
######## Models/Concerns
|
88
|
+
autoload :GenericKlassRevisions, 'labimotion/models/concerns/generic_klass_revisions'
|
89
|
+
autoload :GenericRevisions, 'labimotion/models/concerns/generic_revisions'
|
90
|
+
autoload :Segmentable, 'labimotion/models/concerns/segmentable'
|
91
|
+
autoload :Datasetable, 'labimotion/models/concerns/datasetable'
|
92
|
+
autoload :AttachmentConverter, 'labimotion/models/concerns/attachment_converter.rb'
|
93
|
+
|
94
|
+
|
95
|
+
end
|
metadata
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: labimotion
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.6
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Chia-Lin Lin
|
8
|
+
- Pei-Chi Huang
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2023-08-13 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rails
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 5.2.0
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 5.2.0
|
28
|
+
description:
|
29
|
+
email:
|
30
|
+
- chia-lin.lin@kit.edu
|
31
|
+
- pei-chi.huang@kit.edu
|
32
|
+
executables: []
|
33
|
+
extensions: []
|
34
|
+
extra_rdoc_files: []
|
35
|
+
files:
|
36
|
+
- lib/labimotion.rb
|
37
|
+
- lib/labimotion/api.rb
|
38
|
+
- lib/labimotion/apis/converter_api.rb
|
39
|
+
- lib/labimotion/apis/generic_dataset_api.rb
|
40
|
+
- lib/labimotion/apis/generic_element_api.rb
|
41
|
+
- lib/labimotion/apis/labimotion_hub_api.rb
|
42
|
+
- lib/labimotion/apis/segment_api.rb
|
43
|
+
- lib/labimotion/entities/application_entity.rb
|
44
|
+
- lib/labimotion/entities/dataset_entity.rb
|
45
|
+
- lib/labimotion/entities/dataset_klass_entity.rb
|
46
|
+
- lib/labimotion/entities/element_entity.rb
|
47
|
+
- lib/labimotion/entities/element_klass_entity.rb
|
48
|
+
- lib/labimotion/entities/element_revision_entity.rb
|
49
|
+
- lib/labimotion/entities/eln_element_entity.rb
|
50
|
+
- lib/labimotion/entities/generic_entity.rb
|
51
|
+
- lib/labimotion/entities/generic_klass_entity.rb
|
52
|
+
- lib/labimotion/entities/generic_public_entity.rb
|
53
|
+
- lib/labimotion/entities/klass_revision_entity.rb
|
54
|
+
- lib/labimotion/entities/segment_entity.rb
|
55
|
+
- lib/labimotion/entities/segment_klass_entity.rb
|
56
|
+
- lib/labimotion/entities/segment_revision_entity.rb
|
57
|
+
- lib/labimotion/helpers/converter_helpers.rb
|
58
|
+
- lib/labimotion/helpers/dataset_helpers.rb
|
59
|
+
- lib/labimotion/helpers/element_helpers.rb
|
60
|
+
- lib/labimotion/helpers/generic_helpers.rb
|
61
|
+
- lib/labimotion/helpers/repository_helpers.rb
|
62
|
+
- lib/labimotion/helpers/sample_association_helpers.rb
|
63
|
+
- lib/labimotion/helpers/search_helpers.rb
|
64
|
+
- lib/labimotion/helpers/segment_helpers.rb
|
65
|
+
- lib/labimotion/libs/converter.rb
|
66
|
+
- lib/labimotion/libs/export_dataset.rb
|
67
|
+
- lib/labimotion/libs/nmr_mapper.rb
|
68
|
+
- lib/labimotion/libs/nmr_mapper_repo.rb
|
69
|
+
- lib/labimotion/libs/template_hub.rb
|
70
|
+
- lib/labimotion/models/collections_element.rb
|
71
|
+
- lib/labimotion/models/concerns/attachment_converter.rb
|
72
|
+
- lib/labimotion/models/concerns/datasetable.rb
|
73
|
+
- lib/labimotion/models/concerns/generic_klass_revisions.rb
|
74
|
+
- lib/labimotion/models/concerns/generic_revisions.rb
|
75
|
+
- lib/labimotion/models/concerns/segmentable.rb
|
76
|
+
- lib/labimotion/models/dataset.rb
|
77
|
+
- lib/labimotion/models/dataset_klass.rb
|
78
|
+
- lib/labimotion/models/dataset_klasses_revision.rb
|
79
|
+
- lib/labimotion/models/datasets_revision.rb
|
80
|
+
- lib/labimotion/models/element.rb
|
81
|
+
- lib/labimotion/models/element_klass.rb
|
82
|
+
- lib/labimotion/models/element_klasses_revision.rb
|
83
|
+
- lib/labimotion/models/elements_element.rb
|
84
|
+
- lib/labimotion/models/elements_revision.rb
|
85
|
+
- lib/labimotion/models/elements_sample.rb
|
86
|
+
- lib/labimotion/models/segment.rb
|
87
|
+
- lib/labimotion/models/segment_klass.rb
|
88
|
+
- lib/labimotion/models/segment_klasses_revision.rb
|
89
|
+
- lib/labimotion/models/segments_revision.rb
|
90
|
+
- lib/labimotion/utils/con_state.rb
|
91
|
+
- lib/labimotion/utils/export.rb
|
92
|
+
- lib/labimotion/utils/import.rb
|
93
|
+
- lib/labimotion/utils/search.rb
|
94
|
+
- lib/labimotion/utils/serializer.rb
|
95
|
+
- lib/labimotion/version.rb
|
96
|
+
homepage: https://github.com/phuang26/labimotion
|
97
|
+
licenses:
|
98
|
+
- MIT
|
99
|
+
metadata: {}
|
100
|
+
post_install_message:
|
101
|
+
rdoc_options: []
|
102
|
+
require_paths:
|
103
|
+
- lib
|
104
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - ">="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '0'
|
114
|
+
requirements: []
|
115
|
+
rubygems_version: 3.0.9
|
116
|
+
signing_key:
|
117
|
+
specification_version: 4
|
118
|
+
summary: Chemotion LabIMotion
|
119
|
+
test_files: []
|