diff --git a/app/controllers/admin/import_controller.rb b/app/controllers/admin/import_controller.rb index b5e6718..91659a8 100644 --- a/app/controllers/admin/import_controller.rb +++ b/app/controllers/admin/import_controller.rb @@ -5,7 +5,10 @@ require 'json' class Admin::ImportController < OrbitAdminController layout "structure" + before_filter :get_user + @@import_stats = {} + @@thread = nil def check_url params['url'] = params['url']+"/" if params['url'].last!="/" uri = URI.parse(params['url']) @@ -191,4 +194,140 @@ class Admin::ImportController < OrbitAdminController bulletin.save! end -end \ No newline at end of file + + def rss2_pages + uri = URI.parse(params['url']) + @@thread = Thread.new do + http = Net::HTTP.new(uri.host, uri.port) + request = Net::HTTP::Get.new(uri.request_uri) + response = http.request(request) + data = response.body + data = JSON.parse(data) + pages = data["pages"] + @@import_stats["total"] = data["total_pages"] + @@import_stats["current_stattus"] = 0 + pages.each do |page| + @@import_stats["current_page"] = page["page_id"] + @@import_stats["current_page_name"] = page["title"]["zh_tw"] + if Page.where(:rss2_id => page["page_id"]).count == 0 + page_id = page["page_id"] + number = 0 + while page_present?page_id + page_id = page_id + "_" + (number + 1).to_s + end + p = Page.new(:page_id => page_id, :parent_page_id => Page.root.id, :page_type => "page", :url => "/#{page_id}", :module => "page_content", :enabled_for => ["en", "zh_tw"], :menu_enabled_for => ["en", "zh_tw"], :enabled_for_sitemap => ["en","zh_tw"], :name_translations => {"en"=>page["title"]["en"], "zh_tw" => page["title"]["zh_tw"]},:rss2_id => page["page_id"]) + p.save + en = smart_downloader(page["content"]["en"],data["site_url"]) + zh_tw = smart_downloader(page["content"]["zh_tw"],data["site_url"]) + page_context = PageContext.new(:content_translations => {"en" => en,"zh_tw" => zh_tw}, :version => 1, :update_user_id => current_user.id, :page_id => p.id) + page_context.save + else + p = Page.find_by(:rss2_id => page["page_id"]) + page_id = p.page_id + end + @@import_stats["current_stattus"] = @@import_stats["current_stattus"] + 1 + if !page["childpages"].blank? + childpages = page["childpages"] + childpages.each_with_index do |childpage,i| + @@import_stats["current_page"] = childpage["page_id"] + @@import_stats["current_page_name"] = page["title"]["zh_tw"] + if Page.where(:rss2_id => childpage["page_id"]).count == 0 + p_id = page_id + "_" + i.to_s + case childpage["type"] + when "page" + cp = Page.new(:page_id => p_id, :parent_page_id => p.id, :page_type => "page", :url => "#{p.page_id}/#{p_id}", :module => "page_content", "enabled_for" => ["en", "zh_tw"], :menu_enabled_for => ["en", "zh_tw"], :enabled_for_sitemap => ["en","zh_tw"], :name_translations => {"en"=>childpage["title"]["en"], "zh_tw" => childpage["title"]["zh_tw"]},:rss2_id => childpage["page_id"]) + cp.save + en = smart_downloader(childpage["content"]["en"],data["site_url"]) + zh_tw = smart_downloader(childpage["content"]["zh_tw"],data["site_url"]) + page_context = PageContext.new(:content_translations => {"en" => en,"zh_tw" => zh_tw}, :version => 1, :update_user_id => current_user.id, :page_id => cp.id) + page_context.save + when "exturl" + cp = Page.new(:page_id => p_id, :parent_page_id => p.id, :page_type => "link", "url" => "#{p.page_id}/#{p_id}", :enabled_for => ["en", "zh_tw"], :menu_enabled_for => ["en", "zh_tw"], :enabled_for_sitemap => ["en","zh_tw"], :name_translations => {"en"=>childpage["title"]["en"], "zh_tw" => childpage["title"]["zh_tw"]}, :external_url_translations => {"en" => childpage["url"], "zh_tw" => childpage["url"]},:rss2_id => childpage["page_id"]) + cp.save + when "file" + asset = Asset.new + asset.remote_data_url = childpage["filename"] + asset.title_translations = {"en" => childpage["file_title"], "zh_tw" =>childpage["file_title"]} + asset.save! + @user.assets << asset + @user.save + external_url = asset.data.url + cp = Page.new(:page_id => p_id, :parent_page_id => p.id, :page_type => "link", "url" => "#{p.page_id}/#{p_id}", :enabled_for => ["en", "zh_tw"], :menu_enabled_for => ["en", "zh_tw"], :enabled_for_sitemap => ["en","zh_tw"], :name_translations => {"en"=>childpage["title"]["en"], "zh_tw" => childpage["title"]["zh_tw"]}, :external_url_translations => {"en" => external_url, "zh_tw" => external_url},:rss2_id => childpage["page_id"]) + cp.save + end + end + @@import_stats["current_stattus"] = @@import_stats["current_stattus"] + 1 + end + end + end + + end + @@thread.abort_on_exception = true + render :json => {"success"=>true}.to_json + end + + def get_import_status + if @@thread.alive? + render :json => {"success" => true, "total_pages" => @@import_stats["total"], "current_status" => @@import_stats["current_stattus"], "current_page" => @@import_stats["current_page"], "current_page_name" => @@import_stats["current_page_name"]} + else + if @@import_stats["current_stattus"] == @@import_stats["total"] + render :json => {"success" => true, "total_pages" => @@import_stats["total"], "current_status" => @@import_stats["current_stattus"], "current_page" => @@import_stats["current_page"], "current_page_name" => @@import_stats["current_page_name"]} + + else + render :json => {"success" => false, "current_page" => @@import_stats["current_page"], "current_page_name" => @@import_stats["current_page_name"]} + end + end + end + + private + + def page_present?(page) + Page.where(:page_id => page).count > 0 + end + + def smart_downloader(data,url) + @data = data + excluded_extensions = ["php","/"] + @links = URI.extract(@data) + @links.each do |link| + if link.include?url + temp = link.gsub(url,"") + extension = temp.split(".").last rescue nil + if extension.nil? || excluded_extensions.include?(extension) + @data = @data.sub(link,"#") + else + a = Asset.new + a.remote_data_url = link + a.title_translations = {"en" => a.data.filename, "zh_tw" => a.data.filename} + a.save! + @user.assets << a + @user.save + @data = @data.sub(link, a.data.url) + end + end + end + @data + end + + def get_user + @user = User.find(current_user.id) + end +end + + + + + + + + + + + + + + + + + + diff --git a/app/models/page.rb b/app/models/page.rb index 09af3e5..e6f781c 100644 --- a/app/models/page.rb +++ b/app/models/page.rb @@ -16,6 +16,7 @@ class Page field :menu_enabled_for, type: Array, default: [] field :categories, type: Array, :default => [] field :enabled_for_sitemap, type: Array, :default => [] + field :rss2_id, type: String has_many :page_parts, :autosave => true, :dependent => :destroy has_many :mobile_page_parts, :autosave => true, :dependent => :destroy diff --git a/app/views/admin/import/index.html.erb b/app/views/admin/import/index.html.erb index a142f9c..eff590c 100644 --- a/app/views/admin/import/index.html.erb +++ b/app/views/admin/import/index.html.erb @@ -127,7 +127,7 @@ -
+

