solidus_multi_domain 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +33 -0
  3. data/.rspec +4 -0
  4. data/.ruby-version +1 -0
  5. data/Gemfile +9 -0
  6. data/README.md +72 -0
  7. data/Rakefile +21 -0
  8. data/app/controllers/concerns/spree_multi_domain/create_line_item_support.rb +16 -0
  9. data/app/controllers/concerns/spree_multi_domain/show_product_support.rb +17 -0
  10. data/app/controllers/spree/admin/products_controller_decorator.rb +12 -0
  11. data/app/controllers/spree/admin/stores_controller.rb +24 -0
  12. data/app/controllers/spree/api/line_items_controller_decorator.rb +1 -0
  13. data/app/controllers/spree/api/orders_controller_decorator.rb +21 -0
  14. data/app/controllers/spree/api/products_controller_decorator.rb +1 -0
  15. data/app/controllers/spree/api/shipments_controller_decorator.rb +17 -0
  16. data/app/controllers/spree/home_controller_decorator.rb +7 -0
  17. data/app/controllers/spree/products_controller_decorator.rb +1 -0
  18. data/app/controllers/spree/taxons_controller_decorator.rb +10 -0
  19. data/app/helpers/spree/products_helper_decorator.rb +11 -0
  20. data/app/mailers/spree/carton_mailer_decorator.rb +13 -0
  21. data/app/mailers/spree/order_mailer.rb +35 -0
  22. data/app/models/spree/order_decorator.rb +8 -0
  23. data/app/models/spree/payment_method_decorator.rb +13 -0
  24. data/app/models/spree/product_decorator.rb +4 -0
  25. data/app/models/spree/promotion/rules/store.rb +30 -0
  26. data/app/models/spree/shipping_method_decorator.rb +18 -0
  27. data/app/models/spree/store_decorator.rb +25 -0
  28. data/app/models/spree/store_payment_method.rb +6 -0
  29. data/app/models/spree/store_shipping_method.rb +6 -0
  30. data/app/models/spree/taxon_decorator.rb +5 -0
  31. data/app/models/spree/taxonomy_decorator.rb +3 -0
  32. data/app/models/spree/tracker_decorator.rb +7 -0
  33. data/app/models/spree_multi_domain/line_item_decorator.rb +20 -0
  34. data/app/overrides/decorate_admin_configurations_index.rb +5 -0
  35. data/app/overrides/decorate_admin_products_form.rb +6 -0
  36. data/app/overrides/decorate_admin_products_index.rb +20 -0
  37. data/app/overrides/decorate_admin_trackers_form.rb +6 -0
  38. data/app/overrides/decorate_admin_trackers_index.rb +13 -0
  39. data/app/views/spree/admin/products/_index_headers.html.erb +1 -0
  40. data/app/views/spree/admin/products/_index_rows.html.erb +1 -0
  41. data/app/views/spree/admin/products/_index_search_fields.html.erb +4 -0
  42. data/app/views/spree/admin/products/_stores.html.erb +8 -0
  43. data/app/views/spree/admin/promotions/rules/_store.html.erb +8 -0
  44. data/app/views/spree/admin/stores/_form.html.erb +90 -0
  45. data/app/views/spree/admin/stores/edit.html.erb +29 -0
  46. data/app/views/spree/admin/stores/index.html.erb +43 -0
  47. data/app/views/spree/admin/stores/new.html.erb +29 -0
  48. data/app/views/spree/admin/taxonomies/_form.html.erb +12 -0
  49. data/app/views/spree/admin/trackers/_index_rows.html.erb +1 -0
  50. data/app/views/spree/admin/trackers/_store.html.erb +6 -0
  51. data/app/views/spree/shared/_google_analytics.html.erb +39 -0
  52. data/bin/rails +7 -0
  53. data/circle.yml +6 -0
  54. data/config/locales/en.yml +26 -0
  55. data/config/locales/fr.yml +9 -0
  56. data/config/locales/pl.yml +10 -0
  57. data/config/locales/ru.yml +9 -0
  58. data/config/routes.rb +5 -0
  59. data/db/migrate/20091202123245_add_order_store.rb +17 -0
  60. data/db/migrate/20100114020535_add_store_to_tracker.rb +25 -0
  61. data/db/migrate/20100227180338_create_products_stores.rb +13 -0
  62. data/db/migrate/20100616204303_store_id_for_taxonomies.rb +19 -0
  63. data/db/migrate/20110601125650_remove_datetime_columns_from_products_stores.rb +13 -0
  64. data/db/migrate/20110601145424_add_indexes_to_products_stores.rb +11 -0
  65. data/db/migrate/20120223183401_namespace.rb +9 -0
  66. data/db/migrate/20121210224018_add_store_payment_methods.rb +10 -0
  67. data/db/migrate/20130308084714_add_logo_to_stores.rb +13 -0
  68. data/db/migrate/20130325231147_add_store_shipping_methods.rb +14 -0
  69. data/db/migrate/20130412212659_add_spree_promotion_rules_stores.rb +8 -0
  70. data/db/migrate/20150304200122_add_indexes.rb +6 -0
  71. data/lib/assets/javascripts/spree/backend/solidus_multi_domain.js +1 -0
  72. data/lib/assets/javascripts/spree/backend/store_picker.js +34 -0
  73. data/lib/assets/javascripts/spree/frontend/solidus_multi_domain.js +0 -0
  74. data/lib/assets/stylesheets/spree/frontend/solidus_multi_domain.css +5 -0
  75. data/lib/generators/spree_multi_domain/install/install_generator.rb +24 -0
  76. data/lib/solidus_multi_domain.rb +3 -0
  77. data/lib/spree/controller_helpers/order_decorator.rb +11 -0
  78. data/lib/spree/search/multi_domain.rb +19 -0
  79. data/lib/spree_multi_domain/engine.rb +65 -0
  80. data/lib/spree_multi_domain/multi_domain_helpers.rb +31 -0
  81. data/solidus_multi_domain.gemspec +31 -0
  82. data/spec/controllers/spree/admin/products_controller_spec.rb +39 -0
  83. data/spec/controllers/spree/admin/stores_controller_spec.rb +12 -0
  84. data/spec/controllers/spree/api/line_items_controller_spec.rb +35 -0
  85. data/spec/controllers/spree/api/orders_controller_spec.rb +44 -0
  86. data/spec/controllers/spree/api/products_controller_spec.rb +52 -0
  87. data/spec/controllers/spree/api/shipments_controller_spec.rb +63 -0
  88. data/spec/controllers/spree/products_controller_spec.rb +49 -0
  89. data/spec/helpers/products_helper_decorator_spec.rb +22 -0
  90. data/spec/mailers/carton_mailer_spec.rb +41 -0
  91. data/spec/models/spree/line_item_spec.rb +39 -0
  92. data/spec/models/spree/order_spec.rb +18 -0
  93. data/spec/models/spree/payment_method_spec.rb +33 -0
  94. data/spec/models/spree/product_spec.rb +18 -0
  95. data/spec/models/spree/shipping_method_decorator_spec.rb +27 -0
  96. data/spec/models/spree/store_spec.rb +42 -0
  97. data/spec/models/spree/taxon_decorator_spec.rb +30 -0
  98. data/spec/models/spree/tracker_spec.rb +19 -0
  99. data/spec/requests/global_controller_helpers_spec.rb +65 -0
  100. data/spec/requests/template_renderer_spec.rb +25 -0
  101. data/spec/spec_helper.rb +33 -0
  102. data/spec/support/factory_overrides.rb +10 -0
  103. metadata +278 -0
