PageRenderTime 1176ms CodeModel.GetById 30ms RepoModel.GetById 0ms app.codeStats 0ms

/app/controllers/admin/enterprises_controller.rb

https://gitlab.com/srihas/openfoodnetwork
Ruby | 261 lines | 215 code | 37 blank | 9 comment | 26 complexity | 1ba1349d93a5867e2306e0717a473e20 MD5 | raw file
  1. require 'open_food_network/referer_parser'
  2. module Admin
  3. class EnterprisesController < ResourceController
  4. before_filter :load_enterprise_set, :only => :index
  5. before_filter :load_countries, :except => [:index, :register, :check_permalink]
  6. before_filter :load_methods_and_fees, :only => [:new, :edit, :update, :create]
  7. before_filter :load_groups, :only => [:new, :edit, :update, :create]
  8. before_filter :load_taxons, :only => [:new, :edit, :update, :create]
  9. before_filter :check_can_change_sells, only: :update
  10. before_filter :check_can_change_bulk_sells, only: :bulk_update
  11. before_filter :override_owner, only: :create
  12. before_filter :override_sells, only: :create
  13. before_filter :check_can_change_owner, only: :update
  14. before_filter :check_can_change_bulk_owner, only: :bulk_update
  15. before_filter :check_can_change_managers, only: :update
  16. before_filter :strip_new_properties, only: [:create, :update]
  17. before_filter :load_properties, only: [:edit, :update]
  18. before_filter :setup_property, only: [:edit]
  19. helper 'spree/products'
  20. include ActionView::Helpers::TextHelper
  21. include OrderCyclesHelper
  22. def index
  23. respond_to do |format|
  24. format.html
  25. format.json { render_as_json @collection, ams_prefix: params[:ams_prefix], spree_current_user: spree_current_user }
  26. end
  27. end
  28. def welcome
  29. render layout: "spree/layouts/bare_admin"
  30. end
  31. def update
  32. invoke_callbacks(:update, :before)
  33. if @object.update_attributes(params[object_name])
  34. invoke_callbacks(:update, :after)
  35. flash[:success] = flash_message_for(@object, :successfully_updated)
  36. respond_with(@object) do |format|
  37. format.html { redirect_to location_after_save }
  38. format.js { render :layout => false }
  39. format.json { render_as_json @object, ams_prefix: 'index', spree_current_user: spree_current_user }
  40. end
  41. else
  42. invoke_callbacks(:update, :fails)
  43. respond_with(@object) do |format|
  44. format.json { render json: { errors: @object.errors.messages }, status: :unprocessable_entity }
  45. end
  46. end
  47. end
  48. def register
  49. if params[:sells] == 'unspecified'
  50. flash[:error] = "Please select a package"
  51. return render :welcome, layout: "spree/layouts/bare_admin"
  52. end
  53. attributes = { sells: params[:sells], visible: true }
  54. if ['own', 'any'].include? params[:sells]
  55. attributes[:shop_trial_start_date] = @enterprise.shop_trial_start_date || Time.zone.now
  56. end
  57. if @enterprise.update_attributes(attributes)
  58. flash[:success] = "Congratulations! Registration for #{@enterprise.name} is complete!"
  59. redirect_to admin_path
  60. else
  61. flash[:error] = "Could not complete registration for #{@enterprise.name}"
  62. render :welcome, layout: "spree/layouts/bare_admin"
  63. end
  64. end
  65. def bulk_update
  66. @enterprise_set = EnterpriseSet.new(collection, params[:enterprise_set])
  67. touched_enterprises = @enterprise_set.collection.select(&:changed?)
  68. if @enterprise_set.save
  69. flash[:success] = "Enterprises updated successfully"
  70. # 18-3-2015: It seems that the form for this action sometimes loads bogus values for
  71. # the 'sells' field, and submitting that form results in a bunch of enterprises with
  72. # values that have mysteriously changed. This statement is here to help debug that
  73. # issue, and should be removed (along with its display in index.html.haml) when the
  74. # issue has been resolved.
  75. flash[:action] = "Updated #{pluralize(touched_enterprises.count, 'enterprise')}: #{touched_enterprises.map(&:name).join(', ')}"
  76. redirect_to main_app.admin_enterprises_path
  77. else
  78. @enterprise_set.collection.select! { |e| touched_enterprises.include? e }
  79. flash[:error] = 'Update failed'
  80. render :index
  81. end
  82. end
  83. def for_order_cycle
  84. respond_to do |format|
  85. format.json do
  86. render json: @collection, each_serializer: Api::Admin::ForOrderCycle::EnterpriseSerializer, spree_current_user: spree_current_user
  87. end
  88. end
  89. end
  90. def for_line_items
  91. respond_to do |format|
  92. format.json do
  93. render_as_json @collection, ams_prefix: 'basic', spree_current_user: spree_current_user
  94. end
  95. end
  96. end
  97. protected
  98. def build_resource_with_address
  99. enterprise = build_resource_without_address
  100. enterprise.address = Spree::Address.new
  101. enterprise.address.country = Spree::Country.find_by_id(Spree::Config[:default_country_id])
  102. enterprise
  103. end
  104. alias_method_chain :build_resource, :address
  105. # Overriding method on Spree's resource controller,
  106. # so that resources are found using permalink
  107. def find_resource
  108. Enterprise.find_by_permalink(params[:id])
  109. end
  110. private
  111. def load_enterprise_set
  112. @enterprise_set = EnterpriseSet.new(collection) if spree_current_user.admin?
  113. end
  114. def load_countries
  115. @countries = Spree::Country.order(:name)
  116. end
  117. def collection
  118. case action
  119. when :for_order_cycle
  120. order_cycle = OrderCycle.find_by_id(params[:order_cycle_id]) if params[:order_cycle_id]
  121. coordinator = Enterprise.find_by_id(params[:coordinator_id]) if params[:coordinator_id]
  122. order_cycle = OrderCycle.new(coordinator: coordinator) if order_cycle.nil? && coordinator.present?
  123. return OpenFoodNetwork::OrderCyclePermissions.new(spree_current_user, order_cycle).visible_enterprises
  124. when :index
  125. if spree_current_user.admin?
  126. OpenFoodNetwork::Permissions.new(spree_current_user).
  127. editable_enterprises.
  128. order('is_primary_producer ASC, name')
  129. elsif json_request?
  130. OpenFoodNetwork::Permissions.new(spree_current_user).editable_enterprises.ransack(params[:q]).result
  131. else
  132. Enterprise.where("1=0")
  133. end
  134. when :for_line_items
  135. OpenFoodNetwork::Permissions.new(spree_current_user).visible_enterprises.ransack(params[:q]).result
  136. else
  137. # TODO was ordered with is_distributor DESC as well, not sure why or how we want to sort this now
  138. OpenFoodNetwork::Permissions.new(spree_current_user).
  139. editable_enterprises.
  140. order('is_primary_producer ASC, name')
  141. end
  142. end
  143. def collection_actions
  144. [:index, :for_order_cycle, :for_line_items, :bulk_update]
  145. end
  146. def load_methods_and_fees
  147. @payment_methods = Spree::PaymentMethod.managed_by(spree_current_user).sort_by!{ |pm| [(@enterprise.payment_methods.include? pm) ? 0 : 1, pm.name] }
  148. @shipping_methods = Spree::ShippingMethod.managed_by(spree_current_user).sort_by!{ |sm| [(@enterprise.shipping_methods.include? sm) ? 0 : 1, sm.name] }
  149. @enterprise_fees = EnterpriseFee.managed_by(spree_current_user).for_enterprise(@enterprise).order(:fee_type, :name).all
  150. end
  151. def load_groups
  152. @groups = EnterpriseGroup.managed_by(spree_current_user) | @enterprise.groups
  153. end
  154. def load_taxons
  155. @taxons = Spree::Taxon.order(:name)
  156. end
  157. def check_can_change_bulk_sells
  158. unless spree_current_user.admin?
  159. params[:enterprise_set][:collection_attributes].each do |i, enterprise_params|
  160. enterprise_params.delete :sells unless spree_current_user == Enterprise.find_by_id(enterprise_params[:id]).owner
  161. end
  162. end
  163. end
  164. def check_can_change_sells
  165. unless spree_current_user.admin? || spree_current_user == @enterprise.owner
  166. params[:enterprise].delete :sells
  167. end
  168. end
  169. def override_owner
  170. params[:enterprise][:owner_id] = spree_current_user.id unless spree_current_user.admin?
  171. end
  172. def override_sells
  173. unless spree_current_user.admin?
  174. has_hub = spree_current_user.owned_enterprises.is_hub.any?
  175. new_enterprise_is_producer = Enterprise.new(params[:enterprise]).is_primary_producer
  176. params[:enterprise][:sells] = (has_hub && !new_enterprise_is_producer) ? 'any' : 'none'
  177. end
  178. end
  179. def check_can_change_owner
  180. unless ( spree_current_user == @enterprise.owner ) || spree_current_user.admin?
  181. params[:enterprise].delete :owner_id
  182. end
  183. end
  184. def check_can_change_bulk_owner
  185. unless spree_current_user.admin?
  186. params[:enterprise_set][:collection_attributes].each do |i, enterprise_params|
  187. enterprise_params.delete :owner_id
  188. end
  189. end
  190. end
  191. def check_can_change_managers
  192. unless ( spree_current_user == @enterprise.owner ) || spree_current_user.admin?
  193. params[:enterprise].delete :user_ids
  194. end
  195. end
  196. def strip_new_properties
  197. unless spree_current_user.admin? || params[:enterprise][:producer_properties_attributes].nil?
  198. names = Spree::Property.pluck(:name)
  199. params[:enterprise][:producer_properties_attributes].each do |key, property|
  200. params[:enterprise][:producer_properties_attributes].delete key unless names.include? property[:property_name]
  201. end
  202. end
  203. end
  204. def load_properties
  205. @properties = Spree::Property.pluck(:name)
  206. end
  207. def setup_property
  208. @enterprise.producer_properties.build
  209. end
  210. # Overriding method on Spree's resource controller
  211. def location_after_save
  212. referer_path = OpenFoodNetwork::RefererParser::path(request.referer)
  213. refered_from_edit = referer_path =~ /\/edit$/
  214. if params[:enterprise].key?(:producer_properties_attributes) && !refered_from_edit
  215. main_app.admin_enterprises_path
  216. else
  217. main_app.edit_admin_enterprise_path(@enterprise)
  218. end
  219. end
  220. def ams_prefix_whitelist
  221. [:index, :basic]
  222. end
  223. end
  224. end