Commit 1236556d by Tran Hoang Viet

VietTH: Implement feature order management

parent 03601722
...@@ -13,3 +13,4 @@ ...@@ -13,3 +13,4 @@
/tmp /tmp
/public/uploads/ /public/uploads/
/config/database.yml /config/database.yml
/*.sh
...@@ -96,4 +96,6 @@ gem 'cartman', '~> 2.1.2' ...@@ -96,4 +96,6 @@ gem 'cartman', '~> 2.1.2'
gem 'font-awesome-rails', '~> 4.3.0.0' gem 'font-awesome-rails', '~> 4.3.0.0'
gem 'meta-tags', '~> 2.0.0' gem 'meta-tags', '~> 2.0.0'
\ No newline at end of file
gem 'rolify', '~> 4.0.0'
\ No newline at end of file
...@@ -226,6 +226,7 @@ GEM ...@@ -226,6 +226,7 @@ GEM
request_store (1.1.0) request_store (1.1.0)
responders (2.1.0) responders (2.1.0)
railties (>= 4.2.0, < 5) railties (>= 4.2.0, < 5)
rolify (4.0.0)
rsolr (1.0.12) rsolr (1.0.12)
builder (>= 2.1.2) builder (>= 2.1.2)
rspec-core (3.3.1) rspec-core (3.3.1)
...@@ -352,6 +353,7 @@ DEPENDENCIES ...@@ -352,6 +353,7 @@ DEPENDENCIES
quiet_assets quiet_assets
rails (= 4.2.3) rails (= 4.2.3)
rails_12factor (~> 0.0.3) rails_12factor (~> 0.0.3)
rolify (~> 4.0.0)
rsolr (~> 1.0.12) rsolr (~> 1.0.12)
rspec-rails (~> 3.3.2) rspec-rails (~> 3.3.2)
rubocop (~> 0.32.1) rubocop (~> 0.32.1)
......
...@@ -17,4 +17,5 @@ ...@@ -17,4 +17,5 @@
*= require layout *= require layout
*= require product *= require product
*= require cart *= require cart
*= require order
*/ */
#order-detail{
.value{
padding-top: 7px;
}
}
#orders-list{
.status{
&.done{
color: #ccc;
}
&.original{
color: #00812A;
}
}
}
\ No newline at end of file
class CategoriesController < ApplicationController class CategoriesController < ApplicationController
before_action :set_category, only: [:show] before_action :set_category, only: [:show]
before_action :add_breadcrumb_home before_action :add_breadcrumb_home
before_action :set_metas, only: [:show]
def show def show
@products = @category.products.page(params[:page]) @products = @category.products.page(params[:page])
......
class OrdersController < ApplicationController class OrdersController < ApplicationController
before_action :authenticate_user! before_action :authenticate_user!
before_action :set_order, only: [:show, :update]
def index def index
end end
...@@ -19,11 +20,32 @@ class OrdersController < ApplicationController ...@@ -19,11 +20,32 @@ class OrdersController < ApplicationController
end end
end end
def management
@orders = current_user.admin? ? Order.all : current_user.orders
@orders = @orders.includes(:user).order(created_at: :desc).page(params[:page])
end
def show
end
def update
if order_service.update(@order, order_params)[:status].present?
redirect_to management_orders_path, notice: 'Update order successful!'
else
render :show
end
end
private private
def cart_params def cart_params
params.require(:cart).permit(items: [:id, :quantity]) params.require(:cart).permit(items: [:id, :quantity])
end end
def order_params
params.require(:order).permit(:status)
end
def order_service def order_service
@order_service ||= OrderService.new(current_user, params) @order_service ||= OrderService.new(current_user, params)
end end
...@@ -32,4 +54,8 @@ class OrdersController < ApplicationController ...@@ -32,4 +54,8 @@ class OrdersController < ApplicationController
@cart_service ||= CartService.new(current_user, params) @cart_service ||= CartService.new(current_user, params)
end end
def set_order
@order = Order.find(params[:id])
end
end end
\ No newline at end of file
class OrderDecorator < Draper::Decorator
delegate_all
def status
object.original? ? 'New' : object.status.titleize
end
end
\ No newline at end of file
module UserRole extend ActiveSupport::Concern
included do
ROLES = %w(admin user)
before_save :default_role
rolify
def default_role
self.add_role(:user) if self.roles.blank?
end
ROLES.each do |role|
define_method "#{role}?" do
self.has_role?(role)
end
end
end
end
\ No newline at end of file
...@@ -3,4 +3,6 @@ class Order < ActiveRecord::Base ...@@ -3,4 +3,6 @@ class Order < ActiveRecord::Base
has_many :order_items, dependent: :destroy has_many :order_items, dependent: :destroy
accepts_nested_attributes_for :order_items accepts_nested_attributes_for :order_items
enum status: %i(original preparing shipping done cancel_refund)
end end
class Role < ActiveRecord::Base
has_and_belongs_to_many :users, join_table: :users_roles
belongs_to :resource, :polymorphic => true
validates :resource_type,
:inclusion => { :in => Rolify.resource_types },
:allow_nil => true
scopify
end
class User < ActiveRecord::Base class User < ActiveRecord::Base
include UserRole
with_options dependent: :nullify do |assoc| with_options dependent: :nullify do |assoc|
assoc.has_many :orders assoc.has_many :orders
assoc.has_many :products assoc.has_many :products
...@@ -12,5 +14,4 @@ class User < ActiveRecord::Base ...@@ -12,5 +14,4 @@ class User < ActiveRecord::Base
def cart def cart
Cartman::Cart.new(self.id) Cartman::Cart.new(self.id)
end end
end end
...@@ -19,6 +19,10 @@ class OrderService < BaseService ...@@ -19,6 +19,10 @@ class OrderService < BaseService
end end
end end
def update(order, params)
{status: order.update(params)}
end
private private
def send_checkout_email(order) def send_checkout_email(order)
OrderMailer.send_checkout(current_user.email, order).deliver_later OrderMailer.send_checkout(current_user.email, order).deliver_later
......
...@@ -12,11 +12,13 @@ ...@@ -12,11 +12,13 @@
%ul.nav.navbar-nav.navbar-right %ul.nav.navbar-nav.navbar-right
- if user_signed_in? - if user_signed_in?
%li %li
= link_to 'Logout', destroy_user_session_path, method: :delete = link_to 'Orders', management_orders_path
%li
= link_to 'Change profile', edit_user_registration_path
%li %li
= link_to 'New product', new_product_path = link_to 'New product', new_product_path
%li
= link_to 'Profile', edit_user_registration_path
%li
= link_to 'Logout', destroy_user_session_path, method: :delete
- else - else
%li %li
......
%h3.title Orders management
.module
#orders-list
.order-item.table-responsive
%table.table
%thead
%tr
%td.text-right #
%td Order number
/ %td Ordered by
%td Created at
%td Status
%tbody
- @orders.each_with_index do |order_item, index|
%tr
%td.number.text-right
= index + 1
%td.order-number
= link_to order_item.created_at.to_i, order_path(order_item)
/ %td.created-by
/ = order_item.user.email
%td.created-at
= I18n.l(order_item.created_at)
%td.status{class: order_item.status}
= order_item.decorate.status
%tfooter
%tr
%td{colspan: 10}
= paginate @orders
%h3.title Order detail
#order-detail.module
= form_for @order, html: {class: 'form-horizontal'} do |f|
.form-group
%label.col-md-2.col-sm-3.col-xs-3.control-label Order number
.col-md-4.col-sm-9.col-xs-9.value
= f.object.created_at.to_i
.form-group
%label.col-md-2.col-sm-3.col-xs-3.control-label Created by
.col-md-4.col-sm-9.col-xs-9.value
= f.object.user.email
.form-group
%label.col-md-2.col-sm-3.col-xs-3.control-label Created at
.col-md-4.col-sm-9.col-xs-9.value
= I18n.l(f.object.created_at)
.form-group
%label.col-md-2.col-sm-3.col-xs-3.control-label Total price
.col-md-4.col-sm-9.col-xs-9.value
= f.object.total
.form-group
%label.col-md-2.col-sm-3.col-xs-3.control-label Status
.col-md-2.col-sm-9.col-xs-9.value
- if current_user.admin?
= f.select :status, Order.statuses.keys.map { |status| [status.titleize, status] }, {}, class: 'form-control'
- else
= f.object.status.titleize
- if current_user.admin?
.form-group
%label.col-md-2.col-sm-3.col-xs-3.control-label
.col-md-2.col-sm-4.col-xs-9
= f.submit 'Save', class: 'btn btn-primary'
.list-order-items.table-responsive
%table.table
%thead
%tr
%td.text-right #
%td Title
%td Price
%td Quantity
%tbody
- @order.order_items.each_with_index do |order_item, index|
%tr
%td.number.text-right
= index + 1
%td.title
= link_to order_item.product.title, product_path(order_item.id)
%td.price
= order_item.product.price
%td.quantity
= order_item.quantity
.product-item.col-md-3.text-center .product-item.col-md-3.col-sm-6.text-center
.product-title .product-title
= link_to product.decorate.short_title, product = link_to product.decorate.short_title, product
.product-price .product-price
......
Rolify.configure do |config|
# By default ORM adapter is ActiveRecord. uncomment to use mongoid
# config.use_mongoid
# Dynamic shortcuts for User class (user.is_admin? like methods). Default is: false
# config.use_dynamic_shortcuts
end
\ No newline at end of file
...@@ -14,5 +14,9 @@ Rails.application.routes.draw do ...@@ -14,5 +14,9 @@ Rails.application.routes.draw do
resources :categories resources :categories
resources :orders resources :orders do
collection do
get :management
end
end
end end
\ No newline at end of file
class UpdateRoleUsers < SeedMigration::Migration
def up
User.all.map(&:default_role)
end
end
class RolifyCreateRoles < ActiveRecord::Migration
def change
create_table(:roles) do |t|
t.string :name
t.references :resource, :polymorphic => true
t.timestamps
end
create_table(:users_roles, :id => false) do |t|
t.references :user
t.references :role
end
add_index(:roles, :name)
add_index(:roles, [ :name, :resource_type, :resource_id ])
add_index(:users_roles, [ :user_id, :role_id ])
end
end
class AddStatusToOrders < ActiveRecord::Migration
def change
add_column :orders, :status, :integer, default: 0
end
end
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20150713093724) do ActiveRecord::Schema.define(version: 20150716032049) do
create_table "categories", force: :cascade do |t| create_table "categories", force: :cascade do |t|
t.datetime "created_at", null: false t.datetime "created_at", null: false
...@@ -39,6 +39,7 @@ ActiveRecord::Schema.define(version: 20150713093724) do ...@@ -39,6 +39,7 @@ ActiveRecord::Schema.define(version: 20150713093724) do
t.datetime "updated_at", null: false t.datetime "updated_at", null: false
t.integer "user_id", limit: 4, null: false t.integer "user_id", limit: 4, null: false
t.decimal "total", precision: 10, default: 0 t.decimal "total", precision: 10, default: 0
t.integer "status", limit: 4, default: 0
end end
add_index "orders", ["user_id"], name: "index_orders_on_user_id", using: :btree add_index "orders", ["user_id"], name: "index_orders_on_user_id", using: :btree
...@@ -62,6 +63,17 @@ ActiveRecord::Schema.define(version: 20150713093724) do ...@@ -62,6 +63,17 @@ ActiveRecord::Schema.define(version: 20150713093724) do
add_index "products", ["category_id"], name: "index_products_on_category_id", using: :btree add_index "products", ["category_id"], name: "index_products_on_category_id", using: :btree
add_index "products", ["user_id"], name: "index_products_on_user_id", using: :btree add_index "products", ["user_id"], name: "index_products_on_user_id", using: :btree
create_table "roles", force: :cascade do |t|
t.string "name", limit: 255
t.integer "resource_id", limit: 4
t.string "resource_type", limit: 255
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "roles", ["name", "resource_type", "resource_id"], name: "index_roles_on_name_and_resource_type_and_resource_id", using: :btree
add_index "roles", ["name"], name: "index_roles_on_name", using: :btree
create_table "seed_migration_data_migrations", force: :cascade do |t| create_table "seed_migration_data_migrations", force: :cascade do |t|
t.string "version", limit: 255 t.string "version", limit: 255
t.integer "runtime", limit: 4 t.integer "runtime", limit: 4
...@@ -86,4 +98,11 @@ ActiveRecord::Schema.define(version: 20150713093724) do ...@@ -86,4 +98,11 @@ ActiveRecord::Schema.define(version: 20150713093724) do
add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
create_table "users_roles", id: false, force: :cascade do |t|
t.integer "user_id", limit: 4
t.integer "role_id", limit: 4
end
add_index "users_roles", ["user_id", "role_id"], name: "index_users_roles_on_user_id_and_role_id", using: :btree
end end
...@@ -13,4 +13,4 @@ ...@@ -13,4 +13,4 @@
ActiveRecord::Base.transaction do ActiveRecord::Base.transaction do
end end
SeedMigration::Migrator.bootstrap(20150708092434) SeedMigration::Migrator.bootstrap(20150716025400)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment