start fixing modules

This commit is contained in:
zmagod 2016-07-22 14:31:09 +02:00
parent 785fb2cba1
commit 389ee7ea43
4 changed files with 61 additions and 44 deletions

View file

@ -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 ----

View file

@ -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

View file

@ -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

View file

@ -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