diff --git a/app/controllers/admin/olympiamanagements_controller.rb b/app/controllers/admin/olympiamanagements_controller.rb index 6784ad5..60780e3 100644 --- a/app/controllers/admin/olympiamanagements_controller.rb +++ b/app/controllers/admin/olympiamanagements_controller.rb @@ -437,7 +437,11 @@ class Admin::OlympiamanagementsController < OrbitAdminController @sign_up_setting = SignUpSetting.where(:active=>true).last else @sign_up_setting = SignUpSetting.find(session[:sign_up_setting_id]) rescue nil - @sign_up_setting = SignUpSetting.where(:active=>true).last if @sign_up_setting.nil? + end + if SignUpSetting.where(:active=>true).last.nil? + @sign_up_setting = SignUpSetting.last if @sign_up_setting.nil? + @sign_up_setting.active = true + @sign_up_setting.save end end def download_import_file diff --git a/app/controllers/olympiamanagements_controller.rb b/app/controllers/olympiamanagements_controller.rb index db83f44..31307f9 100644 --- a/app/controllers/olympiamanagements_controller.rb +++ b/app/controllers/olympiamanagements_controller.rb @@ -179,7 +179,12 @@ class OlympiamanagementsController < ApplicationController @page_content = render_to_string(:formats=> [:html] ,:partial=>'edit_school_data.html',:locals=>{:@school_data_fields=>@school_data_fields,:@olympia_school_data_field=>@olympia_school_data_field}) render_contents_in_index_page(@breadcumb+@page_content)#redirect_to :back else - redirect_to :back + begin + redirect_to :back + rescue + @page = Page.where(:layout=>"olympia_managements_index",:parent_page_id=>(Page.where(:name=> ((I18n.locale.to_s == "en") ? "Home" : "首頁")).first.id)).first + redirect_to "/#{I18n.locale}#{@page.url}" + end end end def add_sign_up_student_data @@ -541,6 +546,90 @@ class OlympiamanagementsController < ApplicationController end format_date(final_html_for_render,(original_view == "home" ? "home" : page.module)) rescue final_html_for_render end + def render_widget_for_frontend(controller_name, widget_method, widget_file, subpart_id=nil) + def widget_parsing_repeats_again(elements,d,level) + newhtml = [] + oldhtml = [] + elements.each do |el| + html_to_render = "" + data_name = el.attr("data-list") + wrap_elements = el.css("*[data-list][data-level='#{level}']") + if d["#{data_name}"] + d["#{data_name}"].each_with_index do |item,i| + element = el.inner_html + if wrap_elements.count > 0 + htmls = widget_parsing_repeats_again(wrap_elements,d["#{data_name}"][i], level + 1) + htmls[0].each_with_index do |html,i| + element = element.gsub(html,htmls[1][i]) + end + end + item.each do |key,value| + if !value.kind_of?(Array) + value = value.nil? ? "" : value + element = element.gsub("{{#{key}}}",value.to_s.html_safe) + element = element.gsub("%7B%7B#{key}%7D%7D",value.to_s) + end + end + html_to_render = html_to_render + element + end + temp = el.to_s + oldhtml << temp + temp = temp.gsub(el.inner_html, html_to_render) + newhtml << temp + end + end + [oldhtml,newhtml] + end + @key = Site.first.template if @key.nil? + controller_name = controller_name.downcase.singularize + f = File.join(Rails.root, 'app', 'templates', "#{@key}", 'modules', "#{controller_name}", "_#{widget_file}.html.erb"); + if !File.exists?f + f = File.join(Rails.root, 'app', 'templates', "#{@key}", 'widgets', "#{controller_name}", "_#{widget_file}.html.erb"); + if !File.exists?f + f = File.join(Rails.root, 'app', 'templates', "#{@key}", 'modules', "#{controller_name}", "_widget.html.erb"); + if File.exists?f + f = File.join("#{@key}", 'modules', "#{controller_name}", "_widget.html.erb"); + else + return "
Maybe the administrator has changed the theme, please select the widget design again from the page settings.
".html_safe + end + else + f = File.join("#{@key}", 'widgets', "#{controller_name}", "_#{widget_file}.html.erb"); + end + else + f = File.join("#{@key}", 'modules', "#{controller_name}", "_#{widget_file}.html.erb"); + end + s = render_to_string(f) + doc = Nokogiri::HTML(s, nil, "UTF-8") + if !subpart_id.nil? + doc.css("body").children.first.set_attribute("data-subpart-id", subpart_id) rescue nil + end + wrap_elements = doc.css("*[data-repeat]") + controller = "#{controller_name.capitalize.pluralize}_controller".classify.constantize.new + OrbitHelper.set_current_widget_module controller_name + begin + data = controller.send("#{widget_method}") #rescue nil + rescue Exception => e + write_widget_debug_file(e,controller_name,widget_method,subpart_id) if Site::DEBUG + end + if !data.nil? + wrap_elements = doc.css("*[data-list][data-level='0']") + htmls = widget_parsing_repeats_again(wrap_elements,data,1) + html = doc.to_s + htmls[0].each_with_index do |h,i| + html = html.gsub(h,htmls[1][i]) + end + extras = data['extras'] || {} + extras["subpart-id"] = subpart_id if !subpart_id.nil? + extras["widget-title"] = OrbitHelper.widget_title + extras.each do |key,value| + html = html.gsub("{{#{key}}}",value.to_s.html_safe) + html = html.gsub("%7B%7B#{key}%7D%7D",value.to_s) + end + html.html_safe + else + return "
No content to show.
".html_safe + end + end def update_school_data @readonly_fields = ['account_number','password','school_name','school_code','school_address','class_number','enrollment_limited'] @olympia_school_data_field = OlympiaSchoolDataFields.where(:account_number=>params[:olympia_user_name]).first diff --git a/app/models/olympia_school_data_fields.rb b/app/models/olympia_school_data_fields.rb index 5939696..005f7a0 100644 --- a/app/models/olympia_school_data_fields.rb +++ b/app/models/olympia_school_data_fields.rb @@ -4,8 +4,6 @@ class OlympiaSchoolDataFields include OrbitModel::Status include OrbitModel::Impression # encoding: utf-8 - include OrbitTag::Taggable - include OrbitCategory::Categorizable field :account_number , type: String , default: '' field :password , type: String , default: '' field :school_name , type: String , default: '' @@ -19,9 +17,9 @@ class OlympiaSchoolDataFields field :fax , type: String , default: '' field :mobile_number , type: String , default: '' field :email , type: String , default: '' - field :enrollment , type: Hash , default: 0 + field :enrollment , type: Fixnum , default: 0 field :approved , type: Boolean , default: true - field :sign_up_setting_id , type: String , default: SignUpSetting.where(:active=>true).last.id.to_s + field :sign_up_setting_id , type: String , default: (SignUpSetting.where(:active=>true).last.id.to_s rescue "") after_destroy do |record| OlympiaStudentDataField.where(:olympia_school_data_fields_id => record.id).destroy_all end @@ -49,10 +47,6 @@ class OlympiaSchoolDataFields self.sign_up_setting_id = SignUpSetting.where(:active=>true).last.id.to_s self.save! end - sign_up_setting = SignUpSetting.find(self.sign_up_setting_id) rescue nil - if sign_up_setting.nil? - self.destroy - end end end end \ No newline at end of file diff --git a/app/models/sign_up_setting.rb b/app/models/sign_up_setting.rb index 2dc6c90..75c0da7 100644 --- a/app/models/sign_up_setting.rb +++ b/app/models/sign_up_setting.rb @@ -39,7 +39,17 @@ class SignUpSetting :en=>""} field :active , type: Boolean , default: true after_save :change_all_password , :check_active - after_create :auto_create_schools + after_destroy do |record| + OlympiaSchoolDataFields.where(:sign_up_setting_id => record.id).destroy_all + end + after_create do |record| + SignUpSetting.where(:id.ne=>record.id).each{|record| record.update(:active=>false)} + @sign_up_setting = SignUpSetting.where(:id.ne=>record.id).last + @schools = OlympiaSchoolDataFields.where(:sign_up_setting_id=>@sign_up_setting.id).take_while{true} + @schools.each do |school| + OlympiaSchoolDataFields.create(school.attributes.except(*['_id','enrollment',"view_count","created_at","updated_at","sign_up_setting_id"]).merge({:sign_up_setting_id => record.id})) + end + end def change_all_password if self.set_default_password && !self.default_password.blank? OlympiaSchoolDataFields.where(:sign_up_setting_id=>self.id).each do |school_field| @@ -50,13 +60,6 @@ class SignUpSetting self.save end end - def auto_create_schools - @sign_up_setting = SignUpSetting.where(:id.ne=>self.id).last - @schools = OlympiaSchoolDataFields.where(:sign_up_setting_id=>@sign_up_setting.id) - @schools.each do |school| - OlympiaSchoolDataFields.create(school.attributes.except(*['_id','enrollment'])) - end - end def check_active if self.active SignUpSetting.where(:id.ne=>self.id).each do |setting| diff --git a/lib/olympiamanagement/engine.rb b/lib/olympiamanagement/engine.rb index e690c04..127d627 100644 --- a/lib/olympiamanagement/engine.rb +++ b/lib/olympiamanagement/engine.rb @@ -4,7 +4,7 @@ module Olympiamanagement initializer "olympiamanagement" do OrbitApp.registration "Olympiamanagement", :type => "ModuleApp" do base_url File.expand_path File.dirname(__FILE__) - taggable "olympiamanagementfields" + set_keyword_contstraints ['/olympiamanagements/'] categorizable authorizable widget_methods ["widget"]