Merge pull request #18 from iloveitaly/spree-1.1

Multiple Digital Downloads for a Single Variant
This commit is contained in:
funkensturm
2012-06-23 05:47:28 -07:00
5 changed files with 53 additions and 48 deletions
+4 -4
View File
@@ -1,10 +1,8 @@
Spree::LineItem.class_eval do
has_many :digital_links, :dependent => :destroy
after_save :create_digital_links, :if => :digital?
# Is this item digital?
def digital?
variant.digital?
end
@@ -15,8 +13,10 @@ Spree::LineItem.class_eval do
def create_digital_links
digital_links.delete_all
self.quantity.times do
digital_links.create!(:digital => variant.digital)
variant.digitals.each do |digital|
self.quantity.times do
digital_links.create!(:digital => digital)
end
end
end
+2 -2
View File
@@ -1,11 +1,11 @@
Spree::Variant.class_eval do
has_one :digital, :dependent => :destroy
has_many :digitals, :dependent => :destroy
after_save :destroy_digital, :if => :deleted?
# Is this variant to be downloaded by the customer?
def digital?
digital.present?
digitals.present?
end
private
+30 -29
View File
@@ -1,35 +1,36 @@
<div class="yui-g">
<div class="yui-u first">
<%= form_for(:digital, :url => { :controller => 'digitals', :action => 'create' }, :html => { :multipart => true }) do |f| %>
<div>
<div>
<%= form_for(:digital, :url => { :controller => 'digitals', :action => 'create' }, :html => { :multipart => true }) do |f| %>
<fieldset>
<legend><%= Spree::Variant.model_name.human %> "<%= variant.options_text %>"</legend>
<%= f.field_container :current_file do %>
<strong><%=t 'current_file' %>:</strong><br/>
<% if variant.digital? %>
<%= render variant.digital %><%= %>
<% else %>
<%=t 'none' %>
<% end %>
<% end %>
<p class="form-buttons">
<% if variant.digital? %>
<%= link_to t("delete_file"), admin_product_digital_url(:id => variant.digital.id), :confirm => t('delete_file_cofirmation', :filename => variant.digital.attachment_file_name), :method => :delete %>
<% else %>
<%= f.field_container :current_file do %>
<strong><%=t 'files' %>:</strong>
<% if variant.digital? %>
<ul>
<% variant.digitals.each do |digital| %>
<li>
<%= render digital %>&nbsp;&nbsp;
<%= link_to t("delete_file"), admin_product_digital_url(:id => variant.digitals.first.id), :confirm => t('delete_file_cofirmation', :filename => variant.digitals.first.attachment_file_name), :method => :delete %>
</li>
<% end %>
</ul>
<% else %>
<%=t 'none' %>
<% end %>
<% end %>
<%= f.field_container :file do %>
<%= f.label :file, t("new_file") %> <span class="required">*</span><br/>
<%= f.file_field :attachment %>
<% end %>
<%= hidden_field_tag 'digital[variant_id]', variant.id %>
<p class="form-buttons">
<%= f.field_container :file do %>
<%= f.label :file, t("new_file") %> <span class="required">*</span><br/>
<%= f.file_field :attachment %>
<% end %>
<%= button t('spree_digital.upload') %>
<% end %>
</p>
</fieldset>
<%= hidden_field_tag 'digital[variant_id]', variant.id %>
<%= button t('spree_digital.upload') %>
</p>
</fieldset>
<% end %>
</div>
</div><br/>
</div>
+9 -5
View File
@@ -4,27 +4,31 @@ describe Spree::LineItem do
context "#save" do
it "should create one link for a single digital Variant" do
digital_variant = FactoryGirl.create(:variant, :digital => FactoryGirl.create(:digital))
digital_variant = FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)])
line_item = FactoryGirl.create(:line_item, :variant => digital_variant)
links = digital_variant.digital.digital_links
links = digital_variant.digitals.first.digital_links
links.all.size.should == 1
links.first.line_item.should == line_item
end
it "should create a link for each quantity of a digital Variant, even when quantity changes later" do
digital_variant = FactoryGirl.create(:variant, :digital => FactoryGirl.create(:digital))
digital_variant = FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)])
line_item = FactoryGirl.create(:line_item, :variant => digital_variant, :quantity => 5)
links = digital_variant.digital.digital_links
links = digital_variant.digitals.first.digital_links
links.all.size.should == 5
links.each { |link| link.line_item.should == line_item }
# quantity update
line_item.quantity = 8
line_item.save
links = digital_variant.digital.digital_links
links = digital_variant.digitals.first.digital_links
links.all.size.should == 8
links.each { |link| link.line_item.should == line_item }
end
it "should create a link for digital variants with multiple digital downloads attached" do
end
end
end
+8 -8
View File
@@ -9,9 +9,9 @@ describe Spree::Order do
context "#add_variant" do
it "should add digital Variants of quantity 1 to an order" do
order = FactoryGirl.create(:order)
order.add_variant variant1 = FactoryGirl.create(:variant, :digital => FactoryGirl.create(:digital))
order.add_variant variant2 = FactoryGirl.create(:variant, :digital => FactoryGirl.create(:digital))
order.add_variant variant3 = FactoryGirl.create(:variant, :digital => FactoryGirl.create(:digital))
order.add_variant variant1 = FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)])
order.add_variant variant2 = FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)])
order.add_variant variant3 = FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)])
order.line_items.first.variant.should == variant1
order.line_items.second.variant.should == variant2
order.line_items.third.variant.should == variant3
@@ -19,7 +19,7 @@ describe Spree::Order do
it "should handle quantity higher than 1 when adding one specific digital Variant" do
order = FactoryGirl.create(:order)
digital_variant = FactoryGirl.create(:variant, :digital => FactoryGirl.create(:digital))
digital_variant = FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)])
order.add_variant digital_variant, 3
order.line_items.first.quantity.should == 3
order.add_variant digital_variant, 2
@@ -31,21 +31,21 @@ describe Spree::Order do
it "should understand that all products are digital" do
order = FactoryGirl.create(:order)
3.times do
order.add_variant FactoryGirl.create(:variant, :digital => FactoryGirl.create(:digital))
order.add_variant FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)])
end
order.digital?.should be_true
order.add_variant FactoryGirl.create(:variant, :digital => FactoryGirl.create(:digital)), 4
order.add_variant FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)]), 4
order.digital?.should be_true
end
it "should understand that not all products are digital" do
order = FactoryGirl.create(:order)
3.times do
order.add_variant FactoryGirl.create(:variant, :digital => FactoryGirl.create(:digital))
order.add_variant FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)])
end
order.add_variant FactoryGirl.create(:variant) # this is the analog product
order.digital?.should be_false
order.add_variant FactoryGirl.create(:variant, :digital => FactoryGirl.create(:digital)), 4
order.add_variant FactoryGirl.create(:variant, :digitals => [FactoryGirl.create(:digital)]), 4
order.digital?.should be_false
end
end