require "abstracted_responder"
require "print_control"
require "resource_control"
require "parent_control"
class AbstractResourcesController < ApplicationController
self.responder = ::AbstractedResponder
respond_to :html, :xml, :js, :json #, :xlsx
before_action :authenticate_user!
before_action :set_paper_trail_whodunnit
include PrintControl
include ResourceControl
include ParentControl
before_action :set_fab_button_options
before_action :set_variant_template
after_action :verify_authorized
# after_action :manage_parenthood, only: [:create,:update,:destroy]
# default implementation
def prefer
authorize resource
if resource.prefer parent
flash[:info] = t(:resource_preferred_correct)
render :prefer, layout: false, status: 200 and return
else
flash[:error] = t(:resource_preferred_incorrect)
render :prefer, layout: false, status: 401 and return
end
rescue Exception => e
scoop_from_error e
end
def defer
authorize resource
if resource.defer parent
flash[:info] = t(:resource_deferred_correct)
render :defer, layout: false, status: 200 and return
else
flash[:error] = t(:resource_deferred_incorrect)
render :defer, layout: false, status: 401 and return
end
rescue Exception => e
scoop_from_error e
end
def activate
authorize resource
if resource.activate
flash[:info] = t(:resource_activated_correct)
render :activate, layout: false, status: 200 and return
else
flash[:error] = t(:resource_activated_incorrect)
render :activate, layout: false, status: 401 and return
end
rescue Exception => e
scoop_from_error e
end
def deactivate
authorize resource
if resource.deactivate
flash[:info] = t(:resource_deactivated_correct)
render :deactivate, layout: false, status: 200 and return
else
flash[:error] = t(:resource_deactivated_incorrect)
render :deactivate, layout: false, status: 401 and return
end
rescue Exception => e
scoop_from_error e
end
def attach
authorize resource
if resource.attach parent
flash[:info] = t(:resource_attached_correct)
render :attach, layout: false, status: 200 and return
else
flash[:error] = t(:resource_attached_incorrect)
render :attach, layout: false, status: 401 and return
end
rescue Exception => e
scoop_from_error e
end
def detach
authorize resource
if resource.detach parent
flash[:info] = t(:resource_detached_correct)
render :detach, layout: false, status: 200 and return
else
flash[:error] = t(:resource_detached_incorrect)
render :detach, layout: false, status: 401 and return
end
rescue Exception => e
scoop_from_error e
end
def show
authorize resource
respond_with resource
rescue Exception => e
scoop_from_error e
end
def new
resource.parent_id = params[:parent_id] if resource.respond_to? :parent_id
authorize resource
respond_with resource
rescue Exception => e
scoop_from_error e
end
def edit
authorize resource
respond_with resource
rescue Exception => e
scoop_from_error e
end
def index
authorize resource_class, :index?
respond_with resources do |format|
# format.xlsx {
# # response.headers['Content-Disposition'] = 'attachment; filename="current_tyre_stock.xlsx"'
# render xlsx: 'stock_items/index', template: 'current_tyre_stock', filename: "current_tyre_stock.xlsx", disposition: 'inline', xlsx_created_at: Time.now, xlsx_author: "http://wheelstore.space"
# }
end
rescue Exception => e
scoop_from_error e
end
def create
authorize resource
respond_with(resource, location: redirect_after_create ) do |format|
if resource.save && update_parenthood
flash[:notice] = t('.success.created', resource: resource_class.to_s )
else
format.html { render action: :new, status: :unprocessable_entity }
format.js { render action: :new, status: :unprocessable_entity }
end
end
rescue Exception => e
scoop_from_error e
end
def update
authorize resource
respond_with(resource, location: redirect_after_update) do |format|
if resource.update_attributes(resource_params) && update_parenthood
flash[:notice] = t('.success.updated', resource: resource_class.to_s )
else
format.html { render action: :edit, status: :unprocessable_entity }
format.js { render action: :edit, status: :unprocessable_entity }
end
end
rescue Exception => e
scoop_from_error e
end
def destroy
authorize resource
result = true if delete_resource && update_parenthood
result ? (flash.now[:notice] = t('.success', resource: resource_class.to_s)) : (flash.now[:error] = t('.deleted.error',resource: resource_class.to_s) + " " + resource.errors.messages.values.join( " / "))
if result==true
render layout:false, status: 200, locals: { result: true }
else
render layout:false, status: 301, locals: { result: true, errors: resource.errors.messages.values.join( " / ") }
end
rescue Exception => e
scoop_from_error e
end
private
def delete_resource
if resource.respond_to? :deleted_at
resource.update_attributes deleted_at: Time.now
else
resource.destroy
end
end
# you can override this on your controller
def redirect_after_create
resources_url {}
end
# you can override this on your controller
def redirect_after_update
resources_url {}
end
#
# use views/../$action.html+mobile.erb if request originates from an iPad
#
def set_variant_template
request.variant = :mobile if request.user_agent =~ /iPad/
end
#
# build options for fixed action button - implement on each controller to customize
# raise an exception
def set_fab_button_options
opt = { items: {}}
case params[:action]
when 'nothing'; opt = opt
# when 'new'; #opt[:items].merge! print: { ajax: 'get', icon: 'print', class: 'blue lighten-2', url: '/stock_items/print?print_list=true', browser: 'new' }
# when 'edit'; #opt[:items].merge! print: { ajax: 'get', icon: 'print', class: 'blue lighten-2', url: '/stock_items/print?print_list=true', browser: 'new' }
# when 'show'; opt[:items].merge! print: { ajax: 'get', icon: 'print', class: 'blue lighten-2', url: '/stock_items/print', browser: 'new' }
# when 'index'; opt[:items].merge! print: { ajax: 'get', icon: 'print', class: 'blue lighten-2', url: '/stock_items/print?print_list=true', browser: 'new' }
end
# = build_print_link(f.object, list: false, print_options: "print_cmd=print_label", button: 'icon-tag', text: 'Udskriv dæk label')
@fab_button_options = opt
end
def caught_an_error_already?
result = @caught_an_error_already
@caught_an_error_already ||= true
result
end
def scoop_from_error e
raise e if %w{ test development }.include? Rails.env
logger.debug "AbstractResourcesController##{params[:action]}: #{e.class}"
a_url = root_path
case e.class.to_s
when "Exceptions::AuthenticationError"
flash.now[:error] = flash[:error] = "Access Problem:
%s" % e.message
result= false
status = 412
a_url = resources_url
when "ActiveRecord::RecordNotFound"
flash.now[:error] = flash[:error] = t('.fail.record_not_found')
result = false
status = 301
a_url = resources_url
when "Pundit::NotAuthorizedError"
flash.now[:error] = flash[:error] = t('.fail.authorized', resource: resource)
result = false
status = 401
a_url = resources_url
when "ActiveRecord::StatementInvalid" # Mysql2::Error
flash.now[:error] = flash[:error] = t('fail.mysql_error', mysql: e.to_s)
result= false
status = 409
a_url = resources_url
when "ActionView::Template::Error"
flash.now[:error] = flash[:error] = "A template error occured - please call ALCO with:
%s" % e.message
result= false
status = 301
a_url = resources_url
# when "PrintJobNotCreatedError"
#
# when "NoPreferredPrintersFound"
# logit :error, 'No preferred printers found! Sending PDF by email to %s (%s) ' % [usr.name,usr.email]
#
# when "PrintJobResourceError"
# logit :error, 'PrintJob could not be created - no records!?'
# return false
#
# when "PrintJobPrinterNotAvailableError"
# logit :error, 'PrintJob could not be created - the user has no printers attached!!'
# return false
else
raise e
# flash.now[:error] = flash[:error] = "An error occured - please refer to log for details!"
# render :error, layout: false, status: 412 and return
end unless caught_an_error_already?
respond_to do |format|
case params[:action]
when 'new'
format.html { flash.keep(:error) ; redirect_to a_url }
format.js { render :error, layout: false, status: status, locals: { result: result} }
format.json { render json: resources, status: status }
when 'create'
format.html { render :new }
format.js { render :error, layout: false, status: status, locals: { result: result} }
format.json { render json: resource.errors, status: status }
when 'show'
format.html { flash.keep(:error) ; redirect_to a_url }
format.js { render :error, layout: false, status: status, locals: { result: result} }
format.json { render json: resources, status: status }
when 'edit'
format.html { flash.keep(:error) ; redirect_to a_url }
format.js { render :error, layout: false, status: status, locals: { result: result} }
format.json { render json: resources, status: status }
when 'update'
format.html { render :edit }
format.js { render :error, layout: false, status: status, locals: { result: result} }
format.json { render json: resource.errors, status: status }
when 'index', 'destroy'
# we should render index - but an error here will not make us happy
# format.html { render :index }
#
format.html { redirect_to root_path, alert: flash[:error] }
format.js { render :error, layout: false, status: status, locals: { result: result} }
format.json { render json: resources, status: status }
else
format.html { redirect_to a_url and return }
format.js { render :error, layout:false, status: status, locals: { result: result } }
end
end
end
def error_counter
@error_counter ||= 0
@error_counter = @error_counter + 1
end
end