spree_core 1.0.7 → 1.1.0.rc1
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.
- data/app/assets/javascripts/admin/admin.js.erb +9 -18
- data/app/assets/javascripts/admin/calculator.js +7 -6
- data/app/assets/javascripts/admin/checkouts/edit.js +2 -2
- data/app/assets/javascripts/admin/image_settings.js +49 -0
- data/app/assets/javascripts/admin/orders/edit_form.js +14 -14
- data/app/assets/stylesheets/admin/admin.css.erb +36 -54
- data/app/assets/stylesheets/store/screen.css.scss +25 -12
- data/app/controllers/spree/admin/base_controller.rb +3 -3
- data/app/controllers/spree/admin/image_settings_controller.rb +71 -0
- data/app/controllers/spree/admin/images_controller.rb +22 -21
- data/app/controllers/spree/admin/mail_methods_controller.rb +1 -1
- data/app/controllers/spree/admin/orders/customer_details_controller.rb +2 -2
- data/app/controllers/spree/admin/orders_controller.rb +13 -13
- data/app/controllers/spree/admin/payment_methods_controller.rb +1 -1
- data/app/controllers/spree/admin/payments_controller.rb +1 -1
- data/app/controllers/spree/admin/product_properties_controller.rb +3 -4
- data/app/controllers/spree/admin/products_controller.rb +49 -47
- data/app/controllers/spree/admin/properties_controller.rb +1 -1
- data/app/controllers/spree/admin/prototypes_controller.rb +12 -6
- data/app/controllers/spree/admin/reports_controller.rb +15 -16
- data/app/controllers/spree/admin/resource_controller.rb +1 -1
- data/app/controllers/spree/admin/return_authorizations_controller.rb +1 -1
- data/app/controllers/spree/admin/shipments_controller.rb +0 -3
- data/app/controllers/spree/admin/states_controller.rb +9 -9
- data/app/controllers/spree/admin/users_controller.rb +18 -42
- data/app/controllers/spree/admin/variants_controller.rb +22 -21
- data/app/controllers/spree/admin/zones_controller.rb +11 -11
- data/app/controllers/spree/content_controller.rb +1 -1
- data/app/controllers/spree/locale_controller.rb +2 -2
- data/app/controllers/spree/orders_controller.rb +4 -6
- data/app/controllers/spree/products_controller.rb +1 -1
- data/app/controllers/spree/states_controller.rb +4 -7
- data/app/helpers/spree/admin/base_helper.rb +4 -0
- data/app/helpers/spree/admin/navigation_helper.rb +4 -16
- data/app/helpers/spree/base_helper.rb +22 -3
- data/app/models/spree/activator.rb +4 -1
- data/app/models/spree/address.rb +45 -45
- data/app/models/spree/adjustment.rb +4 -4
- data/app/models/spree/app_configuration.rb +12 -0
- data/app/models/spree/calculator/default_tax.rb +1 -3
- data/app/models/spree/calculator/flat_percent_item_total.rb +0 -2
- data/app/models/spree/calculator/flat_rate.rb +0 -3
- data/app/models/spree/calculator/flexi_rate.rb +1 -3
- data/app/models/spree/calculator/per_item.rb +1 -6
- data/app/models/spree/calculator/price_sack.rb +0 -2
- data/app/models/spree/country.rb +1 -1
- data/app/models/spree/creditcard.rb +9 -10
- data/app/models/spree/gateway.rb +0 -2
- data/app/models/spree/image.rb +18 -2
- data/app/models/spree/inventory_unit.rb +4 -2
- data/app/models/spree/mail_method.rb +1 -6
- data/app/models/spree/option_type.rb +3 -1
- data/app/models/spree/order.rb +68 -62
- data/app/models/spree/payment.rb +1 -1
- data/app/models/spree/payment_method.rb +0 -6
- data/app/models/spree/product/scopes.rb +44 -44
- data/app/models/spree/product.rb +44 -26
- data/app/models/spree/product_property.rb +0 -2
- data/app/models/spree/property.rb +0 -16
- data/app/models/spree/prototype.rb +0 -1
- data/app/models/spree/return_authorization.rb +0 -2
- data/app/models/spree/shipment.rb +2 -3
- data/app/models/spree/shipping_category.rb +0 -2
- data/app/models/spree/shipping_method.rb +1 -2
- data/app/models/spree/shipping_rate.rb +9 -0
- data/app/models/spree/state.rb +10 -2
- data/app/models/spree/{state_event.rb → state_change.rb} +1 -4
- data/app/models/spree/tax_rate.rb +3 -3
- data/app/models/spree/taxon.rb +1 -6
- data/app/models/spree/taxonomy.rb +3 -6
- data/app/models/spree/user.rb +1 -0
- data/app/models/spree/variant.rb +3 -4
- data/app/models/spree/zone.rb +0 -10
- data/app/views/spree/admin/adjustments/_adjustments_table.html.erb +1 -1
- data/app/views/spree/admin/configurations/index.html.erb +4 -0
- data/app/views/spree/admin/image_settings/edit.html.erb +91 -0
- data/app/views/spree/admin/image_settings/show.html.erb +11 -0
- data/app/views/spree/admin/images/index.html.erb +3 -3
- data/app/views/spree/admin/mail_methods/_form.html.erb +1 -1
- data/app/views/spree/admin/mail_methods/index.html.erb +1 -1
- data/app/views/spree/admin/option_types/_option_value_fields.html.erb +1 -1
- data/app/views/spree/admin/option_types/index.html.erb +1 -1
- data/app/views/spree/admin/option_types/new.js.erb +1 -1
- data/app/views/spree/admin/orders/_form.html.erb +3 -5
- data/app/views/spree/admin/orders/_line_item.html.erb +1 -1
- data/app/views/spree/admin/orders/customer_details/_form.html.erb +1 -1
- data/app/views/spree/admin/orders/history.html.erb +2 -2
- data/app/views/spree/admin/orders/index.html.erb +19 -19
- data/app/views/spree/admin/payment_methods/_form.html.erb +1 -1
- data/app/views/spree/admin/payment_methods/index.html.erb +1 -3
- data/app/views/spree/admin/payments/_list.html.erb +1 -1
- data/app/views/spree/admin/product_properties/index.html.erb +1 -1
- data/app/views/spree/admin/products/_form.html.erb +30 -27
- data/app/views/spree/admin/products/index.html.erb +9 -9
- data/app/views/spree/admin/products/new.html.erb +28 -4
- data/app/views/spree/admin/products/new.js.erb +1 -1
- data/app/views/spree/admin/properties/index.html.erb +1 -1
- data/app/views/spree/admin/properties/new.js.erb +1 -1
- data/app/views/spree/admin/prototypes/index.html.erb +1 -1
- data/app/views/spree/admin/prototypes/new.js.erb +1 -1
- data/app/views/spree/admin/prototypes/show.html.erb +42 -0
- data/app/views/spree/admin/return_authorizations/index.html.erb +1 -1
- data/app/views/spree/admin/shared/_address_form.html.erb +1 -1
- data/app/views/spree/admin/shared/_calculator_fields.html.erb +2 -2
- data/app/views/spree/admin/shared/_head.html.erb +3 -3
- data/app/views/spree/admin/shared/_order_details.html.erb +1 -1
- data/app/views/spree/admin/shared/_order_tabs.html.erb +6 -6
- data/app/views/spree/admin/shared/_product_sub_menu.html.erb +0 -1
- data/app/views/spree/admin/shared/_report_criteria.html.erb +3 -3
- data/app/views/spree/admin/shared/_tabs.html.erb +1 -1
- data/app/views/spree/admin/shared/_update_order_state.js +5 -4
- data/app/views/spree/admin/shipments/index.html.erb +1 -1
- data/app/views/spree/admin/shipping_categories/index.html.erb +1 -1
- data/app/views/spree/admin/shipping_methods/index.html.erb +1 -1
- data/app/views/spree/admin/states/_state_list.html.erb +1 -1
- data/app/views/spree/admin/states/new.js.erb +1 -1
- data/app/views/spree/admin/tax_categories/index.html.erb +2 -2
- data/app/views/spree/admin/tax_rates/index.html.erb +2 -2
- data/app/views/spree/admin/taxonomies/_list.html.erb +1 -1
- data/app/views/spree/admin/trackers/_form.html.erb +1 -1
- data/app/views/spree/admin/trackers/index.html.erb +1 -1
- data/app/views/spree/admin/users/_form.html.erb +1 -16
- data/app/views/spree/admin/users/index.html.erb +3 -4
- data/app/views/spree/admin/variants/index.html.erb +2 -2
- data/app/views/spree/admin/variants/new.js.erb +1 -1
- data/app/views/spree/admin/zones/index.html.erb +1 -1
- data/app/views/spree/checkout/_address.html.erb +1 -1
- data/app/views/spree/checkout/edit.html.erb +1 -1
- data/app/views/spree/checkout/registration.html.erb +2 -2
- data/app/views/spree/order_mailer/confirm_email.text.erb +3 -3
- data/app/views/spree/orders/show.html.erb +2 -2
- data/app/views/spree/products/_cart_form.html.erb +1 -2
- data/app/views/spree/products/_image.html.erb +1 -1
- data/app/views/spree/products/show.html.erb +3 -3
- data/app/views/spree/shared/_filters.html.erb +26 -24
- data/app/views/spree/shared/_google_analytics.html.erb +26 -26
- data/app/views/spree/shared/_products.html.erb +2 -2
- data/app/views/spree/shared/_search.html.erb +1 -1
- data/app/views/spree/shared/_store_menu.html.erb +1 -1
- data/app/views/spree/states/index.js.erb +1 -1
- data/config/initializers/rails_3_1.rb +3 -3
- data/config/locales/en.yml +40 -35
- data/config/routes.rb +5 -13
- data/db/migrate/20101026184714_migrate_transactions_to_payment_state.rb +4 -4
- data/db/migrate/20111007143030_namespace_top_level_models.rb +0 -3
- data/db/migrate/20120203001428_rename_state_events_to_state_changes.rb +9 -0
- data/db/migrate/20120315064358_migrate_images_from_products_to_variants.rb +35 -0
- data/lib/generators/spree/dummy/templates/rails/database.yml +48 -20
- data/lib/generators/spree/install/install_generator.rb +17 -1
- data/lib/generators/spree/install/templates/app/assets/javascripts/admin/all.js +0 -1
- data/lib/generators/spree/install/templates/app/assets/javascripts/store/all.js +0 -1
- data/lib/generators/spree/install/templates/app/assets/stylesheets/admin/all.css +0 -1
- data/lib/generators/spree/install/templates/app/assets/stylesheets/store/all.css +0 -1
- data/lib/generators/spree/sandbox/sandbox_generator.rb +9 -2
- data/lib/spree/core/calculated_adjustments.rb +29 -34
- data/lib/spree/core/controller_helpers.rb +36 -34
- data/lib/spree/core/custom_fixtures.rb +1 -1
- data/lib/spree/core/delegate_belongs_to.rb +22 -24
- data/lib/spree/core/engine.rb +3 -3
- data/lib/spree/core/environment_extension.rb +12 -15
- data/lib/spree/core/mail_settings.rb +1 -1
- data/lib/spree/core/permalinks.rb +24 -16
- data/lib/spree/core/preference_rescue.rb +1 -1
- data/lib/spree/core/respond_with.rb +13 -8
- data/lib/spree/core/responder.rb +1 -2
- data/lib/spree/core/search/base.rb +36 -19
- data/lib/spree/core/ssl_requirement.rb +18 -10
- data/lib/spree/core/testing_support/common_rake.rb +1 -1
- data/lib/spree/core/testing_support/factories/product_factory.rb +9 -9
- data/lib/spree/core/testing_support/factories/role_factory.rb +1 -1
- data/lib/spree/core/testing_support/factories/shipping_category_factory.rb +1 -1
- data/lib/spree/core/testing_support/factories/shipping_method_factory.rb +3 -3
- data/lib/spree/core/testing_support/factories/user_factory.rb +1 -1
- data/lib/spree/core/testing_support/factories/zone_factory.rb +4 -2
- data/lib/spree/core/validators/email.rb +23 -0
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/core.rb +2 -2
- data/lib/spree/product_filters.rb +10 -19
- data/lib/tasks/core.rake +1 -1
- data/vendor/assets/javascripts/jquery.alerts/jquery.alerts.css.erb +5 -5
- data/vendor/assets/stylesheets/jquery-ui.datepicker.css.erb +1 -1
- metadata +68 -140
- data/app/assets/images/noimage/large.png +0 -0
- data/app/controllers/spree/admin/product_groups_controller.rb +0 -49
- data/app/controllers/spree/admin/product_scopes_controller.rb +0 -39
- data/app/helpers/spree/admin/product_groups_helper.rb +0 -14
- data/app/helpers/spree/admin/product_properties_helper.rb +0 -24
- data/app/models/spree/product_group.rb +0 -200
- data/app/models/spree/product_scope.rb +0 -79
- data/app/views/spree/admin/banners/_gateway.html.erb +0 -14
- data/app/views/spree/admin/product_groups/_preview.html.erb +0 -33
- data/app/views/spree/admin/product_groups/_product_scope.html.erb +0 -24
- data/app/views/spree/admin/product_groups/edit.html.erb +0 -59
- data/app/views/spree/admin/product_groups/index.html.erb +0 -37
- data/app/views/spree/admin/product_groups/new.html.erb +0 -12
- data/app/views/spree/admin/product_groups/show.html.erb +0 -32
- data/app/views/spree/admin/product_scopes/create.js.erb +0 -6
- data/app/views/spree/admin/product_scopes/destroy.js.erb +0 -3
- data/app/views/spree/admin/product_scopes/new.html.erb +0 -1
- data/app/views/spree/admin/shared/_group_from_products_form.html.erb +0 -12
- data/db/migrate/20091012120519_product_groups_and_scopes.rb +0 -18
- data/db/migrate/20100126103714_create_products_product_groups.rb +0 -8
- data/db/migrate/20100306153445_fix_by_popularity.rb +0 -9
- data/db/migrate/20120523061241_convert_sales_tax_to_default_tax.rb +0 -9
- data/lib/spree/core/testing_support/factories/product_group_factory.rb +0 -5
- data/lib/spree/core/testing_support/factories/product_scope_factory.rb +0 -7
- data/lib/spree/core/theme_support/hook_listener.rb +0 -145
- data/lib/spree/core/theme_support.rb +0 -1
- data/vendor/assets/javascripts/jquery.alerts/jquery.alerts.css +0 -57
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
# *ProductGroups* are used for creating and managing sets of products.
|
|
2
|
-
# Product group can be either anonymous(adhoc) or named.
|
|
3
|
-
#
|
|
4
|
-
# Anonymous Product groups are created by combining product scopes generated from url
|
|
5
|
-
# in 2 formats:
|
|
6
|
-
#
|
|
7
|
-
# /t/*taxons/s/name_of_scope/comma_separated_arguments/name_of_scope_that_doesn_take_any//order
|
|
8
|
-
# */s/name_of_scope/comma_separated_arguments/name_of_scope_that_doesn_take_any//order
|
|
9
|
-
#
|
|
10
|
-
# Named product groups can be created from anonymous ones, lub from another named scope
|
|
11
|
-
# (using ProductGroup.from_url method).
|
|
12
|
-
# Named product groups have pernament urls, that don't change even after changes
|
|
13
|
-
# to scopes are made, and come in two types.
|
|
14
|
-
#
|
|
15
|
-
# /t/*taxons/pg/named_product_group
|
|
16
|
-
# */pg/named_product_group
|
|
17
|
-
#
|
|
18
|
-
# first one is used for combining named scope with taxons, named product group can
|
|
19
|
-
# have #in_taxon or #taxons_name_eq scope defined, result should combine both
|
|
20
|
-
# and return products that exist in both taxons.
|
|
21
|
-
#
|
|
22
|
-
# ProductGroup#dynamic_products returns chain of named scopes generated from order and
|
|
23
|
-
# product scopes. So you can do counting, calculations etc, on resulted set of products,
|
|
24
|
-
# without retriving all records.
|
|
25
|
-
#
|
|
26
|
-
# ProductGroup operates on named scopes defined for product in Scopes::Product,
|
|
27
|
-
# or generated automatically by meta_search
|
|
28
|
-
#
|
|
29
|
-
module Spree
|
|
30
|
-
class ProductGroup < ActiveRecord::Base
|
|
31
|
-
validates :name, :permalink, :presence => true
|
|
32
|
-
validates_associated :product_scopes
|
|
33
|
-
|
|
34
|
-
after_save :update_memberships
|
|
35
|
-
|
|
36
|
-
has_and_belongs_to_many :cached_products, :class_name => 'Spree::Product',
|
|
37
|
-
:join_table => 'spree_product_groups_products'
|
|
38
|
-
has_many :product_scopes
|
|
39
|
-
accepts_nested_attributes_for :product_scopes
|
|
40
|
-
|
|
41
|
-
make_permalink
|
|
42
|
-
|
|
43
|
-
# Testing utility: creates new *ProductGroup* from search permalink url.
|
|
44
|
-
# Follows conventions for accessing PGs from URLs, as decoded in routes
|
|
45
|
-
def self.from_url(url)
|
|
46
|
-
pg = nil;
|
|
47
|
-
case url
|
|
48
|
-
when /\/t\/(.+?)\/s\/(.+)/ then taxons = $1; attrs = $2;
|
|
49
|
-
when /\/t\/(.+?)\/pg\/(.+)/ then taxons = $1; pg_name = $2;
|
|
50
|
-
when /(.*?)\/s\/(.+)/ then attrs = $2;
|
|
51
|
-
when /(.*?)\/pg\/(.+)/ then pg_name = $2;
|
|
52
|
-
else return(nil)
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
if pg_name && opg = ProductGroup.find_by_permalink(pg_name)
|
|
56
|
-
pg = new.from_product_group(opg)
|
|
57
|
-
elsif attrs
|
|
58
|
-
attrs = url.split('/')
|
|
59
|
-
pg = new.from_route(attrs)
|
|
60
|
-
end
|
|
61
|
-
taxon = taxons && taxons.split('/').last
|
|
62
|
-
pg.add_scope('in_taxon', taxon) if taxon
|
|
63
|
-
|
|
64
|
-
pg
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def from_product_group(opg)
|
|
68
|
-
self.product_scopes = opg.product_scopes.map{|ps|
|
|
69
|
-
ps = ps.clone;
|
|
70
|
-
ps.product_group_id = nil;
|
|
71
|
-
ps.product_group = self;
|
|
72
|
-
ps
|
|
73
|
-
}
|
|
74
|
-
self
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
def from_route(attrs)
|
|
78
|
-
self.order_scope = attrs.pop if attrs.length % 2 == 1
|
|
79
|
-
attrs.each_slice(2) do |scope|
|
|
80
|
-
next unless Product.respond_to?(scope.first)
|
|
81
|
-
add_scope(scope.first, scope.last.split(','))
|
|
82
|
-
end
|
|
83
|
-
self
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
def from_search(search_hash)
|
|
87
|
-
search_hash.each_pair do |scope_name, scope_attribute|
|
|
88
|
-
add_scope(scope_name, scope_attribute)
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
self
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
def add_scope(scope_name, arguments=[])
|
|
95
|
-
if scope_name.to_s !~ /eval|send|system|[^a-z0-9_!?]/
|
|
96
|
-
self.product_scopes << ProductScope.new({
|
|
97
|
-
:name => scope_name.to_s,
|
|
98
|
-
:arguments => [*arguments]
|
|
99
|
-
})
|
|
100
|
-
else
|
|
101
|
-
raise ArgumentError.new("'#{scope_name}` can't be used as scope")
|
|
102
|
-
end
|
|
103
|
-
self
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
def apply_on(scopish, use_order = true)
|
|
107
|
-
# There's bug in AR, it doesn't merge :order, instead it takes order
|
|
108
|
-
# from first nested_scope so we have to apply ordering FIRST.
|
|
109
|
-
# see #2253 on rails LH
|
|
110
|
-
base_product_scope = scopish
|
|
111
|
-
if use_order && !self.order_scope.blank? && Product.respond_to?(self.order_scope.intern)
|
|
112
|
-
base_product_scope = base_product_scope.send(self.order_scope)
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
return self.product_scopes.reject { |s| s.is_ordering? }.inject(base_product_scope) do |result, scope|
|
|
116
|
-
scope.apply_on(result)
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
# returns chain of named scopes generated from order scope and product scopes.
|
|
122
|
-
def dynamic_products(use_order = true)
|
|
123
|
-
apply_on(Product.group_by_products_id, use_order)
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
# Does the final ordering if requested
|
|
127
|
-
# TODO: move the order stuff out of the above - is superfluous now
|
|
128
|
-
def products(use_order = true)
|
|
129
|
-
cached_group = Product.in_cached_group(self)
|
|
130
|
-
if cached_group.limit(1).blank?
|
|
131
|
-
dynamic_products(use_order)
|
|
132
|
-
elsif !use_order
|
|
133
|
-
cached_group
|
|
134
|
-
else
|
|
135
|
-
product_scopes.select { |s|
|
|
136
|
-
s.is_ordering?
|
|
137
|
-
}.inject(cached_group) { |res,order|
|
|
138
|
-
order.apply_on(res)
|
|
139
|
-
}
|
|
140
|
-
end
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
def include?(product)
|
|
144
|
-
res = apply_on(Product.where(:id => product.id), false)
|
|
145
|
-
res.count > 0
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
def scopes_to_hash
|
|
149
|
-
result = {}
|
|
150
|
-
self.product_scopes.each do |scope|
|
|
151
|
-
result[scope.name] = scope.arguments
|
|
152
|
-
end
|
|
153
|
-
result
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
def to_param
|
|
157
|
-
permalink.present? ? permalink : (permalink_was || name.to_s.to_url)
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
def update_memberships
|
|
161
|
-
# wipe everything directly to avoid expensive in-rails sorting
|
|
162
|
-
ActiveRecord::Base.connection.execute "DELETE FROM spree_product_groups_products WHERE product_group_id = #{self.id}"
|
|
163
|
-
|
|
164
|
-
# and generate the new group entirely in SQL
|
|
165
|
-
ActiveRecord::Base.connection.execute "INSERT INTO spree_product_groups_products #{dynamic_products(false).scoped(:select => "spree_products.id, #{self.id}").to_sql}"
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
def generate_preview(size = Spree::Config[:admin_pgroup_preview_size])
|
|
169
|
-
count = self.class.count_by_sql ["SELECT COUNT(*) FROM spree_product_groups_products WHERE spree_product_groups_products.product_group_id = ?", self]
|
|
170
|
-
|
|
171
|
-
return count, products.limit(size)
|
|
172
|
-
end
|
|
173
|
-
|
|
174
|
-
def to_s
|
|
175
|
-
"<Spree::ProductGroup" + (id && "[#{id}]").to_s + ":'#{to_url}'>"
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
def order_scope
|
|
180
|
-
if scope = product_scopes.detect {|s| s.is_ordering?}
|
|
181
|
-
scope.name
|
|
182
|
-
end
|
|
183
|
-
end
|
|
184
|
-
|
|
185
|
-
def order_scope=(scope_name)
|
|
186
|
-
if scope = product_scopes.detect {|s| s.is_ordering?}
|
|
187
|
-
scope.update_attribute(:name, scope_name)
|
|
188
|
-
else
|
|
189
|
-
self.product_scopes.build(:name => scope_name, :arguments => [])
|
|
190
|
-
end
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
# Build a new product group with a scope to filter by specified products
|
|
194
|
-
def self.new_from_products(products, attrs = {})
|
|
195
|
-
pg = new(attrs)
|
|
196
|
-
pg.product_scopes.build(:name => 'with_ids', :arguments => [products.map(&:id).join(',')])
|
|
197
|
-
pg
|
|
198
|
-
end
|
|
199
|
-
end
|
|
200
|
-
end
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
# *Spree::ProductScope* is model for storing named scopes with their arguments,
|
|
2
|
-
# to be used with Spree::ProductGroups.
|
|
3
|
-
#
|
|
4
|
-
# Each product Scope can be applied to Spree::Product (or product scope) with #apply_on method
|
|
5
|
-
# which returns new combined named scope
|
|
6
|
-
#
|
|
7
|
-
module Spree
|
|
8
|
-
class ProductScope < ActiveRecord::Base
|
|
9
|
-
# name
|
|
10
|
-
# arguments
|
|
11
|
-
belongs_to :product_group
|
|
12
|
-
serialize :arguments
|
|
13
|
-
|
|
14
|
-
validate :check_validity_of_scope
|
|
15
|
-
|
|
16
|
-
extend ::Spree::Scopes::Dynamic
|
|
17
|
-
|
|
18
|
-
# Get all products with this scope
|
|
19
|
-
def products
|
|
20
|
-
if Product.respond_to?(name)
|
|
21
|
-
Product.send(name, *arguments)
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
# Applies product scope on Spree::Product model or another named scope
|
|
26
|
-
def apply_on(another_scope)
|
|
27
|
-
array = Array.wrap(self.arguments)
|
|
28
|
-
if Product.respond_to?(self.name.intern)
|
|
29
|
-
relation2 = if (array.blank? || array.size < 2)
|
|
30
|
-
if Product.method(self.name.intern).arity == 0
|
|
31
|
-
Product.send(self.name.intern)
|
|
32
|
-
else
|
|
33
|
-
Product.send(self.name.intern, array.try(:first))
|
|
34
|
-
end
|
|
35
|
-
else
|
|
36
|
-
Product.send(self.name.intern, *array)
|
|
37
|
-
end
|
|
38
|
-
else
|
|
39
|
-
relation2 = Product.metasearch({ self.name.intern => array.join("") }).relation
|
|
40
|
-
end
|
|
41
|
-
unless another_scope.class == ActiveRecord::Relation
|
|
42
|
-
another_scope = another_scope.send(:relation)
|
|
43
|
-
end
|
|
44
|
-
another_scope.merge(relation2)
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
# checks validity of the named scope (if its safe and can be applied on Spree::Product)
|
|
48
|
-
def check_validity_of_scope
|
|
49
|
-
errors.add(:name, 'is not a valid scope name') unless Product.respond_to?(self.name.intern)
|
|
50
|
-
apply_on(Product).limit(0) != nil
|
|
51
|
-
rescue Exception => e
|
|
52
|
-
unless Rails.env.production?
|
|
53
|
-
|
|
54
|
-
puts "name: #{self.name}"
|
|
55
|
-
puts "arguments: #{self.arguments.inspect}"
|
|
56
|
-
puts e.message
|
|
57
|
-
puts e.backtrace
|
|
58
|
-
end
|
|
59
|
-
errors.add(:arguments, 'are incorrect')
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
# test ordering scope by looking for name pattern or missed arguments
|
|
63
|
-
def is_ordering?
|
|
64
|
-
name =~ /^(ascend_by|descend_by)/ || arguments.blank?
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def to_sentence
|
|
68
|
-
result = I18n.t(:sentence, :scope => [:product_scopes, :scopes, self.name], :default => '')
|
|
69
|
-
result = I18n.t(:name, :scope => [:product_scopes, :scopes, self.name]) if result.blank?
|
|
70
|
-
result % [*self.arguments]
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
def to_s
|
|
74
|
-
to_sentence
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
require_dependency 'spree/product_scope/scopes'
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
<% if !current_user.dismissed_banner?(:gateway) &&
|
|
2
|
-
Spree::PaymentMethod.production.where("type != 'Spree::Gateway::Bogus'").empty? %>
|
|
3
|
-
|
|
4
|
-
<div class="banner payment_banner">
|
|
5
|
-
<p class="message">
|
|
6
|
-
<%= t(:payment_processor_choose_banner_text)%>
|
|
7
|
-
<%= link_to t(:payment_processor_choose_link), "http://spreecommerce.com/products/payment_processing", :target => '_blank' %>
|
|
8
|
-
</p>
|
|
9
|
-
|
|
10
|
-
<%= link_to t(:dismiss_banner), dismiss_banner_admin_user_path(current_user, :banner_id => :gateway),
|
|
11
|
-
:remote => true, :method => :post, :class => 'dismiss' %>
|
|
12
|
-
</div>
|
|
13
|
-
|
|
14
|
-
<% end %>
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
<% count, preview = @product_group.generate_preview(Spree::Config[:admin_pgroup_preview_size]) %>
|
|
2
|
-
|
|
3
|
-
<h2><%= Spree::ProductGroup.human_attribute_name(:products) %> (<%= count %>)</h2>
|
|
4
|
-
|
|
5
|
-
<% if count == 0 %>
|
|
6
|
-
<p data-hook="preview_empty"><%= t(:no_match_found) %></p>
|
|
7
|
-
<% else %>
|
|
8
|
-
|
|
9
|
-
<% if count > Spree::Config[:admin_pgroup_preview_size] %>
|
|
10
|
-
<p data-hook="preview_showing"><%= t(:showing_first_n, :n => Spree::Config[:admin_pgroup_preview_size]) %></p>
|
|
11
|
-
<% end %>
|
|
12
|
-
|
|
13
|
-
<table class="index" data-hook="preview">
|
|
14
|
-
<thead>
|
|
15
|
-
<tr data-hook="preview_header">
|
|
16
|
-
<th><%= Spree::Product.human_attribute_name(:name) %></th>
|
|
17
|
-
<th><%= t(:action) %></th>
|
|
18
|
-
</tr>
|
|
19
|
-
</thead>
|
|
20
|
-
<tbody>
|
|
21
|
-
<% preview.each do |product| %>
|
|
22
|
-
<tr data-hook="preview_row">
|
|
23
|
-
<td>
|
|
24
|
-
<%= link_to product.name, product_url(product) %>
|
|
25
|
-
</td>
|
|
26
|
-
<td>
|
|
27
|
-
<%= link_to t(:edit), edit_admin_product_path(product) %>
|
|
28
|
-
</td>
|
|
29
|
-
</tr>
|
|
30
|
-
<% end %>
|
|
31
|
-
</tbody>
|
|
32
|
-
</table>
|
|
33
|
-
<% end %>
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
<tr id="<%= dom_id product_scope %>" data-hook="product_scope">
|
|
2
|
-
<td data-hook="description">
|
|
3
|
-
<%= label_tag nil, t(:name, :scope => [:product_scopes, :scopes, product_scope.name]) %>
|
|
4
|
-
<% if description = t(:description, :scope => [:product_scopes, :scopes, product_scope.name], :default => "") and description.present? %>
|
|
5
|
-
<br /><%= description %>
|
|
6
|
-
<% end %>
|
|
7
|
-
</td>
|
|
8
|
-
<td data-hook="arguments">
|
|
9
|
-
<% if arguments = Spree::ProductScope.arguments_for_scope_name(product_scope.name.strip) %>
|
|
10
|
-
<table><tr>
|
|
11
|
-
<% arguments.each_with_index do |argument, i| %>
|
|
12
|
-
<td>
|
|
13
|
-
<%= label_tag nil, t(argument, :scope => [:product_scopes, :scopes, product_scope.name, :args]) %><br />
|
|
14
|
-
<%= hidden_field_tag 'product_group[product_scopes_attributes][][id]', product_scope.id %>
|
|
15
|
-
<%= product_scope_field product_scope, i %>
|
|
16
|
-
</td>
|
|
17
|
-
<% end %>
|
|
18
|
-
</tr></table>
|
|
19
|
-
<% end %>
|
|
20
|
-
</td>
|
|
21
|
-
<td class="actions" data-hook="actions">
|
|
22
|
-
<%= link_to_with_icon 'cross', '', admin_product_group_product_scope_path(@product_group, product_scope), :remote => true, :method => 'delete' %>
|
|
23
|
-
</td>
|
|
24
|
-
</tr>
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
<%= render :partial => 'spree/admin/shared/product_sub_menu' %>
|
|
2
|
-
|
|
3
|
-
<h1><%= t(:editing_product_group) %></h1>
|
|
4
|
-
|
|
5
|
-
<fieldset id="product_group_forms_container" data-hook>
|
|
6
|
-
|
|
7
|
-
<%= form_for [:admin, @product_group], :html => { :id => 'product-group-form', :method => :put } do |f| %>
|
|
8
|
-
|
|
9
|
-
<%= f.field_container :name do %>
|
|
10
|
-
<%= f.label :name, t(:name) %><br />
|
|
11
|
-
<%= f.text_field :name %>
|
|
12
|
-
<%= f.error_message_on :name %>
|
|
13
|
-
<% end %>
|
|
14
|
-
|
|
15
|
-
<%= f.field_container :permalink do %>
|
|
16
|
-
<%= f.label :permalink, t(:permalink) %><br />
|
|
17
|
-
<%= f.text_field :permalink %>
|
|
18
|
-
<%= f.error_message_on :permalink %>
|
|
19
|
-
<% end %>
|
|
20
|
-
|
|
21
|
-
<%= f.field_container :order_scope do %>
|
|
22
|
-
<%= f.label :order_scope, t(:sort_ordering) %><br />
|
|
23
|
-
<%= f.select(:order_scope, Spree::Product.simple_scopes.collect{|p| [ t(:name, :scope =>[:product_scopes, :scopes, p]), p.to_s ] }) %>
|
|
24
|
-
<% end %>
|
|
25
|
-
|
|
26
|
-
<table id="product_scopes" data-hook>
|
|
27
|
-
<%= render :partial => 'product_scope', :collection => @product_group.product_scopes.reject {|s| s.is_ordering? } %>
|
|
28
|
-
</table>
|
|
29
|
-
|
|
30
|
-
<%= button t(:update) %>
|
|
31
|
-
|
|
32
|
-
<% end %>
|
|
33
|
-
|
|
34
|
-
<%= form_tag admin_product_group_product_scopes_path(@product_group), :remote => true, :id => 'new_product_group_form' do %>
|
|
35
|
-
<%
|
|
36
|
-
options =
|
|
37
|
-
grouped_options_for_select(
|
|
38
|
-
Spree::ProductScope.all_scopes.map do |group_name, scopes|
|
|
39
|
-
[
|
|
40
|
-
t(:name, :scope => [:product_scopes, :groups, group_name]),
|
|
41
|
-
scopes.keys.map do |scope_name|
|
|
42
|
-
[ t(:name, :scope => [:product_scopes, :scopes, scope_name]), scope_name]
|
|
43
|
-
end
|
|
44
|
-
]
|
|
45
|
-
end
|
|
46
|
-
)
|
|
47
|
-
%>
|
|
48
|
-
<p>
|
|
49
|
-
<%= label_tag :product_scope_name, t(:add_scope) %>
|
|
50
|
-
<%= select_tag 'product_scope[name]', options %>
|
|
51
|
-
<%= submit_tag t(:add) %>
|
|
52
|
-
</p>
|
|
53
|
-
<% end %>
|
|
54
|
-
|
|
55
|
-
</fieldset>
|
|
56
|
-
|
|
57
|
-
<fieldset id="preview_container" data-hook>
|
|
58
|
-
<%= render :partial => 'preview' %>
|
|
59
|
-
</fieldset>
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
<% render :partial => 'spree/admin/shared/product_sub_menu' %>
|
|
2
|
-
<div class="toolbar" data-hook="toolbar">
|
|
3
|
-
<ul class="actions">
|
|
4
|
-
<li>
|
|
5
|
-
<%= button_link_to t(:new_product_group), new_object_url, :icon => 'add', :id => 'new_product_group_link' %>
|
|
6
|
-
</li>
|
|
7
|
-
</ul>
|
|
8
|
-
<br class="clear" />
|
|
9
|
-
</div>
|
|
10
|
-
|
|
11
|
-
<h1><%= t(:listing_product_groups) %></h1>
|
|
12
|
-
|
|
13
|
-
<table class="index" id='listing_product_groups' data-hook>
|
|
14
|
-
<thead>
|
|
15
|
-
<tr data-hook="product_group_header">
|
|
16
|
-
<th><%= Spree::ProductGroup.human_attribute_name(:name) %></th>
|
|
17
|
-
<th><%= Spree::ProductGroup.human_attribute_name(:url) %></th>
|
|
18
|
-
<th><%= Spree::ProductGroup.human_attribute_name(:product_scopes) %></th>
|
|
19
|
-
<th><%= Spree::ProductGroup.human_attribute_name(:product_count) %></th>
|
|
20
|
-
<th><%= t(:action) %></th>
|
|
21
|
-
</tr>
|
|
22
|
-
</thead>
|
|
23
|
-
<tbody>
|
|
24
|
-
<% @product_groups.each do |pg| %>
|
|
25
|
-
<tr id="<%= dom_id pg %>" data-hook="product_group_row">
|
|
26
|
-
<td><%= link_to pg.name, [:admin, pg] %></td>
|
|
27
|
-
<td><%= link_to pg_search_path(:product_group_name => pg.permalink), pg_search_path(:product_group_name => pg.permalink) %></td>
|
|
28
|
-
<td><%== pg.product_scopes.map(&:to_sentence).join('<br />') %></td>
|
|
29
|
-
<td><%= pg.products.count %></td>
|
|
30
|
-
<td>
|
|
31
|
-
<%= link_to_edit pg, :class => 'admin_edit_product_group' %> <%= link_to_delete pg %>
|
|
32
|
-
</td>
|
|
33
|
-
</tr>
|
|
34
|
-
<% end %>
|
|
35
|
-
</tbody>
|
|
36
|
-
</table>
|
|
37
|
-
<%= paginate @product_groups %>
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
<%= render :partial => 'spree/admin/shared/product_sub_menu' %>
|
|
2
|
-
<%= form_for [:admin, @product_group], :html => { :id => 'product-group-form', :multipart => true } do |f| %>
|
|
3
|
-
<fieldset data-hook="name">
|
|
4
|
-
<legend><%= t(:product_group) %></legend>
|
|
5
|
-
<%= f.field_container :name do %>
|
|
6
|
-
<%= f.label :name, t(:name) %>
|
|
7
|
-
<%= f.text_field :name %>
|
|
8
|
-
<%= f.error_message_on :name %>
|
|
9
|
-
<% end %>
|
|
10
|
-
</fieldset>
|
|
11
|
-
<%= button t(:create) %>
|
|
12
|
-
<% end %>
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
<% render :partial => 'spree/admin/shared/product_sub_menu' %>
|
|
2
|
-
<h2><%= Spree::ProductGroup.model_name.human %></h2>
|
|
3
|
-
<p>
|
|
4
|
-
<%= Spree::ProductGroup.human_attribute_name(:name) %>: <%= @product_group.name %>
|
|
5
|
-
</p>
|
|
6
|
-
<p>
|
|
7
|
-
<%= Spree::ProductGroup.human_attribute_name(:url) %>: <%= link_to @product_group.permalink, "/pg/#{@product_group.permalink}" %>
|
|
8
|
-
</p>
|
|
9
|
-
|
|
10
|
-
<h2><%= Spree::ProductGroup.human_attribute_name(:product_scopes) %>(<%= @product_group.product_scopes.count %>)</h2>
|
|
11
|
-
<table class="product-scopes" data-hook="product_scopes">
|
|
12
|
-
<thead>
|
|
13
|
-
<tr data-hook="product_scopes_header">
|
|
14
|
-
<th><%= Spree::ProductScope.human_attribute_name(:description) %></th>
|
|
15
|
-
<th><%= Spree::ProductScope.human_attribute_name(:arguments) %></th>
|
|
16
|
-
</tr>
|
|
17
|
-
</thead>
|
|
18
|
-
<tbody>
|
|
19
|
-
<% @product_group.product_scopes.each do |product_scope| %>
|
|
20
|
-
<tr <%= !product_scope.valid? ? "class='invalid'":'' %> data-hook="product_scopes_row">
|
|
21
|
-
<td>
|
|
22
|
-
<%= product_scope.to_sentence %>
|
|
23
|
-
</td>
|
|
24
|
-
<td>
|
|
25
|
-
<%= product_scope.arguments.join(', ') %>
|
|
26
|
-
</td>
|
|
27
|
-
</tr>
|
|
28
|
-
<% end %>
|
|
29
|
-
</tbody>
|
|
30
|
-
</table>
|
|
31
|
-
|
|
32
|
-
<%= render :partial => 'preview.html' %>
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
$('#product_scopes').append('<%= escape_javascript( render('spree/admin/product_groups/product_scope', :product_scope => @product_scope) ) %>');
|
|
2
|
-
$('#<%= dom_id @product_scope %>').hide();
|
|
3
|
-
$('#<%= dom_id @product_scope %>').fadeIn();
|
|
4
|
-
if(!$('.token-input-list').is('*')){
|
|
5
|
-
$('.tokeninput.products').productPicker();
|
|
6
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
<%= object.errors.full_messages %>
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
<% if products.any? %>
|
|
2
|
-
<% form_tag admin_product_groups_path do %>
|
|
3
|
-
<%= hidden_field_tag 'product_group[product_scopes_attributes][][name]', 'with_ids' %>
|
|
4
|
-
<%= hidden_field_tag 'product_group[product_scopes_attributes][][arguments][]', products.map(&:id).join(',') %>
|
|
5
|
-
<fieldset data-hook="create_group">
|
|
6
|
-
<legend><%= t(:create_product_group_from_products) %></legend>
|
|
7
|
-
<%= label_tag nil, t(:name) %>
|
|
8
|
-
<%= text_field_tag 'product_group[name]', t(:new_group) %>
|
|
9
|
-
<%= submit_tag t(:create) %>
|
|
10
|
-
</fieldset>
|
|
11
|
-
<% end %>
|
|
12
|
-
<% end %>
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
class ProductGroupsAndScopes < ActiveRecord::Migration
|
|
2
|
-
def change
|
|
3
|
-
create_table :product_groups do |t|
|
|
4
|
-
t.string :name, :permalink, :order
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
create_table :product_scopes do |t|
|
|
8
|
-
t.string :name
|
|
9
|
-
t.text :arguments
|
|
10
|
-
t.references :product_group
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
add_index :product_groups, :name
|
|
14
|
-
add_index :product_groups, :permalink
|
|
15
|
-
add_index :product_scopes, :name
|
|
16
|
-
add_index :product_scopes, :product_group_id
|
|
17
|
-
end
|
|
18
|
-
end
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
class FixByPopularity < ActiveRecord::Migration
|
|
2
|
-
def up
|
|
3
|
-
execute("UPDATE product_scopes SET name='descend_by_popularity' WHERE name='by_popularity'")
|
|
4
|
-
end
|
|
5
|
-
|
|
6
|
-
def down
|
|
7
|
-
execute("UPDATE product_scopes SET name='by_popularity' WHERE name='descend_by_popularity'")
|
|
8
|
-
end
|
|
9
|
-
end
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
class ConvertSalesTaxToDefaultTax < ActiveRecord::Migration
|
|
2
|
-
def up
|
|
3
|
-
execute "UPDATE spree_calculators SET type='Spree::Calculator::DefaultTax' WHERE type='Spree::Calculator::SalesTax'"
|
|
4
|
-
end
|
|
5
|
-
|
|
6
|
-
def down
|
|
7
|
-
execute "UPDATE spree_calculators SET type='Spree::Calculator::SalesTax' WHERE type='Spree::Calculator::DefaultTax'"
|
|
8
|
-
end
|
|
9
|
-
end
|