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,88 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
module Labimotion
|
4
|
+
## ApplicationEntity
|
5
|
+
class ApplicationEntity < Grape::Entity
|
6
|
+
CUSTOM_ENTITY_OPTIONS = %i[anonymize_below anonymize_with].freeze
|
7
|
+
|
8
|
+
format_with(:eln_timestamp) do |datetime|
|
9
|
+
datetime.present? ? datetime&.strftime('%Y-%m-%d %H:%M:%S %Z') : nil
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.expose!(*args)
|
13
|
+
fields = args.first
|
14
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
15
|
+
options = merge_options(options) # merges additional params set in #with_options
|
16
|
+
expose_fields_with_anonymization!(fields, options)
|
17
|
+
end
|
18
|
+
|
19
|
+
# rubocop:disable Metrics/MethodLength
|
20
|
+
def self.expose_fields_with_anonymization!(fields, options)
|
21
|
+
anonymize_below = options[:anonymize_below] || 0
|
22
|
+
anonymize_with = options.key?(:anonymize_with) ? options[:anonymize_with] : '***'
|
23
|
+
|
24
|
+
Array(fields).each do |field|
|
25
|
+
expose(field, options) do |represented_object, _options|
|
26
|
+
if detail_levels[represented_object.class] < anonymize_below
|
27
|
+
anonymize_with
|
28
|
+
elsif respond_to?(field, true) # Entity has a method with the same name
|
29
|
+
send(field)
|
30
|
+
elsif represented_object.respond_to?(field)
|
31
|
+
represented_object.public_send(field)
|
32
|
+
else
|
33
|
+
represented_object[field] # works both for AR and Hash objects
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
private_class_method :expose_fields_with_anonymization!
|
39
|
+
# rubocop:enable Metrics/MethodLength
|
40
|
+
|
41
|
+
def self.expose_timestamps(timestamp_fields: %i[created_at updated_at], **additional_args)
|
42
|
+
timestamp_fields.each do |field|
|
43
|
+
expose field, format_with: :eln_timestamp, **additional_args
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# overridden method from Grape::Entity to support our custom anonymization options
|
48
|
+
# https://github.com/ruby-grape/grape-entity/blob/v0.7.1/lib/grape_entity/entity.rb#L565
|
49
|
+
def self.valid_options(options)
|
50
|
+
options.each_key do |key|
|
51
|
+
next if OPTIONS.include?(key) || CUSTOM_ENTITY_OPTIONS.include?(key)
|
52
|
+
|
53
|
+
raise ArgumentError, "#{key.inspect} is not a valid option."
|
54
|
+
end
|
55
|
+
|
56
|
+
options[:using] = options.delete(:with) if options.key?(:with)
|
57
|
+
options
|
58
|
+
end
|
59
|
+
private_class_method :valid_options
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def displayed_in_list?
|
64
|
+
options[:displayed_in_list] == true
|
65
|
+
end
|
66
|
+
|
67
|
+
def current_user
|
68
|
+
unless options[:current_user]
|
69
|
+
raise MissingCurrentUserError, "#{self.class} requires a current user to work properly"
|
70
|
+
end
|
71
|
+
|
72
|
+
options[:current_user]
|
73
|
+
end
|
74
|
+
|
75
|
+
def detail_levels
|
76
|
+
maximal_default_levels = Hash.new(10) # every requested detail level will be returned as 10
|
77
|
+
minimal_default_levels = Hash.new(0) # every requested detail level will be returned as 0
|
78
|
+
return maximal_default_levels if !options.key?(:detail_levels) || options[:detail_levels].empty?
|
79
|
+
|
80
|
+
# When explicitly configured detail levels are available, we want to return only those and all other
|
81
|
+
# requests (by using `detail_levels[SomeUnconfiguredModel]`) should return the minimum detail level
|
82
|
+
minimal_default_levels.merge(options[:detail_levels])
|
83
|
+
end
|
84
|
+
|
85
|
+
class MissingCurrentUserError < StandardError
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
require 'labimotion/entities/application_entity'
|
4
|
+
module Labimotion
|
5
|
+
# Dataset entity
|
6
|
+
class DatasetEntity < ApplicationEntity
|
7
|
+
expose :id, :dataset_klass_id, :properties, :properties_release, :element_id, :element_type, :klass_ols, :klass_label, :klass_uuid
|
8
|
+
def klass_ols
|
9
|
+
object&.dataset_klass&.ols_term_id
|
10
|
+
end
|
11
|
+
|
12
|
+
def klass_label
|
13
|
+
object&.dataset_klass&.label
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'labimotion/entities/application_entity'
|
4
|
+
## TODO: Refactor labimotion to use the same entities as chemotion
|
5
|
+
module Labimotion
|
6
|
+
class ElementEntity < ApplicationEntity
|
7
|
+
with_options(anonymize_below: 0) do
|
8
|
+
expose! :can_copy
|
9
|
+
expose! :container, using: 'Entities::ContainerEntity'
|
10
|
+
expose! :created_by
|
11
|
+
expose! :id
|
12
|
+
expose! :is_restricted
|
13
|
+
expose! :klass_uuid
|
14
|
+
expose! :name
|
15
|
+
expose! :properties
|
16
|
+
expose! :properties_release
|
17
|
+
expose! :short_label
|
18
|
+
expose! :type
|
19
|
+
expose! :uuid
|
20
|
+
end
|
21
|
+
|
22
|
+
with_options(anonymize_below: 10) do
|
23
|
+
expose! :element_klass, anonymize_with: nil, using: 'Labimotion::ElementKlassEntity'
|
24
|
+
expose! :segments, anonymize_with: [], using: 'Labimotion::SegmentEntity'
|
25
|
+
expose! :tag, anonymize_with: nil, using: 'Entities::ElementTagEntity'
|
26
|
+
end
|
27
|
+
|
28
|
+
expose_timestamps
|
29
|
+
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def is_restricted
|
34
|
+
detail_levels[Labimotion::Element] < 10
|
35
|
+
end
|
36
|
+
|
37
|
+
# TODO: Refactor this method to something more readable/understandable
|
38
|
+
def properties
|
39
|
+
(object.properties['layers']&.keys || []).each do |key|
|
40
|
+
# layer = object.properties[key]
|
41
|
+
field_sample_molecules = object.properties['layers'][key]['fields'].select { |ss| ss['type'] == 'drag_sample' || ss['type'] == 'drag_molecule' }
|
42
|
+
field_sample_molecules.each do |field|
|
43
|
+
idx = object.properties['layers'][key]['fields'].index(field)
|
44
|
+
sid = field.dig('value', 'el_id')
|
45
|
+
next unless sid.present?
|
46
|
+
|
47
|
+
el = field['type'] == 'drag_sample' ? Sample.find_by(id: sid) : Molecule.find_by(id: sid)
|
48
|
+
next unless el.present?
|
49
|
+
next unless object.properties.dig('layers', key, 'fields', idx, 'value').present?
|
50
|
+
|
51
|
+
object.properties['layers'][key]['fields'][idx]['value']['el_label'] = el.short_label if field['type'] == 'drag_sample'
|
52
|
+
object.properties['layers'][key]['fields'][idx]['value']['el_tip'] = el.short_label if field['type'] == 'drag_sample'
|
53
|
+
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)
|
54
|
+
end
|
55
|
+
|
56
|
+
field_tables = object.properties['layers'][key]['fields'].select { |ss| ss['type'] == 'table' }
|
57
|
+
field_tables.each do |field|
|
58
|
+
idx = object.properties['layers'][key]['fields'].index(field)
|
59
|
+
next unless field['sub_values'].present? && field['sub_fields'].present?
|
60
|
+
|
61
|
+
field_table_molecules = field['sub_fields'].select { |ss| ss['type'] == 'drag_molecule' }
|
62
|
+
object.properties['layers'][key]['fields'][idx] = set_table(field, field_table_molecules, 'Molecule') if field_table_molecules.present?
|
63
|
+
|
64
|
+
field_table_samples = field['sub_fields'].select { |ss| ss['type'] == 'drag_sample' }
|
65
|
+
object.properties['layers'][key]['fields'][idx] = set_table(field, field_table_samples, 'Sample') if field_table_samples.present?
|
66
|
+
end
|
67
|
+
end
|
68
|
+
object.properties
|
69
|
+
end
|
70
|
+
|
71
|
+
def type
|
72
|
+
object.element_klass.name # 'genericEl' #object.type
|
73
|
+
end
|
74
|
+
|
75
|
+
def set_table(field, field_table_objs, obj)
|
76
|
+
col_ids = field_table_objs.map { |x| x.values[0] }
|
77
|
+
col_ids.each do |col_id|
|
78
|
+
field['sub_values'].each do |sub_value|
|
79
|
+
next unless sub_value[col_id].present? && sub_value[col_id]['value'].present? && sub_value[col_id]['value']['el_id'].present?
|
80
|
+
|
81
|
+
find_obj = obj.constantize.find_by(id: sub_value[col_id]['value']['el_id'])
|
82
|
+
next unless find_obj.present?
|
83
|
+
|
84
|
+
case obj
|
85
|
+
when 'Molecule'
|
86
|
+
sub_value[col_id]['value']['el_svg'] = File.join('/images', 'molecules', find_obj.molecule_svg_file)
|
87
|
+
sub_value[col_id]['value']['el_inchikey'] = find_obj.inchikey
|
88
|
+
sub_value[col_id]['value']['el_smiles'] = find_obj.cano_smiles
|
89
|
+
sub_value[col_id]['value']['el_iupac'] = find_obj.iupac_name
|
90
|
+
sub_value[col_id]['value']['el_molecular_weight'] = find_obj.molecular_weight
|
91
|
+
when 'Sample'
|
92
|
+
sub_value[col_id]['value']['el_svg'] = find_obj.get_svg_path
|
93
|
+
sub_value[col_id]['value']['el_label'] = find_obj.short_label
|
94
|
+
sub_value[col_id]['value']['el_short_label'] = find_obj.short_label
|
95
|
+
sub_value[col_id]['value']['el_name'] = find_obj.name
|
96
|
+
sub_value[col_id]['value']['el_external_label'] = find_obj.external_label
|
97
|
+
sub_value[col_id]['value']['el_molecular_weight'] = find_obj.decoupled ? find_obj.molecular_mass : find_obj.molecule.molecular_weight
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
field
|
102
|
+
end
|
103
|
+
|
104
|
+
def can_copy
|
105
|
+
true
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'labimotion/entities/application_entity'
|
4
|
+
module Labimotion
|
5
|
+
# ElementRevisionEntity
|
6
|
+
class ElementRevisionEntity < ApplicationEntity
|
7
|
+
expose :id, :element_id, :uuid, :name, :klass_uuid, :properties, :created_at
|
8
|
+
def created_at
|
9
|
+
object.created_at.strftime('%d.%m.%Y, %H:%M')
|
10
|
+
end
|
11
|
+
|
12
|
+
def properties
|
13
|
+
object.properties['layers']&.keys.each do |key|
|
14
|
+
field_sample_molecules = object.properties['layers'][key]['fields'].select { |ss| ss['type'] == 'drag_sample' || ss['type'] == 'drag_molecule' }
|
15
|
+
field_sample_molecules.each do |field|
|
16
|
+
idx = object.properties['layers'][key]['fields'].index(field)
|
17
|
+
sid = field.dig('value', 'el_id')
|
18
|
+
next unless sid.present?
|
19
|
+
|
20
|
+
el = field['type'] == 'drag_sample' ? Sample.find_by(id: sid) : Molecule.find_by(id: sid)
|
21
|
+
next unless el.present?
|
22
|
+
next unless object.properties.dig('layers', key, 'fields', idx, 'value').present?
|
23
|
+
|
24
|
+
object.properties['layers'][key]['fields'][idx]['value']['el_label'] = el.short_label if field['type'] == 'drag_sample'
|
25
|
+
object.properties['layers'][key]['fields'][idx]['value']['el_tip'] = el.short_label if field['type'] == 'drag_sample'
|
26
|
+
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)
|
27
|
+
end
|
28
|
+
|
29
|
+
field_tables = object.properties['layers'][key]['fields'].select { |ss| ss['type'] == 'table' }
|
30
|
+
field_tables.each do |field|
|
31
|
+
next unless field['sub_values'].present? && field['sub_fields'].present?
|
32
|
+
|
33
|
+
field_table_molecules = field['sub_fields'].select { |ss| ss['type'] == 'drag_molecule' }
|
34
|
+
next unless field_table_molecules.present?
|
35
|
+
|
36
|
+
col_ids = field_table_molecules.map { |x| x.values[0] }
|
37
|
+
col_ids.each do |col_id|
|
38
|
+
field_table_values = field['sub_values'].each do |sub_value|
|
39
|
+
next unless sub_value[col_id].present? && sub_value[col_id]['value'].present? && sub_value[col_id]['value']['el_id'].present?
|
40
|
+
|
41
|
+
find_mol = Molecule.find_by(id: sub_value[col_id]['value']['el_id'])
|
42
|
+
next unless find_mol.present?
|
43
|
+
|
44
|
+
sub_value[col_id]['value']['el_svg'] = File.join('/images', 'molecules', find_mol.molecule_svg_file)
|
45
|
+
sub_value[col_id]['value']['el_inchikey'] = find_mol.inchikey
|
46
|
+
sub_value[col_id]['value']['el_smiles'] = find_mol.cano_smiles
|
47
|
+
sub_value[col_id]['value']['el_iupac'] = find_mol.iupac_name
|
48
|
+
sub_value[col_id]['value']['el_molecular_weight'] = find_mol.molecular_weight
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
object.properties['select_options'] = object.properties_release['select_options']
|
54
|
+
object.properties
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
require 'labimotion/entities/application_entity'
|
4
|
+
module Labimotion
|
5
|
+
## ElementEntity
|
6
|
+
class ElnElementEntity < ApplicationEntity
|
7
|
+
with_options(anonymize_below: 0) do
|
8
|
+
expose! :created_by
|
9
|
+
expose! :id
|
10
|
+
expose! :is_restricted
|
11
|
+
expose! :klass_uuid
|
12
|
+
expose! :name
|
13
|
+
expose! :properties
|
14
|
+
expose! :properties_release
|
15
|
+
expose! :short_label
|
16
|
+
expose! :type
|
17
|
+
expose! :uuid
|
18
|
+
end
|
19
|
+
|
20
|
+
expose(
|
21
|
+
:can_copy, unless: ->(_instance, _options) { displayed_in_list? }
|
22
|
+
)
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def properties
|
27
|
+
(object.properties['layers']&.keys || []).each do |key|
|
28
|
+
# layer = object.properties[key]
|
29
|
+
field_sample_molecules = object.properties['layers'][key]['fields'].select do |ss|
|
30
|
+
ss['type'] == 'drag_sample' || ss['type'] == 'drag_molecule'
|
31
|
+
end
|
32
|
+
field_sample_molecules.each do |field|
|
33
|
+
idx = object.properties['layers'][key]['fields'].index(field)
|
34
|
+
sid = field.dig('value', 'el_id')
|
35
|
+
next unless sid.present?
|
36
|
+
|
37
|
+
el = field['type'] == 'drag_sample' ? Sample.find_by(id: sid) : Molecule.find_by(id: sid)
|
38
|
+
next unless el.present?
|
39
|
+
next unless object.properties.dig('layers', key, 'fields', idx, 'value').present?
|
40
|
+
|
41
|
+
if field['type'] == 'drag_sample'
|
42
|
+
object.properties['layers'][key]['fields'][idx]['value']['el_label'] =
|
43
|
+
el.short_label
|
44
|
+
end
|
45
|
+
if field['type'] == 'drag_sample'
|
46
|
+
object.properties['layers'][key]['fields'][idx]['value']['el_tip'] =
|
47
|
+
el.short_label
|
48
|
+
end
|
49
|
+
object.properties['layers'][key]['fields'][idx]['value']['el_svg'] =
|
50
|
+
field['type'] == 'drag_sample' ? el.get_svg_path : File.join('/images', 'molecules', el.molecule_svg_file)
|
51
|
+
end
|
52
|
+
|
53
|
+
field_tables = object.properties['layers'][key]['fields'].select { |ss| ss['type'] == 'table' }
|
54
|
+
field_tables.each do |field|
|
55
|
+
idx = object.properties['layers'][key]['fields'].index(field)
|
56
|
+
next unless field['sub_values'].present? && field['sub_fields'].present?
|
57
|
+
|
58
|
+
field_table_molecules = field['sub_fields'].select { |ss| ss['type'] == 'drag_molecule' }
|
59
|
+
if field_table_molecules.present?
|
60
|
+
object.properties['layers'][key]['fields'][idx] =
|
61
|
+
set_table(field, field_table_molecules, 'Molecule')
|
62
|
+
end
|
63
|
+
|
64
|
+
field_table_samples = field['sub_fields'].select { |ss| ss['type'] == 'drag_sample' }
|
65
|
+
if field_table_samples.present?
|
66
|
+
object.properties['layers'][key]['fields'][idx] =
|
67
|
+
set_table(field, field_table_samples, 'Sample')
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
object.properties
|
72
|
+
end
|
73
|
+
|
74
|
+
def type
|
75
|
+
object.element_klass.name
|
76
|
+
end
|
77
|
+
|
78
|
+
def set_table(field, field_table_objs, obj)
|
79
|
+
col_ids = field_table_objs.map { |x| x.values[0] }
|
80
|
+
col_ids.each do |col_id|
|
81
|
+
field['sub_values'].each do |sub_value|
|
82
|
+
unless sub_value[col_id].present? && sub_value[col_id]['value'].present? && sub_value[col_id]['value']['el_id'].present?
|
83
|
+
next
|
84
|
+
end
|
85
|
+
|
86
|
+
find_obj = obj.constantize.find_by(id: sub_value[col_id]['value']['el_id'])
|
87
|
+
next unless find_obj.present?
|
88
|
+
|
89
|
+
case obj
|
90
|
+
when 'Molecule'
|
91
|
+
sub_value[col_id]['value']['el_svg'] = File.join('/images', 'molecules', find_obj.molecule_svg_file)
|
92
|
+
sub_value[col_id]['value']['el_inchikey'] = find_obj.inchikey
|
93
|
+
sub_value[col_id]['value']['el_smiles'] = find_obj.cano_smiles
|
94
|
+
sub_value[col_id]['value']['el_iupac'] = find_obj.iupac_name
|
95
|
+
sub_value[col_id]['value']['el_molecular_weight'] = find_obj.molecular_weight
|
96
|
+
when 'Sample'
|
97
|
+
sub_value[col_id]['value']['el_svg'] = find_obj.get_svg_path
|
98
|
+
sub_value[col_id]['value']['el_label'] = find_obj.short_label
|
99
|
+
sub_value[col_id]['value']['el_short_label'] = find_obj.short_label
|
100
|
+
sub_value[col_id]['value']['el_name'] = find_obj.name
|
101
|
+
sub_value[col_id]['value']['el_external_label'] = find_obj.external_label
|
102
|
+
sub_value[col_id]['value']['el_molecular_weight'] =
|
103
|
+
find_obj.decoupled ? find_obj.molecular_mass : find_obj.molecule.molecular_weight
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
field
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'labimotion/entities/application_entity'
|
4
|
+
|
5
|
+
# Entity module
|
6
|
+
module Labimotion
|
7
|
+
class GenericEntity < Labimotion::ApplicationEntity
|
8
|
+
expose :id, :is_active, :label, :desc, :place, :released_at
|
9
|
+
|
10
|
+
expose :element_klass_id do |obj|
|
11
|
+
obj[:element_klass_id] || 0
|
12
|
+
end
|
13
|
+
|
14
|
+
expose :klass_name do |obj|
|
15
|
+
obj[:name] || ''
|
16
|
+
end
|
17
|
+
|
18
|
+
expose :ols_term_id do |obj|
|
19
|
+
obj[:ols_term_id] || ''
|
20
|
+
end
|
21
|
+
|
22
|
+
expose :icon_name do |obj|
|
23
|
+
obj[:icon_name] || ''
|
24
|
+
end
|
25
|
+
|
26
|
+
expose :klass_prefix do |obj|
|
27
|
+
obj[:klass_prefix] || ''
|
28
|
+
end
|
29
|
+
|
30
|
+
expose :is_generic do |obj|
|
31
|
+
obj[:is_generic] || true
|
32
|
+
end
|
33
|
+
|
34
|
+
expose :uuid do |obj|
|
35
|
+
obj[:uuid] || ''
|
36
|
+
end
|
37
|
+
|
38
|
+
expose :properties_release do |obj|
|
39
|
+
obj[:properties_release] || {}
|
40
|
+
end
|
41
|
+
|
42
|
+
expose :element_klass do |obj|
|
43
|
+
if obj[:element_klass_id]
|
44
|
+
Labimotion::GenericEntity.represent(obj.element_klass)
|
45
|
+
else
|
46
|
+
{}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
expose :identifier do |obj|
|
51
|
+
obj[:identifier] || ''
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
require 'labimotion/entities/application_entity'
|
4
|
+
module Labimotion
|
5
|
+
# GenericKlassEntity
|
6
|
+
class GenericKlassEntity < ApplicationEntity
|
7
|
+
expose :id, :uuid, :label, :desc, :properties_template, :properties_release, :is_active,
|
8
|
+
:place, :released_at, :identifier, :sync_time, :created_by, :updated_by, :created_at, :updated_at
|
9
|
+
expose_timestamps(timestamp_fields: [:released_at])
|
10
|
+
expose_timestamps(timestamp_fields: [:created_at])
|
11
|
+
expose_timestamps(timestamp_fields: [:updated_at])
|
12
|
+
expose_timestamps(timestamp_fields: [:sync_time])
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'labimotion/entities/application_entity'
|
4
|
+
|
5
|
+
# Entity module
|
6
|
+
module Labimotion
|
7
|
+
class GenericPublicEntity < Labimotion::ApplicationEntity
|
8
|
+
expose! :name
|
9
|
+
expose! :desc
|
10
|
+
expose! :icon_name
|
11
|
+
expose! :klass_prefix
|
12
|
+
expose! :klass_name
|
13
|
+
expose! :label
|
14
|
+
expose! :identifier
|
15
|
+
expose! :released_at
|
16
|
+
expose! :properties_release, if: :displayed
|
17
|
+
expose :element_klass do |obj|
|
18
|
+
if obj[:element_klass_id]
|
19
|
+
{ :label => obj.element_klass.label, :icon_name => obj.element_klass.icon_name }
|
20
|
+
else
|
21
|
+
{}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Labimotion
|
4
|
+
# KlassRevisionEntity
|
5
|
+
class KlassRevisionEntity < ApplicationEntity
|
6
|
+
expose :id, :uuid, :properties_release, :released_at
|
7
|
+
|
8
|
+
expose :klass_id do |object|
|
9
|
+
klass_id = object.element_klass_id if object.respond_to? :element_klass_id
|
10
|
+
klass_id = object.segment_klass_id if object.respond_to? :segment_klass_id
|
11
|
+
klass_id = object.dataset_klass_id if object.respond_to? :dataset_klass_id
|
12
|
+
klass_id
|
13
|
+
end
|
14
|
+
|
15
|
+
def released_at
|
16
|
+
object.released_at&.strftime('%d.%m.%Y, %H:%M')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'labimotion/entities/application_entity'
|
4
|
+
module Labimotion
|
5
|
+
## Segment entity
|
6
|
+
class SegmentEntity < ApplicationEntity
|
7
|
+
expose :id, :segment_klass_id, :element_type, :element_id, :properties, :properties_release, :uuid, :klass_uuid, :klass_label
|
8
|
+
|
9
|
+
def klass_label
|
10
|
+
object.segment_klass.label
|
11
|
+
end
|
12
|
+
|
13
|
+
def properties # rubocop:disable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity, Metrics/AbcSize, Metrics/MethodLength
|
14
|
+
return unless object.respond_to?(:properties)
|
15
|
+
|
16
|
+
return if object&.properties.dig('layers').blank?
|
17
|
+
|
18
|
+
object&.properties['layers'].each_key do |key| # rubocop:disable Metrics/BlockLength
|
19
|
+
next if object&.properties.dig('layers', key, 'fields').blank?
|
20
|
+
|
21
|
+
field_sample_molecules = object&.properties['layers'][key]['fields'].select { |ss| ss['type'] == 'drag_molecule' }
|
22
|
+
field_sample_molecules.each do |field|
|
23
|
+
idx = object&.properties['layers'][key]['fields'].index(field)
|
24
|
+
sid = field.dig('value', 'el_id')
|
25
|
+
next if sid.blank?
|
26
|
+
|
27
|
+
el = Molecule.find_by(id: sid)
|
28
|
+
next if el.blank?
|
29
|
+
|
30
|
+
next if object&.properties.dig('layers', key, 'fields', idx, 'value').blank?
|
31
|
+
|
32
|
+
object&.properties['layers'][key]['fields'][idx]['value']['el_svg'] = File.join('/images', 'molecules', el.molecule_svg_file)
|
33
|
+
end
|
34
|
+
|
35
|
+
field_tables = object.properties['layers'][key]['fields'].select { |ss| ss['type'] == 'table' }
|
36
|
+
field_tables.each do |field|
|
37
|
+
next unless field['sub_values'].present? && field['sub_fields'].present?
|
38
|
+
|
39
|
+
field_table_molecules = field['sub_fields'].select { |ss| ss['type'] == 'drag_molecule' }
|
40
|
+
next if field_table_molecules.blank?
|
41
|
+
|
42
|
+
col_ids = field_table_molecules.map { |x| x.values[0] }
|
43
|
+
col_ids.each do |col_id|
|
44
|
+
field['sub_values'].each do |sub_value|
|
45
|
+
next unless sub_value[col_id].present? && sub_value[col_id]['value'].present? && sub_value[col_id]['value']['el_id'].present?
|
46
|
+
|
47
|
+
find_mol = Molecule.find_by(id: sub_value[col_id]['value']['el_id'])
|
48
|
+
next if find_mol.blank?
|
49
|
+
|
50
|
+
sub_value[col_id]['value']['el_svg'] = File.join('/images', 'molecules', find_mol.molecule_svg_file)
|
51
|
+
sub_value[col_id]['value']['el_inchikey'] = find_mol.inchikey
|
52
|
+
sub_value[col_id]['value']['el_smiles'] = find_mol.cano_smiles
|
53
|
+
sub_value[col_id]['value']['el_iupac'] = find_mol.iupac_name
|
54
|
+
sub_value[col_id]['value']['el_molecular_weight'] = find_mol.molecular_weight
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
object&.properties
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'labimotion/entities/generic_klass_entity'
|
3
|
+
require 'labimotion/entities/element_klass_entity'
|
4
|
+
module Labimotion
|
5
|
+
class SegmentKlassEntity < Labimotion::GenericKlassEntity
|
6
|
+
expose :element_klass, using: Labimotion::ElementKlassEntity
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
require 'labimotion/entities/application_entity'
|
4
|
+
module Labimotion
|
5
|
+
class SegmentRevisionEntity < ApplicationEntity
|
6
|
+
expose :id, :segment_id, :uuid, :klass_uuid, :properties, :created_at
|
7
|
+
def created_at
|
8
|
+
object.created_at.strftime('%d.%m.%Y, %H:%M')
|
9
|
+
end
|
10
|
+
|
11
|
+
def properties
|
12
|
+
object.properties['layers']&.keys.each do |key|
|
13
|
+
field_sample_molecules = object.properties['layers'][key]['fields'].select { |ss| ss['type'] == 'drag_sample' || ss['type'] == 'drag_molecule' }
|
14
|
+
field_sample_molecules.each do |field|
|
15
|
+
idx = object.properties['layers'][key]['fields'].index(field)
|
16
|
+
sid = field.dig('value', 'el_id')
|
17
|
+
next unless sid.present?
|
18
|
+
|
19
|
+
el = field['type'] == 'drag_sample' ? Sample.find_by(id: sid) : Molecule.find_by(id: sid)
|
20
|
+
next unless el.present?
|
21
|
+
next unless object.properties.dig('layers', key, 'fields', idx, 'value').present?
|
22
|
+
|
23
|
+
object.properties['layers'][key]['fields'][idx]['value']['el_label'] = el.short_label if field['type'] == 'drag_sample'
|
24
|
+
object.properties['layers'][key]['fields'][idx]['value']['el_tip'] = el.short_label if field['type'] == 'drag_sample'
|
25
|
+
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)
|
26
|
+
end
|
27
|
+
|
28
|
+
field_tables = object.properties['layers'][key]['fields'].select { |ss| ss['type'] == 'table' }
|
29
|
+
field_tables.each do |field|
|
30
|
+
next unless field['sub_values'].present? && field['sub_fields'].present?
|
31
|
+
|
32
|
+
field_table_molecules = field['sub_fields'].select { |ss| ss['type'] == 'drag_molecule' }
|
33
|
+
next unless field_table_molecules.present?
|
34
|
+
|
35
|
+
col_ids = field_table_molecules.map { |x| x.values[0] }
|
36
|
+
col_ids.each do |col_id|
|
37
|
+
field_table_values = field['sub_values'].each do |sub_value|
|
38
|
+
next unless sub_value[col_id].present? && sub_value[col_id]['value'].present? && sub_value[col_id]['value']['el_id'].present?
|
39
|
+
|
40
|
+
find_mol = Molecule.find_by(id: sub_value[col_id]['value']['el_id'])
|
41
|
+
next unless find_mol.present?
|
42
|
+
|
43
|
+
sub_value[col_id]['value']['el_svg'] = File.join('/images', 'molecules', find_mol.molecule_svg_file)
|
44
|
+
sub_value[col_id]['value']['el_inchikey'] = find_mol.inchikey
|
45
|
+
sub_value[col_id]['value']['el_smiles'] = find_mol.cano_smiles
|
46
|
+
sub_value[col_id]['value']['el_iupac'] = find_mol.iupac_name
|
47
|
+
sub_value[col_id]['value']['el_molecular_weight'] = find_mol.molecular_weight
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
object.properties
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|