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

View file

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

View file

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

View file

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