PageRenderTime 1111ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 0ms

/backend/app/controllers/spree/admin/users_controller.rb

https://gitlab.com/adamlwalker/spree
Ruby | 166 lines | 135 code | 28 blank | 3 comment | 18 complexity | e2be4ff07b5fb2c7d6c848dc02ab90a2 MD5 | raw file
  1. module Spree
  2. module Admin
  3. class UsersController < ResourceController
  4. rescue_from Spree::Core::DestroyWithOrdersError, :with => :user_destroy_with_orders_error
  5. after_action :sign_in_if_change_own_password, only: :update
  6. # http://spreecommerce.com/blog/2010/11/02/json-hijacking-vulnerability/
  7. before_action :check_json_authenticity, only: :index
  8. before_action :load_roles
  9. before_action :extract_roles_from_params, only: [:create, :update]
  10. def index
  11. respond_with(@collection) do |format|
  12. format.html
  13. format.json { render :json => json_data }
  14. end
  15. end
  16. def show
  17. redirect_to edit_admin_user_path(@user)
  18. end
  19. def create
  20. @user = Spree.user_class.new(user_params)
  21. if @user.save
  22. set_roles
  23. flash.now[:success] = flash_message_for(@user, :successfully_created)
  24. render :edit
  25. else
  26. render :new
  27. end
  28. end
  29. def update
  30. if params[:user][:password].blank? && params[:user][:password_confirmation].blank?
  31. params[:user].delete(:password)
  32. params[:user].delete(:password_confirmation)
  33. end
  34. if @user.update_attributes(user_params)
  35. set_roles
  36. flash.now[:success] = Spree.t(:account_updated)
  37. end
  38. render :edit
  39. end
  40. def addresses
  41. if request.put?
  42. if @user.update_attributes(user_params)
  43. flash.now[:success] = Spree.t(:account_updated)
  44. end
  45. render :addresses
  46. end
  47. end
  48. def orders
  49. params[:q] ||= {}
  50. @search = Spree::Order.reverse_chronological.ransack(params[:q].merge(user_id_eq: @user.id))
  51. @orders = @search.result.page(params[:page]).per(Spree::Config[:admin_products_per_page])
  52. end
  53. def items
  54. params[:q] ||= {}
  55. @search = Spree::Order.includes(
  56. line_items: {
  57. variant: [:product, { option_values: :option_type }]
  58. }).ransack(params[:q].merge(user_id_eq: @user.id))
  59. @orders = @search.result.page(params[:page]).per(Spree::Config[:admin_products_per_page])
  60. end
  61. def generate_api_key
  62. if @user.generate_spree_api_key!
  63. flash[:success] = Spree.t('api.key_generated')
  64. end
  65. redirect_to edit_admin_user_path(@user)
  66. end
  67. def clear_api_key
  68. if @user.clear_spree_api_key!
  69. flash[:success] = Spree.t('api.key_cleared')
  70. end
  71. redirect_to edit_admin_user_path(@user)
  72. end
  73. def model_class
  74. Spree.user_class
  75. end
  76. protected
  77. def collection
  78. return @collection if @collection.present?
  79. if request.xhr? && params[:q].present?
  80. @collection = Spree.user_class.includes(:bill_address, :ship_address)
  81. .where("spree_users.email #{LIKE} :search
  82. OR (spree_addresses.firstname #{LIKE} :search AND spree_addresses.id = spree_users.bill_address_id)
  83. OR (spree_addresses.lastname #{LIKE} :search AND spree_addresses.id = spree_users.bill_address_id)
  84. OR (spree_addresses.firstname #{LIKE} :search AND spree_addresses.id = spree_users.ship_address_id)
  85. OR (spree_addresses.lastname #{LIKE} :search AND spree_addresses.id = spree_users.ship_address_id)",
  86. { :search => "#{params[:q].strip}%" })
  87. .limit(params[:limit] || 100)
  88. else
  89. @search = Spree.user_class.ransack(params[:q])
  90. @collection = @search.result.page(params[:page]).per(Spree::Config[:admin_products_per_page])
  91. end
  92. end
  93. private
  94. def set_roles
  95. if @roles_ids
  96. @user.spree_roles = Spree::Role.where(id: @roles_ids)
  97. end
  98. end
  99. def extract_roles_from_params
  100. if params[:user]
  101. @roles_ids = params[:user].delete("spree_role_ids")
  102. end
  103. end
  104. def user_params
  105. params.require(:user).permit(permitted_user_attributes |
  106. [:spree_role_ids,
  107. ship_address_attributes: permitted_address_attributes,
  108. bill_address_attributes: permitted_address_attributes])
  109. end
  110. # handling raise from Spree::Admin::ResourceController#destroy
  111. def user_destroy_with_orders_error
  112. invoke_callbacks(:destroy, :fails)
  113. render status: :forbidden, text: Spree.t(:error_user_destroy_with_orders)
  114. end
  115. # Allow different formats of json data to suit different ajax calls
  116. def json_data
  117. json_format = params[:json_format] || 'default'
  118. case json_format
  119. when 'basic'
  120. collection.map { |u| { 'id' => u.id, 'name' => u.email } }.to_json
  121. else
  122. address_fields = [:firstname, :lastname, :address1, :address2, :city, :zipcode, :phone, :state_name, :state_id, :country_id]
  123. includes = { only: address_fields, include: { state: { only: :name }, country: { only: :name } } }
  124. collection.to_json(only: [:id, :email], include:
  125. { bill_address: includes, ship_address: includes })
  126. end
  127. end
  128. def sign_in_if_change_own_password
  129. if try_spree_current_user == @user && @user.password.present?
  130. sign_in(@user, event: :authentication, bypass: true)
  131. end
  132. end
  133. def load_roles
  134. @roles = Spree::Role.all
  135. end
  136. end
  137. end
  138. end