refinerycms-products 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.
- data/app/controllers/addresses_controller.rb +22 -0
- data/app/controllers/admin/carts_controller.rb +7 -0
- data/app/controllers/admin/categories_controller.rb +50 -0
- data/app/controllers/admin/customers_controller.rb +12 -0
- data/app/controllers/admin/line_items_controller.rb +7 -0
- data/app/controllers/admin/products_controller.rb +23 -0
- data/app/controllers/carts_controller.rb +110 -0
- data/app/controllers/categories_controller.rb +32 -0
- data/app/controllers/customers_controller.rb +33 -0
- data/app/controllers/line_items_controller.rb +8 -0
- data/app/controllers/products_controller.rb +61 -0
- data/app/controllers/profiles_controller.rb +37 -0
- data/app/helpers/address_helper.rb +20 -0
- data/app/helpers/products_helper.rb +34 -0
- data/app/models/address.rb +18 -0
- data/app/models/cart.rb +54 -0
- data/app/models/category.rb +28 -0
- data/app/models/customer.rb +32 -0
- data/app/models/line_item.rb +28 -0
- data/app/models/product.rb +46 -0
- data/app/views/addresses/edit.html.erb +42 -0
- data/app/views/admin/carts/_actions.html.erb +28 -0
- data/app/views/admin/carts/_cart.html.erb +18 -0
- data/app/views/admin/carts/_carts.html.erb +2 -0
- data/app/views/admin/carts/_form.html.erb +24 -0
- data/app/views/admin/carts/_records.html.erb +18 -0
- data/app/views/admin/carts/_sortable_list.html.erb +7 -0
- data/app/views/admin/carts/edit.html.erb +1 -0
- data/app/views/admin/carts/index.html.erb +10 -0
- data/app/views/admin/carts/new.html.erb +1 -0
- data/app/views/admin/categories/_actions.html.erb +28 -0
- data/app/views/admin/categories/_categories.html.erb +2 -0
- data/app/views/admin/categories/_category.html.erb +25 -0
- data/app/views/admin/categories/_form.html.erb +49 -0
- data/app/views/admin/categories/_records.html.erb +18 -0
- data/app/views/admin/categories/_sortable_list.html.erb +10 -0
- data/app/views/admin/categories/edit.html.erb +1 -0
- data/app/views/admin/categories/index.html.erb +12 -0
- data/app/views/admin/categories/new.html.erb +1 -0
- data/app/views/admin/customers/_actions.html.erb +28 -0
- data/app/views/admin/customers/_customer.html.erb +18 -0
- data/app/views/admin/customers/_customers.html.erb +2 -0
- data/app/views/admin/customers/_form.html.erb +40 -0
- data/app/views/admin/customers/_records.html.erb +18 -0
- data/app/views/admin/customers/_sortable_list.html.erb +7 -0
- data/app/views/admin/customers/edit.html.erb +1 -0
- data/app/views/admin/customers/index.html.erb +10 -0
- data/app/views/admin/customers/new.html.erb +1 -0
- data/app/views/admin/customers/show.html.erb +60 -0
- data/app/views/admin/line_items/_actions.html.erb +28 -0
- data/app/views/admin/line_items/_form.html.erb +29 -0
- data/app/views/admin/line_items/_line_item.html.erb +18 -0
- data/app/views/admin/line_items/_line_items.html.erb +2 -0
- data/app/views/admin/line_items/_records.html.erb +18 -0
- data/app/views/admin/line_items/_sortable_list.html.erb +7 -0
- data/app/views/admin/line_items/edit.html.erb +1 -0
- data/app/views/admin/line_items/index.html.erb +10 -0
- data/app/views/admin/line_items/new.html.erb +1 -0
- data/app/views/admin/products/_actions.html.erb +43 -0
- data/app/views/admin/products/_form.html.erb +120 -0
- data/app/views/admin/products/_product.html.erb +24 -0
- data/app/views/admin/products/_products.html.erb +2 -0
- data/app/views/admin/products/_records.html.erb +18 -0
- data/app/views/admin/products/_sortable_list.html.erb +13 -0
- data/app/views/admin/products/edit.html.erb +1 -0
- data/app/views/admin/products/index.html.erb +12 -0
- data/app/views/admin/products/new.html.erb +1 -0
- data/app/views/carts/show.html.erb +56 -0
- data/app/views/categories/index.html.erb +11 -0
- data/app/views/categories/show.html.erb +33 -0
- data/app/views/customers/index.html.erb +11 -0
- data/app/views/customers/show.html.erb +52 -0
- data/app/views/line_items/index.html.erb +11 -0
- data/app/views/line_items/show.html.erb +39 -0
- data/app/views/products/index.html.erb +33 -0
- data/app/views/products/show.html.erb +65 -0
- data/app/views/profiles/_order_history.html.erb +24 -0
- data/app/views/profiles/_show_address.html.erb +4 -0
- data/app/views/profiles/account_details.html.erb +32 -0
- data/app/views/profiles/address_details.html.erb +10 -0
- data/app/views/profiles/index.html.erb +75 -0
- data/app/views/profiles/order_history.html.erb +1 -0
- data/app/views/profiles/order_history_details.html.erb +39 -0
- data/config/locales/en.yml +97 -0
- data/config/locales/fr.yml +25 -0
- data/config/locales/lolcat.yml +25 -0
- data/config/locales/nb.yml +21 -0
- data/config/locales/nl.yml +21 -0
- data/config/routes.rb +58 -0
- data/lib/generators/refinerycms_products_generator.rb +6 -0
- data/lib/refinerycms-carts.rb +32 -0
- data/lib/refinerycms-categories.rb +30 -0
- data/lib/refinerycms-customers.rb +34 -0
- data/lib/refinerycms-line_items.rb +30 -0
- data/lib/refinerycms-products.rb +65 -0
- data/lib/tasks/products.rake +13 -0
- metadata +160 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
class AddressesController < ApplicationController
|
|
2
|
+
|
|
3
|
+
def edit
|
|
4
|
+
|
|
5
|
+
@address = Address.find(params[:id])
|
|
6
|
+
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def update
|
|
10
|
+
|
|
11
|
+
@address = Address.find(params[:id])
|
|
12
|
+
|
|
13
|
+
if @address.update_attributes(params[:address])
|
|
14
|
+
flash[:success] = 'Address was successfully updated.'
|
|
15
|
+
redirect_to profiles_path
|
|
16
|
+
else
|
|
17
|
+
render :action => "edit"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
module Admin
|
|
2
|
+
class CategoriesController < Admin::BaseController
|
|
3
|
+
|
|
4
|
+
crudify :category,
|
|
5
|
+
:conditions => nil,
|
|
6
|
+
:include => [:parent],
|
|
7
|
+
:title_attribute => 'name', :xhr_paging => true
|
|
8
|
+
|
|
9
|
+
def create
|
|
10
|
+
# if the position field exists, set this object as last object, given the conditions of this class.
|
|
11
|
+
if Category.column_names.include?("position")
|
|
12
|
+
params[:category].merge!({
|
|
13
|
+
:position => ((Category.maximum(:position)||-1) + 1)
|
|
14
|
+
})
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
if (@category = Category.create(params[:category])).valid?
|
|
18
|
+
|
|
19
|
+
flash[:notice] = t('refinery.crudify.created', :what => @category.name)
|
|
20
|
+
|
|
21
|
+
if @category.parent.present?
|
|
22
|
+
if @category.parent.products.present?
|
|
23
|
+
flash[:notice] += " Please be aware that the '#{@category.parent.name}' category has products attached to it. Please re-assign these."
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
redirect_to admin_categories_path
|
|
28
|
+
|
|
29
|
+
else
|
|
30
|
+
render :action => 'new'
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def update
|
|
35
|
+
|
|
36
|
+
if @category.update_attributes(params[:category])
|
|
37
|
+
|
|
38
|
+
if @category.parent.present?
|
|
39
|
+
if @category.parent.products.present?
|
|
40
|
+
flash[:notice] = "Please be aware that the '#{@category.parent.name}' category has products attached to it. Please re-assign these."
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
redirect_to admin_categories_path
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Admin
|
|
2
|
+
class ProductsController < Admin::BaseController
|
|
3
|
+
|
|
4
|
+
crudify :product,
|
|
5
|
+
:title_attribute => 'name', :xhr_paging => true
|
|
6
|
+
|
|
7
|
+
def index
|
|
8
|
+
if params[:category_id].present?
|
|
9
|
+
@category = Category.find(params[:category_id])
|
|
10
|
+
@products = Product.by_category(@category.id).order('position ASC').paginate(:page => params[:page])
|
|
11
|
+
else
|
|
12
|
+
paginate_all_products
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def update_prices
|
|
17
|
+
Product.update(params[:products].keys, params[:products].values)
|
|
18
|
+
flash[:notice] = 'Prices were successfully updated.'
|
|
19
|
+
redirect_to :action => "index"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
class CartsController < ApplicationController
|
|
2
|
+
|
|
3
|
+
before_filter :initialize_cart
|
|
4
|
+
|
|
5
|
+
def add_to_cart
|
|
6
|
+
check_quantity_then_update_cart
|
|
7
|
+
|
|
8
|
+
# redirect_to_products("Product added to Cart")
|
|
9
|
+
redirect_to show_cart_path
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Here for backwards compatibility
|
|
13
|
+
def show_cart
|
|
14
|
+
render :action => 'show'
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def show
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def check_quantity_then_update_cart
|
|
22
|
+
|
|
23
|
+
#logger.info("****************** the variant = #{params[:variant][:id]}")
|
|
24
|
+
|
|
25
|
+
if params[:quantity].present?
|
|
26
|
+
if params[:variant].present?
|
|
27
|
+
@current_cart.add_to_the_cart(params[:product_id], params[:quantity], params[:variant][:id])
|
|
28
|
+
else
|
|
29
|
+
@current_cart.add_to_the_cart(params[:product_id], params[:quantity])
|
|
30
|
+
end
|
|
31
|
+
else
|
|
32
|
+
if params[:variant].present?
|
|
33
|
+
@current_cart.add_to_the_cart(params[:product_id], 1, params[:variant][:id])
|
|
34
|
+
else
|
|
35
|
+
@current_cart.add_to_the_cart(params[:product_id])
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def increment_cart
|
|
42
|
+
check_quantity_then_update_cart
|
|
43
|
+
|
|
44
|
+
redirect_to show_cart_path
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
|
|
49
|
+
def redirect_to_products(msg)
|
|
50
|
+
flash[:notice] = msg
|
|
51
|
+
|
|
52
|
+
if params[:category_id].present?
|
|
53
|
+
if params[:category_id] == "0"
|
|
54
|
+
redirect_to "/"
|
|
55
|
+
else
|
|
56
|
+
redirect_to category_products_path(params[:category_id])
|
|
57
|
+
end
|
|
58
|
+
else
|
|
59
|
+
redirect_to product_path(params[:product_id])
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def initialize_cart
|
|
64
|
+
@current_cart = get_cart
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Get the current customer's cart
|
|
68
|
+
def get_cart
|
|
69
|
+
if customer_signed_in?
|
|
70
|
+
|
|
71
|
+
if session[:cart_id].present?
|
|
72
|
+
cart = Cart.find(session[:cart_id])
|
|
73
|
+
if cart.customer_id.blank?
|
|
74
|
+
cart.customer_id = current_customer.id
|
|
75
|
+
cart.is_current = true
|
|
76
|
+
cart.save
|
|
77
|
+
end
|
|
78
|
+
return cart
|
|
79
|
+
else
|
|
80
|
+
cart = Cart.where(:is_current => true, :customer_id => current_customer.id).first
|
|
81
|
+
if cart.blank?
|
|
82
|
+
cart = Cart.create(:is_current => true, :customer_id => current_customer.id)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
session[:cart_id] = cart.id
|
|
86
|
+
return cart
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
else
|
|
90
|
+
if session[:cart_id].present?
|
|
91
|
+
# logger.info("*************** signed OUT and session was present")
|
|
92
|
+
cart = Cart.find_by_id(session[:cart_id])
|
|
93
|
+
if cart.blank?
|
|
94
|
+
cart = Cart.create(:is_current => true)
|
|
95
|
+
session[:cart_id] = cart.id
|
|
96
|
+
return cart
|
|
97
|
+
else
|
|
98
|
+
cart.is_current = true
|
|
99
|
+
cart.save
|
|
100
|
+
return cart
|
|
101
|
+
end
|
|
102
|
+
else
|
|
103
|
+
# logger.info("*************** signed OUT and session was NOT present")
|
|
104
|
+
cart = Cart.create(:is_current => true)
|
|
105
|
+
session[:cart_id] = cart.id
|
|
106
|
+
return cart
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
class CategoriesController < ApplicationController
|
|
2
|
+
|
|
3
|
+
before_filter :find_all_categories
|
|
4
|
+
before_filter :find_page
|
|
5
|
+
|
|
6
|
+
def index
|
|
7
|
+
# you can use meta fields from your model instead (e.g. browser_title)
|
|
8
|
+
# by swapping @page for @category in the line below:
|
|
9
|
+
present(@page)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def show
|
|
13
|
+
@category = Category.find(params[:id])
|
|
14
|
+
|
|
15
|
+
# redirect_to category_products_path(@category)
|
|
16
|
+
|
|
17
|
+
# you can use meta fields from your model instead (e.g. browser_title)
|
|
18
|
+
# by swapping @page for @category in the line below:
|
|
19
|
+
present(@page)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
protected
|
|
23
|
+
|
|
24
|
+
def find_all_categories
|
|
25
|
+
@categories = Category.order('position ASC')
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def find_page
|
|
29
|
+
@page = Page.where(:link_url => "/categories").first
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
class CustomersController < ApplicationController
|
|
2
|
+
|
|
3
|
+
#before_filter :find_all_customers
|
|
4
|
+
before_filter :find_page
|
|
5
|
+
helper :all
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
#def index
|
|
10
|
+
# # you can use meta fields from your model instead (e.g. browser_title)
|
|
11
|
+
# # by swapping @page for @customer in the line below:
|
|
12
|
+
# present(@page)
|
|
13
|
+
#end
|
|
14
|
+
|
|
15
|
+
def show
|
|
16
|
+
@customer = Customer.find(params[:id])
|
|
17
|
+
|
|
18
|
+
# you can use meta fields from your model instead (e.g. browser_title)
|
|
19
|
+
# by swapping @page for @customer in the line below:
|
|
20
|
+
present(@page)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
protected
|
|
24
|
+
|
|
25
|
+
#def find_all_customers
|
|
26
|
+
# @customers = Customer.order('surname ASC')
|
|
27
|
+
#end
|
|
28
|
+
|
|
29
|
+
def find_page
|
|
30
|
+
@page = Page.where(:link_url => "/customers").first
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
class ProductsController < ApplicationController
|
|
2
|
+
include ActionView::Helpers::NumberHelper
|
|
3
|
+
before_filter :find_all_products, :only => :index
|
|
4
|
+
before_filter :find_page
|
|
5
|
+
|
|
6
|
+
def index
|
|
7
|
+
# you can use meta fields from your model instead (e.g. browser_title)
|
|
8
|
+
# by swapping @page for @product in the line below:
|
|
9
|
+
present(@page)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def show
|
|
13
|
+
@product = Product.find(params[:id])
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@tagged_products = Product.tagged_with(@product.tag_list, :any => :true).order('position ASC')
|
|
17
|
+
|
|
18
|
+
# you can use meta fields from your model instead (e.g. browser_title)
|
|
19
|
+
# by swapping @page for @product in the line below:
|
|
20
|
+
present(@page)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def get_variant_image
|
|
24
|
+
if params[:variant_id].present?
|
|
25
|
+
variant_url = Variant.find(params[:variant_id]).image.url
|
|
26
|
+
end
|
|
27
|
+
render :text => variant_url
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def get_variant_price
|
|
31
|
+
if params[:variant_id].present?
|
|
32
|
+
variant_price = Variant.find(params[:variant_id]).price
|
|
33
|
+
end
|
|
34
|
+
render :text => number_to_currency(variant_price, :unit => 'R')
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
protected
|
|
38
|
+
|
|
39
|
+
def find_all_products
|
|
40
|
+
|
|
41
|
+
if params[:category_id].present?
|
|
42
|
+
@category = Category.find(params[:category_id])
|
|
43
|
+
@products = Product.by_category(@category.id).order('position ASC')
|
|
44
|
+
@page_title = @category.name
|
|
45
|
+
elsif params[:upper].present? and params[:lower].present?
|
|
46
|
+
@products = Product.greater_than(params[:lower]).less_than(params[:upper])
|
|
47
|
+
@page_title = "By Price"
|
|
48
|
+
elsif params[:tag].present?
|
|
49
|
+
@products = Product.tagged_with(params[:tag]).order('position ASC')
|
|
50
|
+
@page_title = params[:tag].capitalize
|
|
51
|
+
else
|
|
52
|
+
@products = Product.all
|
|
53
|
+
@page_title = "All Products"
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def find_page
|
|
58
|
+
@page = Page.where(:link_url => "/products").first
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
class ProfilesController < ApplicationController
|
|
2
|
+
before_filter :authenticate_customer!
|
|
3
|
+
|
|
4
|
+
def index
|
|
5
|
+
@current_customer = current_customer
|
|
6
|
+
if @current_customer.present?
|
|
7
|
+
@delivery_addresses = Address.where(:customer_id => current_customer.id).all
|
|
8
|
+
end
|
|
9
|
+
if @current_customer.present?
|
|
10
|
+
@orders = Order.where(:customer_id => current_customer.id).limit(5)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def account_details
|
|
15
|
+
@current_customer = current_customer
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def address_details
|
|
19
|
+
if current_customer.present?
|
|
20
|
+
@delivery_addresses = Address.where(:customer_id => current_customer.id).all
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
if defined?(OrdersController)
|
|
25
|
+
def order_history
|
|
26
|
+
if current_customer.present?
|
|
27
|
+
@orders = Order.where(:customer_id => current_customer.id).all
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def order_history_details
|
|
32
|
+
@current_order = Order.where(:order_number => params[:order_number]).first
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module AddressHelper
|
|
2
|
+
|
|
3
|
+
def address_html(address)
|
|
4
|
+
if address.present?
|
|
5
|
+
items = []
|
|
6
|
+
items << address.address_line_1 if address.address_line_1.present?
|
|
7
|
+
items << address.address_line_2 if address.address_line_2.present?
|
|
8
|
+
items << address.suburb if address.suburb.present?
|
|
9
|
+
items << address.city if address.city.present?
|
|
10
|
+
items << address.postal_code if address.postal_code.present?
|
|
11
|
+
|
|
12
|
+
items.join("<br />")
|
|
13
|
+
else
|
|
14
|
+
nil
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require 'acts-as-taggable-on'
|
|
2
|
+
|
|
3
|
+
module ProductsHelper
|
|
4
|
+
include ActsAsTaggableOn::TagsHelper
|
|
5
|
+
|
|
6
|
+
def rands(amount)
|
|
7
|
+
number_to_currency(amount, :unit => 'R')
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def rands_nocents(amount)
|
|
11
|
+
number_to_currency(amount, :unit => 'R', :precision => 0)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def product_or_variant_name(cart_item)
|
|
15
|
+
if variant_exists?(cart_item)
|
|
16
|
+
"#{cart_item.product.name}: #{cart_item.variant.name}"
|
|
17
|
+
else
|
|
18
|
+
cart_item.product.name
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def product_or_variant_price(cart_item)
|
|
23
|
+
if variant_exists?(cart_item)
|
|
24
|
+
rands(cart_item.variant.price)
|
|
25
|
+
else
|
|
26
|
+
rands(cart_item.product.price)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def variant_exists?(cart_item)
|
|
31
|
+
cart_item.variant_id.present? and defined?(Variant)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
class Address < ActiveRecord::Base
|
|
2
|
+
belongs_to :customer
|
|
3
|
+
|
|
4
|
+
validates_presence_of :address_line_1, :suburb, :city, :postal_code, :customer
|
|
5
|
+
|
|
6
|
+
scope :is_default, where(:default => true)
|
|
7
|
+
|
|
8
|
+
def set_as_default
|
|
9
|
+
self.update_attribute(:default, true)
|
|
10
|
+
|
|
11
|
+
other_addresses = Address.where(:customer_id => self.customer_id)
|
|
12
|
+
other_addresses.each do |address|
|
|
13
|
+
if self.id != address.id
|
|
14
|
+
address.update_attribute(:default, false)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
data/app/models/cart.rb
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
class Cart < ActiveRecord::Base
|
|
2
|
+
before_save :check_is_current_for_sibling_carts
|
|
3
|
+
|
|
4
|
+
belongs_to :customer
|
|
5
|
+
has_many :line_items
|
|
6
|
+
has_many :products, :through => :line_items
|
|
7
|
+
|
|
8
|
+
# def title was created automatically because you didn't specify a string field
|
|
9
|
+
# when you ran the refinery_engine generator. Love, Refinery CMS.
|
|
10
|
+
def title
|
|
11
|
+
"Override def title in vendor/engines/carts/app/models/cart.rb"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def grand_total
|
|
15
|
+
total = 0
|
|
16
|
+
line_items.each do |li|
|
|
17
|
+
total += li.total_price
|
|
18
|
+
end
|
|
19
|
+
total
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def add_to_the_cart(product_id, quantity = 1, variant_id = nil)
|
|
24
|
+
if variant_id.blank?
|
|
25
|
+
li = self.line_items.where(:product_id => product_id).first
|
|
26
|
+
else
|
|
27
|
+
li = self.line_items.where(:product_id => product_id, :variant_id => variant_id).first
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
#logger.info("****************** the variant id = #{variant_id}")
|
|
31
|
+
|
|
32
|
+
if li.present?
|
|
33
|
+
li.quantity += quantity.to_i
|
|
34
|
+
li.save
|
|
35
|
+
else
|
|
36
|
+
if variant_id.blank?
|
|
37
|
+
self.line_items.create(:product_id => product_id, :quantity => quantity)
|
|
38
|
+
else
|
|
39
|
+
self.line_items.create(:product_id => product_id, :quantity => quantity, :variant_id => variant_id)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def check_is_current_for_sibling_carts
|
|
46
|
+
if is_current.present? and is_current == true and customer_id.present?
|
|
47
|
+
other_carts = Cart.where(:customer_id => self.customer_id)
|
|
48
|
+
other_carts.each do |cart|
|
|
49
|
+
cart.update_attributes(:is_current => false) if cart.id != self.id
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
class Category < ActiveRecord::Base
|
|
2
|
+
|
|
3
|
+
include Rails.application.routes.url_helpers
|
|
4
|
+
#default_url_options[:host] = request.host_with_port
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
acts_as_indexed :fields => [:name]
|
|
8
|
+
|
|
9
|
+
validates :name, :presence => true, :uniqueness => true
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
belongs_to :parent, :class_name => "Category", :foreign_key => "parent_id"
|
|
13
|
+
has_many :children, :class_name => "Category", :foreign_key => "parent_id"
|
|
14
|
+
|
|
15
|
+
has_and_belongs_to_many :products
|
|
16
|
+
has_and_belongs_to_many :banners
|
|
17
|
+
|
|
18
|
+
# Docs for acts_as_nested_set https://github.com/collectiveidea/awesome_nested_set
|
|
19
|
+
acts_as_nested_set :dependent => :destroy # rather than :delete_all
|
|
20
|
+
|
|
21
|
+
def title
|
|
22
|
+
name
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def url
|
|
26
|
+
category_products_path(id)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
class Customer < ActiveRecord::Base
|
|
2
|
+
|
|
3
|
+
# Include default devise modules. Others available are:
|
|
4
|
+
# :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
|
|
5
|
+
devise :database_authenticatable, :registerable,
|
|
6
|
+
:recoverable, :rememberable, :trackable
|
|
7
|
+
|
|
8
|
+
# Setup accessible (or protected) attributes for your model
|
|
9
|
+
attr_accessible :name, :surname, :contact_number, :email, :password, :password_confirmation #, :remember_me
|
|
10
|
+
|
|
11
|
+
acts_as_indexed :fields => [:name, :surname, :contact_number, :email, :encrypted_password]
|
|
12
|
+
|
|
13
|
+
validates :email, :presence => true, :uniqueness => true
|
|
14
|
+
|
|
15
|
+
has_many :carts
|
|
16
|
+
has_many :addresses
|
|
17
|
+
|
|
18
|
+
if defined?(Order)
|
|
19
|
+
has_many :orders
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def self.update_customer(id, name, surname, contact_number, email)
|
|
23
|
+
logger.info("********************** params = #{name}")
|
|
24
|
+
this_customer = self.find(id)
|
|
25
|
+
this_customer.update_attributes(:name => name, :surname => surname, :contact_number => contact_number, :email => email)
|
|
26
|
+
this_customer.save!
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def delivery_address
|
|
30
|
+
addresses.is_default.first
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
class LineItem < ActiveRecord::Base
|
|
2
|
+
|
|
3
|
+
belongs_to :cart
|
|
4
|
+
belongs_to :product
|
|
5
|
+
|
|
6
|
+
# def title was created automatically because you didn't specify a string field
|
|
7
|
+
# when you ran the refinery_engine generator. Love, Refinery CMS.
|
|
8
|
+
def title
|
|
9
|
+
"line item for #{product.name}"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def total_price
|
|
13
|
+
if variant_id.present? and defined?(Variant)
|
|
14
|
+
variant.price * quantity
|
|
15
|
+
else
|
|
16
|
+
product.price * quantity
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def grand_total
|
|
21
|
+
total = 0
|
|
22
|
+
line_items.each do |li|
|
|
23
|
+
total += li.total_price
|
|
24
|
+
end
|
|
25
|
+
total
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
require 'acts-as-taggable-on'
|
|
2
|
+
|
|
3
|
+
class Product < ActiveRecord::Base
|
|
4
|
+
|
|
5
|
+
acts_as_indexed :fields => [:name, :description, :summary]
|
|
6
|
+
|
|
7
|
+
if defined?(ActsAsTaggableOn)
|
|
8
|
+
acts_as_taggable_on :tags
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
validates :name, :presence => true, :uniqueness => true
|
|
12
|
+
validate :validate_category
|
|
13
|
+
|
|
14
|
+
scope :less_than, lambda { |price| where("price < ?", price) }
|
|
15
|
+
scope :greater_than, lambda { |price| where("price > ?", price) }
|
|
16
|
+
|
|
17
|
+
scope :best_sellers, where(:best_seller => true)
|
|
18
|
+
scope :featured, where(:featured => true)
|
|
19
|
+
scope :new_products, where(:new_product => true)
|
|
20
|
+
|
|
21
|
+
scope :by_category, lambda { |category_id|
|
|
22
|
+
ids = []
|
|
23
|
+
Category.find(category_id).children.each do |child|
|
|
24
|
+
ids << child.id
|
|
25
|
+
end
|
|
26
|
+
ids << category_id
|
|
27
|
+
|
|
28
|
+
joins(:categories).where("categories.id" => ids)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
belongs_to :image
|
|
32
|
+
has_and_belongs_to_many :categories
|
|
33
|
+
has_many :line_items
|
|
34
|
+
|
|
35
|
+
def title
|
|
36
|
+
name
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def validate_category
|
|
40
|
+
categories.each do |category|
|
|
41
|
+
if category.children.present?
|
|
42
|
+
errors.add_to_base("Cannot assign product to a category that has sub-categories")
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|