mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-11-11 00:41:41 +08:00
start fixing modules
This commit is contained in:
parent
785fb2cba1
commit
389ee7ea43
4 changed files with 61 additions and 44 deletions
|
|
@ -122,7 +122,7 @@ module PermissionHelper
|
||||||
] do |proxy, *args, &block|
|
] do |proxy, *args, &block|
|
||||||
if args[0]
|
if args[0]
|
||||||
my_module = args[0]
|
my_module = args[0]
|
||||||
if my_module.active? and my_module.project.active?
|
if my_module.active? and my_module.experiment.project.active?
|
||||||
proxy.call(*args, &block)
|
proxy.call(*args, &block)
|
||||||
else
|
else
|
||||||
false
|
false
|
||||||
|
|
@ -334,11 +334,11 @@ module PermissionHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
def can_view_module(my_module)
|
def can_view_module(my_module)
|
||||||
can_view_project(my_module.project)
|
can_view_project(my_module.experiment.project)
|
||||||
end
|
end
|
||||||
|
|
||||||
def can_edit_module(my_module)
|
def can_edit_module(my_module)
|
||||||
is_user_or_higher_of_project(my_module.project)
|
is_user_or_higher_of_project(my_module.experiment.project)
|
||||||
end
|
end
|
||||||
|
|
||||||
def can_archive_module(my_module)
|
def can_archive_module(my_module)
|
||||||
|
|
@ -350,7 +350,7 @@ module PermissionHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
def can_edit_tags_for_module(my_module)
|
def can_edit_tags_for_module(my_module)
|
||||||
is_user_or_higher_of_project(my_module.project)
|
is_user_or_higher_of_project(my_module.experiment.project)
|
||||||
end
|
end
|
||||||
|
|
||||||
def can_add_tag_to_module(my_module)
|
def can_add_tag_to_module(my_module)
|
||||||
|
|
@ -362,11 +362,11 @@ module PermissionHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
def can_view_module_info(my_module)
|
def can_view_module_info(my_module)
|
||||||
can_view_project(my_module.project)
|
can_view_project(my_module.experiment.project)
|
||||||
end
|
end
|
||||||
|
|
||||||
def can_view_module_users(my_module)
|
def can_view_module_users(my_module)
|
||||||
can_view_project(my_module.project)
|
can_view_project(my_module.experiment.project)
|
||||||
end
|
end
|
||||||
|
|
||||||
def can_edit_users_on_module(my_module)
|
def can_edit_users_on_module(my_module)
|
||||||
|
|
@ -386,24 +386,24 @@ module PermissionHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
def can_view_module_activities(my_module)
|
def can_view_module_activities(my_module)
|
||||||
is_member_of_project(my_module.project)
|
is_member_of_project(my_module.experiment.project)
|
||||||
end
|
end
|
||||||
|
|
||||||
def can_view_module_comments(my_module)
|
def can_view_module_comments(my_module)
|
||||||
can_view_project(my_module.project)
|
can_view_project(my_module.experiment.project)
|
||||||
end
|
end
|
||||||
|
|
||||||
def can_add_comment_to_module(my_module)
|
def can_add_comment_to_module(my_module)
|
||||||
is_technician_or_higher_of_project(my_module.project)
|
is_technician_or_higher_of_project(my_module.experiment.project)
|
||||||
end
|
end
|
||||||
|
|
||||||
def can_view_module_samples(my_module)
|
def can_view_module_samples(my_module)
|
||||||
can_view_module(my_module) and
|
can_view_module(my_module) and
|
||||||
can_view_samples(my_module.project.organization)
|
can_view_samples(my_module.experiment.project.organization)
|
||||||
end
|
end
|
||||||
|
|
||||||
def can_view_module_archive(my_module)
|
def can_view_module_archive(my_module)
|
||||||
is_user_or_higher_of_project(my_module.project)
|
is_user_or_higher_of_project(my_module.experiment.project)
|
||||||
end
|
end
|
||||||
|
|
||||||
# ---- RESULTS PERMISSIONS ----
|
# ---- RESULTS PERMISSIONS ----
|
||||||
|
|
|
||||||
|
|
@ -22,4 +22,9 @@ class Experiment < ActiveRecord::Base
|
||||||
experiment.validates :archived_by, presence: true
|
experiment.validates :archived_by, presence: true
|
||||||
experiment.validates :archived_on, presence: true
|
experiment.validates :archived_on, presence: true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def modules_without_group
|
||||||
|
MyModule.where(experiment_id: id).where(my_module_group: nil)
|
||||||
|
.where(archived: false)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -52,12 +52,14 @@ class MyModule < ActiveRecord::Base
|
||||||
if include_archived
|
if include_archived
|
||||||
new_query = MyModule
|
new_query = MyModule
|
||||||
.distinct
|
.distinct
|
||||||
.where("my_modules.project_id IN (?)", project_ids)
|
.joins(:experiment)
|
||||||
|
.where("experiment.project_id IN (?)", project_ids)
|
||||||
.where_attributes_like([:name, :description], a_query)
|
.where_attributes_like([:name, :description], a_query)
|
||||||
else
|
else
|
||||||
new_query = MyModule
|
new_query = MyModule
|
||||||
.distinct
|
.distinct
|
||||||
.where("my_modules.project_id IN (?)", project_ids)
|
.joins(:experiment)
|
||||||
|
.where("experiment.project_id IN (?)", project_ids)
|
||||||
.where("my_modules.archived = ?", false)
|
.where("my_modules.archived = ?", false)
|
||||||
.where_attributes_like([:name, :description], a_query)
|
.where_attributes_like([:name, :description], a_query)
|
||||||
end
|
end
|
||||||
|
|
@ -285,7 +287,7 @@ class MyModule < ActiveRecord::Base
|
||||||
# Copy the module
|
# Copy the module
|
||||||
clone = MyModule.new(
|
clone = MyModule.new(
|
||||||
name: self.name,
|
name: self.name,
|
||||||
project: self.project,
|
experiment: self.experiment,
|
||||||
description: self.description,
|
description: self.description,
|
||||||
x: self.x,
|
x: self.x,
|
||||||
y: self.y)
|
y: self.y)
|
||||||
|
|
@ -318,7 +320,7 @@ class MyModule < ActiveRecord::Base
|
||||||
# Find an empty position for the restored module. It's
|
# Find an empty position for the restored module. It's
|
||||||
# basically a first empty row with x=0.
|
# basically a first empty row with x=0.
|
||||||
def get_new_position
|
def get_new_position
|
||||||
if project.blank?
|
if project.experiment.blank?
|
||||||
return { x: 0, y: 0 }
|
return { x: 0, y: 0 }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -89,12 +89,24 @@ class Project < ActiveRecord::Base
|
||||||
.limit(per_page)
|
.limit(per_page)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def project_my_modules
|
||||||
|
experiments.map{ |exp| exp.my_modules.take}
|
||||||
|
end
|
||||||
|
|
||||||
def active_modules
|
def active_modules
|
||||||
self.my_modules.where(:archived => false)
|
experiments.map do |exp|
|
||||||
|
exp.my_modules
|
||||||
|
.where(:archived => false)
|
||||||
|
.take
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def archived_modules
|
def archived_modules
|
||||||
self.my_modules.where(:archived => true)
|
experiments.map do |exp|
|
||||||
|
exp.my_modules
|
||||||
|
.where(:archived => true)
|
||||||
|
.take
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def unassigned_users
|
def unassigned_users
|
||||||
|
|
@ -110,9 +122,9 @@ class Project < ActiveRecord::Base
|
||||||
if role.blank?
|
if role.blank?
|
||||||
return MyModule.none
|
return MyModule.none
|
||||||
elsif role == "owner"
|
elsif role == "owner"
|
||||||
return self.my_modules.where(archived: false)
|
return self.active_modules
|
||||||
else
|
else
|
||||||
return self.my_modules.where(archived: false)
|
return self.active_modules
|
||||||
.joins(:user_my_modules)
|
.joins(:user_my_modules)
|
||||||
.where("user_my_modules.user_id IN (?)", user.id)
|
.where("user_my_modules.user_id IN (?)", user.id)
|
||||||
.distinct
|
.distinct
|
||||||
|
|
@ -127,19 +139,17 @@ class Project < ActiveRecord::Base
|
||||||
return (self.user_projects.select { |up| up.user == user }).first.role
|
return (self.user_projects.select { |up| up.user == user }).first.role
|
||||||
end
|
end
|
||||||
|
|
||||||
def modules_without_group
|
|
||||||
MyModule.where(project_id: id).where(my_module_group: nil)
|
|
||||||
.where(archived: false)
|
|
||||||
end
|
|
||||||
|
|
||||||
def active_module_groups
|
def active_module_groups
|
||||||
self.my_module_groups.joins(:my_modules)
|
self.experiments.each do |exp|
|
||||||
|
exp.my_module_groups.joins(:my_modules)
|
||||||
.where('my_modules.archived = ?', false)
|
.where('my_modules.archived = ?', false)
|
||||||
.distinct
|
.distinct
|
||||||
|
.take
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def assigned_samples
|
def assigned_samples
|
||||||
Sample.joins(:my_modules).where(my_modules: {id: my_modules} )
|
Sample.joins(:my_modules).where(my_modules: {id: project_my_modules} )
|
||||||
end
|
end
|
||||||
|
|
||||||
def unassigned_samples(assigned_samples)
|
def unassigned_samples(assigned_samples)
|
||||||
|
|
@ -148,7 +158,7 @@ class Project < ActiveRecord::Base
|
||||||
|
|
||||||
def space_taken
|
def space_taken
|
||||||
st = 0
|
st = 0
|
||||||
my_modules.find_each do |my_module|
|
project_my_modules.find_each do |my_module|
|
||||||
st += my_module.space_taken
|
st += my_module.space_taken
|
||||||
end
|
end
|
||||||
st
|
st
|
||||||
|
|
@ -254,23 +264,23 @@ class Project < ActiveRecord::Base
|
||||||
# Archive all modules. Receives an array of module integer IDs.
|
# Archive all modules. Receives an array of module integer IDs.
|
||||||
def archive_modules(module_ids)
|
def archive_modules(module_ids)
|
||||||
module_ids.each do |m_id|
|
module_ids.each do |m_id|
|
||||||
my_module = my_modules.find_by_id(m_id)
|
my_module = project_my_modules.find_by_id(m_id)
|
||||||
unless my_module.blank?
|
unless my_module.blank?
|
||||||
my_module.archive!
|
my_module.archive!
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
my_modules.reload
|
project_my_modules.reload
|
||||||
end
|
end
|
||||||
|
|
||||||
# Archive all modules. Receives an array of module integer IDs and current user.
|
# Archive all modules. Receives an array of module integer IDs and current user.
|
||||||
def archive_modules(module_ids, current_user)
|
def archive_modules(module_ids, current_user)
|
||||||
module_ids.each do |m_id|
|
module_ids.each do |m_id|
|
||||||
my_module = my_modules.find_by_id(m_id)
|
my_module = project_my_modules.find_by_id(m_id)
|
||||||
unless my_module.blank?
|
unless my_module.blank?
|
||||||
my_module.archive!(current_user)
|
my_module.archive!(current_user)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
my_modules.reload
|
project_my_modules.reload
|
||||||
end
|
end
|
||||||
|
|
||||||
# Add modules, and returns a map of "virtual" IDs with
|
# Add modules, and returns a map of "virtual" IDs with
|
||||||
|
|
@ -333,7 +343,7 @@ class Project < ActiveRecord::Base
|
||||||
dg = RGL::DirectedAdjacencyGraph.new
|
dg = RGL::DirectedAdjacencyGraph.new
|
||||||
connections.each do |a,b|
|
connections.each do |a,b|
|
||||||
# Check if both vertices exist
|
# Check if both vertices exist
|
||||||
if (my_modules.find_all {|m| [a.to_i, b.to_i].include? m.id }).count == 2
|
if (project_my_modules.find_all {|m| [a.to_i, b.to_i].include? m.id }).count == 2
|
||||||
dg.add_edge(a, b)
|
dg.add_edge(a, b)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -348,13 +358,13 @@ class Project < ActiveRecord::Base
|
||||||
# but keep a copy of previous state
|
# but keep a copy of previous state
|
||||||
previous_sources = {}
|
previous_sources = {}
|
||||||
previous_sources.default = []
|
previous_sources.default = []
|
||||||
my_modules.each do |m|
|
project_my_modules.each do |m|
|
||||||
previous_sources[m.id] = []
|
previous_sources[m.id] = []
|
||||||
m.inputs.each do |c|
|
m.inputs.each do |c|
|
||||||
previous_sources[m.id] << c.from
|
previous_sources[m.id] << c.from
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
my_modules.each do |m|
|
project_my_modules.each do |m|
|
||||||
unless m.outputs.destroy_all
|
unless m.outputs.destroy_all
|
||||||
raise ActiveRecord::ActiveRecordError
|
raise ActiveRecord::ActiveRecordError
|
||||||
end
|
end
|
||||||
|
|
@ -374,8 +384,8 @@ class Project < ActiveRecord::Base
|
||||||
visited = []
|
visited = []
|
||||||
# Assign samples to all new downstream modules
|
# Assign samples to all new downstream modules
|
||||||
filtered_edges.each do |a, b|
|
filtered_edges.each do |a, b|
|
||||||
source = my_modules.find(a.to_i)
|
source = project_my_modules.find(a.to_i)
|
||||||
target = my_modules.find(b.to_i)
|
target = project_my_modules.find(b.to_i)
|
||||||
# Do this only for new edges
|
# Do this only for new edges
|
||||||
if previous_sources[target.id].exclude?(source)
|
if previous_sources[target.id].exclude?(source)
|
||||||
# Go as high upstream as new edges take us
|
# Go as high upstream as new edges take us
|
||||||
|
|
@ -386,7 +396,7 @@ class Project < ActiveRecord::Base
|
||||||
|
|
||||||
# Save topological order of modules (for modules without workflow,
|
# Save topological order of modules (for modules without workflow,
|
||||||
# leave them unordered)
|
# leave them unordered)
|
||||||
my_modules.each do |m|
|
project_my_modules.each do |m|
|
||||||
if topsort.include? m.id.to_s
|
if topsort.include? m.id.to_s
|
||||||
m.workflow_order = topsort.find_index(m.id.to_s)
|
m.workflow_order = topsort.find_index(m.id.to_s)
|
||||||
else
|
else
|
||||||
|
|
@ -396,14 +406,14 @@ class Project < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
# Make sure to reload my modules, which now have updated connections and samples
|
# Make sure to reload my modules, which now have updated connections and samples
|
||||||
my_modules.reload
|
project_my_modules.reload
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
# When connections are deleted, unassign samples that
|
# When connections are deleted, unassign samples that
|
||||||
# are not inherited anymore
|
# are not inherited anymore
|
||||||
def unassign_samples_from_old_downstream_modules(sources)
|
def unassign_samples_from_old_downstream_modules(sources)
|
||||||
my_modules.each do |my_module|
|
project_my_modules.each do |my_module|
|
||||||
sources[my_module.id].each do |s|
|
sources[my_module.id].each do |s|
|
||||||
# Only do this for newly deleted connections
|
# Only do this for newly deleted connections
|
||||||
if s.outputs.map{|i| i.to}.exclude? my_module
|
if s.outputs.map{|i| i.to}.exclude? my_module
|
||||||
|
|
@ -456,17 +466,17 @@ class Project < ActiveRecord::Base
|
||||||
raise ActiveRecord::ActiveRecordError
|
raise ActiveRecord::ActiveRecordError
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
my_modules.reload
|
project_my_modules.reload
|
||||||
end
|
end
|
||||||
|
|
||||||
# Normalize module positions in this project.
|
# Normalize module positions in this project.
|
||||||
def normalize_module_positions
|
def normalize_module_positions
|
||||||
# This method normalizes module positions so x-s and y-s
|
# This method normalizes module positions so x-s and y-s
|
||||||
# are all positive
|
# are all positive
|
||||||
x_diff = (my_modules.collect { |m| m.x }).min
|
x_diff = (project_my_modules.collect { |m| m.x }).min
|
||||||
y_diff = (my_modules.collect { |m| m.y }).min
|
y_diff = (project_my_modules.collect { |m| m.y }).min
|
||||||
|
|
||||||
my_modules.each do |m|
|
project_my_modules.each do |m|
|
||||||
unless
|
unless
|
||||||
m.update_attribute(:x, m.x - x_diff) and
|
m.update_attribute(:x, m.x - x_diff) and
|
||||||
m.update_attribute(:y, m.y - y_diff)
|
m.update_attribute(:y, m.y - y_diff)
|
||||||
|
|
@ -484,7 +494,7 @@ class Project < ActiveRecord::Base
|
||||||
|
|
||||||
dg = RGL::DirectedAdjacencyGraph[]
|
dg = RGL::DirectedAdjacencyGraph[]
|
||||||
group_ids = Set.new
|
group_ids = Set.new
|
||||||
my_modules.where(archived: :false).each do |m|
|
active_modules.each do |m|
|
||||||
unless m.my_module_group.blank?
|
unless m.my_module_group.blank?
|
||||||
group_ids << m.my_module_group.id
|
group_ids << m.my_module_group.id
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue