labimotion 0.1.12 → 0.1.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/labimotion/apis/generic_dataset_api.rb +2 -0
- data/lib/labimotion/apis/generic_element_api.rb +71 -3
- data/lib/labimotion/apis/labimotion_hub_api.rb +13 -4
- data/lib/labimotion/entities/generic_klass_entity.rb +1 -1
- data/lib/labimotion/entities/generic_public_entity.rb +2 -0
- data/lib/labimotion/entities/klass_revision_entity.rb +1 -1
- data/lib/labimotion/helpers/dataset_helpers.rb +5 -3
- data/lib/labimotion/helpers/element_helpers.rb +71 -20
- data/lib/labimotion/helpers/generic_helpers.rb +21 -26
- data/lib/labimotion/helpers/segment_helpers.rb +17 -14
- data/lib/labimotion/libs/converter.rb +19 -11
- data/lib/labimotion/libs/export_dataset.rb +13 -3
- data/lib/labimotion/libs/nmr_mapper.rb +17 -4
- data/lib/labimotion/libs/nmr_mapper_repo.rb +22 -7
- data/lib/labimotion/libs/template_hub.rb +9 -3
- data/lib/labimotion/models/concerns/attachment_converter.rb +3 -2
- data/lib/labimotion/models/concerns/datasetable.rb +6 -10
- data/lib/labimotion/models/concerns/generic_klass_revisions.rb +18 -10
- data/lib/labimotion/models/concerns/segmentable.rb +6 -11
- data/lib/labimotion/models/concerns/workflow.rb +27 -0
- data/lib/labimotion/models/element.rb +14 -1
- data/lib/labimotion/models/element_klass.rb +12 -2
- data/lib/labimotion/models/element_klasses_revision.rb +10 -0
- data/lib/labimotion/models/hub_log.rb +8 -0
- data/lib/labimotion/utils/utils.rb +33 -0
- data/lib/labimotion/version.rb +2 -1
- data/lib/labimotion.rb +1 -1
- metadata +4 -2
@@ -1,6 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'grape'
|
3
3
|
require 'labimotion/models/segment_klass'
|
4
|
+
require 'labimotion/utils/utils'
|
5
|
+
|
4
6
|
module Labimotion
|
5
7
|
## ElementHelpers
|
6
8
|
module SegmentHelpers
|
@@ -26,8 +28,7 @@ module Labimotion
|
|
26
28
|
attributes = declared(params, include_missing: false)
|
27
29
|
attributes[:properties_template]['uuid'] = uuid if attributes[:properties_template].present?
|
28
30
|
template = (attributes[:properties_template].presence || template)
|
29
|
-
template['
|
30
|
-
template['labimotion'] = Labimotion::VERSION
|
31
|
+
template['pkg'] = Labimotion::Utils.pkg(template['pkg'])
|
31
32
|
template['klass'] = 'SegmentKlass'
|
32
33
|
attributes.merge!(properties_template: template, element_klass: @klass, created_by: current_user.id,
|
33
34
|
place: place)
|
@@ -37,7 +38,7 @@ module Labimotion
|
|
37
38
|
attributes[:properties_release] = attributes[:properties_template]
|
38
39
|
klass = Labimotion::SegmentKlass.create!(attributes)
|
39
40
|
klass.reload
|
40
|
-
klass.create_klasses_revision(current_user
|
41
|
+
klass.create_klasses_revision(current_user)
|
41
42
|
klass
|
42
43
|
rescue StandardError => e
|
43
44
|
Labimotion.log_exception(e, current_user)
|
@@ -64,8 +65,9 @@ module Labimotion
|
|
64
65
|
|
65
66
|
def create_repo_klass(params, current_user)
|
66
67
|
response = Labimotion::TemplateHub.fetch_identifier('SegmentKlass', params[:identifier])
|
67
|
-
attributes = response.slice('label', 'desc', 'uuid', 'identifier', 'released_at'
|
68
|
-
attributes['
|
68
|
+
attributes = response.slice('label', 'desc', 'uuid', 'identifier', 'released_at', 'properties_release', 'version')
|
69
|
+
attributes['properties_release']['identifier'] = attributes['identifier']
|
70
|
+
attributes['properties_template'] = attributes['properties_release']
|
69
71
|
attributes['place'] = ((Labimotion::SegmentKlass.all.length * 10) || 0) + 10
|
70
72
|
attributes['is_active'] = false
|
71
73
|
attributes['updated_by'] = current_user.id
|
@@ -74,20 +76,21 @@ module Labimotion
|
|
74
76
|
|
75
77
|
element_klass = Labimotion::ElementKlass.find_by(identifier: response['element_klass']['identifier'])
|
76
78
|
element_klass = Labimotion::ElementKlass.find_by(name: response['element_klass']['name']) if element_klass.nil?
|
77
|
-
if element_klass.nil?
|
78
|
-
el_attributes = response['element_klass'].slice('name', 'label', 'desc', 'uuid', 'identifier', 'icon_name', 'klass_prefix', 'is_generic', 'released_at')
|
79
|
-
el_attributes['properties_template'] = response['element_klass']['properties_release']
|
80
|
-
Labimotion::ElementKlass.create!(el_attributes)
|
81
|
-
end
|
79
|
+
return { error: 'ElementKlass not found' } if element_klass.nil?
|
82
80
|
|
81
|
+
# el_attributes = response['element_klass'].slice('name', 'label', 'desc', 'uuid', 'identifier', 'icon_name', 'klass_prefix', 'is_generic', 'released_at')
|
82
|
+
# el_attributes['properties_template'] = response['element_klass']['properties_release']
|
83
|
+
# Labimotion::ElementKlass.create!(el_attributes)
|
83
84
|
|
84
|
-
|
85
|
-
|
86
|
-
|
85
|
+
attributes['element_klass_id'] = element_klass.id
|
86
|
+
segment_klass = Labimotion::SegmentKlass.find_by(identifier: attributes['identifier'])
|
87
|
+
if segment_klass.present?
|
88
|
+
segment_klass.update!(attributes)
|
87
89
|
else
|
88
90
|
attributes['created_by'] = current_user.id
|
89
|
-
Labimotion::SegmentKlass.create!(attributes)
|
91
|
+
segment_klass = Labimotion::SegmentKlass.create!(attributes)
|
90
92
|
end
|
93
|
+
segment_klass.create_klasses_revision(current_user)
|
91
94
|
rescue StandardError => e
|
92
95
|
Labimotion.log_exception(e, current_user)
|
93
96
|
raise e
|
@@ -5,6 +5,7 @@ require 'uri'
|
|
5
5
|
require 'json'
|
6
6
|
require 'date'
|
7
7
|
require 'labimotion/version'
|
8
|
+
require 'labimotion/utils/utils'
|
8
9
|
|
9
10
|
# rubocop: disable Metrics/AbcSize
|
10
11
|
# rubocop: disable Metrics/MethodLength
|
@@ -116,7 +117,7 @@ module Labimotion
|
|
116
117
|
)
|
117
118
|
# att.attachment_attacher.attach(tmp_file)
|
118
119
|
if att.valid? && Labimotion::IS_RAILS5 == false
|
119
|
-
att.attachment_attacher.create_derivatives
|
120
|
+
## att.attachment_attacher.create_derivatives
|
120
121
|
att.save!
|
121
122
|
end
|
122
123
|
if att.valid? && Labimotion::IS_RAILS5 == true
|
@@ -143,12 +144,16 @@ module Labimotion
|
|
143
144
|
end
|
144
145
|
|
145
146
|
def self.process(data)
|
146
|
-
return if data[:a]&.attachable_type != 'Container'
|
147
|
-
|
147
|
+
return data[:a].con_state if data[:a]&.attachable_type != 'Container'
|
148
148
|
response = nil
|
149
149
|
begin
|
150
150
|
ofile = Rails.root.join(data[:f], data[:a].filename)
|
151
|
-
|
151
|
+
if Labimotion::IS_RAILS5 == true
|
152
|
+
FileUtils.cp(data[:a].store.path, ofile)
|
153
|
+
else
|
154
|
+
FileUtils.cp(data[:a].attachment_url, ofile)
|
155
|
+
end
|
156
|
+
|
152
157
|
File.open(ofile, 'r') do |f|
|
153
158
|
body = { file: f }
|
154
159
|
response = HTTParty.post(
|
@@ -160,12 +165,14 @@ module Labimotion
|
|
160
165
|
end
|
161
166
|
if response.ok?
|
162
167
|
Labimotion::Converter.handle_response(data[:a], response)
|
168
|
+
Labimotion::ConState::PROCESSED
|
163
169
|
else
|
164
170
|
Labimotion::Converter.logger.error ["Converter Response Error: id: [#{data[:a]&.id}], filename: [#{data[:a]&.filename}], response: #{response}"].join($INPUT_RECORD_SEPARATOR)
|
171
|
+
Labimotion::ConState::ERROR
|
165
172
|
end
|
166
|
-
response
|
167
173
|
rescue StandardError => e
|
168
|
-
|
174
|
+
Labimotion::Converter.logger.error ["process fail: #{id}", e.message, *e.backtrace].join($INPUT_RECORD_SEPARATOR)
|
175
|
+
Labimotion::ConState::ERROR
|
169
176
|
ensure
|
170
177
|
FileUtils.rm_f(ofile)
|
171
178
|
end
|
@@ -174,14 +181,14 @@ module Labimotion
|
|
174
181
|
def self.jcamp_converter(id)
|
175
182
|
resp = nil
|
176
183
|
begin
|
184
|
+
|
177
185
|
data = Labimotion::Converter.vor_conv(id)
|
178
186
|
return if data.nil?
|
179
187
|
|
180
|
-
|
181
|
-
resp&.success? ? Labimotion::ConState::PROCESSED : Labimotion::ConState::ERROR
|
188
|
+
Labimotion::Converter.process(data)
|
182
189
|
rescue StandardError => e
|
183
|
-
Labimotion::ConState::ERROR
|
184
190
|
Labimotion::Converter.logger.error ["jcamp_converter fail: #{id}", e.message, *e.backtrace].join($INPUT_RECORD_SEPARATOR)
|
191
|
+
Labimotion::ConState::ERROR
|
185
192
|
end
|
186
193
|
end
|
187
194
|
|
@@ -209,8 +216,7 @@ module Labimotion
|
|
209
216
|
uuid = SecureRandom.uuid
|
210
217
|
props = klass.properties_release
|
211
218
|
props['uuid'] = uuid
|
212
|
-
props['
|
213
|
-
props['labimotion'] = Labimotion::VERSION
|
219
|
+
props['pkg'] = Labimotion::Utils.pkg(props['pkg'])
|
214
220
|
props['klass'] = 'Dataset'
|
215
221
|
Labimotion::Dataset.create!(
|
216
222
|
uuid: uuid,
|
@@ -228,6 +234,8 @@ module Labimotion
|
|
228
234
|
new_prop = dataset.properties
|
229
235
|
dsr.each do |ds|
|
230
236
|
layer = layers[ds[:layer]]
|
237
|
+
next if layer.nil? || layer['fields'].nil?
|
238
|
+
|
231
239
|
fields = layer['fields'].select{ |f| f['field'] == ds[:field] }
|
232
240
|
fi = fields&.first
|
233
241
|
idx = layer['fields'].find_index(fi)
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'export_table'
|
3
|
+
require 'labimotion/version'
|
3
4
|
|
4
5
|
module Labimotion
|
5
6
|
## ExportDataset
|
@@ -101,9 +102,18 @@ module Labimotion
|
|
101
102
|
cds.attachments.where(aasm_state: 'csv').each do |att|
|
102
103
|
name = File.basename(att.filename, '.csv')
|
103
104
|
sheet = @xfile.workbook.add_worksheet(name: name)
|
104
|
-
|
105
|
-
|
106
|
-
|
105
|
+
|
106
|
+
if Labimotion::IS_RAILS5 == true
|
107
|
+
File.open(att.store.path) do |fi|
|
108
|
+
fi.each_line do |line|
|
109
|
+
sheet.add_row(line.split(','))
|
110
|
+
end
|
111
|
+
end
|
112
|
+
else
|
113
|
+
File.open(att.attachment_url) do |fi|
|
114
|
+
fi.each_line do |line|
|
115
|
+
sheet.add_row(line.split(','))
|
116
|
+
end
|
107
117
|
end
|
108
118
|
end
|
109
119
|
end
|
@@ -1,12 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'labimotion/version'
|
4
|
+
require 'labimotion/utils/utils'
|
5
|
+
|
3
6
|
module Labimotion
|
4
7
|
## NmrMapper
|
5
8
|
class NmrMapper
|
6
9
|
def self.is_brucker_binary(id)
|
7
10
|
att = Attachment.find(id)
|
8
|
-
if
|
9
|
-
Zip::File.open(att.
|
11
|
+
if Labimotion::IS_RAILS5 == true
|
12
|
+
Zip::File.open(att.store.path) do |zip_file|
|
10
13
|
zip_file.each do |entry|
|
11
14
|
if entry.name.include?('/pdata/') && entry.name.include?('parm.txt')
|
12
15
|
metadata = entry.get_input_stream.read.force_encoding('UTF-8')
|
@@ -14,6 +17,17 @@ module Labimotion
|
|
14
17
|
end
|
15
18
|
end
|
16
19
|
end
|
20
|
+
else
|
21
|
+
if att&.attachment_attacher&.file&.url
|
22
|
+
Zip::File.open(att.attachment_attacher.file.url) do |zip_file|
|
23
|
+
zip_file.each do |entry|
|
24
|
+
if entry.name.include?('/pdata/') && entry.name.include?('parm.txt')
|
25
|
+
metadata = entry.get_input_stream.read.force_encoding('UTF-8')
|
26
|
+
return metadata
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
17
31
|
end
|
18
32
|
nil
|
19
33
|
end
|
@@ -247,8 +261,7 @@ module Labimotion
|
|
247
261
|
uuid = SecureRandom.uuid
|
248
262
|
props = klass.properties_release
|
249
263
|
props['uuid'] = uuid
|
250
|
-
props['
|
251
|
-
props['labimotion'] = Labimotion::VERSION
|
264
|
+
props['pkg'] = Labimotion::Utils.pkg(props['pkg'])
|
252
265
|
props['klass'] = 'Dataset'
|
253
266
|
dataset = Labimotion::Dataset.create!(
|
254
267
|
uuid: uuid,
|
@@ -1,17 +1,33 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
require 'labimotion/version'
|
3
|
+
require 'labimotion/utils/utils'
|
2
4
|
|
3
5
|
module Labimotion
|
4
6
|
class NmrMapperRepo
|
5
7
|
def self.is_brucker_binary(id)
|
6
8
|
att = Attachment.find(id)
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
if Labimotion::IS_RAILS5 == true
|
10
|
+
Zip::File.open(att.store.path) do |zip_file|
|
11
|
+
zip_file.each do |entry|
|
12
|
+
if entry.name.include?('/pdata/') && entry.name.include?('parm.txt')
|
13
|
+
metadata = entry.get_input_stream.read.force_encoding('UTF-8')
|
14
|
+
return metadata
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
else
|
19
|
+
if att&.attachment_attacher&.file&.url
|
20
|
+
Zip::File.open(att.attachment_attacher.file.url) do |zip_file|
|
21
|
+
zip_file.each do |entry|
|
22
|
+
if entry.name.include?('/pdata/') && entry.name.include?('parm.txt')
|
23
|
+
metadata = entry.get_input_stream.read.force_encoding('UTF-8')
|
24
|
+
return metadata
|
25
|
+
end
|
26
|
+
end
|
12
27
|
end
|
13
28
|
end
|
14
29
|
end
|
30
|
+
|
15
31
|
nil
|
16
32
|
end
|
17
33
|
|
@@ -245,8 +261,7 @@ module Labimotion
|
|
245
261
|
uuid = SecureRandom.uuid
|
246
262
|
props = klass.properties_release
|
247
263
|
props['uuid'] = uuid
|
248
|
-
props['
|
249
|
-
props['labimotion'] = Labimotion::VERSION
|
264
|
+
props['pkg'] = Labimotion::Utils.pkg(props['pkg'])
|
250
265
|
props['klass'] = 'Dataset'
|
251
266
|
dataset = Labimotion::Dataset.create!(
|
252
267
|
uuid: uuid,
|
@@ -20,7 +20,7 @@ module Labimotion
|
|
20
20
|
|
21
21
|
|
22
22
|
def self.header(opt = {})
|
23
|
-
opt || {}
|
23
|
+
opt || { timeout: 10, headers: { 'Content-Type' => 'text/json' } }
|
24
24
|
end
|
25
25
|
|
26
26
|
def self.handle_response(oat, response) # rubocop: disable Metrics/PerceivedComplexity
|
@@ -35,16 +35,22 @@ module Labimotion
|
|
35
35
|
|
36
36
|
def self.list(klass)
|
37
37
|
body = { klass: klass }
|
38
|
-
response = HTTParty.get("#{uri('list')}?klass=#{klass}")
|
38
|
+
response = HTTParty.get("#{uri('list')}?klass=#{klass}", timeout: 10)
|
39
39
|
# response.parsed_response if response.code == 200
|
40
40
|
JSON.parse(response.body) if response.code == 200
|
41
|
+
rescue StandardError => e
|
42
|
+
Labimotion.log_exception(e)
|
43
|
+
error!('Cannot connect to Chemotion Repository', 401)
|
41
44
|
end
|
42
45
|
|
43
46
|
def self.fetch_identifier(klass, identifier)
|
44
47
|
# body = { klass: klass, identifier: identifier }
|
45
|
-
response = HTTParty.get("#{uri('fetch')}?klass=#{klass}&identifier=#{identifier}")
|
48
|
+
response = HTTParty.get("#{uri('fetch')}?klass=#{klass}&identifier=#{identifier}", timeout: 10)
|
46
49
|
# response.parsed_response if response.code == 200
|
47
50
|
JSON.parse(response.body) if response.code == 200
|
51
|
+
rescue StandardError => e
|
52
|
+
Labimotion.log_exception(e)
|
53
|
+
error!('Cannot connect to Chemotion Repository', 401)
|
48
54
|
end
|
49
55
|
end
|
50
56
|
end
|
@@ -9,7 +9,7 @@ module Labimotion
|
|
9
9
|
before_create :init_converter
|
10
10
|
after_update :exec_converter
|
11
11
|
def init_converter
|
12
|
-
return if con_state.present?
|
12
|
+
return if self.has_attribute?(:con_state) == false || con_state.present?
|
13
13
|
if Rails.configuration.try(:converter).try(:url) && ACCEPTED_FORMATS.include?(File.extname(filename&.downcase))
|
14
14
|
self.con_state = Labimotion::ConState::WAIT
|
15
15
|
end
|
@@ -23,7 +23,7 @@ module Labimotion
|
|
23
23
|
|
24
24
|
def exec_converter
|
25
25
|
#return if attachable_id.nil?
|
26
|
-
return if con_state.nil? || con_state == Labimotion::ConState::NONE
|
26
|
+
return if self.has_attribute?(:con_state) == false || con_state.nil? || con_state == Labimotion::ConState::NONE
|
27
27
|
case con_state
|
28
28
|
when Labimotion::ConState::NMR
|
29
29
|
content = Labimotion::NmrMapperRepo.is_brucker_binary(id)
|
@@ -36,6 +36,7 @@ module Labimotion
|
|
36
36
|
when Labimotion::ConState::WAIT
|
37
37
|
self.con_state = Labimotion::Converter.jcamp_converter(id)
|
38
38
|
end
|
39
|
+
update_column(:con_state, con_state)
|
39
40
|
end
|
40
41
|
end
|
41
42
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# Datasetable concern
|
4
|
+
require 'labimotion/utils/utils'
|
4
5
|
|
5
6
|
module Labimotion
|
6
7
|
## Datasetable concern
|
@@ -21,23 +22,18 @@ module Labimotion
|
|
21
22
|
klass = Labimotion::DatasetKlass.find_by(id: args[:dataset_klass_id])
|
22
23
|
uuid = SecureRandom.uuid
|
23
24
|
props = args[:properties]
|
24
|
-
props['
|
25
|
-
props['
|
25
|
+
props['pkg'] = Labimotion::Utils.pkg(props['pkg'])
|
26
|
+
props['identifier'] = klass.identifier
|
27
|
+
props['uuid'] = uuid
|
28
|
+
props['klass'] = 'Dataset'
|
29
|
+
|
26
30
|
ds = Labimotion::Dataset.find_by(element_type: self.class.name, element_id: id)
|
27
31
|
if ds.present? && (ds.klass_uuid != props['klass_uuid'] || ds.properties != props)
|
28
|
-
props['uuid'] = uuid
|
29
|
-
props['eln'] = Chemotion::Application.config.version
|
30
|
-
props['labimotion'] = Labimotion::VERSION
|
31
|
-
props['klass'] = 'Dataset'
|
32
32
|
ds.update!(properties_release: klass.properties_release, uuid: uuid, dataset_klass_id: args[:dataset_klass_id], properties: props, klass_uuid: props['klass_uuid'])
|
33
33
|
end
|
34
34
|
return if ds.present?
|
35
35
|
|
36
|
-
props['uuid'] = uuid
|
37
36
|
props['klass_uuid'] = klass.uuid
|
38
|
-
props['eln'] = Chemotion::Application.config.version
|
39
|
-
props['labimotion'] = Labimotion::VERSION
|
40
|
-
props['klass'] = 'Dataset'
|
41
37
|
Labimotion::Dataset.create!(properties_release: klass.properties_release, uuid: uuid, dataset_klass_id: args[:dataset_klass_id], element_type: self.class.name, element_id: id, properties: props, klass_uuid: klass.uuid)
|
42
38
|
end
|
43
39
|
|
@@ -1,34 +1,42 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Labimotion
|
4
|
-
|
4
|
+
## Generic Klass Revisions Helpers
|
5
|
+
module GenericKlassRevisions
|
5
6
|
extend ActiveSupport::Concern
|
6
7
|
included do
|
7
8
|
# has_many :element_klasses_revisions, dependent: :destroy
|
8
9
|
end
|
9
10
|
|
10
|
-
def create_klasses_revision(
|
11
|
+
def create_klasses_revision(current_user)
|
11
12
|
properties_release = properties_template
|
12
|
-
|
13
|
-
# properties_release['layers'][key]['layer'] = properties_release['layers'][key]['key']
|
14
|
-
# end
|
13
|
+
migrate_workflow if properties_release['flow'].present?
|
15
14
|
|
16
|
-
if properties_release['
|
17
|
-
elements = (properties_release['
|
15
|
+
if properties_release['flowObject'].present?
|
16
|
+
elements = (properties_release['flowObject']['nodes'] || []).map do |el|
|
18
17
|
if el['data'].present? && el['data']['lKey'].present?
|
19
18
|
layer = properties_release['layers'][el['data']['lKey']]
|
20
19
|
el['data']['layer'] = layer if layer.present?
|
21
20
|
end
|
22
21
|
el
|
23
22
|
end
|
24
|
-
properties_release['
|
23
|
+
properties_release['flowObject']['nodes'] = elements
|
25
24
|
end
|
25
|
+
klass_attributes = {
|
26
|
+
uuid: properties_template['uuid'],
|
27
|
+
properties_template: properties_release,
|
28
|
+
properties_release: properties_release,
|
29
|
+
released_at: DateTime.now,
|
30
|
+
updated_by: current_user&.id,
|
31
|
+
released_by: current_user&.id,
|
32
|
+
}
|
26
33
|
|
27
|
-
self.update!(
|
34
|
+
self.update!(klass_attributes)
|
28
35
|
reload
|
29
36
|
attributes = {
|
30
|
-
released_by:
|
37
|
+
released_by: released_by,
|
31
38
|
uuid: uuid,
|
39
|
+
version: version,
|
32
40
|
properties_release: properties_release,
|
33
41
|
released_at: released_at
|
34
42
|
}
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'labimotion/utils/utils'
|
4
|
+
|
3
5
|
module Labimotion
|
4
6
|
# Segmentable concern
|
5
7
|
module Segmentable
|
@@ -45,25 +47,18 @@ module Labimotion
|
|
45
47
|
klass = Labimotion::SegmentKlass.find_by(id: seg['segment_klass_id'])
|
46
48
|
uuid = SecureRandom.uuid
|
47
49
|
props = seg['properties']
|
48
|
-
props['
|
49
|
-
props['
|
50
|
+
props['pkg'] = Labimotion::Utils.pkg(props['pkg'])
|
51
|
+
props['identifier'] = identifier
|
52
|
+
props['uuid'] = uuid
|
53
|
+
props['klass'] = 'Segment'
|
50
54
|
segment = Labimotion::Segment.find_by(element_type: Labimotion::Utils.element_name(self.class.name), element_id: self.id, segment_klass_id: seg['segment_klass_id'])
|
51
55
|
if segment.present? && (segment.klass_uuid != props['klass_uuid'] || segment.properties != props)
|
52
|
-
props['uuid'] = uuid
|
53
|
-
props['eln'] = Chemotion::Application.config.version
|
54
|
-
props['labimotion'] = Labimotion::VERSION
|
55
|
-
props['klass'] = 'Segment'
|
56
|
-
|
57
56
|
segment.update!(properties_release: klass.properties_release, properties: props, uuid: uuid, klass_uuid: props['klass_uuid'])
|
58
57
|
segments.push(segment)
|
59
58
|
end
|
60
59
|
next if segment.present?
|
61
60
|
|
62
|
-
props['uuid'] = uuid
|
63
61
|
props['klass_uuid'] = klass.uuid
|
64
|
-
props['eln'] = Chemotion::Application.config.version
|
65
|
-
props['labimotion'] = Labimotion::VERSION
|
66
|
-
props['klass'] = 'Segment'
|
67
62
|
segment = Labimotion::Segment.create!(properties_release: klass.properties_release, segment_klass_id: seg['segment_klass_id'], element_type: Labimotion::Utils.element_name(self.class.name), element_id: self.id, properties: props, created_by: args[:current_user_id], uuid: uuid, klass_uuid: klass.uuid)
|
68
63
|
segments.push(segment)
|
69
64
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Labimotion
|
2
|
+
# Segmentable concern
|
3
|
+
module Workflow
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
def split_workflow(properties)
|
7
|
+
return if properties['flow'].nil?
|
8
|
+
|
9
|
+
if properties['flow'].present?
|
10
|
+
properties['flowObject'] = {}
|
11
|
+
elements = properties['flow']['elements'] || {}
|
12
|
+
properties['flowObject']['nodes'] = elements.select { |obj| obj['source'].nil? }
|
13
|
+
properties['flowObject']['edges'] = elements.select { |obj| obj['source'] && obj['source'] != obj['target'] }.map do |obj|
|
14
|
+
obj['markerEnd'] = { 'type': 'arrowclosed' }
|
15
|
+
obj
|
16
|
+
end
|
17
|
+
properties['flowObject']['viewport'] = {
|
18
|
+
"x": properties['flow']['position'][0] || 0,
|
19
|
+
"y": properties['flow']['position'][1] || 0,
|
20
|
+
"zoom": properties['flow']['zoom'] || 1
|
21
|
+
}
|
22
|
+
properties.delete('flow')
|
23
|
+
end
|
24
|
+
properties
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -1,16 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'labimotion/models/concerns/generic_revisions'
|
3
3
|
require 'labimotion/models/concerns/segmentable'
|
4
|
+
require 'labimotion/models/concerns/workflow'
|
4
5
|
|
5
6
|
module Labimotion
|
6
7
|
class Element < ApplicationRecord
|
7
8
|
acts_as_paranoid
|
8
9
|
self.table_name = :elements
|
9
|
-
include PgSearch
|
10
|
+
include PgSearch if Labimotion::IS_RAILS5 == true
|
11
|
+
include PgSearch::Model if Labimotion::IS_RAILS5 == false
|
10
12
|
include ElementUIStateScopes
|
11
13
|
include Collectable
|
12
14
|
## include AnalysisCodes
|
13
15
|
include Taggable
|
16
|
+
include Workflow
|
14
17
|
include Segmentable
|
15
18
|
include GenericRevisions
|
16
19
|
|
@@ -106,6 +109,16 @@ module Labimotion
|
|
106
109
|
preview && Base64.encode64(preview) || 'not available'
|
107
110
|
end
|
108
111
|
|
112
|
+
|
113
|
+
def migrate_workflow
|
114
|
+
return if properties.nil? || properties_release.nil?
|
115
|
+
|
116
|
+
return if properties['flow'].nil? && properties_release['flow'].nil?
|
117
|
+
|
118
|
+
update_column(:properties, split_workflow(properties)) if properties['flow']
|
119
|
+
update_column(:properties_release, split_workflow(properties_release)) if properties_release['flow']
|
120
|
+
end
|
121
|
+
|
109
122
|
private
|
110
123
|
|
111
124
|
def delete_attachment
|
@@ -1,11 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'labimotion/models/concerns/generic_klass_revisions'
|
3
|
+
require 'labimotion/models/concerns/workflow'
|
3
4
|
|
4
5
|
module Labimotion
|
5
6
|
class ElementKlass < ApplicationRecord
|
6
|
-
acts_as_paranoid
|
7
7
|
self.table_name = :element_klasses
|
8
|
+
acts_as_paranoid
|
8
9
|
include GenericKlassRevisions
|
10
|
+
include Workflow
|
9
11
|
has_many :elements, dependent: :destroy, class_name: 'Labimotion::Element'
|
10
12
|
has_many :segment_klasses, dependent: :destroy, class_name: 'Labimotion::SegmentKlass'
|
11
13
|
has_many :element_klasses_revisions, dependent: :destroy, class_name: 'Labimotion::ElementKlassesRevision'
|
@@ -16,10 +18,18 @@ module Labimotion
|
|
16
18
|
klasses = []
|
17
19
|
ensure
|
18
20
|
File.write(
|
19
|
-
Rails.root.join('
|
21
|
+
Rails.root.join('app/packs/klasses.json'),
|
20
22
|
klasses&.to_json || []
|
21
23
|
)
|
22
24
|
end
|
23
25
|
|
26
|
+
def migrate_workflow
|
27
|
+
return if properties_template.nil? || properties_release.nil?
|
28
|
+
|
29
|
+
return if properties_template['flow'].nil? && properties_release['flow'].nil?
|
30
|
+
|
31
|
+
update_column(:properties_template, split_workflow(properties_template)) if properties_template['flow']
|
32
|
+
update_column(:properties_release, split_workflow(properties_release)) if properties_release['flow']
|
33
|
+
end
|
24
34
|
end
|
25
35
|
end
|
@@ -1,9 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'labimotion/models/concerns/workflow'
|
4
|
+
|
3
5
|
module Labimotion
|
4
6
|
class ElementKlassesRevision < ApplicationRecord
|
5
7
|
acts_as_paranoid
|
6
8
|
self.table_name = :element_klasses_revisions
|
9
|
+
include Workflow
|
7
10
|
has_one :element_klass, class_name: 'Labimotion::ElementKlass'
|
11
|
+
|
12
|
+
|
13
|
+
def migrate_workflow
|
14
|
+
return if properties_release.nil? || properties_release['flow'].nil?
|
15
|
+
|
16
|
+
update_column(:properties_release, split_workflow(properties_release)) if properties_release['flow']
|
17
|
+
end
|
8
18
|
end
|
9
19
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'labimotion/version'
|
3
4
|
module Labimotion
|
5
|
+
## Generic Utils
|
4
6
|
class Utils
|
5
7
|
def self.klass_by_collection(name)
|
6
8
|
names = name.split('::')
|
@@ -53,5 +55,36 @@ module Labimotion
|
|
53
55
|
def self.element_name_dc(name)
|
54
56
|
Labimotion::Utils.element_name(name)&.downcase
|
55
57
|
end
|
58
|
+
|
59
|
+
def self.next_version(release, current_version)
|
60
|
+
case release
|
61
|
+
when 'draft'
|
62
|
+
current_version
|
63
|
+
when 'major'
|
64
|
+
if current_version.nil? || current_version.split('.').length < 2
|
65
|
+
'1.0'
|
66
|
+
else
|
67
|
+
"#{current_version&.split('.').first.to_i + 1}.0"
|
68
|
+
end
|
69
|
+
when 'minor'
|
70
|
+
if current_version.nil? || current_version&.split('.').length < 2
|
71
|
+
'0.1'
|
72
|
+
else
|
73
|
+
"#{current_version&.split('.').first.to_i.to_s}.#{current_version&.split('.').last.to_i + 1}"
|
74
|
+
end
|
75
|
+
else
|
76
|
+
current_version
|
77
|
+
end
|
78
|
+
rescue StandardError => e
|
79
|
+
Labimotion.log_exception(e)
|
80
|
+
current_version
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.pkg(pkg)
|
84
|
+
pkg = {} if pkg.nil?
|
85
|
+
pkg['eln'] = Chemotion::Application.config.version
|
86
|
+
pkg['labimotion'] = Labimotion::VERSION
|
87
|
+
pkg
|
88
|
+
end
|
56
89
|
end
|
57
90
|
end
|