# -*- encoding : utf-8 -*- module KirguduBase module Controllers module BasicActions ################################################################################################################ ######################################### Base and Ajax Modules ###################################### ################################################################################################################ module Base module IndexActions 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? raise "Method :get_kb_page must be implemented for controller '#{self.class}'" unless self.class.respond_to?(:get_kb_page) options = { logger: string_logger } local_data = { errors: [], messages: [], page: self.class.get_kb_page(:index) } # Rendering 'Page not Found' and completing Request self.def render_page_404 and return unless local_data[:page] # fill parent for data filters_for_parents = {} self.fill_obligatory_db_query_params(filters_for_parents) self.fill_parents_for_local_data(local_data, filters_for_parents) filters = self.get_filters_for_list(local_data[:page].lists[:entries_list], params) self.fill_obligatory_db_query_params(filters) filters.merge!(local_data[:parent_ids]) filters[:per_page] = 30 unless filters[:per_page] filters[:per_page] ||= 30 # retrieving filters data from database local_data[:filters_data] = self.load_data_for_filters_controls(local_data[:page].lists[:entries_list], params) # retrieving entries from database local_data[:entries] = self.entry_class.get_entries(nil, filters, options) # filling filters for current url filters_for_current_url = self.get_filters_for_list(local_data[:page].lists[:entries_list], params) filters_for_current_url.merge!(local_data[:parent_ids]) local_data[:current_url] = self.to_url_for(:index, filters_for_current_url) # building breadcrumbs self.kb_dp_breadcrumbs_build_for_index(local_data, true) #index page parent_ids = {} local_data[:parents].each do |parent| # breadcrumbs: adding parent index add_new_breadcrumb(I18n.t("#{parent[:controller].to_i18n}.index.title"), parent[:controller].to_url_for(:index, parent_ids)) # breadcrumbs: getting parent entry name parent_entry_name = nil parent_entry_name = parent[:entry].name_for_breadcrumbs if parent[:entry].respond_to?(:name_for_breadcrumbs) parent_entry_name = parent[:entry].id unless parent_entry_name # breadcrumbs: adding parent entry add_new_breadcrumb(parent_entry_name, parent[:controller].to_url_for(:show, parent_ids.merge(id: parent[:entry].id))) parent_ids[parent[:id_param]] = parent[:id_value] end if local_data[:parents] # breadcrumbs: adding current index add_new_breadcrumb(I18n.t("#{self.to_i18n}.index.title"), self.to_url_for(:index, local_data[:parent_ids])) # logger.info "TEMPLATE PATH: #{self.class.get_method_latest_result(:get_kb_template)}" # logger.info "VIEW PATH: #{self.class.get_method_latest_result(:get_kb_view_path, :index)}" # rendering page respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :index)}", locals: {data: local_data} } format.json { render_json_ok(local_data[:entries]) } end end end module DashboardActions def dashboard #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 options = { logger: string_logger } local_data = { errors: [], messages: [], page: self.class.get_kb_page(:dashboard) } unless local_data[:page] respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :page_404)}" } format.json { render_json_page_404 } end return end # fill parent for data filters_for_parents = {} self.fill_obligatory_db_query_params(filters_for_parents) self.fill_parents_for_local_data(local_data, filters_for_parents) # filling filters for current url filters_for_current_url = self.get_filters_for_list(local_data[:page].lists[:entries_list], params) filters_for_current_url.merge!(local_data[:parent_ids]) local_data[:current_url] = self.to_url_for(:index, filters_for_current_url) # building breadcrumbs self.kb_dp_breadcrumbs_build_for_index(local_data, true) #index page parent_ids = {} local_data[:parents].each do |parent| # breadcrumbs: adding parent index add_new_breadcrumb(I18n.t("#{parent[:controller].to_i18n}.index.title"), parent[:controller].to_url_for(:index, parent_ids)) # breadcrumbs: getting parent entry name parent_entry_name = nil parent_entry_name = parent[:entry].name_for_breadcrumbs if parent[:entry].respond_to?(:name_for_breadcrumbs) parent_entry_name = parent[:entry].id unless parent_entry_name # breadcrumbs: adding parent entry add_new_breadcrumb(parent_entry_name, parent[:controller].to_url_for(:show, parent_ids.merge(id: parent[:entry].id))) parent_ids[parent[:id_param]] = parent[:id_value] end if local_data[:parents] # breadcrumbs: adding current index add_new_breadcrumb(I18n.t("#{self.to_i18n}.index.title"), self.to_url_for(:index, local_data[:parent_ids])) # logger.info "TEMPLATE PATH: #{self.class.get_method_latest_result(:get_kb_template)}" # logger.info "VIEW PATH: #{self.class.get_method_latest_result(:get_kb_view_path, :index)}" # rendering page respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :dashboard)}", locals: {data: local_data} } format.json { render_json_ok(nil) } end end end module ShowActions def show unless self.class.respond_to?(:get_kb_page) raise "Method :get_kb_page must be implemented for controller '#{self.class}'" end options = { logger: self.string_logger } local_data = { errors: [], messages: [], page: self.class.get_kb_page(:show) } if local_data[:page].nil? respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :page_404)}" } format.json { render_json_page_404 } end return end # fill parent for data filters_for_parents = {} self.fill_obligatory_db_query_params(filters_for_parents) self.fill_parents_for_local_data(local_data, filters_for_parents) # fill filters for search filters = {} self.fill_obligatory_db_query_params(filters) filters.merge!(local_data[:parent_ids]) # getting local entry local_data[:entry] = self.entry_class.get_entry_by_id(params[:id], filters, options) # entry not found, showing not found page unless local_data[:entry] local_data[:errors] << I18n.t("#{self.to_i18n}.messages.not_found", entry_id: params[:id]) respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :entry_not_found)}", locals: {data: local_data} } format.json { render_json_not_found message: local_data[:errors] } end return end # getting lists local_data[:page].lists.each_pair do |key, list| if list.relation filters_for_list = {} self.fill_obligatory_db_query_params(filters_for_list) reflection = self.entry_class.reflections[list.relation.name] list_per_page = list.relation.per_page_param list_page = list.relation.page_param begin filters_for_list[:per_page] = params[list_per_page].to_i rescue end filters_for_list[:per_page] ||= 30 filters_for_list[:per_page] = 30 if filters_for_list[:per_page] == 0 begin filters_for_list[:page] = params[list_page].to_i if params[list_page] rescue end filters_for_list[reflection.foreign_key] = local_data[:entry].id #logger.info "FILTERS for LIST: #{filters_for_list.to_json}" local_data[:"list_entries_#{list.name}"] = eval(reflection.class_name).get_entries(nil, filters_for_list, options) end end if local_data[:page].lists # fill parent for data filters_for_parents = {} self.fill_obligatory_db_query_params(filters_for_parents) self.fill_parents_for_local_data(local_data, filters_for_parents) # building breadcrumbs self.kb_dp_breadcrumbs_build_for_index(local_data, false) #not index page # rendering page respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :show)}", locals: {data: local_data} } format.json { render_json_ok local_data[:entry] } end end end module NewActions def new unless self.class.respond_to?(:get_kb_page) raise "Method :get_kb_page must be implemented for controller '#{self.class}'" end local_data = { messages: [], errors: [], page: self.class.get_kb_page(:new) } unless local_data[:page] respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :page_404)}" } format.json { render_json_page_404 } end return end filters = {} self.fill_obligatory_db_query_params(filters) # getting entry local_data[:entry] = entry_class.new # getting controls data local_data[:controls_data] = self.load_data_for_entry_controls(local_data[:page].forms[:changes], local_data[:entry]) # fill parent for data filters_for_parents = {} self.fill_obligatory_db_query_params(filters_for_parents) self.fill_parents_for_local_data(local_data, filters_for_parents) # building breadcrumbs self.kb_dp_breadcrumbs_build_for_index(local_data, false) #not index page # rendering page respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :new)}", locals: {data: local_data} } format.json { render_json_ok local_data[: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 local_data = { messages: [], errors: [], page: self.class.get_kb_page(:new) } unless local_data[:page] respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :page_404)}" } format.json { render_json_page_404 } end return end # fill parent for data filters_for_parents = {} self.fill_obligatory_db_query_params(filters_for_parents) self.fill_parents_for_local_data(local_data, filters_for_parents) strong_params = {}.merge(self.class_strong_params(local_data[:page].forms[:changes])) self.fill_obligatory_db_query_params(strong_params) strong_params.merge!(local_data[:parent_ids]) # getting entry local_data[:entry] = self.entry_class.new(strong_params) # pre create self.process_transaction_injections(local_data[:entry], :create, :before_transaction, strong_params) transaction_is_ok = true ActiveRecord::Base.transaction do #raise "In Transaction Before Create" unless self.process_transaction_injections(local_data[:entry], :create, :before_save, strong_params) transaction_is_ok = false raise ActiveRecord::Rollback end if local_data[:entry].save unless process_transaction_injections(local_data[:entry], :create, :after_save, strong_params) transaction_is_ok = false raise ActiveRecord::Rollback end else transaction_is_ok = false raise ActiveRecord::Rollback end end self.process_transaction_injections(local_data[:entry], :create, :after_transaction, strong_params) respond_to do |format| if transaction_is_ok local_data[:messages] << I18n.t("#{self.to_i18n}.messages.entry_created", entry_name: local_data[:entry].to_s) format.html { render_redirect self.to_url_for(:show, local_data[:parent_ids].merge(id: local_data[:entry].id)) } format.json { render_json_ok local_data[:entry], message: local_data[:messages] } else # loading data for select-like controls local_data[:controls_data] = self.load_data_for_entry_controls(local_data[:page].forms[:changes], local_data[:entry]) local_data[:errors] << I18n.t("#{self.to_i18n}.messages.create_error") # building breadcrumbs self.kb_dp_breadcrumbs_build_for_index(local_data, false) #not index page # rendering page format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :new)}", locals: {data: local_data} } format.json { render_json_error local_data[:entry], message: local_data[:errors] } end end end end module EditActions def edit unless self.class.respond_to?(:get_kb_page) raise "Method :get_kb_page must be implemented for controller '#{self.class}'" end local_data = { errors: [], messages: [], page: self.class.get_kb_page(:edit) } unless local_data[:page] respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :page_404)}" } format.json { render_json_page_404 } end return end # fill parent for data filters_for_parents = {} self.fill_obligatory_db_query_params(filters_for_parents) self.fill_parents_for_local_data(local_data, filters_for_parents) # filling filters for search filters = {} self.fill_obligatory_db_query_params(filters) filters.merge!(local_data[:parent_ids]) # retrieving entry from database local_data[:entry] = self.entry_class.get_entry_by_id(params[:id], filters, {logger: string_logger}) # entry not found, showing not found page unless local_data[:entry] local_data[:errors] << I18n.t("#{self.to_i18n}.messages.not_found", entry_id: params[:id]) respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :entry_not_found)}", locals: {data: local_data} } format.json { render_json_not_found message: local_data[:errors] } end return end # loading data for controls local_data[:controls_data] = self.load_data_for_entry_controls(local_data[:page].forms[:changes], local_data[:entry]) # fill parent for data filters_for_parents = {} self.fill_obligatory_db_query_params(filters_for_parents) self.fill_parents_for_local_data(local_data, filters_for_parents) # building breadcrumbs self.kb_dp_breadcrumbs_build_for_index(local_data, false) #not index page # rendering page respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :edit)}", locals: {data: local_data} } format.json { render_json_ok local_data[: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 local_data = { errors: [], messages: [], page: self.class.get_kb_page(:edit) } unless local_data[:page] respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :page_404)}" } format.json { render_json_page_404 } end return end # fill parent for data filters_for_parents = {} self.fill_obligatory_db_query_params(filters_for_parents) self.fill_parents_for_local_data(local_data, filters_for_parents) # filling filters for search filters = {} self.fill_obligatory_db_query_params(filters) filters.merge!(local_data[:parent_ids]) # merging search filters with parent ids # retrieving data from database local_data[:entry] = self.entry_class.get_entry_by_id(params[:id], filters, {logger: string_logger}) # entry not found, showing not found page unless local_data[:entry] local_data[:errors] << I18n.t("#{self.to_i18n}.messages.not_found", entry_id: params[:id]) respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :entry_not_found)}", locals: {data: local_data} } format.json { render_json_not_found message: local_data[:errors] } end return end # getting string params from params strong_params = {}.merge(self.class_strong_params(local_data[:page].forms[:changes])) self.fill_obligatory_db_query_params(strong_params) self.process_transaction_injections(local_data[:entry], :update, :before_transaction, strong_params) transaction_is_ok = true ActiveRecord::Base.transaction do #raise "In Transaction Before Create" unless self.process_transaction_injections(local_data[:entry], :update, :before_save, strong_params) transaction_is_ok = false raise ActiveRecord::Rollback end if local_data[:entry].update(strong_params) unless process_transaction_injections(local_data[:entry], :update, :after_save, strong_params) transaction_is_ok = false raise ActiveRecord::Rollback end else transaction_is_ok = false raise ActiveRecord::Rollback end end self.process_transaction_injections(local_data[:entry], :update, :after_transaction, strong_params) respond_to do |format| flash[:success] = I18n.t("#{self.to_i18n}.messages.manufacturer_updated", entry_name: local_data[:entry].to_s) if transaction_is_ok format.html { render_redirect url_for(action: :show, id: local_data[:entry]) } format.json { head :no_content } else # loading data for select-like controls local_data[:controls_data] = self.load_data_for_entry_controls(local_data[:page].forms[:changes], local_data[:entry]) local_data[:entry].errors[:form] << I18n.t("#{self.to_i18n}.messages.update_error") # building breadcrumbs self.kb_dp_breadcrumbs_build_for_index(local_data, false) #not index page format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :edit)}", locals: {data: local_data} } format.json { render json: local_data[:entry].errors, status: :unprocessable_entity } end end end end module DeleteActions def destroy unless self.class.respond_to?(:get_kb_page) raise "Method :get_kb_page must be implemented for controller '#{self.class}'" end local_data = { errors: [], messages: [], page: self.class.get_kb_page(:delete) } #unless local_data[:page] # respond_to do |format| # format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :page_404)}" } # format.json { render_json_page_404 } # end # return #end # fill parent for data filters_for_parents = {} self.fill_obligatory_db_query_params(filters_for_parents) self.fill_parents_for_local_data(local_data, filters_for_parents) # filling filters for search filters = {} self.fill_obligatory_db_query_params(filters) filters.merge!(local_data[:parent_ids]) # retrieving entry from database local_data[:entry] = self.entry_class.get_entry_by_id(params[:id], filters, {logger: string_logger}) # entry not found, showing not found page unless local_data[:entry] local_data[:errors] << I18n.t("#{self.to_i18n}.messages.not_found", entry_id: params[:id]) respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :entry_not_found)}", locals: {data: local_data} } format.json { render_json_not_found message: local_data[:errors] } end return end # destroying entry if local_data[:entry].destroy # entry destroyed respond_to do |format| format.html { render_redirect(self.to_url_for(:index, local_data[:parent_ids])) } format.json { render_json_ok(local_data[:entry], message: "Record Deleted") } end else # failed to destroy entry local_data[:errors] << I18n.t("#{self.to_i18n}.messages.delete_error") respond_to do |format| format.html { render_html1 self.get_view_path_for_page_edit, locals: {data: local_data} } format.json { render_json_error(local_data[:entry], message: local_data[:errors]) } end end end end module ExportActions 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? options = { logger: string_logger } local_data = { errors: [], messages: [] } # fill parent for data filters_for_parents = {} self.fill_obligatory_db_query_params(filters_for_parents) self.fill_parents_for_local_data(local_data, filters_for_parents) # filling filters for search filters = {} self.fill_obligatory_db_query_params(filters) filters.merge!(local_data[:parent_ids]) # retrieving entries from database local_data[:entries] = self.entry_class.get_entries(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: local_data[:entries_list].to_xml end else respond_to do |format| format.json { render json: local_data[:entries] } format.json { render xml: local_data[:entries] } end end end end module ImportActions def import import_type = params[:type] end end module ItemsManagementActions def manage_items unless self.class.respond_to?(:get_kb_page) raise "Method :get_kb_page must be implemented for controller '#{self.class}'" end local_data = { errors: [], messages: [], page: self.class.get_kb_page(:management) } options = { logger: string_logger } unless local_data[:page] respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :page_404)}" } format.json { render_json_page_404 } end return end # getting management settings local_data[:management_settings] = local_data[:page].managements[:manage] if local_data[:page].managements unless local_data[:management_settings] respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :page_404)}" } format.json { render_json_page_404 } end return end #raise "MANAGEMENT: management settings error" unless local_data[:management_settings] local_container_class = local_data[:management_settings].container_class local_container_id_property = local_data[:management_settings].container_id_property local_item_class = local_data[:management_settings].item_class local_entry_id_property = local_data[:management_settings].entry_id_property local_entry_class = local_data[:management_settings].entry_class # fill parent for data filters_for_parents = {} self.fill_obligatory_db_query_params(filters_for_parents) self.fill_parents_for_local_data(local_data, filters_for_parents) #loading container data filters_4_container = {} self.fill_obligatory_db_query_params(filters_4_container) filters_4_container.merge!(local_data[:parent_ids]) # retrieving container from database local_data[:container] = local_container_class.get_entry_by_id(params[local_container_id_property], filters_4_container, options) # filling filters for items filters_4_items = {} self.fill_obligatory_db_query_params(filters_4_items) filters_4_items.merge!(local_data[:parent_ids]) filters_4_items[local_container_id_property] = params[local_container_id_property] # retrieving items from database local_data[:items] = local_item_class.get_entries(nil, filters_4_items, options) #entries_order_by = get_managing_entries_order_by if self.respond_to?(:get_managing_entries_order_by) #entries_order_by = "name asc" unless entries_order_by # filling filters for entries filters_4_entries = {} self.fill_obligatory_db_query_params(filters_4_entries) filters_4_entries[local_entry_id_property] = params[local_entry_id_property] # retrieving entries from database local_entries_initial_query = local_entry_class.where { -(id.in local_item_class.get_entries(nil, filters_4_items, options).select(local_entry_id_property)) } #fill parent elements filters_for_parents = {} self.fill_obligatory_db_query_params(filters_for_parents) self.fill_parents_for_local_data(local_data, filters_for_parents) local_entries = local_entry_class.get_entries(local_entries_initial_query, filters_4_entries, options) local_data[:entries] = local_entries # building breadcrumbs self.kb_dp_breadcrumbs_build_for_index(local_data, false) #not index page respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :management)}", locals: {data: local_data} } format.json { render json: local_data } end end def manage_items_add unless self.class.respond_to?(:get_kb_page) raise "Method :get_kb_page must be implemented for controller '#{self.class}'" end local_data = { errors: [], messages: [], page: self.class.get_kb_page(:management) } options = { logger: string_logger } unless local_data[:page] respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :page_404)}" } format.json { render_json_page_404 } end return end # getting management settings local_data[:management_settings] = local_data[:page].managements[:manage] if local_data[:page].managements unless local_data[:management_settings] respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :page_404)}" } format.json { render_json_page_404 } end return end local_container_class = local_data[:management_settings].container_class local_container_id_property = local_data[:management_settings].container_id_property local_item_class = local_data[:management_settings].item_class local_entry_id_property = local_data[:management_settings].entry_id_property local_entry_class = local_data[:management_settings].entry_class # fill parent for data filters_for_parents = {} self.fill_obligatory_db_query_params(filters_for_parents) self.fill_parents_for_local_data(local_data, filters_for_parents) #loading container from database filters_4_container = {} self.fill_obligatory_db_query_params(filters_4_container) local_data[:container] = local_container_class.get_entry_by_id(params[local_container_id_property], filters_4_container, options) #checking if container not found unless local_data[:container] render json: {status: ::ChupakabraTools::ApiStatus.id_by_tag('set_not_found'), message: I18n.t("#{self.to_i18n}.management.messages.set_not_found", id: params[local_container_id_property])} return end #loading entry from database filters_4_entries = {} self.fill_obligatory_db_query_params(filters_4_entries) #local_data[:entry] = local_entry_class.get_entry_by_id(params[local_entry_id_property], filters_4_entries, options ) local_data[:entry] = local_entry_class.get_entry_by_id(params[:entry_id], filters_4_entries, options) #checking if entry not found unless local_data[:entry] render json: {status: ::ChupakabraTools::ApiStatus.id_by_tag('entry_not_found'), message: I18n.t("#{self.to_i18n}.management.messages.entry_not_found", entry_id: params[:entry_id])} return end #raise "MANAGEMENT: entry is ok" # loading item from database filters_4_item = {} self.fill_obligatory_db_query_params(filters_4_item) filters_4_item[local_container_id_property] = params[local_container_id_property] #filters_4_item[local_entry_id_property] = params[local_entry_id_property] filters_4_item[local_entry_id_property] = params[:entry_id] logger.info("MANAGEMENT ADD: Retrieve Item from database filters - #{filters_4_item.to_json}") local_data[:item] = local_item_class.get_entries(nil, filters_4_item, options).first unless local_data[:item] local_data[:item] = local_item_class.new local_data[:item][local_container_id_property] = local_data[:container].id local_data[:item][local_entry_id_property] = local_data[:entry].id if local_data[:item].respond_to?(:sort_position) filters_4_items_max = {} self.fill_obligatory_db_query_params(filters_4_items_max) filters_4_items_max[local_container_id_property] = params[local_container_id_property] max_sort_position = local_item_class.get_entries(nil, filters_4_items_max, options).maximum(:sort_position) local_data[:item].sort_position = max_sort_position ? max_sort_position + 1 : 1 end # saving entry using transactions self.process_transaction_injections(local_data[:item], :create, :before_transaction, nil) transaction_is_ok = true ActiveRecord::Base.transaction do #raise "In Transaction Before Create" unless self.process_transaction_injections(local_data[:item], :create, :before_save, nil) transaction_is_ok = false raise ActiveRecord::Rollback end if local_data[:item].save unless self.process_transaction_injections(local_data[:item], :create, :after_save, nil) transaction_is_ok = false raise ActiveRecord::Rollback end else transaction_is_ok = false raise ActiveRecord::Rollback end end self.process_transaction_injections(local_data[:item], :create, :after_transaction, nil) # rendering page if transaction_is_ok render json: {status: ::ChupakabraTools::ApiStatus.id_by_tag('ok'), message: I18n.t("#{self.to_i18n}.management.messages.add_management_ok")} else render json: {status: ::ChupakabraTools::ApiStatus.id_by_tag('error'), message: I18n.t("#{self.to_i18n}.management.messages.add_management_error")} end else render json: {status: ::ChupakabraTools::ApiStatus.id_by_tag('entry_already_in_set'), message: I18n.t("#{self.to_i18n}.management.messages.entry_already_in_set")} end end def manage_items_remove unless self.class.respond_to?(:get_kb_page) raise "Method :get_kb_page must be implemented for controller '#{self.class}'" end local_data = { errors: [], messages: [], page: self.class.get_kb_page(:management) } options = { logger: string_logger } unless local_data[:page] respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :page_404)}" } format.json { render_json_page_404 } end return end # getting management settings local_data[:management_settings] = local_data[:page].managements[:manage] if local_data[:page].managements unless local_data[:management_settings] respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :page_404)}" } format.json { render_json_page_404 } end return end local_container_class = local_data[:management_settings].container_class local_container_id_property = local_data[:management_settings].container_id_property local_item_class = local_data[:management_settings].item_class local_entry_id_property = local_data[:management_settings].entry_id_property local_entry_class = local_data[:management_settings].entry_class # fill parent for data filters_for_parents = {} self.fill_obligatory_db_query_params(filters_for_parents) self.fill_parents_for_local_data(local_data, filters_for_parents) #loading container from database filters_4_container = {} self.fill_obligatory_db_query_params(filters_4_container) local_data[:container] = local_container_class.get_entry_by_id(params[local_container_id_property], filters_4_container, options) #checking if container not found unless local_data[:container] render json: {status: ::ChupakabraTools::ApiStatus.id_by_tag('set_not_found'), message: I18n.t("#{self.to_i18n}.management.messages.set_not_found", id: params[local_container_id_property])} return end # loading item from database filters_4_item = {} self.fill_obligatory_db_query_params(filters_4_item) filters_4_item[local_container_id_property] = params[local_container_id_property] filters_4_item[local_entry_id_property] = params[:entry_id] local_data[:item] = local_item_class.get_entries(nil, filters_4_item, options).first unless local_data[:item] render json: {status: ::ChupakabraTools::ApiStatus.id_by_tag('item_not_found'), message: I18n.t("#{self.to_i18n}.management.messages.item_not_found", entry_id: params[:entry_id])} return end if local_data[:item].destroy render json: {status: ::ChupakabraTools::ApiStatus.id_by_tag('ok'), message: I18n.t("#{self.to_i18n}.management.messages.remove_management_ok")} else render json: {status: ::ChupakabraTools::ApiStatus.id_by_tag('error'), message: I18n.t("#{self.to_i18n}.management.messages.remove_management_error")} end end def sort_items unless self.class.respond_to?(:get_kb_page) raise "Method :get_kb_page must be implemented for controller '#{self.class}'" end local_data = { errors: [], messages: [], page: self.class.get_kb_page(:sorting) } options = { logger: string_logger } unless local_data[:page] respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :page_404)}" } format.json { render_json_page_404 } end return end # getting sorting settings local_data[:sorting_settings] = local_data[:page].sortings[:sort] if local_data[:page].sortings unless local_data[:sorting_settings] respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :page_404)}" } format.json { render_json_page_404 } end return end #raise "SORTING: sorting settings error" unless local_data[:sorting_settings] local_container_class = local_data[:sorting_settings].container_class local_container_id_property = local_data[:sorting_settings].container_id_property local_item_class = local_data[:sorting_settings].item_class local_entry_id_property = local_data[:sorting_settings].entry_id_property local_entry_class = local_data[:sorting_settings].entry_class # fill parent for data filters_for_parents = {} self.fill_obligatory_db_query_params(filters_for_parents) self.fill_parents_for_local_data(local_data, filters_for_parents) #loading container data filters_4_container = {} self.fill_obligatory_db_query_params(filters_4_container) filters_4_container.merge!(local_data[:parent_ids]) # retrieving container from database local_data[:container] = local_container_class.get_entry_by_id(params[local_container_id_property], filters_4_container, options) # filling filters for items filters_4_items = {} self.fill_obligatory_db_query_params(filters_4_items) filters_4_items.merge!(local_data[:parent_ids]) filters_4_items[local_container_id_property] = params[local_container_id_property] filters_4_items[:order] = ::Core::Store::CollectionProduct.for_sql_order_by(:sort_position, :asc) # retrieving items from database local_data[:items] = local_item_class.get_entries(nil, filters_4_items, options) # building breadcrumbs self.kb_dp_breadcrumbs_build_for_index(local_data, false) #not index page respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :sorting)}", locals: {data: local_data} } format.json { render_json_ok local_data } end end def sort_items_process unless self.class.respond_to?(:get_kb_page) raise "Method :get_kb_page must be implemented for controller '#{self.class}'" end local_data = { errors: [], messages: [], page: self.class.get_kb_page(:sorting) } options = { logger: string_logger } unless local_data[:page] respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :page_404)}" } format.json { render_json_page_404 } end return end # getting sorting settings local_data[:sorting_settings] = local_data[:page].sortings[:sort] if local_data[:page].sortings unless local_data[:sorting_settings] respond_to do |format| format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :page_404)}" } format.json { render_json_page_404 } end return end #raise "SORTING: sorting settings error" unless local_data[:sorting_settings] local_container_class = local_data[:sorting_settings].container_class local_container_id_property = local_data[:sorting_settings].container_id_property local_item_class = local_data[:sorting_settings].item_class local_entry_id_property = local_data[:sorting_settings].entry_id_property local_entry_class = local_data[:sorting_settings].entry_class # fill parent for data filters_for_parents = {} self.fill_obligatory_db_query_params(filters_for_parents) self.fill_parents_for_local_data(local_data, filters_for_parents) #loading container from database filters_4_container = {} self.fill_obligatory_db_query_params(filters_4_container) local_data[:container] = local_container_class.get_entry_by_id(params[local_container_id_property], filters_4_container, options) #checking if container not found unless local_data[:container] render json: {status: ::ChupakabraTools::ApiStatus.id_by_tag('set_not_found'), message: I18n.t("#{self.to_i18n}.sorting.messages.set_not_found", id: params[local_container_id_property])} return end # loading items from database one by one and processing them # filters_4_item = {} # self.fill_obligatory_db_query_params(filters_4_item) # filters_4_item[local_container_id_property] = params[local_container_id_property] filters_4_item = {} self.fill_obligatory_db_query_params(filters_4_item) filters_4_item[local_container_id_property] = params[local_container_id_property] #filters_4_item[local_entry_id_property] = id result_is_ok = false if params[:items] begin ActiveRecord::Base.transaction do params[:items].each_with_index do |id, index| logger.info("ITEMID: #{id}") logger.info "ITEM FILTERS: #{filters_4_item.to_json}" item = local_item_class.get_entry_by_id(id, filters_4_item, options) if item item.sort_position = index + 1 item.save end end result_is_ok = true end end end if result_is_ok == true render json: {status: ::ChupakabraTools::ApiStatus.id_by_tag('ok'), message: I18n.t("#{self.to_i18n}.sorting.messages.sorting_ok")} else render json: {status: ::ChupakabraTools::ApiStatus.id_by_tag('error'), message: I18n.t("#{self.to_i18n}.sorting.messages.sorting_error")} end end end end module Common def kb_dp_render_page_404 respond_to do |format| #format.html { render_html1 "#{self.class.get_method_latest_result(:get_kb_template)}/#{self.class.get_method_latest_result(:get_kb_view_path, :page_404)}" } format.html { render_html1 self.get_view_path(:page_404), layout: self.get_view_path(:layout) } format.json { render_json_page_404 } end end def kb_dp_breadcrumbs_build_for_index(local_data, is_index_page) # getting home controller local_home_path = self.class.get_method_latest_result(:get_kb_home_path) if is_index_page if local_home_path if self.class == local_home_path add_new_breadcrumb(I18n.t("#{local_home_path.to_i18n}.index.title")) else add_new_breadcrumb(I18n.t("#{local_home_path.to_i18n}.index.title"), local_home_path.to_url_for(:index)) end end else add_new_breadcrumb(I18n.t("#{local_home_path.to_i18n}.index.title"), local_home_path.to_url_for(:index)) end if local_home_path # building breadcrumbs for parents parent_ids = {} local_data[:parents].each do |parent| # breadcrumbs: adding parent index add_new_breadcrumb(I18n.t("#{parent[:controller].to_i18n}.index.title"), parent[:controller].to_url_for(:index, parent_ids)) # breadcrumbs: getting parent entry name parent_entry_name = nil parent_entry_name = parent[:entry].name_for_breadcrumbs if parent[:entry].respond_to?(:name_for_breadcrumbs) parent_entry_name = parent[:entry].id unless parent_entry_name # breadcrumbs: adding parent entry add_new_breadcrumb(parent_entry_name, parent[:controller].to_url_for(:show, parent_ids.merge(id: parent[:entry].id))) parent_ids[parent[:id_param]] = parent[:id_value] end if local_data[:parents] # breadcrumbs: adding current index add_new_breadcrumb(I18n.t("#{self.to_i18n}.index.title"), self.to_url_for(:index, local_data[:parent_ids])) unless is_index_page # breadcrumbs: getting entry name entry_name = nil entry_name = local_data[:entry].name_for_breadcrumbs if local_data[:entry].respond_to?(:name_for_breadcrumbs) #entry_name.trim(20) if entry_name && entry_name.length > 20 # breadcrumbs: adding current entry page_name = local_data[:page].name if page_name == :edit add_new_breadcrumb(local_data[:entry].id) elsif page_name == :show || page_name == :delete add_new_breadcrumb(entry_name || local_data[:entry].id) elsif page_name == :new add_new_breadcrumb(I18n.t("#{self.to_i18n}.new.title")) elsif page_name == :management add_new_breadcrumb(I18n.t("#{self.to_i18n}.management.title")) elsif page_name == :sorting add_new_breadcrumb(I18n.t("#{self.to_i18n}.sorting.title")) end end end ################################################################################################################ ######################################### Ajax Modules ############################################### ################################################################################################################ module Ajax module InplaceEditActions def edit_inplace unless self.class.respond_to?(:get_kb_page) render text: 'ERROR OCCURRED!!!' return end local_data = {} local_data[:page] = self.class.get_kb_page(:update) unless local_data[:page] render text: 'ERROR OCCURRED!!!' return end local_data[:entry] = self.entry_class.get_entry_by_id(params[:id], nil, {logger: string_logger}) if local_data[:entry] result_string = '' begin unless local_data[:entry][params[:field_name]] == params[:value] local_data[:entry][params[:field_name]] = params[:value] local_data[:entry].updated_at = Time.now local_data[:entry].updater = @current_user unless local_data[:entry].save result_string = 'FAILED TO SAVE!!!' end end rescue result_string = 'ERROR OCCURRED!!!' end if result_string.blank? begin result_string = local_data[:entry].send(params[:field_name]) rescue result_string = 'ERROR OCCURRED!!!' end end render text: result_string else render text: 'NOT FOUND!!!' end end end end end end end end