Merge pull request #3027 from okriuchykhin/ok_SCI_5246
Remove Demo project and Samples inventory [SCI-5246][SCI-5248]
Before Width: | Height: | Size: 538 KiB |
Before Width: | Height: | Size: 531 KiB |
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 231 KiB |
Before Width: | Height: | Size: 183 KiB |
Before Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 530 KiB |
Before Width: | Height: | Size: 73 KiB |
|
@ -1,18 +0,0 @@
|
||||||
# Content for tables used in demo project.
|
|
||||||
|
|
||||||
module1:
|
|
||||||
experimental_design_table: '{"data":[["group/time","1 dpi","6 dpi","",""],["PVYNTN","1","1","",""],["mock","1","1","",""],["","","","",""]]}'
|
|
||||||
|
|
||||||
module2:
|
|
||||||
samples_table: '{"data":[["Name","Sample type"],["Mock 1dpi","potatoe leaves"],["Mock 6dpi","potatoe leaves"],["PVY NTN 1dpi","potatoe leaves"],["PVY NTN 6dpi","potatoe leaves"]]}'
|
|
||||||
module3:
|
|
||||||
nanodrop: '{"data":[["Sample name","ng/ul ","260/280 ","260/230 "],["PVY NTN 6dpi","1.05","1.39","1.61"],["PVY NTN 1dpi","320.52","2.16","2.26"],["Mock 6dpi","906.19","2.15","2.26"],["Mock 1dpi","940.22","2.17","2.27"]]}'
|
|
||||||
module4:
|
|
||||||
volumes: '{"data":[["Amount of starting material (mg)","Volume of Buffer RLT (µl)"],["<20","350"],["20 - 30","600"]]}'
|
|
||||||
dna_q: '{"data":[["Sample 1","Quantity "],["1","0,2"],["2","0,5"],["3","0,4"],["4","1,1"],["5","12,5"],["6","0,05"],["7","0"],["8","0"],["9","0"],["10","0"],["11","0"],["12","4,7"],["13","2,3"],["14","5,6"],["15","2,6"],["16","8,9"],["17","1,7"],["18","1"]]}'
|
|
||||||
module6:
|
|
||||||
mastermix: '{"data":[["Date:","","","","","","","","","","","",""],["Reaction volume:","20 ul","","","","","","","","","","",""],["UMM/reaction:","10 µl","","","","","","","","","","",""],["sample/reaction:","6 µl","","","","","","","","","","",""],["","","","","","","","","","","","",""],["Chemistry","TaqMan","","","SYBR Green I","","","TaqMan","","","SYBR Green I","",""],["Gene","cox","","","cab4","","","PVY-NTN","","","PR-1","",""],["","conc.*","final conc.**","µl/reaction","conc.*","final conc.**","µl/reaction","conc.*","final conc.**","µl/reaction","conc.*","final conc.**","µl/reaction"],["Probe","10 µM","150 nM","0.3","/","/","/","5 µM","150 nM","0.6","/","/","/"],["FP","30 µM","300 nM","0.2","30 µM","300 nM ","0.2","10 µM","250 nM","0.5","30 µM","300 nM ","0.2"],["RP","30 µM","300 nM","0.2","30 µM","300 nM ","0.2","10 µM","250 nM","0.5","30 µM","300 nM ","0.2"]]}'
|
|
||||||
distribution: '{"data":[["%{sample0} (100x)\t","%{sample0} (100x)\t","%{sample0} (100x)\t","%{sample0} (100x)\t","%{sample0} (100x)\t","%{sample0} (100x)\t","%{sample0} (100x)\t","%{sample0} (100x)\t",null,null,"Mix smpl (10x)\t","Mix smpl (10x)\t"],["%{sample0} (1000x)\t","%{sample0} (1000x)\t","%{sample0} (1000x)\t","%{sample0} (1000x)\t","%{sample0} (1000x)\t","%{sample0} (1000x)\t","%{sample0} (1000x)\t","%{sample0} (1000x)\t",null,null,"Mix smpl (100x)\t","Mix smpl (100x)\t"],["%{sample1} (100x)\t","%{sample1} (100x)\t","%{sample1} (100x)\t","%{sample1} (100x)\t","%{sample1} (100x)\t","%{sample1} (100x)\t","%{sample1} (100x)\t","%{sample1} (100x)\t",null,null,"Mix smpl (1000x)\t","Mix smpl (1000x)\t"],["%{sample1} (1000x)\t","%{sample1} (1000x)\t","%{sample1} (1000x)\t","%{sample1} (1000x)\t","%{sample1} (1000x)\t","%{sample1} (1000x)\t","%{sample1} (1000x)\t","%{sample1} (1000x)\t",null,null,"Mix smpl (10000x)\t","Mix smpl (10000x)\t"],["%{sample2} (100x)\t","%{sample2} (100x)\t","%{sample2} (100x)\t","%{sample2} (100x)\t","%{sample2} (100x)\t","%{sample2} (100x)\t","%{sample2} (100x)\t","%{sample2} (100x)\t",null,null,"NTC1","NTC2"],["%{sample2} (1000x)\t","%{sample2} (1000x)\t","%{sample2} (1000x)\t","%{sample2} (1000x)\t","%{sample2} (1000x)\t","%{sample2} (1000x)\t","%{sample2} (1000x)\t","%{sample2} (1000x)\t",null,null,"NTC1","NTC2"],["%{sample3} (100x)\t","%{sample3} (100x)\t","%{sample3} (100x)\t","%{sample3} (100x)\t","%{sample3} (100x)\t","%{sample3} (100x)\t","%{sample3} (100x)\t","%{sample3} (100x)\t",null,null,"NTC1","NTC2"],["%{sample3} (1000x)\t","%{sample3} (1000x)\t","%{sample3} (1000x)\t","%{sample3} (1000x)\t","%{sample3} (1000x)\t","%{sample3} (1000x)\t","%{sample3} (1000x)\t","%{sample3} (1000x)\t",null,null,"NTC1","NTC2"],[null,null,null,null,null,null,null,null,null,null,null,null]]}'
|
|
||||||
qpcr_raw_data: '{"data":[["Sample 1","Quantity ","Column 3","Column 4"],["2","0,2","0,4","0,08"],["2","0,5","1","0,5"],["3","0,4","1,2","0,48"],["4","1,1","4,4","4,84"],["5","12,5","62,5","781,25"],["6","0,05","0,3","0,015"],["7","0","4","0"],["8","0","0","0"],["9","0","0","0"],["10","0","0","0"],["11","0","0","0"],["12","4,7","56,4","265,08"],["13","2,3","30","69"],["14","5,6","78,4","439,04"],["15","2,6","39","101,4"],["16","8,9","142,4","1267,36"],["17","1,7","28,9","49,13"],["18","1","18","18"],["","","",""]]}'
|
|
||||||
module7:
|
|
||||||
qpcr_results: '{"data":[["Sample 1","Quantity ",null,null,null],["1","0,2",null,null,null],["2","0,5",null,null,null],["3","0,4",null,null,null],["4","1,1",null,null,null],["5","12,5",null,null,null],["6","0,05",null,null,null],["7","0",null,null,null],["8","0",null,null,null],["9","0",null,null,null],["10","0",null,null,null],["11","0",null,null,null],["12","4,7",null,null,null],["13","2,3",null,null,null],["14","5,6",null,null,null],["15","2,6",null,null,null],["16","8,9",null,null,null],["17","1,7",null,null,null],["18","1",null,null,null]]}'
|
|
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 474 KiB After Width: | Height: | Size: 474 KiB |
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 75 KiB |
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 187 KiB After Width: | Height: | Size: 187 KiB |
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 118 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
2920
app/assets/templates/experiment_1/experiment.json
Normal file
|
@ -26,7 +26,9 @@ class RepositoriesController < ApplicationController
|
||||||
|
|
||||||
def index
|
def index
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html do; end
|
format.html do
|
||||||
|
render 'empty_index' if @repositories.blank?
|
||||||
|
end
|
||||||
format.json do
|
format.json do
|
||||||
render json: prepare_repositories_datatable(@repositories, current_team, params)
|
render json: prepare_repositories_datatable(@repositories, current_team, params)
|
||||||
end
|
end
|
||||||
|
|
|
@ -25,7 +25,7 @@ class Users::SessionsController < Devise::SessionsController
|
||||||
def create
|
def create
|
||||||
super
|
super
|
||||||
|
|
||||||
generate_demo_project
|
generate_templates_project
|
||||||
end
|
end
|
||||||
|
|
||||||
def two_factor_recovery
|
def two_factor_recovery
|
||||||
|
@ -80,7 +80,7 @@ class Users::SessionsController < Devise::SessionsController
|
||||||
session.delete(:otp_user_id)
|
session.delete(:otp_user_id)
|
||||||
|
|
||||||
sign_in(user)
|
sign_in(user)
|
||||||
generate_demo_project
|
generate_templates_project
|
||||||
flash[:notice] = t('devise.sessions.signed_in')
|
flash[:notice] = t('devise.sessions.signed_in')
|
||||||
redirect_to stored_location_for(:user) || root_path
|
redirect_to stored_location_for(:user) || root_path
|
||||||
else
|
else
|
||||||
|
@ -100,7 +100,7 @@ class Users::SessionsController < Devise::SessionsController
|
||||||
session.delete(:otp_user_id)
|
session.delete(:otp_user_id)
|
||||||
if user.recover_2fa!(params[:recovery_code])
|
if user.recover_2fa!(params[:recovery_code])
|
||||||
sign_in(user)
|
sign_in(user)
|
||||||
generate_demo_project
|
generate_templates_project
|
||||||
flash[:notice] = t('devise.sessions.signed_in')
|
flash[:notice] = t('devise.sessions.signed_in')
|
||||||
redirect_to root_path
|
redirect_to root_path
|
||||||
else
|
else
|
||||||
|
@ -130,17 +130,9 @@ class Users::SessionsController < Devise::SessionsController
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def generate_demo_project
|
def generate_templates_project
|
||||||
# Schedule templates creation for user
|
# Schedule templates creation for user
|
||||||
TemplatesService.new.schedule_creation_for_user(current_user)
|
TemplatesService.new.schedule_creation_for_user(current_user)
|
||||||
|
|
||||||
# Schedule demo project creation for user
|
|
||||||
current_user.created_teams.each do |team|
|
|
||||||
FirstTimeDataGenerator.delay(
|
|
||||||
queue: :new_demo_project,
|
|
||||||
priority: 10
|
|
||||||
).seed_demo_data_with_id(current_user.id, team.id)
|
|
||||||
end
|
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
Rails.logger.fatal("User ID #{current_user.id}: Error creating inital projects on sign_in: #{e.message}")
|
Rails.logger.fatal("User ID #{current_user.id}: Error creating inital projects on sign_in: #{e.message}")
|
||||||
end
|
end
|
||||||
|
|
|
@ -43,8 +43,6 @@ class Team < ApplicationRecord
|
||||||
has_many :shared_repositories, through: :team_repositories, source: :repository
|
has_many :shared_repositories, through: :team_repositories, source: :repository
|
||||||
|
|
||||||
attr_accessor :without_templates
|
attr_accessor :without_templates
|
||||||
attr_accessor :without_intro_demo
|
|
||||||
after_create :generate_intro_demo
|
|
||||||
|
|
||||||
def default_view_state
|
def default_view_state
|
||||||
{
|
{
|
||||||
|
@ -168,15 +166,4 @@ class Team < ApplicationRecord
|
||||||
return if without_templates
|
return if without_templates
|
||||||
TemplatesService.new.delay(queue: :templates).update_team(self)
|
TemplatesService.new.delay(queue: :templates).update_team(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
include FirstTimeDataGenerator
|
|
||||||
|
|
||||||
def generate_intro_demo
|
|
||||||
return if without_intro_demo
|
|
||||||
|
|
||||||
user = User.find(created_by_id)
|
|
||||||
if user.created_teams.order(:created_at).first == self
|
|
||||||
seed_demo_data(user, self)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -57,7 +57,6 @@ class TeamImporter
|
||||||
team_last_modified_by = team.last_modified_by_id
|
team_last_modified_by = team.last_modified_by_id
|
||||||
team.last_modified_by_id = nil
|
team.last_modified_by_id = nil
|
||||||
team.without_templates = true
|
team.without_templates = true
|
||||||
team.without_intro_demo = true
|
|
||||||
team.save!
|
team.save!
|
||||||
|
|
||||||
create_users(team_json['users'], team)
|
create_users(team_json['users'], team)
|
||||||
|
|
|
@ -1,60 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module DelayedUploaderDemo
|
|
||||||
# Get asset from demo_files folder
|
|
||||||
def self.get_asset(user, team, file_name)
|
|
||||||
asset = Asset.create(
|
|
||||||
created_by: user,
|
|
||||||
team: team,
|
|
||||||
last_modified_by: user
|
|
||||||
)
|
|
||||||
asset.file.attach(io: File.open("#{Rails.root}/app/assets/demo_files/#{file_name}", 'r'), filename: file_name)
|
|
||||||
asset
|
|
||||||
end
|
|
||||||
|
|
||||||
# Generates results asset for given module, file_name assumes file is located
|
|
||||||
# in demo_files.
|
|
||||||
def self.generate_result_asset(
|
|
||||||
my_module:,
|
|
||||||
current_user:,
|
|
||||||
current_team:,
|
|
||||||
result_name:,
|
|
||||||
created_at: Time.now,
|
|
||||||
file_name:,
|
|
||||||
comment: nil
|
|
||||||
)
|
|
||||||
temp_asset = get_asset(current_user, current_team, file_name)
|
|
||||||
temp_result = Result.new(
|
|
||||||
created_at: created_at,
|
|
||||||
user: current_user,
|
|
||||||
my_module: my_module,
|
|
||||||
name: result_name,
|
|
||||||
asset: temp_asset
|
|
||||||
)
|
|
||||||
|
|
||||||
temp_result.save
|
|
||||||
|
|
||||||
# Generate comment if it exists
|
|
||||||
generate_result_comment(temp_result, current_user, comment) if comment
|
|
||||||
|
|
||||||
temp_asset.post_process_file(my_module.experiment.project.team)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Adds asset to existing step
|
|
||||||
def self.add_step_asset(step:, current_user:, current_team:, file_name:)
|
|
||||||
temp_asset =
|
|
||||||
DelayedUploaderDemo.get_asset(current_user, current_team, file_name)
|
|
||||||
step.assets << temp_asset
|
|
||||||
temp_asset.post_process_file(step.my_module.experiment.project.team)
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.generate_result_comment(result, user, message, created_at = nil)
|
|
||||||
created_at ||= result.created_at
|
|
||||||
ResultComment.create(
|
|
||||||
user: user,
|
|
||||||
message: message,
|
|
||||||
created_at: created_at,
|
|
||||||
result: result
|
|
||||||
)
|
|
||||||
end
|
|
||||||
end
|
|
29
app/views/repositories/empty_index.html.erb
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
<% provide(:head_title, t('libraries.index.head_title')) %>
|
||||||
|
<% provide(:container_class, 'no-second-nav-container') %>
|
||||||
|
|
||||||
|
<%= render partial: 'sidebar', locals: { repositories: @repositories, archived: false } %>
|
||||||
|
<div class="content-pane flexible repositories-index" data-readonly="<%= !current_user.is_admin_of_team?(current_team) %>">
|
||||||
|
<div class="content-header">
|
||||||
|
<h1 data-view-mode="active"><%= t('libraries.index.head_title') %></h1>
|
||||||
|
</div>
|
||||||
|
<div class="content-body">
|
||||||
|
<h1>
|
||||||
|
<%= t('repositories.index.empty_title') %>
|
||||||
|
</h1>
|
||||||
|
<% if can_create_repositories?(current_team) %>
|
||||||
|
<h5>
|
||||||
|
<%= t('repositories.index.empty_description_with_create') %>
|
||||||
|
</h5>
|
||||||
|
<a id="createRepoBtn" class="btn btn-primary create-new-repository" data-remote="true" href="<%= create_modal_team_repositories_path(current_team) %>">
|
||||||
|
<span class="fas fa-plus"></span>
|
||||||
|
<span class="hidden-xs"><%= t('libraries.index.no_libraries.create_new_button') %></span>
|
||||||
|
</a>
|
||||||
|
<% else %>
|
||||||
|
<h5>
|
||||||
|
<%= t('repositories.index.empty_description_no_create') %>
|
||||||
|
</h5>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%= javascript_include_tag 'repositories/index' %>
|
|
@ -1201,6 +1201,9 @@ en:
|
||||||
index:
|
index:
|
||||||
head_title: "Inventories"
|
head_title: "Inventories"
|
||||||
title: "Inventories"
|
title: "Inventories"
|
||||||
|
empty_title: "Your team has no inventories yet"
|
||||||
|
empty_description_no_create: "It would be a shame to waste all this space. Sadly you don’t have permission to add inventories. You can ask your team admin to grant you that permission."
|
||||||
|
empty_description_with_create: "It would be a shame to waste all this space. Create your first inventory now"
|
||||||
add_new_repository_tab: "Add inventory"
|
add_new_repository_tab: "Add inventory"
|
||||||
delete_flash: "\"%{name}\" inventory was successfully deleted!"
|
delete_flash: "\"%{name}\" inventory was successfully deleted!"
|
||||||
rename_flash: "\"%{old_name}\" inventory was successfully renamed to \"%{new_name}\"!"
|
rename_flash: "\"%{old_name}\" inventory was successfully renamed to \"%{new_name}\"!"
|
||||||
|
|
|
@ -13,7 +13,7 @@ Given default screen size2
|
||||||
| name | email | password | password_confirmation |
|
| name | email | password | password_confirmation |
|
||||||
| Karli Novak | nonadmin@myorg.com | mypassword1234 | mypassword1234 |
|
| Karli Novak | nonadmin@myorg.com | mypassword1234 | mypassword1234 |
|
||||||
And "nonadmin@myorg.com" is in "BioSistemika Process" team as a "admin"
|
And "nonadmin@myorg.com" is in "BioSistemika Process" team as a "admin"
|
||||||
Given Demo project exists for the "BioSistemika Process" team
|
Given Templates project exists for the "BioSistemika Process" team
|
||||||
And "nonadmin@myorg.com" is signed in with "mypassword1234"
|
And "nonadmin@myorg.com" is signed in with "mypassword1234"
|
||||||
|
|
||||||
@javascript
|
@javascript
|
||||||
|
|
|
@ -13,7 +13,7 @@ Given the following users are registered
|
||||||
| name | email | password | password_confirmation |
|
| name | email | password | password_confirmation |
|
||||||
| Karli Novak | nonadmin@myorg.com | mypassword1234 | mypassword1234 |
|
| Karli Novak | nonadmin@myorg.com | mypassword1234 | mypassword1234 |
|
||||||
And "nonadmin@myorg.com" is in "BioSistemika Process" team as a "admin"
|
And "nonadmin@myorg.com" is in "BioSistemika Process" team as a "admin"
|
||||||
Given Demo project exists for the "BioSistemika Process" team
|
Given Templates project exists for the "BioSistemika Process" team
|
||||||
And "nonadmin@myorg.com" is signed in with "mypassword1234"
|
And "nonadmin@myorg.com" is signed in with "mypassword1234"
|
||||||
|
|
||||||
@javascript @wip
|
@javascript @wip
|
||||||
|
|
|
@ -12,7 +12,7 @@ Background:
|
||||||
| name | email | password | password_confirmation |
|
| name | email | password | password_confirmation |
|
||||||
| Karli Novak | nonadmin@myorg.com | mypassword1234 | mypassword1234 |
|
| Karli Novak | nonadmin@myorg.com | mypassword1234 | mypassword1234 |
|
||||||
And "nonadmin@myorg.com" is in "BioSistemika Process" team as a "admin"
|
And "nonadmin@myorg.com" is in "BioSistemika Process" team as a "admin"
|
||||||
Given Demo project exists for the "BioSistemika Process" team
|
Given Templates project exists for the "BioSistemika Process" team
|
||||||
And "nonadmin@myorg.com" is signed in with "mypassword1234"
|
And "nonadmin@myorg.com" is signed in with "mypassword1234"
|
||||||
|
|
||||||
@javascript
|
@javascript
|
||||||
|
|
|
@ -85,12 +85,11 @@ Given(/^the "([^"]*)" team exists$/) do |team_name|
|
||||||
FactoryBot.create(:team, name: team_name)
|
FactoryBot.create(:team, name: team_name)
|
||||||
end
|
end
|
||||||
|
|
||||||
Given(/^Demo project exists for the "([^"]*)" team$/) do |team_name|
|
Given(/^Templates project exists for the "([^"]*)" team$/) do |team_name|
|
||||||
team = Team.find_by(name: team_name)
|
team = Team.find_by(name: team_name)
|
||||||
user = team.user_teams.where(role: :admin).take.user
|
user = team.user_teams.where(role: :admin).take.user
|
||||||
seed_demo_data(user, team)
|
TemplatesService.new.schedule_creation_for_user(user)
|
||||||
end
|
end
|
||||||
|
|
||||||
Given(/^I'm on the projects page of "([^"]*)" team$/) do |team_name|
|
Given(/^I'm on the projects page of "([^"]*)" team$/) do |team_name|
|
||||||
team = Team.find_by(name: team_name)
|
team = Team.find_by(name: team_name)
|
||||||
@current_user.update(current_team_id: team.id)
|
@current_user.update(current_team_id: team.id)
|
||||||
|
@ -238,5 +237,3 @@ Then('I delete downloaded file {string}') do |file_name|
|
||||||
sleep 3
|
sleep 3
|
||||||
FileUtils.rm_f(Rails.root.join(file_name))
|
FileUtils.rm_f(Rails.root.join(file_name))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,6 @@ require 'capybara/email'
|
||||||
# require 'capybara/poltergeist'
|
# require 'capybara/poltergeist'
|
||||||
Capybara.javascript_driver = :poltergeist
|
Capybara.javascript_driver = :poltergeist
|
||||||
|
|
||||||
include FirstTimeDataGenerator
|
|
||||||
|
|
||||||
Capybara.default_max_wait_time = 30
|
Capybara.default_max_wait_time = 30
|
||||||
#Capybara.asset_host = 'http://localhost:3001'
|
#Capybara.asset_host = 'http://localhost:3001'
|
||||||
Capybara.server_port = ENV['CAPYBARA_SERVER_PORT'] || 3000
|
Capybara.server_port = ENV['CAPYBARA_SERVER_PORT'] || 3000
|
||||||
|
|
|
@ -151,33 +151,4 @@ namespace :data do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
desc 'Create demo project on existing users'
|
|
||||||
task :create_demo_project_on_existing_users,
|
|
||||||
%i(slice_size) => [:environment] do |_, args|
|
|
||||||
args.with_defaults(slice_size: 800)
|
|
||||||
|
|
||||||
require "#{Rails.root}/app/utilities/first_time_data_generator"
|
|
||||||
include FirstTimeDataGenerator
|
|
||||||
|
|
||||||
Rails.logger.info('Creating demo project on existing users')
|
|
||||||
|
|
||||||
Team.all.order(updated_at: :desc)
|
|
||||||
.each_slice(args[:slice_size]).with_index do |teams, i|
|
|
||||||
Rails.logger.info("Processing slice with index #{i}. " \
|
|
||||||
"First team: #{teams.first.id}, " \
|
|
||||||
"Last team: #{teams.last.id}.")
|
|
||||||
|
|
||||||
teams.each do |team|
|
|
||||||
owner_ut = team.user_teams.where(role: 2).first
|
|
||||||
next unless owner_ut
|
|
||||||
|
|
||||||
FirstTimeDataGenerator.delay(
|
|
||||||
run_at: i.hours.from_now,
|
|
||||||
queue: :new_demo_project,
|
|
||||||
priority: 10
|
|
||||||
).seed_demo_data_with_id(owner_ut.user.id, team.id)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -7,7 +7,6 @@ FactoryBot.define do
|
||||||
description { Faker::Lorem.sentence }
|
description { Faker::Lorem.sentence }
|
||||||
space_taken { 1048576 }
|
space_taken { 1048576 }
|
||||||
without_templates { true }
|
without_templates { true }
|
||||||
without_intro_demo { true }
|
|
||||||
trait :with_members do
|
trait :with_members do
|
||||||
users { create_list :user, 3 }
|
users { create_list :user, 3 }
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,7 +4,6 @@ require 'rails_helper'
|
||||||
require 'fileutils'
|
require 'fileutils'
|
||||||
|
|
||||||
describe TemplatesService do
|
describe TemplatesService do
|
||||||
include FirstTimeDataGenerator
|
|
||||||
let!(:main_team) { create :team }
|
let!(:main_team) { create :team }
|
||||||
let!(:admin_user) { create :user }
|
let!(:admin_user) { create :user }
|
||||||
|
|
||||||
|
@ -12,84 +11,30 @@ describe TemplatesService do
|
||||||
context 'update templates project' do
|
context 'update templates project' do
|
||||||
it 'experiment is added to templates project' do
|
it 'experiment is added to templates project' do
|
||||||
create(:user_team, user: admin_user, team: main_team)
|
create(:user_team, user: admin_user, team: main_team)
|
||||||
seed_demo_data(main_team.created_by, main_team)
|
|
||||||
dj_worker = Delayed::Worker.new
|
dj_worker = Delayed::Worker.new
|
||||||
# Two runs are needed to execute additional jobs which get generated
|
|
||||||
# during first run
|
|
||||||
Delayed::Job.all.each { |job| dj_worker.run(job) }
|
|
||||||
Delayed::Job.all.each { |job| dj_worker.run(job) }
|
|
||||||
demo_exp = main_team.projects.first.experiments.first
|
|
||||||
exp_exporter = ModelExporters::ExperimentExporter.new(demo_exp.id)
|
|
||||||
exp_dir = exp_exporter.export_template_to_dir
|
|
||||||
tmplts_dir = "#{Rails.root}/tmp/testing_templates"
|
|
||||||
FileUtils.remove_dir(tmplts_dir) if Dir.exist?(tmplts_dir)
|
|
||||||
FileUtils.mkdir(tmplts_dir)
|
|
||||||
FileUtils.mv(exp_dir, "#{tmplts_dir}/experiment_#{demo_exp.id}")
|
|
||||||
templates_project =
|
templates_project =
|
||||||
create :project, name: 'Templates', template: true, team: main_team
|
create :project, name: 'Templates', template: true, team: main_team
|
||||||
create(
|
create(
|
||||||
:user_project, :owner, project: templates_project, user: admin_user
|
:user_project, :owner, project: templates_project, user: admin_user
|
||||||
)
|
)
|
||||||
ts = TemplatesService.new(tmplts_dir)
|
ts = TemplatesService.new
|
||||||
ts.update_team(main_team)
|
ts.update_team(main_team)
|
||||||
Delayed::Job.all.each { |job| dj_worker.run(job) }
|
Delayed::Job.all.each { |job| dj_worker.run(job) }
|
||||||
tmpl_exp = templates_project.experiments.first
|
tmpl_exp = templates_project.experiments.find_by(name: 'Polymerase chain reaction')
|
||||||
|
|
||||||
expect(tmpl_exp.name).to eq(demo_exp.name)
|
|
||||||
expect(tmpl_exp.uuid).to_not eq(nil)
|
expect(tmpl_exp.uuid).to_not eq(nil)
|
||||||
expect(tmpl_exp.my_modules.pluck(:name))
|
expect(tmpl_exp.my_modules.pluck(:name))
|
||||||
.to match_array(demo_exp.my_modules.active.pluck(:name))
|
.to match_array(['Data analysis - ddCq', 'Data quality control', 'Experiment design', 'qPCR',
|
||||||
|
'Reverse transcription', 'RNA isolation', 'RNA quality & quantity - BIOANALYSER',
|
||||||
|
'Sampling biological material'])
|
||||||
tmpl_tasks = tmpl_exp.my_modules
|
tmpl_tasks = tmpl_exp.my_modules
|
||||||
demo_tasks = demo_exp.my_modules.active
|
tmpl_tasks.each do |tmpl_task|
|
||||||
demo_tasks.each do |demo_task|
|
tmpl_task.protocol.steps.each do |tmpl_step|
|
||||||
tmpl_task = tmpl_tasks.find_by_name(demo_task.name)
|
|
||||||
expect(tmpl_task.name).to eq(demo_task.name)
|
|
||||||
expect(tmpl_task.task_comments.size)
|
|
||||||
.to eq(demo_task.task_comments.size)
|
|
||||||
demo_task.results.each do |demo_res|
|
|
||||||
tmpl_res = tmpl_task.results.find_by_name(demo_res.name)
|
|
||||||
expect(tmpl_res.name).to eq(demo_res.name)
|
|
||||||
if demo_res.asset
|
|
||||||
expect(tmpl_res.asset.file.attached?).to eq(true)
|
|
||||||
expect(demo_res.asset.file_name)
|
|
||||||
.to eq(tmpl_res.asset.file_name)
|
|
||||||
elsif demo_res.table
|
|
||||||
expect(demo_res.table.contents).to eq(tmpl_res.table.contents)
|
|
||||||
elsif demo_res.result_text
|
|
||||||
expect(demo_res.result_text.text).to eq(tmpl_res.result_text.text)
|
|
||||||
end
|
|
||||||
expect(demo_res.result_comments.size)
|
|
||||||
.to eq(tmpl_res.result_comments.size)
|
|
||||||
end
|
|
||||||
unless demo_task.protocol.present? &&
|
|
||||||
demo_task.protocol.steps.size.positive?
|
|
||||||
next
|
|
||||||
end
|
|
||||||
|
|
||||||
demo_task.protocol.steps.each do |demo_step|
|
|
||||||
tmpl_step = tmpl_task.protocol.steps.find_by_name(demo_step.name)
|
|
||||||
expect(demo_step.name).to eq(tmpl_step.name)
|
|
||||||
expect(demo_step.description).to eq(tmpl_step.description)
|
|
||||||
if demo_step.assets.present?
|
|
||||||
expect(demo_step.assets.map(&:file_name))
|
|
||||||
.to match_array(tmpl_step.assets.map(&:file_name))
|
|
||||||
end
|
|
||||||
tmpl_step.assets.each do |asset|
|
tmpl_step.assets.each do |asset|
|
||||||
expect(asset.file.attached?).to eq(true)
|
expect(asset.file.attached?).to eq(true)
|
||||||
end
|
end
|
||||||
if demo_step.tables.present?
|
|
||||||
expect(demo_step.tables.pluck(:contents))
|
|
||||||
.to match_array(tmpl_step.tables.pluck(:contents))
|
|
||||||
end
|
|
||||||
if demo_step.checklists.present?
|
|
||||||
expect(demo_step.checklists.pluck(:name))
|
|
||||||
.to match_array(tmpl_step.checklists.pluck(:name))
|
|
||||||
end
|
|
||||||
expect(demo_step.step_comments.size)
|
|
||||||
.to eq(tmpl_step.step_comments.size)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
FileUtils.remove_dir(tmplts_dir)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|