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