mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-02-27 01:43:22 +00:00
Merge laura_and_will into icon_font
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
Darkswarm.controller "CartCtrl", ($scope, CurrentOrder) ->
|
||||
$scope.CurrentOrder = CurrentOrder
|
||||
@@ -1,10 +1,11 @@
|
||||
Darkswarm.directive "ofnEmptiesCart", (CurrentHub, Navigation) ->
|
||||
Darkswarm.directive "ofnEmptiesCart", (CurrentHub, CurrentOrder, Navigation) ->
|
||||
restrict: "A"
|
||||
scope:
|
||||
hub: '=ofnEmptiesCart'
|
||||
template: "{{action}} <strong>{{hub.name}}</strong>"
|
||||
link: (scope, elm, attr)->
|
||||
if CurrentHub.id and CurrentHub.id isnt scope.hub.id
|
||||
# A hub is selected, we're changing to a different hub, and the cart isn't empty
|
||||
if CurrentHub.id and CurrentHub.id isnt scope.hub.id and not CurrentOrder.empty()
|
||||
scope.action = attr.change
|
||||
elm.bind 'click', (ev)->
|
||||
ev.preventDefault()
|
||||
@@ -12,5 +13,3 @@ Darkswarm.directive "ofnEmptiesCart", (CurrentHub, Navigation) ->
|
||||
Navigation.go scope.hub.path
|
||||
else
|
||||
scope.action = attr.shop
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
Darkswarm.factory 'CurrentOrder', (currentOrder) ->
|
||||
new class CurrentOrder
|
||||
constructor: ->
|
||||
@[k] = v for k, v of currentOrder
|
||||
|
||||
empty: =>
|
||||
@line_items.length == 0
|
||||
@@ -15,6 +15,3 @@ footer
|
||||
&:hover, &:active, &:focus
|
||||
color: $clr-brick-bright
|
||||
@include textsoftpress
|
||||
span.email
|
||||
direction: rtl
|
||||
unicode-bidi: bidi-override
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
.producer-hero-img
|
||||
background-color: #999
|
||||
width: 100%
|
||||
min-height: 160px
|
||||
height: inherit
|
||||
max-height: 260px
|
||||
overflow: hidden
|
||||
|
||||
@@ -4,4 +4,4 @@
|
||||
.producers
|
||||
@include fullwidthbg
|
||||
background-image: url("/assets/producers/producers-pg-bg.jpg")
|
||||
background-repeat: no-repeat
|
||||
background-repeat: no-repeat
|
||||
@@ -71,3 +71,7 @@ table tr th, table tr td
|
||||
color: #333333
|
||||
table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td
|
||||
color: #333333
|
||||
|
||||
span.email
|
||||
direction: rtl
|
||||
unicode-bidi: bidi-override
|
||||
|
||||
@@ -15,11 +15,12 @@ class Enterprise < ActiveRecord::Base
|
||||
has_and_belongs_to_many :payment_methods, join_table: 'distributors_payment_methods', class_name: 'Spree::PaymentMethod', foreign_key: 'distributor_id'
|
||||
has_and_belongs_to_many :shipping_methods, join_table: 'distributors_shipping_methods', class_name: 'Spree::ShippingMethod', foreign_key: 'distributor_id'
|
||||
|
||||
|
||||
delegate :latitude, :longitude, :city, :state_name, :to => :address
|
||||
|
||||
accepts_nested_attributes_for :address
|
||||
has_attached_file :logo, :styles => { :medium => "300x300>", :thumb => "100x100>" }
|
||||
has_attached_file :promo_image, :styles => { :large => "260x1200#", :thumb => "100x100>" }
|
||||
has_attached_file :promo_image, :styles => { :large => "1200x260#", :thumb => "100x100>" }
|
||||
|
||||
validates_presence_of :name
|
||||
validates_presence_of :address
|
||||
|
||||
@@ -9,7 +9,7 @@ class EnterpriseGroup < ActiveRecord::Base
|
||||
attr_accessible :name, :description, :long_description, :on_front_page, :enterprise_ids
|
||||
|
||||
attr_accessible :promo_image
|
||||
has_attached_file :promo_image, styles: {large: "260x1200#"}
|
||||
has_attached_file :promo_image, styles: {large: "1200x260#"}
|
||||
validates_attachment_content_type :promo_image, :content_type => /\Aimage\/.*\Z/
|
||||
|
||||
attr_accessible :logo
|
||||
|
||||
10
app/models/spree/classification_decorator.rb
Normal file
10
app/models/spree/classification_decorator.rb
Normal file
@@ -0,0 +1,10 @@
|
||||
Spree::Classification.class_eval do
|
||||
before_destroy :dont_destroy_if_primary_taxon
|
||||
|
||||
def dont_destroy_if_primary_taxon
|
||||
if product.primary_taxon == taxon
|
||||
errors.add :base, "Taxon #{taxon.name} is the primary taxon of #{product.name} and cannot be deleted"
|
||||
return false
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -6,6 +6,7 @@ Spree::Product.class_eval do
|
||||
|
||||
|
||||
belongs_to :supplier, :class_name => 'Enterprise'
|
||||
belongs_to :primary_taxon, class_name: 'Spree::Taxon'
|
||||
|
||||
has_many :product_distributions, :dependent => :destroy
|
||||
has_many :distributors, :through => :product_distributions
|
||||
@@ -13,9 +14,10 @@ Spree::Product.class_eval do
|
||||
accepts_nested_attributes_for :product_distributions, :allow_destroy => true
|
||||
delegate_belongs_to :master, :unit_value, :unit_description
|
||||
|
||||
attr_accessible :supplier_id, :distributor_ids, :product_distributions_attributes, :group_buy, :group_buy_unit_size, :variant_unit, :variant_unit_scale, :variant_unit_name, :unit_value, :unit_description, :notes
|
||||
attr_accessible :supplier_id, :primary_taxon_id, :distributor_ids, :product_distributions_attributes, :group_buy, :group_buy_unit_size, :variant_unit, :variant_unit_scale, :variant_unit_name, :unit_value, :unit_description, :notes
|
||||
|
||||
validates_presence_of :supplier
|
||||
validates_presence_of :primary_taxon
|
||||
|
||||
validates_presence_of :variant_unit, if: :has_variants?
|
||||
validates_presence_of :variant_unit_scale,
|
||||
@@ -25,6 +27,7 @@ Spree::Product.class_eval do
|
||||
|
||||
after_initialize :set_available_on_to_now, :if => :new_record?
|
||||
after_save :update_units
|
||||
before_save :add_primary_taxon_to_taxons
|
||||
|
||||
|
||||
# -- Joins
|
||||
@@ -124,10 +127,6 @@ Spree::Product.class_eval do
|
||||
order_cycle.variants_distributed_by(distributor).where(product_id: self)
|
||||
end
|
||||
|
||||
def primary_taxon
|
||||
self.taxons.order.first
|
||||
end
|
||||
|
||||
# Build a product distribution for each distributor
|
||||
def build_product_distributions_for_user user
|
||||
Enterprise.is_distributor.managed_by(user).each do |distributor|
|
||||
@@ -163,6 +162,10 @@ Spree::Product.class_eval do
|
||||
end
|
||||
end
|
||||
|
||||
def add_primary_taxon_to_taxons
|
||||
taxons << primary_taxon unless taxons.find_by_id(primary_taxon)
|
||||
end
|
||||
|
||||
def self.all_variant_unit_option_types
|
||||
Spree::OptionType.where('name LIKE ?', 'unit_%%')
|
||||
end
|
||||
|
||||
4
app/overrides/add_primary_taxon_to_admin_product.rb
Normal file
4
app/overrides/add_primary_taxon_to_admin_product.rb
Normal file
@@ -0,0 +1,4 @@
|
||||
Deface::Override.new(:virtual_path => "spree/admin/products/_form",
|
||||
:insert_top => "[data-hook='admin_product_form_right']",
|
||||
:partial => "spree/admin/products/primary_taxon_form",
|
||||
:name => "add_primary_taxon_to_admin_product")
|
||||
4
app/overrides/add_primary_taxon_to_admin_product_new.rb
Normal file
4
app/overrides/add_primary_taxon_to_admin_product_new.rb
Normal file
@@ -0,0 +1,4 @@
|
||||
Deface::Override.new(:virtual_path => "spree/admin/products/new",
|
||||
:insert_before => "[data-hook='new_product_attrs']",
|
||||
:partial => "spree/admin/products/primary_taxon_form",
|
||||
:name => "add_primary_taxon_to_admin_product_new")
|
||||
@@ -4,4 +4,3 @@
|
||||
= f.label :notes, t(:notes)
|
||||
= f.text_area :notes, { :class => 'fullwidth', rows: 5 }
|
||||
= f.error_message_on :notes
|
||||
|
||||
|
||||
@@ -168,7 +168,7 @@
|
||||
%br
|
||||
100 x 100 pixels
|
||||
.omega.eight.columns
|
||||
= image_tag @object.logo.url if @object.logo.present?
|
||||
= image_tag @object.logo(:medium) if @object.logo.present?
|
||||
= f.file_field :logo
|
||||
.row
|
||||
.alpha.three.columns
|
||||
@@ -177,5 +177,5 @@
|
||||
%a What's this?
|
||||
|
||||
.omega.eight.columns
|
||||
= image_tag @object.promo_image.url if @object.promo_image.present?
|
||||
= image_tag @object.promo_image(:large) if @object.promo_image.present?
|
||||
= f.file_field :promo_image
|
||||
|
||||
13
app/views/json/_current_order.rabl
Normal file
13
app/views/json/_current_order.rabl
Normal file
@@ -0,0 +1,13 @@
|
||||
object current_order
|
||||
attributes :id, :item_total
|
||||
|
||||
if current_order
|
||||
child line_items: :line_items do
|
||||
attributes :id, :variant_id, :quantity, :price
|
||||
end
|
||||
|
||||
node :cart_count do
|
||||
cart_count
|
||||
end
|
||||
end
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
%body.off-canvas{"ng-app" => "Darkswarm"}
|
||||
= inject_json "currentHub", "current_hub"
|
||||
= inject_json "currentOrder", "current_order"
|
||||
= inject_json "user", "current_user"
|
||||
|
||||
.off-canvas-wrap{offcanvas: true}
|
||||
|
||||
@@ -2,6 +2,6 @@
|
||||
%i.ofn-i_040-hub>
|
||||
Food Hubs
|
||||
%h5 Our food hubs are the point of contact between you and the people who make your food!
|
||||
%p You can search for a convenient hub by location or name. Some hubs have multiple points where you can pick-up your purchases, and some will also provide delivery options. Each food hub is a sales point with independent business operations and logisitics - so variations between hubs are to be expected.
|
||||
%p You can only shop one food hub at a time.
|
||||
%p You can search for a convenient hub by location or name. Some hubs have multiple points where you can pick-up your purchases, and some will also provide delivery options. Each food hub is a sales point with independent business operations and logistics - so variations between hubs are to be expected.
|
||||
%p You can only shop at one food hub at a time.
|
||||
%a.close-reveal-modal{"ng-click" => "$close()"} ×
|
||||
|
||||
@@ -1,44 +1,46 @@
|
||||
%ofn-modal{title: "{{producer.name}}"}
|
||||
.row
|
||||
.columns.small-12.producer-hero
|
||||
%img.producer-hero-img{"ng-src" => "{{producer.promo_image}}"}
|
||||
/ Will - scale large images down to 1200px wide, crop in to img aspect ratio 60W:13H
|
||||
.small-12.columns.producer-hero
|
||||
%h3.producer-name {{ producer.name }}
|
||||
%img.producer-hero-img{"ng-src" => "{{producer.promo_image}}"}
|
||||
|
||||
.row
|
||||
.columns.small-12.large-6{"ng-bind-html" => "producer.long_description"}
|
||||
.columns.small-12.large-6
|
||||
.small-12.large-6.columns
|
||||
%p{"ng-bind-html" => "producer.long_description"}
|
||||
.small-12.large-6.columns
|
||||
%img.producer-logo{"ng-src" => "{{producer.logo}}", "ng-if" => "producer.logo"}
|
||||
%h4 Stay in touch with {{ producer.name }}
|
||||
%h5 Stay in touch with {{ producer.name }}
|
||||
|
||||
%ul.small-block-grid-1{bindonce: true}
|
||||
|
||||
%li{"ng-if" => "producer.website"}
|
||||
%a{"ng-href" => "http://{{producer.website | stripUrl}}", target: "_blank" }
|
||||
%i.ofn-i_049-web
|
||||
{{ producer.website | stripUrl }}
|
||||
|
||||
|
||||
%li{"ng-if" => "producer.email"}
|
||||
%a{"ng-href" => "mailto:{{producer.email | stripUrl}}", target: "_blank" }
|
||||
%i.ofn-i_050-mail-circle
|
||||
{{ producer.email | stripUrl }}
|
||||
|
||||
|
||||
%li{"ng-if" => "producer.twitter"}
|
||||
%a{"ng-href" => "http://twitter.com/{{producer.twitter}}", target: "_blank"}
|
||||
%i.ofn-i_041-twitter
|
||||
{{ producer.twitter }}
|
||||
|
||||
|
||||
%li{"ng-if" => "producer.facebook"}
|
||||
%a{"ng-href" => "http://{{producer.facebook | stripUrl}}", target: "_blank"}
|
||||
%i.ofn-i_044-facebook
|
||||
{{ producer.facebook | stripUrl }}
|
||||
|
||||
|
||||
%li{"ng-if" => "producer.linkedin"}
|
||||
%a{"ng-href" => "http://{{producer.linkedin | stripUrl}}", target: "_blank"}
|
||||
%i.ofn-i_042-linkedin
|
||||
{{ producer.linkedin | stripUrl }}
|
||||
|
||||
|
||||
%li{"ng-if" => "producer.instagram"}
|
||||
%a{"ng-href" => "http://instagram.com/{{producer.instagram}}", target: "_blank"}
|
||||
%i.ofn-i_043-instagram
|
||||
{{ producer.instagram }}
|
||||
|
||||
|
||||
|
||||
%a.close-reveal-modal{"ng-click" => "$close()"} ×
|
||||
|
||||
5
app/views/shared/menu/_cart.html.haml
Normal file
5
app/views/shared/menu/_cart.html.haml
Normal file
@@ -0,0 +1,5 @@
|
||||
%a.icon{href: cart_url, "ng-controller" => "CartCtrl"}
|
||||
%i.fi-shopping-cart.nav-branded
|
||||
%span
|
||||
{{ CurrentOrder.cart_count }}
|
||||
items
|
||||
@@ -43,8 +43,4 @@
|
||||
%span.nav-primary.nav-branded {{ CurrentHub.name }}
|
||||
%li.divider
|
||||
%li.cart
|
||||
%a.icon{href: cart_url}
|
||||
%i.ofn-i_027-shopping-cart.nav-branded
|
||||
%span
|
||||
= cart_count
|
||||
items
|
||||
= render partial: "shared/menu/cart"
|
||||
@@ -3,11 +3,7 @@
|
||||
%a.left-off-canvas-toggle.menu-icon
|
||||
%span
|
||||
%section.right
|
||||
%a.nav-branded.icon{href: cart_url}
|
||||
%i.ofn-i_027-shopping-cart
|
||||
%span
|
||||
= cart_count
|
||||
items
|
||||
= render partial: "shared/menu/cart"
|
||||
%a{href: main_app.shop_path}
|
||||
{{ CurrentHub.name }}
|
||||
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
.content#about
|
||||
%img.about.right{src: current_distributor.promo_image.url(:large)}
|
||||
%p= current_distributor.long_description.andand.html_safe
|
||||
.row
|
||||
.small-12.large-9.columns
|
||||
%p= current_distributor.long_description.andand.html_safe
|
||||
.small-12.large-3.columns
|
||||
%img.about.right{src: current_distributor.promo_image.url(:large)}
|
||||
|
||||
|
||||
@@ -1,15 +1,55 @@
|
||||
/ Will for all the things: please add logic to include this /only/ if data is available
|
||||
|
||||
.content#contact
|
||||
.panel
|
||||
%p
|
||||
%strong E
|
||||
%a{href: "mailto:#{current_distributor.email}"}= current_distributor.email
|
||||
- unless current_distributor.website.blank?
|
||||
%br
|
||||
%strong W
|
||||
%a{href: current_distributor.website}= current_distributor.website
|
||||
%br
|
||||
= [current_distributor.address.address1, current_distributor.address.address2].join ", "
|
||||
%br
|
||||
= current_distributor.address.city
|
||||
= current_distributor.address.state
|
||||
= current_distributor.address.zipcode
|
||||
.row
|
||||
.small-12.large-4.columns
|
||||
%h4=current_distributor.name
|
||||
%p
|
||||
= current_distributor.address.address1
|
||||
- unless current_distributor.address.address2.blank?
|
||||
%br
|
||||
= current_distributor.address.address2
|
||||
%br
|
||||
= current_distributor.address.city
|
||||
= current_distributor.address.state
|
||||
= current_distributor.address.zipcode
|
||||
|
||||
.small-12.large-8.columns
|
||||
%ul.small-block-grid-1.large-block-grid-2{bindonce: true}
|
||||
- unless current_distributor.website.blank?
|
||||
%li
|
||||
%a{href: current_distributor.website, target: "_blank" }
|
||||
%i.fi-web
|
||||
= current_distributor.website
|
||||
|
||||
- unless current_distributor.email.blank?
|
||||
%li
|
||||
%a{href: current_distributor.email.reverse, mailto: true }
|
||||
%i.fi-mail
|
||||
%span.email
|
||||
= current_distributor.email.reverse
|
||||
|
||||
- unless current_distributor.twitter.blank?
|
||||
%li
|
||||
%a{href: current_distributor.twitter, target: "_blank" }
|
||||
%i.fi-social-twitter
|
||||
= current_distributor.twitter
|
||||
|
||||
- unless current_distributor.facebook.blank?
|
||||
%li
|
||||
%a{href: current_distributor.facebook, target: "_blank" }
|
||||
%i.fi-social-facebook
|
||||
= current_distributor.facebook
|
||||
|
||||
- unless current_distributor.linkedin.blank?
|
||||
%li
|
||||
%a{href: current_distributor.linkedin, target: "_blank" }
|
||||
%i.fi-social-linkedin
|
||||
= current_distributor.linkedin
|
||||
|
||||
- unless current_distributor.instagram.blank?
|
||||
%li
|
||||
%a{href: current_distributor.instagram, target: "_blank" }
|
||||
%i.fi-social-instagram
|
||||
= current_distributor.instagram
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
.content
|
||||
%ul
|
||||
- for group in current_distributor.groups
|
||||
%li
|
||||
%a{href: main_app.groups_path(anchor: "#/#group#{group.id}")}= group.name
|
||||
.row
|
||||
.small-12.columns
|
||||
%h5
|
||||
=current_distributor.name
|
||||
belongs to:
|
||||
%ul.ofn-list
|
||||
- for group in current_distributor.groups
|
||||
%li
|
||||
%a{href: main_app.groups_path(anchor: "#/#group#{group.id}")}= group.name
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
.content#producers{"ng-controller" => "ProducersTabCtrl"}
|
||||
%ul
|
||||
%li{"ng-repeat" => "producer in CurrentHub.producers"}
|
||||
= render partial: "modals/producer"
|
||||
.row
|
||||
.small-12.columns
|
||||
%h5
|
||||
= "#{current_distributor.name}'s producers:"
|
||||
%ul.ofn-list
|
||||
%li{"ng-repeat" => "producer in CurrentHub.producers"}
|
||||
= render partial: "modals/producer"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#tabs{"ng-controller" => "TabsCtrl"}
|
||||
.row
|
||||
%tabset
|
||||
- for name, heading in { about: "About Us",
|
||||
%tabset.small-12.columns
|
||||
- for name, heading in { about: "About #{current_distributor.name}",
|
||||
producers: "Producers",
|
||||
groups: "Groups",
|
||||
contact: "Contact"}
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
Paperclip::Attachment.default_options[:convert_options] = {
|
||||
Paperclip::Attachment.default_options[:source_file_options] = {
|
||||
all: "-auto-orient"
|
||||
}
|
||||
|
||||
@@ -1,7 +1,15 @@
|
||||
class AddPrimaryTaxonToProducts < ActiveRecord::Migration
|
||||
def change
|
||||
add_column :spree_products, :primary_taxon_id, :integer
|
||||
<<<<<<< HEAD
|
||||
<<<<<<< HEAD
|
||||
add_index :spree_products, :primary_taxon_id
|
||||
add_foreign_key :spree_products, :spree_taxons, column: :primary_taxon_id
|
||||
=======
|
||||
>>>>>>> fd1e7eb... Adding primary taxon field to product
|
||||
=======
|
||||
add_index :spree_products, :primary_taxon_id
|
||||
add_foreign_key :spree_products, :spree_taxons, column: :primary_taxon_id
|
||||
>>>>>>> 110a6f2... Adding primary taxon to admin forms
|
||||
end
|
||||
end
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
#
|
||||
# It's strongly recommended to check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(:version => 20140522015012) do
|
||||
ActiveRecord::Schema.define(:version => 20140522044009) do
|
||||
|
||||
create_table "adjustment_metadata", :force => true do |t|
|
||||
t.integer "adjustment_id"
|
||||
@@ -681,6 +681,7 @@ ActiveRecord::Schema.define(:version => 20140522015012) do
|
||||
t.float "variant_unit_scale"
|
||||
t.string "variant_unit_name"
|
||||
t.text "notes"
|
||||
t.integer "primary_taxon_id"
|
||||
end
|
||||
|
||||
add_index "spree_products", ["available_on"], :name => "index_products_on_available_on"
|
||||
@@ -688,6 +689,7 @@ ActiveRecord::Schema.define(:version => 20140522015012) do
|
||||
add_index "spree_products", ["name"], :name => "index_products_on_name"
|
||||
add_index "spree_products", ["permalink"], :name => "index_products_on_permalink"
|
||||
add_index "spree_products", ["permalink"], :name => "permalink_idx_unique", :unique => true
|
||||
add_index "spree_products", ["primary_taxon_id"], :name => "index_spree_products_on_primary_taxon_id"
|
||||
|
||||
create_table "spree_products_promotion_rules", :id => false, :force => true do |t|
|
||||
t.integer "product_id"
|
||||
@@ -1092,6 +1094,7 @@ ActiveRecord::Schema.define(:version => 20140522015012) do
|
||||
add_foreign_key "spree_products", "enterprises", name: "spree_products_supplier_id_fk", column: "supplier_id"
|
||||
add_foreign_key "spree_products", "spree_shipping_categories", name: "spree_products_shipping_category_id_fk", column: "shipping_category_id"
|
||||
add_foreign_key "spree_products", "spree_tax_categories", name: "spree_products_tax_category_id_fk", column: "tax_category_id"
|
||||
add_foreign_key "spree_products", "spree_taxons", name: "spree_products_primary_taxon_id_fk", column: "primary_taxon_id"
|
||||
|
||||
add_foreign_key "spree_products_promotion_rules", "spree_products", name: "spree_products_promotion_rules_product_id_fk", column: "product_id"
|
||||
add_foreign_key "spree_products_promotion_rules", "spree_promotion_rules", name: "spree_products_promotion_rules_promotion_rule_id_fk", column: "promotion_rule_id"
|
||||
|
||||
@@ -10,6 +10,6 @@ describe Spree::Admin::BaseController do
|
||||
|
||||
it "redirects to Angular login" do
|
||||
get :index
|
||||
response.should redirect_to root_path(anchor: "login?after_login=#{spree.admin_path}")
|
||||
response.should redirect_to root_path(anchor: "login?after_login=/anonymous")
|
||||
end
|
||||
end
|
||||
|
||||
@@ -2,6 +2,9 @@ require 'ffaker'
|
||||
require 'spree/core/testing_support/factories'
|
||||
|
||||
FactoryGirl.define do
|
||||
factory :classification, class: Spree::Classification do
|
||||
end
|
||||
|
||||
factory :order_cycle, :parent => :simple_order_cycle do
|
||||
coordinator_fees { [create(:enterprise_fee, enterprise: coordinator)] }
|
||||
|
||||
@@ -150,6 +153,9 @@ end
|
||||
|
||||
|
||||
FactoryGirl.modify do
|
||||
factory :product do
|
||||
primary_taxon { Spree::Taxon.first || FactoryGirl.create(:taxon) }
|
||||
end
|
||||
factory :simple_product do
|
||||
# Fix product factory name sequence with Kernel.rand so it is not interpreted as a Spree::Product method
|
||||
# Pull request: https://github.com/spree/spree/pull/1964
|
||||
@@ -157,6 +163,7 @@ FactoryGirl.modify do
|
||||
sequence(:name) { |n| "Product ##{n} - #{Kernel.rand(9999)}" }
|
||||
|
||||
supplier { Enterprise.is_primary_producer.first || FactoryGirl.create(:supplier_enterprise) }
|
||||
primary_taxon { Spree::Taxon.first || FactoryGirl.create(:taxon) }
|
||||
on_hand 3
|
||||
|
||||
variant_unit 'weight'
|
||||
|
||||
@@ -223,20 +223,19 @@ feature %q{
|
||||
scenario "creating a new product" do
|
||||
s = FactoryGirl.create(:supplier_enterprise)
|
||||
d = FactoryGirl.create(:distributor_enterprise)
|
||||
taxon = create(:taxon)
|
||||
|
||||
login_to_admin_section
|
||||
|
||||
visit '/admin/products/bulk_edit'
|
||||
|
||||
#save_screenshot "/Users/willmarshall/Desktop/foo.png"
|
||||
#save_and_open_page
|
||||
find("a", text: "NEW PRODUCT").click
|
||||
|
||||
page.should have_content 'NEW PRODUCT'
|
||||
|
||||
fill_in 'product_name', :with => 'Big Bag Of Apples'
|
||||
select(s.name, :from => 'product_supplier_id')
|
||||
fill_in 'product_price', :with => '10.00'
|
||||
select taxon.name, from: 'product_primary_taxon_id'
|
||||
click_button 'Create'
|
||||
|
||||
URI.parse(current_url).path.should == '/admin/products/bulk_edit'
|
||||
|
||||
@@ -6,6 +6,7 @@ feature %q{
|
||||
} do
|
||||
include AuthenticationWorkflow
|
||||
include WebHelper
|
||||
let!(:taxon) { create(:taxon) }
|
||||
|
||||
background do
|
||||
@supplier = create(:supplier_enterprise, :name => 'New supplier')
|
||||
@@ -22,6 +23,7 @@ feature %q{
|
||||
|
||||
fill_in 'product_name', with: 'A new product !!!'
|
||||
fill_in 'product_price', with: '19.99'
|
||||
select taxon.name, from: "product_primary_taxon_id"
|
||||
select 'New supplier', from: 'product_supplier_id'
|
||||
|
||||
click_button 'Create'
|
||||
@@ -43,6 +45,8 @@ feature %q{
|
||||
|
||||
product.reload
|
||||
product.distributors.sort.should == [@distributors[0], @distributors[2]].sort
|
||||
|
||||
|
||||
product.product_distributions.map { |pd| pd.enterprise_fee }.sort.should == [@enterprise_fees[0], @enterprise_fees[2]].sort
|
||||
end
|
||||
|
||||
@@ -96,6 +100,7 @@ feature %q{
|
||||
|
||||
page.should have_selector('#product_supplier_id')
|
||||
select 'Another Supplier', :from => 'product_supplier_id'
|
||||
select taxon.name, from: "product_primary_taxon_id"
|
||||
|
||||
# Should only have suppliers listed which the user can manage
|
||||
within "#product_supplier_id" do
|
||||
|
||||
@@ -432,8 +432,8 @@ describe Enterprise do
|
||||
let(:supplier) { create(:supplier_enterprise) }
|
||||
let(:taxon1) { create(:taxon) }
|
||||
let(:taxon2) { create(:taxon) }
|
||||
let(:product1) { create(:simple_product, taxons: [taxon1]) }
|
||||
let(:product2) { create(:simple_product, taxons: [taxon1, taxon2]) }
|
||||
let(:product1) { create(:simple_product, primary_taxon: taxon1, taxons: [taxon1]) }
|
||||
let(:product2) { create(:simple_product, primary_taxon: taxon1, taxons: [taxon1, taxon2]) }
|
||||
|
||||
it "gets all taxons of all distributed products" do
|
||||
Spree::Product.stub(:in_distributor).and_return [product1, product2]
|
||||
|
||||
15
spec/models/spree/classification_spec.rb
Normal file
15
spec/models/spree/classification_spec.rb
Normal file
@@ -0,0 +1,15 @@
|
||||
require 'spec_helper'
|
||||
|
||||
module Spree
|
||||
describe Classification do
|
||||
let(:product) { create(:simple_product) }
|
||||
let(:taxon) { create(:taxon) }
|
||||
let(:classification) { create(:classification, taxon: taxon, product: product) }
|
||||
|
||||
it "won't destroy if classification is the primary taxon" do
|
||||
product.primary_taxon = taxon
|
||||
classification.destroy.should be_false
|
||||
classification.errors.messages[:base].should == ["Taxon #{taxon.name} is the primary taxon of #{product.name} and cannot be deleted"]
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -5,6 +5,7 @@ module Spree
|
||||
|
||||
describe "associations" do
|
||||
it { should belong_to(:supplier) }
|
||||
it { should belong_to(:primary_taxon) }
|
||||
it { should have_many(:product_distributions) }
|
||||
end
|
||||
|
||||
@@ -13,6 +14,12 @@ module Spree
|
||||
create(:product).should be_valid
|
||||
end
|
||||
|
||||
it "requires a primary taxon" do
|
||||
product = create(:simple_product)
|
||||
product.primary_taxon = nil
|
||||
product.should_not be_valid
|
||||
end
|
||||
|
||||
it "requires a supplier" do
|
||||
product = create(:simple_product)
|
||||
product.supplier = nil
|
||||
@@ -565,10 +572,10 @@ module Spree
|
||||
describe "Taxons" do
|
||||
let(:taxon1) { create(:taxon) }
|
||||
let(:taxon2) { create(:taxon) }
|
||||
let(:product) { create(:simple_product, taxons: [taxon1, taxon2]) }
|
||||
let(:product) { create(:simple_product) }
|
||||
|
||||
it "returns the first taxon as the primary taxon" do
|
||||
product.primary_taxon.should == taxon1
|
||||
product.taxons.should == [product.primary_taxon]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user