# -*- encoding : utf-8 -*-
module KirguduBase
module Controllers
module BasicActions
def index
#raise self.entry_class
raise "No defined \"entry_class\" method for controller #{self.class}" if !self.respond_to?(:entry_class) && self.entry_class.nil?
#raise "Current User NULL" if @current_user.nil?
unless self.class.respond_to?(:get_kb_page)
raise "Method :get_kb_page must be implemented for controller '#{self.class}'"
end
@page = self.class.get_kb_page(:index)
unless @page
respond_to do |format|
format.html { render_html1 get_view_path_for_page_404 }
format.json { render json: :not_found }
end
return
end
filters = {}.merge(params)
options = {}
options[:logger] = string_logger
#logger.info "OPTIONS FOR SEARCH: #{options.to_s}"
@entries_list = self.entry_class.get_entries(self, nil, filters, options)
load_data_from_datasources_for_filters
#raise "index page error"
respond_to do |format|
format.html { render_html1 get_view_path_for_page_index }
format.json { render_json_nav(@entries_list) }
end
end
def show
unless self.class.respond_to?(:get_kb_page)
raise "Method :get_kb_page must be implemented for controller '#{self.class}'"
end
@page = self.class.get_kb_page(:show)
unless @page
respond_to do |format|
format.html { render_html1 get_view_path_for_page_404 }
format.json { render json: :not_found }
end
return
end
@entry = self.entry_class.get_entry_by_id(self, params[:id], nil, {logger: string_logger})
unless @entry
respond_to do |format|
flash[:error] = I18n.t("#{self.to_i18n}.messages.not_found", id: params[:id])
format.html { render_html1 get_not_found_view_path, locals: {entry: @entry} }
format.json { render json: @entry.errors, status: :unprocessable_entity }
end
return
end
# loading data for select-like controls
load_data_from_datasources_for_form(:show, @entry)
respond_to do |format|
format.html { render_html1 get_view_path_for_page_show, locals: {entry: @entry} }
format.json { render json: @entry }
end
end
def new
unless self.class.respond_to?(:get_kb_page)
raise "Method :get_kb_page must be implemented for controller '#{self.class}'"
end
@page = self.class.get_kb_page(:new)
unless @page
respond_to do |format|
format.html { render_html1 get_view_path_for_page_404 }
format.json { render json: :not_found }
end
return
end
@entry = entry_class.new
load_data_from_datasources_for_form(:new, @entry)
respond_to do |format|
format.html { render_html1 get_view_path_for_page_new, locals: {entry: @entry} }
format.json { render json: @entry }
end
end
def create
unless self.class.respond_to?(:get_kb_page)
raise "Method :get_kb_page must be implemented for controller '#{self.class}'"
end
@page = self.class.get_kb_page(:new)
unless @page
respond_to do |format|
format.html { render_html1 get_view_path_for_page_404 }
format.json { render json: :not_found }
end
return
end
@entry = self.entry_class.new(params[:"#{self.entry_class.to_s.underscore.gsub('/', '_')}"])
transaction_is_ok = true
filter_params = {}.merge(params)
process_transaction_out_filters(@entry, :before_create, filter_params, {logger: self.string_logger})
ActiveRecord::Base.transaction do
#raise "In Transaction Before Create"
transaction_is_ok &= process_transaction_in_filters(@entry, :before_create, filter_params, {logger: self.string_logger})
if transaction_is_ok
if @entry.save
transaction_is_ok &= process_transaction_in_filters(@entry, :after_create, filter_params, {logger: self.string_logger})
else
transaction_is_ok = false
end
end
if transaction_is_ok == false
raise ActiveRecord::Rollback
end
end
process_transaction_out_filters(@entry, :after_create, filter_params, {logger: self.string_logger})
respond_to do |format|
if transaction_is_ok == true
flash[:success] = I18n.t("#{self.to_i18n}.messages.entry_created", entry_name: @entry.to_s)
format.html { render_redirect url_for(action: 'show', id: @entry) }
format.json { render json: @entry, status: :created, location: @entry }
else
# loading data for select-like controls
load_data_from_datasources_for_form(:new, @entry)
flash[:error] = I18n.t("#{self.to_i18n}.messages.create_error")
format.html { render_html1 get_view_path_for_page_new, locals: {entry: @entry} }
format.json { render json: @entry.errors, status: :unprocessable_entity }
end
end
end
def edit
unless self.class.respond_to?(:get_kb_page)
raise "Method :get_kb_page must be implemented for controller '#{self.class}'"
end
@page = self.class.get_kb_page(:edit)
unless @page
respond_to do |format|
format.html { render_html1 get_view_path_for_page_404 }
format.json { render json: :not_found }
end
return
end
@entry = self.entry_class.get_entry_by_id(self, params[:id], nil, {logger: string_logger})
unless @entry
respond_to do |format|
flash[:error] = I18n.t("#{self.to_i18n}.messages.not_found", id: params[:id])
format.html { render_html1 get_not_found_view_path, locals: {entry: @entry} }
format.json { render json: @entry.errors, status: :unprocessable_entity }
end
return
end
# loading data for select-like controls
load_data_from_datasources_for_form(:edit, @entry)
respond_to do |format|
format.html { render_html1 get_view_path_for_page_edit, locals: {entry: @entry} }
format.json { render json: @entry }
end
end
def update
unless self.class.respond_to?(:get_kb_page)
raise "Method :get_kb_page must be implemented for controller '#{self.class}'"
end
@page = self.class.get_kb_page(:edit)
unless @page
respond_to do |format|
format.html { render_html1 get_view_path_for_page_404 }
format.json { render json: :not_found }
end
return
end
@entry = self.entry_class.get_entry_by_id(self, params[:id], nil, {logger: string_logger})
# Render NOT FOUND Form
unless @entry
respond_to do |format|
flash[:error] = I18n.t("#{self.to_i18n}.messages.not_found", id: params[:id])
format.html { render_html1 get_not_found_view_path, locals: {entry: @entry} }
format.json { render json: @entry.errors, status: :unprocessable_entity }
end
return
end
respond_to do |format|
flash[:success] = I18n.t("#{self.to_i18n}.messages.manufacturer_updated", entry_name: @entry.to_s)
if @entry.update_attributes(params[:"#{entry_class.to_s.underscore.gsub('/', '_')}"])
format.html { render_redirect url_for(action: 'show', id: @entry) }
format.json { head :no_content }
else
# loading data for select-like controls
load_data_from_datasources_for_form(:edit, @entry)
flash[:error] = I18n.t("#{self.to_i18n}.messages.update_error")
format.html { render_html1 get_view_path_for_page_edit, locals: {entry: @entry} }
format.json { render json: @entry.errors, status: :unprocessable_entity }
end
end
end
#************************************************************************************************************
# ONLY JQUERY METHODS
#************************************************************************************************************
def edit_inplace
unless self.class.respond_to?(:get_kb_page)
render text: 'ERROR OCCURRED!!!'
return
end
@page = self.class.get_kb_page(:update)
unless @page
render text: 'ERROR OCCURRED!!!'
return
end
item = self.entry_class.get_entry_by_id(self, params[:id], nil, {logger: string_logger})
if item
result_string = ''
begin
unless item[params[:field_name]] == params[:value]
item[params[:field_name]] = params[:value]
item.updated_at = Time.now
item.updater = @current_user
unless item.save
result_string = 'FAILED TO SAVE!!!'
end
end
rescue
result_string = 'ERROR OCCURRED!!!'
end
if result_string.blank?
begin
result_string = item.send(params[:field_name])
rescue
result_string = 'ERROR OCCURRED!!!'
end
end
render text: result_string
else
render text: 'NOT FOUND!!!'
end
end
def export
raise "No defined \"entry_class\" method for controller #{self.class}" if !self.respond_to?(:entry_class) || self.entry_class.nil?
raise "Current User NULL" if @current_user.nil?
filters = {}.merge(params)
options = {}
options[:logger] = string_logger
#logger.info "OPTIONS FOR SEARCH: #{options.to_s}"
@entries_list = self.entry_class.get_entries(self, nil, filters, options)
export_type = params[:type]
unless export_type
end
export_options = {}
self.entry_class.export_types_set.each do |exp|
if exp[:name] == export_type
#export_options[:include] =
#render text: @entries_list.to_json
end
end
if params[:type]
case params[:type]
when "json"
when "xml"
render text: @entries_list.to_xml
end
else
respond_to do |format|
format.json { render json: @entries_list }
format.json { render xml: @entries_list }
end
end
end
def import
import_type = params[:type]
end
#************************************************************************************************************
# PRIVATE METHODS
#************************************************************************************************************
private
# ********************** GETTING VIEW'S PATH METHODS *******************************
def get_view_path_for_page_new
view_path = "/shared/entry_new_form_renderer"
if self.respond_to?(:views_paths_new)
view_path = self.views_paths_new
end
view_path
end
def get_view_path_for_page_edit
view_path = "/shared/entry_edit_form_renderer"
if self.respond_to?(:views_paths_edit)
view_path = self.views_paths_edit
end
view_path
end
def get_view_path_for_page_index
view_path = "/shared/entry_index_renderer"
if self.respond_to?(:views_paths_index)
view_path = self.views_paths_index
end
view_path
end
def get_view_path_for_page_show
view_path = "/shared/entry_show_renderer"
if self.respond_to?(:views_paths_show)
view_path = self.views_paths_show
end
view_path
end
def get_not_found_view_path
view_path = "/shared/entry_not_found_renderer"
if self.respond_to?(:views_paths_entry_not_found)
view_path = self.views_paths_entry_not_found
end
view_path
end
def get_view_path_for_page_404
view_path = "/shared/404"
if self.respond_to?(:views_paths_404_page)
view_path = self.views_paths_404_page
end
view_path
end
#********************************* DATA FOR SELECTS ***********************************
def load_data_from_datasources_for_form(aktion, entry)
@entry_data_sources = {}
class_properties_for_form = []
#string_logger.info("*********************** LOADING DATA FOR SELECTS *****************************")
if aktion == :new || aktion == :create
class_properties_for_form = self.entry_class.form_properties_set_for_new_form
elsif aktion == :edit || aktion == :update
class_properties_for_form = self.entry_class.form_properties_set_for_edit_form
end
class_properties_for_form.each do |property|
if property.input_type == :chosen_select || property.input_type == :select
#string_logger.info("ChosenSelect for Property : #{property[:name]}")
@entry_data_sources[property.name] = load_data_for_select(property, entry)
end
end
#string_logger.info("ENTRY DATA SOURCES: #{@entry_data_sources.to_json}")
#string_logger.info("************************************************************************")
end
def load_data_from_datasources_for_filters
@data_sources_for_filters = {}
class_properties_for_form = []
#string_logger.info("*********************** LOADING DATA FOR SELECTS *****************************")
if self.entry_class.respond_to?(:data_filters_set)
self.entry_class.data_filters_set.each do |filter|
if filter.input_type == :chosen_select || filter.input_type == :select
#string_logger.info("ChosenSelect for Property : #{property[:name]}")
@data_sources_for_filters[filter.name] = load_data_for_select(filter, nil)
end
end
end
end
def load_data_for_select(property, entry)
#if property.predefined_values
# return property.predefined_values
#end
parent_value = nil
parent_value = entry[property.parent] if entry
get_entries_for_select(property.source, parent_value: parent_value, logger: string_logger)
end
def get_entries_for_select(source, options={})
options ||= {}
logger = options[:logger]
options[:logger] = nil
select_data = nil
if source
id_property = nil
name_property = nil
logger.info("Process: SOURCE SUPPLIED") if logger
if source.is_a?(Hash)
logger.info("Process: SOURCE IS HASH") if logger
id_property = source[:id] || :id
name_property = source[:name] || :name
source = source[:klass]
end
if source.is_a?(String)
source_data = I18n.t(source)
select_data = []
source_data.keys.each do |key|
select_data.push([source_data[key].to_s, key.to_s.to_i])
end
elsif source.is_a?(Array)
select_data = []
source.each do |e|
if e.is_a?(Array)
select_data.push(e)
elsif e.is_a?(Hash)
select_data.push([e[:name], e[:id]])
else
select_data.push([e.to_s, e])
end
end
elsif source.is_a?(Range)
select_data = []
#raise source.to_json
source.each do |e|
select_data.push([e.to_s, e])
end
elsif source < ::ChupakabraTools::ActiveEnumExtended
select_data = source.to_select
logger.info("Selected #{select_data.count} entries") if logger
elsif source < ActiveRecord::Base || source < ActiveRecord::Relation
id_property = :id unless id_property
name_property = :name unless name_property
logger.info("Process: SOURCE RESPOND TO :apply_filters_to_query") if logger
filters = {}.merge(options)
filters[:parent] = nil
filters[:parent_value] = nil
if options[:parent]
logger.info("Process: PARENT PROPERTY DEFINED #{options[:parent]}") if logger
if options[:parent_value]
logger.info("Process: PARENT VALUE DEFINED #{options[:parent_value]}") if logger
filters[options[:parent]] = options[:parent_value]
else
logger.info("Process: PARENT PROPERTY DEFINED #{options[:parent]}, BUT NOT VALUE SUPPLIED") if logger
return []
end
end
filters[:per_page] = 9999999
filters[:page] = 1
select_data = source.get_entries(self, nil, filters, options).select([name_property, id_property]).map { |u| [u.send(name_property), u.send(id_property)] }
else
logger.info("Process: UNEXPECTED TYPE OF SOURCE #{source.class}") if logger
end
else
logger.error("Process: SOURCE NOT SUPPLIED") if logger
end
select_data
end
#********************** /DATA FOR SELECTS ***********************
#********************** TRANSACTION FILTERS ************************
def process_filters(entry, filter_name, filter_params, available_filters, options)
options ||= {}
logger = options[:logger]
transaction_is_ok = true
logger.debug "#{filter_name} filters start", options if logger
logger.depth_up if logger
available_filters.each do |filter|
logger.debug("Execute Filter Method #{filter[:method]}") if logger
if self.send(filter[:method], entry, filter_params, options) == false
transaction_is_ok |= false
end
end
logger.depth_down if logger
logger.debug "#{filter_name} filters end", options if logger
transaction_is_ok
end
def process_transaction_in_filters(entry, filter_name, filter_params, options= {})
found_filters = []
::KirguduBase::ClassHelper.get_class_hierarchy_for_controller(self.class).each do |klass|
if klass.respond_to?(:in_transaction_filters_collection)
klass.in_transaction_filters_collection(filter_name).each do |action|
found_filters.push(action)
end
end
end
#raise "In transaction Found filters: #{found_filters.count}"
process_filters(entry, filter_name, filter_params, found_filters, options)
end
def process_transaction_out_filters(entry, filter_name, filter_params, options = {})
found_filters = []
::KirguduBase::ClassHelper.get_class_hierarchy_for_controller(self.class).each do |klass|
if klass.respond_to?(:out_transaction_filters_collection)
klass.out_transaction_filters_collection(filter_name).each do |action|
found_filters.push(action)
end
end
end
process_filters(entry, filter_name, filter_params, found_filters, options)
end
#************************ /TRANSACTION FILTERS ************************
def sanitize_params_for_mass_assignment(klass, prms)
unless klass && klass < ActiveRecord::Base
raise "Class '#{klass}' must be an ActiveRecord::Base descendant"
end
options = {}
if prms || prms.is_a?(Hash)
prms.keys.each do |key|
if klass.accessible_attributes.contains(key)
options[key] = prms[key]
end
end
end
end
end
end
end