<%= t("page_content.page") %> @@ -170,7 +170,7 @@ $("#import-start-btn").click(function(){ switch(module){ - case "page": + case "pages": importPages(); break; default: @@ -186,7 +186,40 @@ var importPages = function(){ $("#import-progress .bar").css('width','0%'); - $("#import-progress-text").html("Importing Pages

"); + $.ajax({ + type: "post", + dataType: "json", + url: '<%= admin_import_rss2_pages_path %>', + data : {"url" : url+'?module='+module} + }).done(function(){ + startCheckingImportStatus(); + $("#import-progress-text").html("Importing Pages...
"); + }) + } + + var startCheckingImportStatus = function(){ + $.ajax({ + type : "get", + dataType : "json", + url : "<%= admin_import_get_import_status_path %>" + }).done(function(status){ + if(status.success == true){ + if(status.total_pages != null){ + var percent = (status.current_status * 100) / status.total_pages; + $("#import-progress .bar").css('width',percent + "%"); + $("#import-progress-text").html("Importing page " + status.current_page_name + " .. " + status.current_status + "/" + status.total_pages + "
"); + } + if(status.total_pages != status.current_status){ + setTimeout("startCheckingImportStatus()",700); + }else{ + $("#import-progress-text").html("Finished importing pages.
"); + } + }else if(status.success == false){ + $("#import-progress-text").html("Importing failed, click on start to try again."); + $("#alert-msg").text("Error importing page " + status.current_page_name + " ID : " + status.current_page) + $(".alert-danger").removeClass("hide").show(); + } + }) } var importModule = function(m){ diff --git a/config/routes.rb b/config/routes.rb index 31de1ce..d3731a7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -205,6 +205,8 @@ Orbit::Application.routes.draw do get "import/module_data" => "import#module_data" post "import/rss2_news" => "import#rss2_news" post "import/rss2_archive" => "import#rss2_archive" + post "import/rss2_pages" => "import#rss2_pages" + get "import/get_import_status" => "import#get_import_status" end get 'mobile', to: 'pages#home'