Duplicate methods are moved of a module, and very similar methods are
generated programatically, which is a lot fewer lines, but slightly less
readable.

Reviewed-by: Nick Lewis <n...@puppetlabs.com>
Signed-off-by: Matt Robinson <m...@puppetlabs.com>
---
Local-branch: ticket/master/8878_add_nodes_from_group_page
 app/models/node.rb       |    9 +-----
 app/models/node_class.rb |    9 +-----
 app/models/node_group.rb |   75 +++++++++++++--------------------------------
 lib/find_from_form.rb    |    9 +++++
 4 files changed, 33 insertions(+), 69 deletions(-)
 create mode 100644 lib/find_from_form.rb

diff --git a/app/models/node.rb b/app/models/node.rb
index 045c40e..43c351c 100644
--- a/app/models/node.rb
+++ b/app/models/node.rb
@@ -4,6 +4,7 @@ class Node < ActiveRecord::Base
   def self.per_page; 20 end # Pagination
 
   include NodeGroupGraph
+  extend FindFromForm
 
   validates_presence_of :name
   validates_uniqueness_of :name
@@ -248,12 +249,4 @@ class Node < ActiveRecord::Base
     options = {:conditions => "metrics.category = 'resources' AND metrics.name 
= '#{resource_status}'", :joins => 'left join metrics on metrics.report_id = 
nodes.last_apply_report_id'}
     ['all', 'index'].include?(scope) ? Node.sum(:value, options).to_i : 
Node.send(scope).sum(:value, options).to_i
   end
-
-  def self.find_from_form_names(*names)
-    names.reject(&:blank?).map{|name| self.find_by_name(name)}.uniq
-  end
-
-  def self.find_from_form_ids(*ids)
-    ids.map{|entry| entry.to_s.split(/[ 
,]/)}.flatten.reject(&:blank?).uniq.map{|id| self.find(id)}
-  end
 end
diff --git a/app/models/node_class.rb b/app/models/node_class.rb
index bf55370..f2b6710 100644
--- a/app/models/node_class.rb
+++ b/app/models/node_class.rb
@@ -2,6 +2,7 @@ class NodeClass < ActiveRecord::Base
   def self.per_page; 50 end # Pagination
 
   include NodeGroupGraph
+  extend FindFromForm
 
   has_many :node_group_class_memberships, :dependent => :destroy
   has_many :node_class_memberships, :dependent => :destroy
@@ -27,14 +28,6 @@ class NodeClass < ActiveRecord::Base
     super({:methods => :description, :only => [:name, :id]}.merge(options))
   end
 
-  def self.find_from_form_names(*names)
-    names.reject(&:blank?).map{|name| self.find_by_name(name)}.uniq
-  end
-
-  def self.find_from_form_ids(*ids)
-    ids.map{|entry| entry.to_s.split(/[ 
,]/)}.flatten.reject(&:blank?).uniq.map{|id| self.find(id)}
-  end
-
   def <=>(rhs)
     self.name <=> rhs.name
   end
diff --git a/app/models/node_group.rb b/app/models/node_group.rb
index 01f0f62..d7bdc6d 100644
--- a/app/models/node_group.rb
+++ b/app/models/node_group.rb
@@ -2,6 +2,7 @@ class NodeGroup < ActiveRecord::Base
   def self.per_page; 50 end # Pagination
 
   include NodeGroupGraph
+  extend FindFromForm
 
   has_many :node_group_class_memberships, :dependent => :destroy
   has_many :node_classes, :through => :node_group_class_memberships
@@ -39,59 +40,27 @@ class NodeGroup < ActiveRecord::Base
     super({:methods => :description, :only => [:name, :id]}.merge(options))
   end
 
-  attr_accessor :node_names
-  attr_accessor :node_ids
-  before_validation :assign_nodes
-  def assign_nodes
-    return true unless @node_ids || @node_names
-    raise NodeClassificationDisabledError.new unless 
SETTINGS.use_external_node_classification
-    nodes = []
-    nodes << Node.find_from_form_names(*@node_names) if @node_names
-    nodes << Node.find_from_form_ids(*@node_ids)     if @node_ids
-
-    self.nodes = nodes.flatten.uniq
-  rescue ActiveRecord::RecordInvalid => e
-    self.errors.add_to_base(e.message)
-    return false
-  end
-
-  attr_accessor :node_class_names
-  attr_accessor :node_class_ids
-  before_validation :assign_node_classes
-  def assign_node_classes
-    return true unless @node_class_ids || @node_class_names
-    raise NodeClassificationDisabledError.new unless 
SETTINGS.use_external_node_classification
-    node_classes = []
-    node_classes << NodeClass.find_from_form_names(*@node_class_names) if 
@node_class_names
-    node_classes << NodeClass.find_from_form_ids(*@node_class_ids)     if 
@node_class_ids
-
-    self.node_classes = node_classes.flatten.uniq
-  rescue ActiveRecord::RecordInvalid => e
-    self.errors.add_to_base(e.message)
-    return false
-  end
-
-  attr_accessor :node_group_names
-  attr_accessor :node_group_ids
-  before_validation :assign_node_groups
-  def assign_node_groups
-    return true unless @node_group_ids || @node_group_names
-    node_groups = []
-    node_groups << NodeGroup.find_from_form_names(*@node_group_names) if 
@node_group_names
-    node_groups << NodeGroup.find_from_form_ids(*@node_group_ids)     if 
@node_group_ids
-
-    self.node_groups = node_groups.flatten.uniq
-  rescue ActiveRecord::RecordInvalid => e
-    self.errors.add_to_base(e.message)
-    return false
-  end
-
-  def self.find_from_form_names(*names)
-    names.reject(&:blank?).map{|name| self.find_by_name(name)}.uniq
-  end
-
-  def self.find_from_form_ids(*ids)
-    ids.map{|entry| entry.to_s.split(/[ 
,]/)}.flatten.reject(&:blank?).uniq.map{|id| self.find(id)}
+  ['node', 'node_class', 'node_group'].each do |model|
+    attr_accessor "#{model}_names"
+    attr_accessor "#{model}_ids"
+    before_validation "assign_#{model.pluralize}"
+
+    define_method("assign_#{model.pluralize}") do
+      names = instance_variable_get("@#{model}_names")
+      ids = instance_variable_get("@#{model}_ids")
+      begin
+        return true unless ids || names
+        raise NodeClassificationDisabledError.new unless 
SETTINGS.use_external_node_classification
+        nodes = []
+        nodes << model.camelize.constantize.find_from_form_names(*names) if 
names
+        nodes << model.camelize.constantize.find_from_form_ids(*ids)     if ids
+
+        send("#{model.pluralize}=", nodes.flatten.uniq)
+      rescue ActiveRecord::RecordInvalid, ActiveRecord::RecordNotFound => e
+        self.errors.add_to_base(e.message)
+        return false
+      end
+    end
   end
 
   def <=>(rhs)
diff --git a/lib/find_from_form.rb b/lib/find_from_form.rb
new file mode 100644
index 0000000..875b9bb
--- /dev/null
+++ b/lib/find_from_form.rb
@@ -0,0 +1,9 @@
+module FindFromForm
+  def find_from_form_names(*names)
+    names.reject(&:blank?).map{|name| self.find_by_name(name)}.uniq
+  end
+
+  def find_from_form_ids(*ids)
+    ids.map{|entry| entry.to_s.split(/[ 
,]/)}.flatten.reject(&:blank?).uniq.map{|id| self.find(id)}
+  end
+end
-- 
1.7.3.1

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to puppet-dev@googlegroups.com.
To unsubscribe from this group, send email to 
puppet-dev+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.

Reply via email to