2016-02-12 23:52:43 +08:00
|
|
|
namespace :data do
|
|
|
|
Rails.logger = Logger.new(STDOUT)
|
|
|
|
|
|
|
|
desc "Remove expired temporary files"
|
|
|
|
task clean_temp_files: :environment do
|
|
|
|
Rails.logger.info "Cleaning temporary files older than 3 days"
|
|
|
|
TempFile.where("created_at < ?", 3.days.ago).each do |tmp_file|
|
|
|
|
|
|
|
|
TempFile.transaction do
|
|
|
|
begin
|
|
|
|
tmp_file.destroy!
|
|
|
|
rescue Exception => e
|
|
|
|
Rails.logger.error "Failed to destroy temporary file #{tmp_file.id}: #{e}"
|
|
|
|
raise ActiveRecord::Rollback
|
|
|
|
else
|
|
|
|
Rails.logger.info "Temporary file ##{tmp_file.id} removed"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-07-21 19:11:15 +08:00
|
|
|
def destroy_users(users)
|
|
|
|
users.each do |user|
|
2016-02-12 23:52:43 +08:00
|
|
|
|
|
|
|
User.transaction do
|
|
|
|
begin
|
2017-01-27 17:39:57 +08:00
|
|
|
# Destroy user_team, and possibly team
|
|
|
|
if user.teams.count > 0
|
|
|
|
oids = user.teams.pluck(:id)
|
2016-07-21 19:11:15 +08:00
|
|
|
oids.each do |oid|
|
2017-01-27 17:39:57 +08:00
|
|
|
team = Team.find(oid)
|
|
|
|
user_team = user.user_teams.where(team: team).first
|
|
|
|
destroy_team = (team.users.count == 1 && team.created_by == user)
|
|
|
|
if !user_team.destroy(nil) then
|
2016-07-21 19:11:15 +08:00
|
|
|
raise Exception
|
|
|
|
end
|
2017-01-27 17:39:57 +08:00
|
|
|
team.destroy! if destroy_team
|
2016-07-21 19:11:15 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-02-12 23:52:43 +08:00
|
|
|
user.destroy!
|
|
|
|
rescue Exception => e
|
|
|
|
Rails.logger.error "Failed to destroy unconfirmed user #{user.id}: #{e}"
|
|
|
|
raise ActiveRecord::Rollback
|
|
|
|
else
|
|
|
|
Rails.logger.info "Unconfirmed user ##{user.id} removed"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-07-21 19:11:15 +08:00
|
|
|
desc "Remove unconfirmed user accounts"
|
|
|
|
task clean_unconfirmed_users: :environment do
|
|
|
|
Rails.logger.info "Cleaning unconfirmed users"
|
|
|
|
|
|
|
|
# First, remove the users who signed up by themselves
|
|
|
|
users = User
|
|
|
|
.where(confirmed_at: nil)
|
|
|
|
.where.not(confirmation_token: nil)
|
|
|
|
.where(invitation_token: nil)
|
|
|
|
.where("created_at < ?", Devise.confirm_within.ago)
|
|
|
|
destroy_users(users)
|
|
|
|
|
|
|
|
# Now, remove users who were invited
|
|
|
|
users = User
|
|
|
|
.where(confirmed_at: nil)
|
|
|
|
.where(invitation_accepted_at: nil)
|
|
|
|
.where(confirmation_token: nil)
|
|
|
|
.where.not(invitation_token: nil)
|
|
|
|
.where("created_at < ?", Devise.invite_for.ago)
|
|
|
|
destroy_users(users)
|
2018-02-26 18:05:05 +08:00
|
|
|
|
|
|
|
# Remove users who didn't finish signup with LinkedIn
|
|
|
|
users = User.joins(:user_identities)
|
|
|
|
.where(confirmed_at: nil)
|
2018-07-09 22:21:11 +08:00
|
|
|
.where('users.created_at < ?', Devise.confirm_within.ago)
|
2018-02-26 18:05:05 +08:00
|
|
|
destroy_users(users)
|
2016-07-21 19:11:15 +08:00
|
|
|
end
|
|
|
|
|
2016-02-12 23:52:43 +08:00
|
|
|
desc "Remove temporary and obsolete data"
|
|
|
|
task clean: [:environment, :clean_temp_files, :clean_unconfirmed_users]
|
|
|
|
|
2018-03-06 18:26:30 +08:00
|
|
|
desc 'Export team to directory'
|
|
|
|
task :team_export, [:team_id] => [:environment] do |_, args|
|
|
|
|
Rails.logger.info(
|
|
|
|
"Exporting team with ID:#{args[:team_id]} to directory in tmp"
|
|
|
|
)
|
2019-01-16 15:00:01 +08:00
|
|
|
te = ModelExporters::TeamExporter.new(args[:team_id])
|
2019-01-16 15:37:05 +08:00
|
|
|
te&.export_to_dir
|
2018-03-06 18:26:30 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
desc 'Import team from directory'
|
|
|
|
task :team_import, [:dir_path] => [:environment] do |_, args|
|
|
|
|
Rails.logger.info(
|
2018-03-13 00:00:44 +08:00
|
|
|
"Importing team from directory #{args[:dir_path]}"
|
2018-03-06 18:26:30 +08:00
|
|
|
)
|
|
|
|
TeamImporter.new.import_from_dir(args[:dir_path])
|
|
|
|
end
|
2018-07-26 22:15:46 +08:00
|
|
|
|
|
|
|
desc 'Delete team and all data inside the team'
|
|
|
|
task :team_delete, [:team_id] => [:environment] do |_, args|
|
|
|
|
Rails.logger.info(
|
|
|
|
"Deleting team with ID:#{args[:team_id]} and all data inside the team"
|
|
|
|
)
|
|
|
|
team = Team.find_by_id(args[:team_id])
|
|
|
|
raise StandardError, 'Can not load team' unless team
|
2019-01-16 15:37:05 +08:00
|
|
|
|
2018-07-26 22:15:46 +08:00
|
|
|
UserDataDeletion.delete_team_data(team) if team
|
|
|
|
end
|
2019-01-16 15:37:05 +08:00
|
|
|
|
|
|
|
desc 'Export experiment to directory'
|
2019-01-28 22:37:24 +08:00
|
|
|
task :experiment_template_export,
|
|
|
|
[:experiment_id] => [:environment] do |_, args|
|
2019-01-16 15:37:05 +08:00
|
|
|
Rails.logger.info(
|
2019-01-28 22:37:24 +08:00
|
|
|
"Exporting experiment template with ID:#{args[:experiment_id]} "\
|
|
|
|
"to directory in tmp"
|
2019-01-16 15:37:05 +08:00
|
|
|
)
|
|
|
|
ee = ModelExporters::ExperimentExporter.new(args[:experiment_id])
|
2019-01-25 17:50:08 +08:00
|
|
|
ee&.export_template_to_dir
|
2019-01-16 15:37:05 +08:00
|
|
|
end
|
|
|
|
|
2019-01-16 22:54:03 +08:00
|
|
|
desc 'Import experiment from directory to given project'
|
2019-01-28 22:37:24 +08:00
|
|
|
task :experiment_template_import,
|
|
|
|
%i(dir_path project_id user_id) => [:environment] do |_, args|
|
2019-01-16 22:54:03 +08:00
|
|
|
Rails.logger.info(
|
|
|
|
"Importing experiment from directory #{args[:dir_path]}"
|
|
|
|
)
|
2019-01-25 17:50:08 +08:00
|
|
|
TeamImporter.new.import_experiment_template_from_dir(args[:dir_path],
|
2019-01-16 22:54:03 +08:00
|
|
|
args[:project_id],
|
|
|
|
args[:user_id])
|
|
|
|
end
|
2019-01-25 17:50:08 +08:00
|
|
|
|
|
|
|
desc 'Update all templates projects'
|
2019-02-27 21:34:20 +08:00
|
|
|
task :update_all_templates,
|
|
|
|
%i(slice_size) => [:environment] do |_, args|
|
|
|
|
args.with_defaults(slice_size: 800)
|
|
|
|
|
2019-01-25 17:50:08 +08:00
|
|
|
Rails.logger.info('Templates, syncing all templates projects')
|
2019-02-27 21:34:20 +08:00
|
|
|
Team.all.order(updated_at: :desc)
|
|
|
|
.each_slice(args[:slice_size].to_i).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|
|
|
|
|
TemplatesService.new.delay(
|
|
|
|
run_at: i.hours.from_now,
|
|
|
|
queue: :templates,
|
2019-02-27 21:46:12 +08:00
|
|
|
priority: 5
|
2019-02-27 21:34:20 +08:00
|
|
|
).update_team(team)
|
|
|
|
end
|
|
|
|
end
|
2019-01-25 17:50:08 +08:00
|
|
|
end
|
2021-02-18 21:40:32 +08:00
|
|
|
|
|
|
|
desc 'Purge all experiment workflow images'
|
|
|
|
task purge_experiment_workflow_images: :environment do
|
|
|
|
ActiveStorage::Attachment.where(name: 'workflowimg').delete_all
|
|
|
|
end
|
|
|
|
|
|
|
|
desc 'Purge all experiment workflow images'
|
|
|
|
task cleanup_blobs: :environment do
|
|
|
|
ActiveStorage::Blob.unattached.find_each(&:purge_later)
|
|
|
|
end
|
2021-09-22 21:28:32 +08:00
|
|
|
|
|
|
|
desc 'Reset to defaults all predefined user roles'
|
|
|
|
task reset_predefined_user_roles: :environment do
|
|
|
|
ActiveRecord::Base.transaction do
|
|
|
|
%i(owner_role normal_user_role technician_role viewer_role).each do |predefined_role|
|
|
|
|
reference_role = UserRole.public_send(predefined_role)
|
|
|
|
existing_role = UserRole.find_by(name: reference_role.name)
|
|
|
|
if existing_role.present?
|
|
|
|
# rubocop:disable Rails/SkipsModelValidations
|
|
|
|
existing_role.update_attribute(:permissions, reference_role.permissions)
|
|
|
|
# rubocop:enable Rails/SkipsModelValidations
|
|
|
|
else
|
|
|
|
reference_role.save!
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2016-02-12 23:52:43 +08:00
|
|
|
end
|