From 12281630d155817367d2fc05c9f1da5708ed454d Mon Sep 17 00:00:00 2001 From: Michael Bianco Date: Mon, 18 Jun 2012 16:54:12 -0400 Subject: [PATCH 1/2] Allow multiple digital files to be attached to a single variant. Useful for multi-format ebook downloads --- app/models/spree/line_item_decorator.rb | 8 +-- app/models/spree/variant_decorator.rb | 4 +- app/views/spree/admin/digitals/_form.html.erb | 59 ++++++++++--------- 3 files changed, 36 insertions(+), 35 deletions(-) diff --git a/app/models/spree/line_item_decorator.rb b/app/models/spree/line_item_decorator.rb index 8d73a3e..abdf8be 100644 --- a/app/models/spree/line_item_decorator.rb +++ b/app/models/spree/line_item_decorator.rb @@ -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 diff --git a/app/models/spree/variant_decorator.rb b/app/models/spree/variant_decorator.rb index acf8eb5..e090aa4 100644 --- a/app/models/spree/variant_decorator.rb +++ b/app/models/spree/variant_decorator.rb @@ -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 diff --git a/app/views/spree/admin/digitals/_form.html.erb b/app/views/spree/admin/digitals/_form.html.erb index e017113..7ac9233 100644 --- a/app/views/spree/admin/digitals/_form.html.erb +++ b/app/views/spree/admin/digitals/_form.html.erb @@ -1,35 +1,36 @@ -
-
- <%= form_for(:digital, :url => { :controller => 'digitals', :action => 'create' }, :html => { :multipart => true }) do |f| %> +
+
+ <%= form_for(:digital, :url => { :controller => 'digitals', :action => 'create' }, :html => { :multipart => true }) do |f| %>
<%= Spree::Variant.model_name.human %> "<%= variant.options_text %>" - <%= f.field_container :current_file do %> - <%=t 'current_file' %>:
- <% if variant.digital? %> - <%= render variant.digital %><%= %> - <% else %> - <%=t 'none' %> - <% end %> - <% end %> - -

- <% 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 %> + <%=t 'files' %>: + <% if variant.digital? %> +

    + <% variant.digitals.each do |digital| %> +
  • + <%= render digital %>   + <%= 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 %> +
  • + <% end %> +
+ <% else %> + <%=t 'none' %> + <% end %> + <% end %> - <%= f.field_container :file do %> - <%= f.label :file, t("new_file") %> *
- <%= f.file_field :attachment %> - <% end %> - - <%= hidden_field_tag 'digital[variant_id]', variant.id %> +

+ <%= f.field_container :file do %> + <%= f.label :file, t("new_file") %> *
+ <%= f.file_field :attachment %> + <% end %> - <%= button t('spree_digital.upload') %> - <% end %> -

- -
+ <%= hidden_field_tag 'digital[variant_id]', variant.id %> + + <%= button t('spree_digital.upload') %> +

+ + <% end %> -
-

\ No newline at end of file +
From 71340444c10d48390e4de5a5f8bf970885bc6fd4 Mon Sep 17 00:00:00 2001 From: Michael Bianco Date: Mon, 18 Jun 2012 16:58:24 -0400 Subject: [PATCH 2/2] Tests are passing --- spec/models/line_item_spec.rb | 14 +++++++++----- spec/models/order_spec.rb | 16 ++++++++-------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/spec/models/line_item_spec.rb b/spec/models/line_item_spec.rb index b8a64dd..97dbc0e 100644 --- a/spec/models/line_item_spec.rb +++ b/spec/models/line_item_spec.rb @@ -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 diff --git a/spec/models/order_spec.rb b/spec/models/order_spec.rb index 404d055..b361524 100644 --- a/spec/models/order_spec.rb +++ b/spec/models/order_spec.rb @@ -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