From 1f75bc060aeedeaf60f75c65f4a5db1cc3a75fee Mon Sep 17 00:00:00 2001 From: AntonioTerceiro Date: Tue, 31 Jul 2007 13:02:43 +0000 Subject: [PATCH] r226@sede: terceiro | 2007-07-28 16:54:22 -0300 ActionItem0: bringing box from old flexible_template --- vendor/plugins/design/lib/design/box.rb | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ vendor/plugins/design/test/box_test.rb | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+), 0 deletions(-) create mode 100644 vendor/plugins/design/lib/design/box.rb create mode 100644 vendor/plugins/design/test/box_test.rb diff --git a/vendor/plugins/design/lib/design/box.rb b/vendor/plugins/design/lib/design/box.rb new file mode 100644 index 0000000..6967183 --- /dev/null +++ b/vendor/plugins/design/lib/design/box.rb @@ -0,0 +1,62 @@ +module Design + + # A design is composed of one or more boxes. Each box defines an area in the + # screen identified by a number and possibly by a name. A box contains inside + # it several Block objects, and is owner by some other object, possibly one + # from the application model. + class Box < ActiveRecord::Base + + set_table_name 'design_boxes' + + has_many :blocks + belongs_to :owner, :polymorphic => true + + validates_presence_of :owner + validates_presence_of :name + + #we cannot have two boxs with the same number to the same owner + validates_uniqueness_of :number, :scope => [:owner_type, :owner_id] + + #number could not be nil and must be an integer + validates_numericality_of :number, :only_integer => true + #TODO see the internationalization questions + #, :message => _('%{fn} must be composed only of integers.') + + # Return all blocks of the current box object sorted by the position block + def blocks_sort_by_position + self.blocks.sort{|x,y| x.position <=> y.position} + end + + def save + self[:name] ||= "Box " + self.number.to_s + super + end + + def owner= owner + self[:owner_type] = owner.class.to_s + self[:owner_id] = owner.id + n_boxes = self.owner.boxes.count if self.owner + if !n_boxes.nil? + self[:number] ||= n_boxes == 0 ? 1 : n_boxes + 1 + else + self[:number] ||= nil + end + end + + def switch_number box + throw :cant_switch_without_save if self[:id].nil? and (box.nil? or box.id.nil?) + + max_box = box.owner.boxes.count + transaction do + n = self[:number] + self[:number] = box.number + box.number = max_box + 1 + box.save + self.save + box.number = n + box.save + end + end + + end +end diff --git a/vendor/plugins/design/test/box_test.rb b/vendor/plugins/design/test/box_test.rb new file mode 100644 index 0000000..ad8b6ba --- /dev/null +++ b/vendor/plugins/design/test/box_test.rb @@ -0,0 +1,60 @@ +require File.dirname(__FILE__) + '/test_helper' + +class BoxTest < Test::Unit::TestCase + + include Design + + def setup + @owner = DesignTestUser.create!(:name => 'my test user') + end + + def teardown + Box.delete_all + DesignTestUser.delete_all + end + + def test_block_should_have_an_owner + count = Box.count + b = Box.new + b.owner = @owner + assert b.save + assert count + 1, Box.count + end + + def test_should_only_accept_integers_as_number + b = Box.new + b.number = "none" + assert !b.valid? + assert b.errors.invalid?(:number) + + b = Box.new + b.owner = @owner + b.number = 10.2 + assert !b.valid? + assert b.errors.invalid?(:number) + + b = Box.new + b.owner = @owner + b.number = 10 + assert b.save + end + + def test_should_require_unique_number + b1 = Box.new + b1.owner = @owner + assert b1.save + + b2 = Box.new + b2.owner = @owner + b2.number = b1.number + assert !b2.valid? + assert b2.errors.invalid?(:number) + end + + def test_should_require_presence_of_number + b = Box.new(:number => nil) + assert !b.valid? + assert b.errors.invalid?(:number) + end + +end -- libgit2 0.21.2