labimotion 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +7 -0
  2. data/lib/labimotion/api.rb +19 -0
  3. data/lib/labimotion/apis/converter_api.rb +68 -0
  4. data/lib/labimotion/apis/generic_dataset_api.rb +50 -0
  5. data/lib/labimotion/apis/generic_element_api.rb +339 -0
  6. data/lib/labimotion/apis/labimotion_hub_api.rb +53 -0
  7. data/lib/labimotion/apis/segment_api.rb +144 -0
  8. data/lib/labimotion/entities/application_entity.rb +88 -0
  9. data/lib/labimotion/entities/dataset_entity.rb +16 -0
  10. data/lib/labimotion/entities/dataset_klass_entity.rb +9 -0
  11. data/lib/labimotion/entities/element_entity.rb +108 -0
  12. data/lib/labimotion/entities/element_klass_entity.rb +10 -0
  13. data/lib/labimotion/entities/element_revision_entity.rb +57 -0
  14. data/lib/labimotion/entities/eln_element_entity.rb +110 -0
  15. data/lib/labimotion/entities/generic_entity.rb +54 -0
  16. data/lib/labimotion/entities/generic_klass_entity.rb +14 -0
  17. data/lib/labimotion/entities/generic_public_entity.rb +25 -0
  18. data/lib/labimotion/entities/klass_revision_entity.rb +20 -0
  19. data/lib/labimotion/entities/segment_entity.rb +62 -0
  20. data/lib/labimotion/entities/segment_klass_entity.rb +8 -0
  21. data/lib/labimotion/entities/segment_revision_entity.rb +55 -0
  22. data/lib/labimotion/helpers/converter_helpers.rb +13 -0
  23. data/lib/labimotion/helpers/dataset_helpers.rb +38 -0
  24. data/lib/labimotion/helpers/element_helpers.rb +268 -0
  25. data/lib/labimotion/helpers/generic_helpers.rb +252 -0
  26. data/lib/labimotion/helpers/repository_helpers.rb +14 -0
  27. data/lib/labimotion/helpers/sample_association_helpers.rb +126 -0
  28. data/lib/labimotion/helpers/search_helpers.rb +62 -0
  29. data/lib/labimotion/helpers/segment_helpers.rb +97 -0
  30. data/lib/labimotion/libs/converter.rb +325 -0
  31. data/lib/labimotion/libs/export_dataset.rb +121 -0
  32. data/lib/labimotion/libs/nmr_mapper.rb +265 -0
  33. data/lib/labimotion/libs/nmr_mapper_repo.rb +263 -0
  34. data/lib/labimotion/libs/template_hub.rb +55 -0
  35. data/lib/labimotion/models/collections_element.rb +42 -0
  36. data/lib/labimotion/models/concerns/attachment_converter.rb +42 -0
  37. data/lib/labimotion/models/concerns/datasetable.rb +50 -0
  38. data/lib/labimotion/models/concerns/generic_klass_revisions.rb +39 -0
  39. data/lib/labimotion/models/concerns/generic_revisions.rb +43 -0
  40. data/lib/labimotion/models/concerns/segmentable.rb +74 -0
  41. data/lib/labimotion/models/dataset.rb +14 -0
  42. data/lib/labimotion/models/dataset_klass.rb +25 -0
  43. data/lib/labimotion/models/dataset_klasses_revision.rb +9 -0
  44. data/lib/labimotion/models/datasets_revision.rb +9 -0
  45. data/lib/labimotion/models/element.rb +121 -0
  46. data/lib/labimotion/models/element_klass.rb +25 -0
  47. data/lib/labimotion/models/element_klasses_revision.rb +9 -0
  48. data/lib/labimotion/models/elements_element.rb +11 -0
  49. data/lib/labimotion/models/elements_revision.rb +8 -0
  50. data/lib/labimotion/models/elements_sample.rb +11 -0
  51. data/lib/labimotion/models/segment.rb +14 -0
  52. data/lib/labimotion/models/segment_klass.rb +24 -0
  53. data/lib/labimotion/models/segment_klasses_revision.rb +9 -0
  54. data/lib/labimotion/models/segments_revision.rb +9 -0
  55. data/lib/labimotion/utils/con_state.rb +13 -0
  56. data/lib/labimotion/utils/export.rb +112 -0
  57. data/lib/labimotion/utils/import.rb +186 -0
  58. data/lib/labimotion/utils/search.rb +112 -0
  59. data/lib/labimotion/utils/serializer.rb +78 -0
  60. data/lib/labimotion/version.rb +6 -0
  61. data/lib/labimotion.rb +95 -0
  62. 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
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Labimotion
4
+ VERSION = '0.1.6'
5
+ IS_RAILS5 = true
6
+ 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: []