data/circle.yml ADDED
@@ -0,0 +1,6 @@
1
+ machine:
2
+ ruby:
3
+ version: 2.1.5
4
+ test:
5
+ pre:
6
+ - bundle exec rake test_app
@@ -0,0 +1,26 @@
1
+ en:
2
+ spree:
3
+ back_to_store_list: Back To Store List
4
+ default_currency: Default Currency
5
+ errors:
6
+ products_from_different_stores_may_not_be_added_to_this_order: Products from different stores may not be added to this order.
7
+ send_mail_as: Send Mail As
8
+ logo: Logo
9
+ payment_method: Payment Method
10
+ shipping_method: Shipping Method
11
+ store: Store
12
+ stores: Stores
13
+ new_store: New Store
14
+ domains: Domains
15
+ stores_admin: "Stores & Domains"
16
+ manage_stores: Configure multiple stores and associated domain names
17
+ editing_store: Editing Store
18
+ default: Default
19
+ store_name: Name
20
+ store_code: Code
21
+ promotion_rule_types:
22
+ store:
23
+ name: Store
24
+ description: "Store must match one from the list"
25
+ store_rule:
26
+ choose_stores: "Choose Stores"
@@ -0,0 +1,9 @@
1
+ fr:
2
+ store: Boutique
3
+ stores: Boutiques
4
+ new_store: Nouvelle Boutique
5
+ domains: Domaines
6
+ stores_admin: "Boutiques & Domaines"
7
+ manage_stores: Configurer les boutiques et les domaines associés
8
+ editing_store: Modifier une boutique
9
+ default: Defaut
@@ -0,0 +1,10 @@
1
+ pl:
2
+ store: "Sklep"
3
+ stores: "Sklepy"
4
+ new_store: "Nowy Sklep"
5
+ domains: "Domeny"
6
+ stores_admin: "Sklepy & Domeny"
7
+ manage_stores: "Skonfiguruj wiele sklepów i powiązane z nimi domeny"
8
+ editing_store: "Edcja sklepu"
9
+ default: "Domyślny"
10
+
@@ -0,0 +1,9 @@
1
+ ru:
2
+ store: "Магазин"
3
+ stores: "Магазины"
4
+ new_store: "Новый магазин"
5
+ domains: "Домены"
6
+ stores_admin: "Магазины и домены"
7
+ manage_stores: "Управление магазинами и привязка доменов"
8
+ editing_store: "Редактирование магазина"
9
+ default: "По умолчанию"
data/config/routes.rb ADDED
@@ -0,0 +1,5 @@
1
+ Spree::Core::Engine.routes.append do
2
+ namespace :admin do
3
+ resources :stores
4
+ end
5
+ end
@@ -0,0 +1,17 @@
1
+ class AddOrderStore < ActiveRecord::Migration
2
+ def self.up
3
+ if table_exists?('orders')
4
+ add_column :orders, :store_id, :integer
5
+ elsif table_exists?('spree_orders')
6
+ add_column :spree_orders, :store_id, :integer unless column_exists?(:spree_orders, :store_id)
7
+ end
8
+ end
9
+
10
+ def self.down
11
+ if table_exists?('orders')
12
+ remove_column :orders, :store_id
13
+ elsif table_exists?('spree_orders')
14
+ remove_column :spree_orders, :store_id
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,25 @@
1
+ class AddStoreToTracker < ActiveRecord::Migration
2
+ def self.up
3
+ if table_exists?('trackers')
4
+ change_table :trackers do |t|
5
+ t.references :store
6
+ end
7
+ elsif table_exists?('spree_trackers')
8
+ change_table :spree_trackers do |t|
9
+ t.references :store
10
+ end
11
+ end
12
+ end
13
+
14
+ def self.down
15
+ if table_exists?('trackers')
16
+ change_table :trackers do |t|
17
+ t.remove :store_id
18
+ end
19
+ elsif table_exists?('spree_trackers')
20
+ change_table :spree_trackers do |t|
21
+ t.remove :store_id
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,13 @@
1
+ class CreateProductsStores < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :products_stores, :id => false do |t|
4
+ t.references :product
5
+ t.references :store
6
+ t.timestamps
7
+ end
8
+ end
9
+
10
+ def self.down
11
+ drop_table :products_stores
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ class StoreIdForTaxonomies < ActiveRecord::Migration
2
+ def self.up
3
+ if table_exists?('taxonomies')
4
+ add_column :taxonomies, :store_id, :integer
5
+ add_index :taxonomies, :store_id
6
+ elsif table_exists?('spree_taxonomies')
7
+ add_column :spree_taxonomies, :store_id, :integer
8
+ add_index :spree_taxonomies, :store_id
9
+ end
10
+ end
11
+
12
+ def self.down
13
+ if table_exists?('taxonomies')
14
+ remove_column :taxonomies, :store_id
15
+ elsif table_exists?('spree_taxonomies')
16
+ remove_column :spree_taxonomies, :store_id
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ class RemoveDatetimeColumnsFromProductsStores < ActiveRecord::Migration
2
+ def self.up
3
+ change_table :products_stores do |t|
4
+ t.remove :created_at, :updated_at
5
+ end
6
+ end
7
+
8
+ def self.down
9
+ change_table :products_stores do |t|
10
+ t.timestamps
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ class AddIndexesToProductsStores < ActiveRecord::Migration
2
+ def self.up
3
+ add_index :products_stores, :product_id
4
+ add_index :products_stores, :store_id
5
+ end
6
+
7
+ def self.down
8
+ remove_index :products_stores, :product_id
9
+ remove_index :products_stores, :store_id
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ class Namespace < ActiveRecord::Migration
2
+ def up
3
+ rename_table :products_stores, :spree_products_stores
4
+ end
5
+
6
+ def down
7
+ rename_table :spree_products_stores, :products_stores
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ class AddStorePaymentMethods < ActiveRecord::Migration
2
+ def change
3
+ create_table :spree_store_payment_methods do |t|
4
+ t.integer :store_id
5
+ t.integer :payment_method_id
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ class AddLogoToStores < ActiveRecord::Migration
2
+ def self.up
3
+ change_table :spree_stores do |t|
4
+ t.string :logo_file_name
5
+ end
6
+ end
7
+
8
+ def self.down
9
+ change_table :spree_stores do |t|
10
+ t.remove :logo_file_name
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ class AddStoreShippingMethods < ActiveRecord::Migration
2
+ def change
3
+ create_table :spree_store_shipping_methods do |t|
4
+ t.integer :store_id
5
+ t.integer :shipping_method_id
6
+
7
+ t.timestamps
8
+ end
9
+
10
+ add_index :spree_store_shipping_methods, :store_id
11
+ add_index :spree_store_shipping_methods, :shipping_method_id
12
+ end
13
+ end
14
+
@@ -0,0 +1,8 @@
1
+ class AddSpreePromotionRulesStores < ActiveRecord::Migration
2
+ def change
3
+ create_table :spree_promotion_rules_stores, :id => false do |t|
4
+ t.references :promotion_rule
5
+ t.references :store
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,6 @@
1
+ class AddIndexes < ActiveRecord::Migration
2
+ def change
3
+ add_index :spree_promotion_rules_stores, :store_id
4
+ add_index :spree_promotion_rules_stores, :promotion_rule_id
5
+ end
6
+ end
@@ -0,0 +1 @@
1
+ //= require_tree .
@@ -0,0 +1,34 @@
1
+ $.fn.storeAutocomplete = function() {
2
+ this.select2({
3
+ minimumInputLength: 1,
4
+ multiple: true,
5
+ initSelection: function(element, callback) {
6
+ $.get(Spree.routes.store_search, { ids: element.val() }, function(data) {
7
+ callback(data.stores)
8
+ })
9
+ },
10
+ ajax: {
11
+ url: Spree.routes.store_search,
12
+ datatype: 'json',
13
+ data: function(term, page) {
14
+ return { q: term }
15
+ },
16
+ results: function(data, page) {
17
+ return { results: data.stores }
18
+ }
19
+ },
20
+ formatResult: function(store) {
21
+ return store.name;
22
+ },
23
+ formatSelection: function(store) {
24
+ return store.name;
25
+ },
26
+ id: function(store) {
27
+ return store.id
28
+ }
29
+ });
30
+ }
31
+
32
+ $(document).ready(function () {
33
+ $('.store_picker').storeAutocomplete();
34
+ })
@@ -0,0 +1,5 @@
1
+ .admin .edit_product .stores label {
2
+ display: inline;
3
+ text-transform: none;
4
+ margin-right: 10px;
5
+ }
@@ -0,0 +1,24 @@
1
+ module SpreeMultiDomain
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ class_option :auto_run_migrations, type: :boolean, default: false
5
+
6
+ def add_javascripts
7
+ append_file "vendor/assets/javascripts/spree/backend/all.js", "//= require spree/backend/solidus_multi_domain\n"
8
+ end
9
+
10
+ def add_migrations
11
+ run 'rake railties:install:migrations FROM=solidus_multi_domain'
12
+ end
13
+
14
+ def run_migrations
15
+ run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask 'Would you like to run the migrations now? [Y/n]')
16
+ if run_migrations
17
+ run 'bundle exec rake db:migrate'
18
+ else
19
+ puts 'Skipping rake db:migrate, don\'t forget to run it!'
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,3 @@
1
+ require 'sass/rails'
2
+ require 'spree_core'
3
+ require 'spree_multi_domain/engine'
@@ -0,0 +1,11 @@
1
+ Spree::Core::ControllerHelpers::Order.class_eval do
2
+ def current_currency
3
+ # When using spree_multi_currency the current_currency is stored within session[:currency]
4
+ currency = session[:currency] if session.key?(:currency) && supported_currencies.map(&:iso_code).include?(session[:currency])
5
+ # If there is no session currency fall back to the store default
6
+ currency ||= current_store.try(:default_currency)
7
+ # If there is still no currency fall back to Spree default
8
+ currency = Spree::Config[:currency] if currency.blank?
9
+ currency
10
+ end
11
+ end
@@ -0,0 +1,19 @@
1
+ module Spree::Search
2
+ class MultiDomain < Spree::Core::Search::Base
3
+ def get_base_scope
4
+ base_scope = @cached_product_group ? @cached_product_group.products.active : Spree::Product.active
5
+ base_scope = base_scope.by_store(current_store_id) if current_store_id
6
+ base_scope = base_scope.in_taxon(taxon) unless taxon.blank?
7
+
8
+ base_scope = get_products_conditions_for(base_scope, keywords) unless keywords.blank?
9
+
10
+ base_scope = add_search_scopes(base_scope)
11
+ base_scope
12
+ end
13
+
14
+ def prepare(params)
15
+ super
16
+ @properties[:current_store_id] = params[:current_store_id]
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,65 @@
1
+ module SpreeMultiDomain
2
+ class Engine < Rails::Engine
3
+ engine_name 'solidus_multi_domain'
4
+
5
+ config.autoload_paths += %W(#{config.root}/lib)
6
+
7
+ def self.activate
8
+ ['app', 'lib'].each do |dir|
9
+ Dir.glob(File.join(File.dirname(__FILE__), "../../#{dir}/**/*_decorator*.rb")) do |c|
10
+ Rails.application.config.cache_classes ? require(c) : load(c)
11
+ end
12
+ end
13
+
14
+ Spree::Config.searcher_class = Spree::Search::MultiDomain
15
+ ApplicationController.send :include, SpreeMultiDomain::MultiDomainHelpers
16
+ end
17
+
18
+ config.to_prepare &method(:activate).to_proc
19
+
20
+ initializer "templates with dynamic layouts" do |app|
21
+ ActionView::TemplateRenderer.class_eval do
22
+ def find_layout_with_multi_store(layout, locals)
23
+ if @view.respond_to?(:current_store) && @view.current_store && !@view.controller.is_a?(Spree::Admin::BaseController) && layout.call.present?
24
+ store_layout = if layout.is_a?(String)
25
+ layout.gsub("layouts/", "layouts/#{@view.current_store.code}/")
26
+ else
27
+ layout.call.try(:gsub, "layouts/", "layouts/#{@view.current_store.code}/")
28
+ end
29
+
30
+ begin
31
+ find_layout_without_multi_store(store_layout, locals)
32
+ rescue ::ActionView::MissingTemplate
33
+ find_layout_without_multi_store(layout, locals)
34
+ end
35
+ else
36
+ find_layout_without_multi_store(layout, locals)
37
+ end
38
+ end
39
+
40
+ alias_method_chain :find_layout, :multi_store
41
+ end
42
+ end
43
+
44
+ initializer "current order decoration" do |app|
45
+ require 'spree/core/controller_helpers/order'
46
+ ::Spree::Core::ControllerHelpers::Order.module_eval do
47
+ def current_order_with_multi_domain(options = {})
48
+ options[:create_order_if_necessary] ||= false
49
+ current_order_without_multi_domain(options)
50
+
51
+ if @current_order and current_store and @current_order.store.blank?
52
+ @current_order.update_attribute(:store_id, current_store.id)
53
+ end
54
+
55
+ @current_order
56
+ end
57
+ alias_method_chain :current_order, :multi_domain
58
+ end
59
+ end
60
+
61
+ initializer 'spree.promo.register.promotions.rules' do |app|
62
+ app.config.spree.promotions.rules << Spree::Promotion::Rules::Store
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,31 @@
1
+ module SpreeMultiDomain
2
+ module MultiDomainHelpers
3
+ def self.included(receiver)
4
+ receiver.send :helper, 'spree/products'
5
+ receiver.send :helper, 'spree/taxons'
6
+
7
+ receiver.send :before_filter, :add_current_store_id_to_params
8
+ receiver.send :helper_method, :current_store
9
+ receiver.send :helper_method, :current_tracker
10
+ end
11
+
12
+ def current_tracker
13
+ @current_tracker ||= Spree::Tracker.current(store_key)
14
+ end
15
+
16
+ def get_taxonomies
17
+ @taxonomies ||= current_store.present? ? Spree::Taxonomy.where(["store_id = ?", current_store.id]) : Spree::Taxonomy
18
+ @taxonomies = @taxonomies.includes(:root => :children)
19
+ @taxonomies
20
+ end
21
+
22
+ def add_current_store_id_to_params
23
+ params[:current_store_id] = current_store.try(:id)
24
+ end
25
+
26
+ private
27
+ def store_key
28
+ request.headers['HTTP_SPREE_STORE'] || request.env['SERVER_NAME']
29
+ end
30
+ end
31
+ end