spree_multi_vendor 2.2.0 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +7 -0
- data/.travis.yml +1 -8
- data/Gemfile +5 -2
- data/README.md +39 -24
- data/app/controllers/spree/admin/vendor_settings_controller.rb +1 -1
- data/app/controllers/spree/admin/vendors_controller.rb +10 -2
- data/app/controllers/spree/api/v1/vendors_controller.rb +1 -1
- data/app/controllers/spree/api/v2/storefront/vendors_controller.rb +6 -1
- data/app/controllers/spree_multi_vendor/spree/api/base_controller_decorator.rb +2 -2
- data/app/controllers/spree_multi_vendor/spree/api/v1/products_controller_decorator.rb +1 -1
- data/app/controllers/spree_multi_vendor/spree/api/v1/users_controller_decorator.rb +1 -1
- data/app/finders/spree_multi_vendor/products_finder_decorator.rb +1 -1
- data/app/helpers/spree_multi_vendor/spree/api/api_helpers_decorator.rb +1 -1
- data/app/models/spree/vendor.rb +1 -1
- data/app/models/spree/vendor_ability.rb +1 -1
- data/app/models/spree_multi_vendor/spree/variant_decorator.rb +0 -1
- data/app/overrides/spree/admin/users/_form.rb +1 -1
- data/app/views/spree/admin/vendor_settings/edit.html.erb +1 -1
- data/app/views/spree/admin/vendors/_form.html.erb +1 -1
- data/app/views/spree/admin/vendors/index.html.erb +1 -1
- data/config/initializers/spree_permitted_attributes.rb +0 -2
- data/config/locales/es.yml +3 -0
- data/config/routes.rb +1 -1
- data/db/migrate/20210728120649_change_vendorized_models_vendor_id_type.rb +10 -0
- data/db/migrate/20210728120910_change_vendor_id_and_user_id_type_for_spree_vendor_users.rb +14 -0
- data/db/migrate/20210728121024_change_vendor_id_and_order_id_type_for_spree_order_commissions.rb +14 -0
- data/{app/models → lib}/spree_multi_vendor/configuration.rb +0 -0
- data/lib/spree_multi_vendor/engine.rb +10 -0
- data/lib/spree_multi_vendor/version.rb +1 -1
- data/lib/spree_multi_vendor.rb +3 -1
- data/spec/factories/spree/vendor_factory.rb +6 -0
- data/spec/features/spree/admin/orders_spec.rb +5 -4
- data/spec/features/spree/admin/vendor_settings_spec.rb +6 -8
- data/spec/requests/spree/api/v2/storefront/products_spec.rb +2 -1
- data/spec/requests/spree/api/v2/storefront/vendors_spec.rb +66 -0
- data/spec/spec_helper.rb +3 -1
- data/spree_multi_vendor.gemspec +5 -4
- metadata +20 -37
- data/Appraisals +0 -11
- data/gemfiles/spree_4_2.gemfile +0 -9
- data/gemfiles/spree_master.gemfile +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c5387ab5edeed4f158bfb7e5f264800ea5b02efc14c2048957501948c406dcca
|
4
|
+
data.tar.gz: 523fd3aea41eea77295a9f34d33ee3bcfb08dd9b615ddba74eda769b8e65f326
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9a8768042a152773ff4059c05c4e49f5102048cc3538e0289a9f015daa4afe0bae20124bbd8a96f61bb4d2a6f48033b4c4f2cbefcc1650c1e1ff83211f6b20b6
|
7
|
+
data.tar.gz: 97901fc6622e7d5c208656630865c01da883cac4ee158309b62bce59984c69357b971a128257dca459e556ced2097ce3ecb5aec664b297ebeb0eaffb31dc2b18
|
data/.travis.yml
CHANGED
@@ -11,6 +11,7 @@ addons:
|
|
11
11
|
services:
|
12
12
|
- mysql
|
13
13
|
- postgresql
|
14
|
+
- redis-server
|
14
15
|
|
15
16
|
language: ruby
|
16
17
|
|
@@ -22,14 +23,6 @@ env:
|
|
22
23
|
- DB=mysql
|
23
24
|
- DB=postgres
|
24
25
|
|
25
|
-
gemfile:
|
26
|
-
- gemfiles/spree_4_2.gemfile
|
27
|
-
- gemfiles/spree_master.gemfile
|
28
|
-
|
29
|
-
jobs:
|
30
|
-
allow_failures:
|
31
|
-
- gemfile: gemfiles/spree_master.gemfile
|
32
|
-
|
33
26
|
before_install:
|
34
27
|
- mysql -u root -e "GRANT ALL ON *.* TO 'travis'@'%';"
|
35
28
|
|
data/Gemfile
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
gem 'spree', github: 'spree/spree', branch: '
|
4
|
-
gem '
|
3
|
+
gem 'spree', github: 'spree/spree', branch: 'main'
|
4
|
+
gem 'spree_backend', github: 'spree/spree_backend', branch: 'main'
|
5
|
+
gem 'spree_frontend', github: 'spree/spree_legacy_frontend', branch: 'main'
|
6
|
+
gem 'spree_emails', github: 'spree/spree', branch: 'main'
|
7
|
+
gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: 'main'
|
5
8
|
gem 'rails-controller-testing'
|
6
9
|
|
7
10
|
gemspec
|
data/README.md
CHANGED
@@ -1,30 +1,31 @@
|
|
1
1
|
# Spree Multi Vendor
|
2
2
|
|
3
|
-
[![Build Status](https://travis-ci.org/spree-contrib/spree_multi_vendor.svg?branch=master)](https://travis-ci.org/spree-contrib/spree_multi_vendor)
|
4
|
-
|
5
3
|
This is a [spree multi vendor marketplace](https://spreecommerce.org/use-cases/multi-vendor-marketplace/) extension. It's a great starting point if you're building a marketplace on top of [Spree](https://spreecommerce.org). Our goal was flexibility to allow you to tweak it to your needs.
|
6
4
|
|
7
|
-
|
8
|
-
|
9
|
-
Developed and maintained by:
|
10
|
-
|
11
|
-
[![Spark Solutions](http://sparksolutions.co/wp-content/uploads/2015/01/logo-ss-tr-221x100.png)][spark]
|
5
|
+
## Developed by
|
12
6
|
|
13
|
-
|
7
|
+
[![Vendo](https://assets-global.website-files.com/6230c485f2c32ea1b0daa438/623372f40a8c54ca9aea34e8_vendo%202.svg)](https://getvendo.com?utm_source=spree_multi_vendor_github)
|
14
8
|
|
15
|
-
|
9
|
+
> All-in-one platform for all your Marketplace and B2B eCommerce needs. [Start your 30-day free trial](https://e98esoirr8c.typeform.com/contactvendo?typeform-source=spree_multi_vendor_github)
|
16
10
|
|
17
|
-
|
18
|
-
- [X] Products
|
19
|
-
- [X] Stock Locations
|
20
|
-
- [X] Shipping Methods
|
21
|
-
- [X] Vendor profile
|
11
|
+
## Open source vs Vendo
|
22
12
|
|
23
|
-
|
24
|
-
- [X] Super Admins can assign Users to Vendors
|
25
|
-
- [X] You can modify which permissions and models/resources Vendors can manage quite easily
|
13
|
+
If you need a product that has all of the features out of the box, such us supplier onboarding, Stripe connect payment splitting and payouts, and don't require any custom development - we recommend using [Vendo](http://getvendo.com?utm_source=spree_multi_vendor_github) which is also based on Spree.
|
26
14
|
|
27
|
-
|
15
|
+
| feature | open source | [vendo] |
|
16
|
+
|---|---|---|
|
17
|
+
| basic vendorization | ✔️ | ✔️ |
|
18
|
+
| supplier onboarding | | ✔️ |
|
19
|
+
| supplier dashboard | | ✔️ |
|
20
|
+
| supplier management | | ✔️ |
|
21
|
+
| supplier product curation | | ✔️ |
|
22
|
+
| automatic payment splitting | | ✔️ |
|
23
|
+
| automatic payouts | | ✔️ |
|
24
|
+
| Afterpay / klarna / apple pay | | ✔️ |
|
25
|
+
| shopify / bigcommerce / woocommerce integration | | ✔️ |
|
26
|
+
| USPS, UPS, FedEx, DHL, and more | | ✔️ |
|
27
|
+
| bulk upload / import of products from CSV and XSLX | | ✔️ |
|
28
|
+
| bulk export of orders, shipments and more | | ✔️ |
|
28
29
|
|
29
30
|
## Installation
|
30
31
|
|
@@ -97,6 +98,17 @@ Spree Multi Vendor adds new [API v2](https://api.spreecommerce.org/docs/api-v2/a
|
|
97
98
|
|
98
99
|
`/api/v2/storefront/vendors/test-vendor?include=image,products`
|
99
100
|
|
101
|
+
2. `GET` Returns a list of Vendors
|
102
|
+
|
103
|
+
```
|
104
|
+
/api/v2/storefront/vendors
|
105
|
+
```
|
106
|
+
|
107
|
+
you can also include Vendor image and/or Products in that call:
|
108
|
+
|
109
|
+
`/api/v2/storefront/vendors?include=image,products`
|
110
|
+
|
111
|
+
|
100
112
|
And modfies existing:
|
101
113
|
|
102
114
|
1. `GET` Filtering Products by Vendor ID(s):
|
@@ -154,13 +166,16 @@ and may be redistributed under the terms specified in the
|
|
154
166
|
|
155
167
|
[LICENSE]: https://github.com/spark-solutions/spree_braintree_vzero/blob/master/LICENSE
|
156
168
|
|
157
|
-
## About
|
169
|
+
## About Vendo
|
170
|
+
|
171
|
+
<a href="https://getvendo.com?utm_source=spree_multi_vendor_github">
|
172
|
+
<img src="https://uploads-ssl.webflow.com/6230c485f2c32ea1b0daa438/62386b96518cdcbe111f134a_OG%20Image%20(2).png" style="max-height:400px" />
|
173
|
+
</a>
|
158
174
|
|
159
|
-
[
|
175
|
+
> [Vendo][vendo] is a great fit for marketplaces of all sizes - either with own fulfillment and multiple warehouses or in a dropshipping model. Vendo **automates everything** from **vendor onboarding**, accepting buyer **payments in over 135 currencies**, to supplier **payouts in 50 countries**.
|
160
176
|
|
161
|
-
|
177
|
+
> Vendo ensures excellent buyer experience with smooth product discovery and search, a multitude of payment methods and optimal shipping cost calculation. Vendo keeps suppliers happy with easy onboarding, automated products sync using their preferred method and easy payouts.
|
162
178
|
|
163
|
-
|
164
|
-
We are [available for hire][spark].
|
179
|
+
> [Start your 30-day free trial](https://e98esoirr8c.typeform.com/contactvendo?typeform-source=spree_multi_vendor_github)
|
165
180
|
|
166
|
-
[
|
181
|
+
[vendo]:http://getvendo.com?utm_source=spree_multi_vendor_github
|
@@ -3,14 +3,14 @@ module Spree
|
|
3
3
|
class VendorsController < ResourceController
|
4
4
|
|
5
5
|
def create
|
6
|
-
if permitted_resource_params[:image]
|
6
|
+
if permitted_resource_params[:image]
|
7
7
|
@vendor.build_image(attachment: permitted_resource_params.delete(:image))
|
8
8
|
end
|
9
9
|
super
|
10
10
|
end
|
11
11
|
|
12
12
|
def update
|
13
|
-
if permitted_resource_params[:image]
|
13
|
+
if permitted_resource_params[:image]
|
14
14
|
@vendor.create_image(attachment: permitted_resource_params.delete(:image))
|
15
15
|
end
|
16
16
|
format_translations if defined? SpreeGlobalize
|
@@ -40,10 +40,18 @@ module Spree
|
|
40
40
|
@search = vendors.ransack(params[:q])
|
41
41
|
|
42
42
|
@collection = @search.result.
|
43
|
+
includes(vendor_includes).
|
43
44
|
page(params[:page]).
|
44
45
|
per(params[:per_page])
|
45
46
|
end
|
46
47
|
|
48
|
+
def vendor_includes
|
49
|
+
{
|
50
|
+
image: [],
|
51
|
+
products: []
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
47
55
|
def format_translations
|
48
56
|
return if params[:vendor][:translations_attributes].blank?
|
49
57
|
params[:vendor][:translations_attributes].each do |_, data|
|
@@ -3,7 +3,7 @@ module Spree
|
|
3
3
|
module V2
|
4
4
|
module Storefront
|
5
5
|
class VendorsController < ::Spree::Api::V2::ResourceController
|
6
|
-
|
6
|
+
|
7
7
|
private
|
8
8
|
|
9
9
|
def model_class
|
@@ -21,6 +21,11 @@ module Spree
|
|
21
21
|
def resource_serializer
|
22
22
|
Spree::V2::Storefront::VendorSerializer
|
23
23
|
end
|
24
|
+
|
25
|
+
def collection_serializer
|
26
|
+
Spree::V2::Storefront::VendorSerializer
|
27
|
+
end
|
28
|
+
|
24
29
|
end
|
25
30
|
end
|
26
31
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module SpreeMultiVendor::Spree::Api::BaseControllerDecorator
|
2
|
-
Spree::Api::BaseController.include(Spree::Api::VendorHelper)
|
2
|
+
Spree::Api::V1::BaseController.include(Spree::Api::VendorHelper) if SpreeMultiVendor::Engine.api_v1_available?
|
3
3
|
|
4
4
|
def self.prepended(base)
|
5
5
|
base.helper_method :current_spree_vendor
|
@@ -14,4 +14,4 @@ module SpreeMultiVendor::Spree::Api::BaseControllerDecorator
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
::Spree::Api::BaseController.prepend SpreeMultiVendor::Spree::Api::BaseControllerDecorator
|
17
|
+
::Spree::Api::V1::BaseController.prepend SpreeMultiVendor::Spree::Api::BaseControllerDecorator if SpreeMultiVendor::Engine.api_v1_available?
|
@@ -6,4 +6,4 @@ module SpreeMultiVendor::Spree::Api::V1::ProductsControllerDecorator
|
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
9
|
-
Spree::Api::V1::ProductsController.prepend SpreeMultiVendor::Spree::Api::V1::ProductsControllerDecorator
|
9
|
+
Spree::Api::V1::ProductsController.prepend SpreeMultiVendor::Spree::Api::V1::ProductsControllerDecorator if SpreeMultiVendor::Engine.api_v1_available?
|
@@ -10,4 +10,4 @@ module SpreeMultiVendor::Spree::Api::V1::UsersControllerDecorator
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
Spree::Api::V1::UsersController.prepend SpreeMultiVendor::Spree::Api::V1::UsersControllerDecorator
|
13
|
+
Spree::Api::V1::UsersController.prepend SpreeMultiVendor::Spree::Api::V1::UsersControllerDecorator if SpreeMultiVendor::Engine.api_v1_available?
|
data/app/models/spree/vendor.rb
CHANGED
@@ -61,7 +61,7 @@ module Spree
|
|
61
61
|
private
|
62
62
|
|
63
63
|
def create_stock_location
|
64
|
-
stock_locations.where(name: name, country: Spree::
|
64
|
+
stock_locations.where(name: name, country: Spree::Store.default.default_country).first_or_create!
|
65
65
|
end
|
66
66
|
|
67
67
|
def should_generate_new_friendly_id?
|
@@ -48,7 +48,7 @@ class Spree::VendorAbility
|
|
48
48
|
end
|
49
49
|
|
50
50
|
if order_scope.present?
|
51
|
-
can %i[admin index edit update cart], Spree::Order, order_scope.merge(state: 'complete')
|
51
|
+
can %i[admin show index edit update cart], Spree::Order, order_scope.merge(state: 'complete')
|
52
52
|
else
|
53
53
|
cannot_display_model(Spree::Order)
|
54
54
|
end
|
@@ -7,7 +7,6 @@ module SpreeMultiVendor::Spree::VariantDecorator
|
|
7
7
|
|
8
8
|
def vendor
|
9
9
|
@vendor ||= if self.class.reflect_on_association(:vendor) && self[:vendor_id].present?
|
10
|
-
product.vendor
|
11
10
|
::Spree::Vendor.unscoped.find(self[:vendor_id])
|
12
11
|
elsif Spree::Product.reflect_on_association(:vendor) && product.vendor_id.present?
|
13
12
|
product.vendor
|
@@ -5,7 +5,7 @@ Deface::Override.new(
|
|
5
5
|
text: <<-HTML
|
6
6
|
<% if current_spree_user.respond_to?(:has_spree_role?) && current_spree_user.has_spree_role?(:admin) %>
|
7
7
|
<%= f.field_container :vendor_ids, class: ['form-group'] do %>
|
8
|
-
<%= f.label :vendor_ids,
|
8
|
+
<%= f.label :vendor_ids, plural_resource_name(Spree::Vendor) %>
|
9
9
|
<%= f.collection_select(:vendor_ids, Spree::Vendor.all, :id, :name, { }, { class: 'select2', multiple: true }) %>
|
10
10
|
<% end %>
|
11
11
|
<% end %>
|
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
<%= form_for [:admin, @vendor], url: admin_vendor_settings_url do |f| %>
|
6
6
|
<fieldset>
|
7
|
-
<%= render partial: 'spree/shared/error_messages', locals: { target: @vendor } %>
|
7
|
+
<%= render partial: 'spree/admin/shared/error_messages', locals: { target: @vendor } %>
|
8
8
|
<div class="form-group">
|
9
9
|
<%= f.field_container :name do %>
|
10
10
|
<%= f.label :name %>
|
@@ -6,7 +6,5 @@ module Spree
|
|
6
6
|
|
7
7
|
@@vendor_attributes = [:name, :about_us, :contact_us, :notification_email]
|
8
8
|
@@vendor_attributes << :image if Spree.version.to_f >= 3.6
|
9
|
-
|
10
|
-
@@product_attributes << :vendor_id if SpreeMultiVendor::Config[:vendorized_models].include?('product')
|
11
9
|
end
|
12
10
|
end
|
data/config/locales/es.yml
CHANGED
@@ -7,9 +7,11 @@ es:
|
|
7
7
|
attributes:
|
8
8
|
spree/vendor:
|
9
9
|
about_us: Acerca de
|
10
|
+
commission_rate: Porcentaje Comisión
|
10
11
|
contact_us: Contáctanos
|
11
12
|
image: Imagen
|
12
13
|
name: Nombre
|
14
|
+
notification_email: Email notificación pedido
|
13
15
|
state: estado
|
14
16
|
created_at: creado en
|
15
17
|
priority: prioridad
|
@@ -21,6 +23,7 @@ es:
|
|
21
23
|
order_mailer:
|
22
24
|
vendor_notification_email:
|
23
25
|
dear_vendor: Estimado vendedor,
|
26
|
+
order_summary: Resumen del pedido
|
24
27
|
subject: Notificación de vendedor
|
25
28
|
thanks: Gracias
|
26
29
|
vendor: Vendedor
|
data/config/routes.rb
CHANGED
@@ -0,0 +1,10 @@
|
|
1
|
+
class ChangeVendorizedModelsVendorIdType < ActiveRecord::Migration[4.2]
|
2
|
+
def change
|
3
|
+
SpreeMultiVendor.vendorized_models.each do |klass|
|
4
|
+
change_column klass.table_name, :vendor_id, :bigint
|
5
|
+
rescue
|
6
|
+
message = "Could not change vendor_id column for spree_#{klass}"
|
7
|
+
Rails.logger.error message
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class ChangeVendorIdAndUserIdTypeForSpreeVendorUsers < ActiveRecord::Migration[4.2]
|
2
|
+
def up
|
3
|
+
change_table(:spree_vendor_users) do |t|
|
4
|
+
t.change :vendor_id, :bigint
|
5
|
+
t.change :user_id, :bigint
|
6
|
+
end
|
7
|
+
end
|
8
|
+
def down
|
9
|
+
change_table(:spree_vendor_users) do |t|
|
10
|
+
t.change :vendor_id, :integer
|
11
|
+
t.change :user_id, :integer
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/db/migrate/20210728121024_change_vendor_id_and_order_id_type_for_spree_order_commissions.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
class ChangeVendorIdAndOrderIdTypeForSpreeOrderCommissions < ActiveRecord::Migration[4.2]
|
2
|
+
def up
|
3
|
+
change_table(:spree_order_commissions) do |t|
|
4
|
+
t.change :vendor_id, :bigint
|
5
|
+
t.change :order_id, :bigint
|
6
|
+
end
|
7
|
+
end
|
8
|
+
def down
|
9
|
+
change_table(:spree_order_commissions) do |t|
|
10
|
+
t.change :vendor_id, :integer
|
11
|
+
t.change :order_id, :integer
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
File without changes
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require_relative 'configuration'
|
2
|
+
|
1
3
|
module SpreeMultiVendor
|
2
4
|
class Engine < Rails::Engine
|
3
5
|
require 'spree/core'
|
@@ -13,12 +15,20 @@ module SpreeMultiVendor
|
|
13
15
|
SpreeMultiVendor::Config = SpreeMultiVendor::Configuration.new
|
14
16
|
end
|
15
17
|
|
18
|
+
config.after_initialize do
|
19
|
+
::Spree::PermittedAttributes.product_attributes << :vendor_id if SpreeMultiVendor::Config[:vendorized_models].include?('product')
|
20
|
+
end
|
21
|
+
|
16
22
|
def self.activate
|
17
23
|
Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
|
18
24
|
Rails.configuration.cache_classes ? require(c) : load(c)
|
19
25
|
end
|
20
26
|
end
|
21
27
|
|
28
|
+
def self.api_v1_available?
|
29
|
+
@@api_v1_available ||= Gem::Specification.find_all_by_name('spree_api_v1').any?
|
30
|
+
end
|
31
|
+
|
22
32
|
config.to_prepare &method(:activate).to_proc
|
23
33
|
end
|
24
34
|
end
|
data/lib/spree_multi_vendor.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'spree_core'
|
2
|
+
require 'spree_backend'
|
3
|
+
require 'spree_emails'
|
2
4
|
require 'spree_multi_vendor/engine'
|
3
5
|
require 'spree_multi_vendor/version'
|
4
6
|
require 'spree_extension'
|
@@ -8,7 +10,7 @@ module SpreeMultiVendor
|
|
8
10
|
# TODO: this should be moved into preferences
|
9
11
|
def self.vendorized_models
|
10
12
|
SpreeMultiVendor::Config[:vendorized_models].map(&:classify).map do |class_name|
|
11
|
-
"Spree::#{class_name}".safe_constantize
|
13
|
+
"::Spree::#{class_name}".safe_constantize
|
12
14
|
end.compact.uniq
|
13
15
|
end
|
14
16
|
end
|
@@ -9,6 +9,12 @@ FactoryBot.define do
|
|
9
9
|
state { :active }
|
10
10
|
end
|
11
11
|
|
12
|
+
factory :active_vendor_list do
|
13
|
+
name { "#{FFaker::Company.name} #{FFaker::Company.suffix }" }
|
14
|
+
state { :active }
|
15
|
+
end
|
16
|
+
|
17
|
+
|
12
18
|
factory :pending_vendor do
|
13
19
|
name { 'Pending vendor' }
|
14
20
|
state { :pending }
|
@@ -1,13 +1,14 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
RSpec.feature 'Admin Orders', :js do
|
4
|
+
let(:store) { Spree::Store.default }
|
4
5
|
let(:vendor) { create(:active_vendor, name: 'Vendor') }
|
5
6
|
let(:vendor_2) { create(:active_vendor, name: 'Other vendor') }
|
6
|
-
let(:order) { create(:order, ship_address: create(:address), bill_address: create(:address)) }
|
7
|
-
let(:order_2) { create(:order) }
|
7
|
+
let(:order) { create(:order, ship_address: create(:address), bill_address: create(:address), store: store) }
|
8
|
+
let(:order_2) { create(:order, store: store) }
|
8
9
|
let!(:user) { create(:user, vendors: [vendor]) }
|
9
|
-
let(:product) { create(:product_in_stock, vendor: vendor) }
|
10
|
-
let(:product_2) { create(:product_in_stock, vendor: vendor_2) }
|
10
|
+
let(:product) { create(:product_in_stock, vendor: vendor, stores:[store]) }
|
11
|
+
let(:product_2) { create(:product_in_stock, vendor: vendor_2,stores:[store]) }
|
11
12
|
|
12
13
|
before do
|
13
14
|
create(:line_item, order: order, product: product)
|
@@ -42,13 +42,11 @@ RSpec.feature 'Admin Vendor Settings', :js do
|
|
42
42
|
expect(page).not_to have_text 'contact_us can\'t be blank'
|
43
43
|
end
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
expect(page).to have_css("img[src*='thinking-cat.jpg']")
|
51
|
-
end
|
45
|
+
scenario 'can update an existing vendor image' do
|
46
|
+
create(:vendor, name: 'New vendor')
|
47
|
+
page.attach_file("vendor_image", Spree::Core::Engine.root + 'spec/fixtures' + 'thinking-cat.jpg')
|
48
|
+
click_button 'Update'
|
49
|
+
expect(page).to have_css("img[src*='thinking-cat.jpg']")
|
52
50
|
end
|
53
51
|
end
|
54
52
|
|
@@ -70,7 +68,7 @@ RSpec.feature 'Admin Vendor Settings', :js do
|
|
70
68
|
|
71
69
|
it 'renders forbidden page' do
|
72
70
|
visit spree.admin_vendor_settings_path
|
73
|
-
expect(current_path).to eq spree.
|
71
|
+
expect(current_path).to eq spree.admin_forbidden_path
|
74
72
|
end
|
75
73
|
end
|
76
74
|
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe 'API V2 Storefront Products Spec', type: :request do
|
4
|
-
let
|
4
|
+
let(:store) { Spree::Store.default }
|
5
|
+
let!(:products) { create_list(:product, 5, stores: [store]) }
|
5
6
|
let!(:vendor) { create(:vendor) }
|
6
7
|
let!(:vendor_2) { create(:vendor) }
|
7
8
|
|
@@ -5,6 +5,8 @@ describe 'API V2 Storefront Vendor Spec', type: :request do
|
|
5
5
|
let!(:vendor_image) { create(:vendor_image) }
|
6
6
|
let!(:vendor) { create(:active_vendor, name: 'vendor', image: vendor_image) }
|
7
7
|
let!(:product) { create(:product, vendor: vendor) }
|
8
|
+
let!(:vendors) {
|
9
|
+
create_list(:active_vendor_list, 30)}
|
8
10
|
|
9
11
|
describe 'vendors#show' do
|
10
12
|
context 'with invalid slug param' do
|
@@ -49,4 +51,68 @@ describe 'API V2 Storefront Vendor Spec', type: :request do
|
|
49
51
|
end
|
50
52
|
end
|
51
53
|
end
|
54
|
+
|
55
|
+
|
56
|
+
describe 'vendors#index' do
|
57
|
+
context 'returns vendors list' do
|
58
|
+
|
59
|
+
it 'must return a list of vendor paged' do
|
60
|
+
get "/api/v2/storefront/vendors"
|
61
|
+
expect(response).to have_http_status(:ok)
|
62
|
+
json_response = JSON.parse(response.body)
|
63
|
+
expect(json_response)
|
64
|
+
expect(json_response['data'].count).to eq (25)
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'can request different pages' do
|
68
|
+
get "/api/v2/storefront/vendors?page=2"
|
69
|
+
expect(response).to have_http_status(:ok)
|
70
|
+
json_response = JSON.parse(response.body)
|
71
|
+
expect(json_response)
|
72
|
+
expect(json_response['data'].count).to eq (6)
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'can control paging size' do
|
77
|
+
get "/api/v2/storefront/vendors?page=2&per_page=10"
|
78
|
+
expect(response).to have_http_status(:ok)
|
79
|
+
json_response = JSON.parse(response.body)
|
80
|
+
expect(json_response)
|
81
|
+
expect(json_response['data'].count).to eq (10)
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
it 'returns data type vendor' do
|
86
|
+
get "/api/v2/storefront/vendors"
|
87
|
+
json_response = JSON.parse(response.body)
|
88
|
+
expect(json_response)
|
89
|
+
expect(json_response['data'][0]['type']).to eq('vendor')
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'does not return included' do
|
93
|
+
get "/api/v2/storefront/vendors"
|
94
|
+
json_response = JSON.parse(response.body)
|
95
|
+
expect(json_response.keys).to contain_exactly('data', "links", "meta")
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
context 'with products and images included' do
|
100
|
+
before { get "/api/v2/storefront/vendors?include=products,image" }
|
101
|
+
|
102
|
+
it_behaves_like 'returns 200 HTTP status'
|
103
|
+
|
104
|
+
it 'returns product information' do
|
105
|
+
json_response = JSON.parse(response.body)
|
106
|
+
expect(json_response.keys).to contain_exactly('data', 'included', "links", "meta")
|
107
|
+
expect(json_response['included'].first['id']).to eq(product.id.to_s)
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'returns image information' do
|
111
|
+
json_response = JSON.parse(response.body)
|
112
|
+
expect(json_response.keys).to contain_exactly('data', 'included',"links", "meta")
|
113
|
+
|
114
|
+
expect(json_response['included'].second['id']).to eq(vendor_image.id.to_s)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
52
118
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -8,4 +8,6 @@ require 'spree_dev_tools/rspec/spec_helper'
|
|
8
8
|
|
9
9
|
# Requires supporting ruby files with custom matchers and macros, etc,
|
10
10
|
# in spec/support/ and its subdirectories.
|
11
|
-
Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].sort.each { |f| require f }
|
11
|
+
Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].sort.each { |f| require f }
|
12
|
+
|
13
|
+
ActiveJob::Base.queue_adapter = :inline
|
data/spree_multi_vendor.gemspec
CHANGED
@@ -14,7 +14,7 @@ Gem::Specification.new do |s|
|
|
14
14
|
|
15
15
|
s.author = 'Spark Solutions'
|
16
16
|
s.email = 'we@sparksolutions.co'
|
17
|
-
s.homepage = 'https://
|
17
|
+
s.homepage = 'https://spreecommerce.org/use-cases/multi-vendor-marketplace-demo/'
|
18
18
|
s.license = 'BSD-3-Clause'
|
19
19
|
|
20
20
|
s.metadata = {
|
@@ -29,11 +29,12 @@ Gem::Specification.new do |s|
|
|
29
29
|
s.require_path = 'lib'
|
30
30
|
s.requirements << 'none'
|
31
31
|
|
32
|
-
spree_version = '>= 4.
|
33
|
-
s.add_dependency '
|
34
|
-
s.add_dependency 'spree_api', spree_version
|
32
|
+
spree_version = '>= 4.3.0.rc1'
|
33
|
+
s.add_dependency 'spree', spree_version
|
35
34
|
s.add_dependency 'spree_backend', spree_version
|
35
|
+
s.add_dependency 'spree_emails', spree_version
|
36
36
|
s.add_dependency 'spree_extension'
|
37
|
+
|
37
38
|
s.add_dependency 'deface', '~> 1.0'
|
38
39
|
|
39
40
|
s.add_development_dependency 'shoulda-matchers'
|
metadata
CHANGED
@@ -1,75 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spree_multi_vendor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Spark Solutions
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-12-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: spree
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 4.
|
20
|
-
- - "<"
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: '5.0'
|
19
|
+
version: 4.3.0.rc1
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
24
|
- - ">="
|
28
25
|
- !ruby/object:Gem::Version
|
29
|
-
version: 4.
|
30
|
-
- - "<"
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: '5.0'
|
26
|
+
version: 4.3.0.rc1
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
|
-
name:
|
28
|
+
name: spree_backend
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
36
30
|
requirements:
|
37
31
|
- - ">="
|
38
32
|
- !ruby/object:Gem::Version
|
39
|
-
version: 4.
|
40
|
-
- - "<"
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
version: '5.0'
|
33
|
+
version: 4.3.0.rc1
|
43
34
|
type: :runtime
|
44
35
|
prerelease: false
|
45
36
|
version_requirements: !ruby/object:Gem::Requirement
|
46
37
|
requirements:
|
47
38
|
- - ">="
|
48
39
|
- !ruby/object:Gem::Version
|
49
|
-
version: 4.
|
50
|
-
- - "<"
|
51
|
-
- !ruby/object:Gem::Version
|
52
|
-
version: '5.0'
|
40
|
+
version: 4.3.0.rc1
|
53
41
|
- !ruby/object:Gem::Dependency
|
54
|
-
name:
|
42
|
+
name: spree_emails
|
55
43
|
requirement: !ruby/object:Gem::Requirement
|
56
44
|
requirements:
|
57
45
|
- - ">="
|
58
46
|
- !ruby/object:Gem::Version
|
59
|
-
version: 4.
|
60
|
-
- - "<"
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: '5.0'
|
47
|
+
version: 4.3.0.rc1
|
63
48
|
type: :runtime
|
64
49
|
prerelease: false
|
65
50
|
version_requirements: !ruby/object:Gem::Requirement
|
66
51
|
requirements:
|
67
52
|
- - ">="
|
68
53
|
- !ruby/object:Gem::Version
|
69
|
-
version: 4.
|
70
|
-
- - "<"
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
version: '5.0'
|
54
|
+
version: 4.3.0.rc1
|
73
55
|
- !ruby/object:Gem::Dependency
|
74
56
|
name: spree_extension
|
75
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -132,10 +114,10 @@ executables: []
|
|
132
114
|
extensions: []
|
133
115
|
extra_rdoc_files: []
|
134
116
|
files:
|
117
|
+
- ".github/dependabot.yml"
|
135
118
|
- ".gitignore"
|
136
119
|
- ".rspec"
|
137
120
|
- ".travis.yml"
|
138
|
-
- Appraisals
|
139
121
|
- Gemfile
|
140
122
|
- LICENSE
|
141
123
|
- README.md
|
@@ -166,7 +148,6 @@ files:
|
|
166
148
|
- app/models/spree/vendor_image.rb
|
167
149
|
- app/models/spree/vendor_order_totals.rb
|
168
150
|
- app/models/spree/vendor_user.rb
|
169
|
-
- app/models/spree_multi_vendor/configuration.rb
|
170
151
|
- app/models/spree_multi_vendor/spree/ability_decorator.rb
|
171
152
|
- app/models/spree_multi_vendor/spree/base_decorator.rb
|
172
153
|
- app/models/spree_multi_vendor/spree/line_item_decorator.rb
|
@@ -220,12 +201,14 @@ files:
|
|
220
201
|
- db/migrate/20190312130754_create_spree_order_commissions.rb
|
221
202
|
- db/migrate/20190322133128_add_notification_email_to_vendors.rb
|
222
203
|
- db/migrate/20200416030721_add_translations_to_vendor.rb
|
223
|
-
-
|
224
|
-
-
|
204
|
+
- db/migrate/20210728120649_change_vendorized_models_vendor_id_type.rb
|
205
|
+
- db/migrate/20210728120910_change_vendor_id_and_user_id_type_for_spree_vendor_users.rb
|
206
|
+
- db/migrate/20210728121024_change_vendor_id_and_order_id_type_for_spree_order_commissions.rb
|
225
207
|
- lib/generators/spree_multi_vendor/install/install_generator.rb
|
226
208
|
- lib/generators/spree_multi_vendor/mailers_preview/mailers_preview_generator.rb
|
227
209
|
- lib/generators/spree_multi_vendor/mailers_preview/templates/mailers/previews/vendor_notification_preview.rb
|
228
210
|
- lib/spree_multi_vendor.rb
|
211
|
+
- lib/spree_multi_vendor/configuration.rb
|
229
212
|
- lib/spree_multi_vendor/engine.rb
|
230
213
|
- lib/spree_multi_vendor/factories.rb
|
231
214
|
- lib/spree_multi_vendor/version.rb
|
@@ -262,14 +245,14 @@ files:
|
|
262
245
|
- spec/spec_helper.rb
|
263
246
|
- spec/support/shoulda_matchers.rb
|
264
247
|
- spree_multi_vendor.gemspec
|
265
|
-
homepage: https://
|
248
|
+
homepage: https://spreecommerce.org/use-cases/multi-vendor-marketplace-demo/
|
266
249
|
licenses:
|
267
250
|
- BSD-3-Clause
|
268
251
|
metadata:
|
269
252
|
bug_tracker_uri: https://github.com/spree-contrib/spree_multi_vendor/issues
|
270
|
-
changelog_uri: https://github.com/spree-contrib/spree_multi_vendor/releases/tag/v2.
|
253
|
+
changelog_uri: https://github.com/spree-contrib/spree_multi_vendor/releases/tag/v2.4.0
|
271
254
|
documentation_uri: https://guides.spreecommerce.org/
|
272
|
-
source_code_uri: https://github.com/spree-contrib/spree_multi_vendor/tree/v2.
|
255
|
+
source_code_uri: https://github.com/spree-contrib/spree_multi_vendor/tree/v2.4.0
|
273
256
|
post_install_message:
|
274
257
|
rdoc_options: []
|
275
258
|
require_paths:
|
@@ -286,7 +269,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
286
269
|
version: '0'
|
287
270
|
requirements:
|
288
271
|
- none
|
289
|
-
rubygems_version: 3.
|
272
|
+
rubygems_version: 3.0.9
|
290
273
|
signing_key:
|
291
274
|
specification_version: 4
|
292
275
|
summary: Spree Commerce multi vendor marketplace extension
|
data/Appraisals
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
appraise 'spree-4-2' do
|
2
|
-
gem 'spree', '~> 4.2.0.rc4'
|
3
|
-
gem 'spree_auth_devise', '~> 4.3'
|
4
|
-
gem 'rails-controller-testing'
|
5
|
-
end
|
6
|
-
|
7
|
-
appraise 'spree-master' do
|
8
|
-
gem 'spree', github: 'spree/spree', branch: 'master'
|
9
|
-
gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: 'master'
|
10
|
-
gem 'rails-controller-testing'
|
11
|
-
end
|
data/gemfiles/spree_4_2.gemfile
DELETED
@@ -1,9 +0,0 @@
|
|
1
|
-
# This file was generated by Appraisal
|
2
|
-
|
3
|
-
source "https://rubygems.org"
|
4
|
-
|
5
|
-
gem "spree", github: "spree/spree", branch: "master"
|
6
|
-
gem "spree_auth_devise", github: "spree/spree_auth_devise", branch: "master"
|
7
|
-
gem "rails-controller-testing"
|
8
|
-
|
9
|
-
gemspec path: "../"
|