Import RSS2 UI

This commit is contained in:
manson 2014-06-06 12:22:55 +08:00
parent 94ad217259
commit 218e7f16df
7 changed files with 462 additions and 189 deletions

View File

@ -21,8 +21,8 @@ $(function () {
'use strict';
// Initialize the jQuery File Upload widget:
$('#fileupload').fileupload({
maxFileSize: 5000000,
acceptFileTypes: /(\.|\/)(gif|jpe?g|png|pdf|doc|docx|ppt|pptx|xls|xlsx)$/i,
maxFileSize: 10000000,
acceptFileTypes: /(\.|\/)(gif|jpe?g|png|pdf|doc|docx|ppt|pptx|xls|xlsx|csv|txt |zip|rar|tar|gz)$/i,
dropZone: $('#dropzone'),
headers:{
'X-CSRF-Token': $('meta[name="csrf-token"]').attr("content")

View File

@ -4,45 +4,134 @@ require "uri"
require 'json'
class Admin::ImportController < OrbitAdminController
before_action :get_data ,:except=>'index'
layout "structure"
def rss2_news
@new_category_ids = {}
module_id = ModuleApp.where(:key=>"announcement").first.id
def check_url
params['url'] = params['url']+"/" if params['url'].last!="/"
uri = URI.parse(params['url'])
@categories.each do |category|
x = Category.where(:title => category["zh_tw"]).first
if x.nil?
begin
@host = uri.host
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)
msg = data['status']
rescue
msg = "Failed to connect to RSS2 (#{uri.to_s})"
end
render :json=>{"status"=>msg}
end
def module_categories
module_app = ModuleApp.find_by(:key=>params['module'])
uri = URI.parse(params['url'])
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Get.new(uri.request_uri)
response = http.request(request)
data = response.body
categories = JSON.parse(data)
I18n.locale = :zh_tw
categories.each do |id, category|
old_cate = module_app.categories.where(:title => category["zh_tw"]).first
if old_cate.nil?
cat = Category.new
titles = {}
@site_valid_locales.each do |locale|
titles[locale] = category[locale.to_s]
end
cat.title_translations = titles
cat.module_app_id = module_id
cat.title_translations = category
cat.save!
@new_category_ids[category["id"]] = cat.id
module_app.categories << cat
categories[id]['id'] = cat.id.to_s
else
@new_category_ids[category["id"]] = x.id
categories[id]['id'] = old_cate.id.to_s
end
end
render :json=>categories
end
def module_data_list
uri = URI.parse(params['url'])
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)
render :json=>data
end
def module_data
uri = URI.parse(params['url'])
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)
case params['module']
when 'archive'
import_archive(data)
when 'announcement'
import_announcement(data)
end
render :json=>['status'=>'ok']
end
def import_archive(file)
archive_file = ArchiveFile.where(:rss2_sn=>file['Sn']).first
if archive_file.nil?
archive_file = ArchiveFile.new
archive_file.rss2_sn = file['Sn']
end
archive_file.title_translations = file['title']
archive_file.sort_number = file['sort_number']
archive_file.category = Category.find(params["category"])
archive_file.create_user_id = current_user.id
archive_file.update_user_id = current_user.id
archive_file.save
if(file['url'])
archive = ArchiveFileMultiple.new({
:file_title_translations=>file['title'],
:choose_lang => @site_valid_locales,
:remote_file_url => file['url'],
:sort_number=>file['sort_number']
})
archive.save
archive_file.archive_file_multiples << archive
end
if(file['url2'])
archive = ArchiveFileMultiple.new({
:file_title_translations=>file['title'],
:choose_lang => @site_valid_locales,
:remote_file_url => file['url2'],
:sort_number=>file['sort_number']
})
archive.save
archive_file.archive_file_multiples << archive
end
end
@data.each do |row|
def import_announcement(news)
bulletin = Bulletin.where(:rss2_sn=>news['Sn']).first
if bulletin.nil?
bulletin = Bulletin.new
bulletin.update_user = @user
bulletin.title_translations = row['Title']
bulletin.subtitle_translations = row['Summary']
next if row['Title']==[] and row['Summary']==[] and row['Content']==[]
bulletin.rss2_sn = news['Sn']
end
bulletin.update_user = current_user
bulletin.title_translations = news['Title']
bulletin.subtitle_translations = news['Summary']
@site_valid_locales.each do |locale|
locale = locale.to_s
if row['Content'][locale]=="" and row['Summary'][locale]!=""
row['Content'][locale] = row['Summary'][locale]
row['Summary'][locale] = " "
if news['Content'][locale]=="" and news['Summary'][locale]!=""
news['Content'][locale] = news['Summary'][locale]
news['Summary'][locale] = " "
end
temp = row['Content'][locale]
temp = news['Content'][locale]
urls = Nokogiri::HTML(temp).css("img").map do |link|
@ -59,24 +148,24 @@ class Admin::ImportController < OrbitAdminController
@user.assets << a
temp.gsub!(CGI::escapeHTML(url), a.data.to_s)
end
row['Content'][locale] = temp
news['Content'][locale] = temp
end
bulletin.text_translations = row['Content']
bulletin.category = Category.find(@new_category_ids[row["Category"]])
bulletin.view_count = row["Visits"].blank? ? 0 : row["Visits"]
bulletin.postdate = row["PostDate"]
bulletin.deadline = row['Deadline']
bulletin.remote_image_url = row["Pic"] if row["Pic"]
bulletin.text_translations = news['Content']
bulletin.category = Category.find(params["category"])
bulletin.view_count = news["Visits"].blank? ? 0 : news["Visits"]
bulletin.postdate = news["PostDate"]
bulletin.deadline = news['Deadline']
bulletin.remote_image_url = news["Pic"] if news["Pic"]
if row["URL"] && row['URL'] != ""
if news["URL"] && news['URL'] != ""
bl = BulletinLink.new
bl.url = row["URL"]
bl.url = news["URL"]
bl.title_translations = {"en" => "Link", "zh_tw" => "Link"}
bl.save!
bulletin.bulletin_links << bl
end
row['files'].each do |f|
news['files'].each do |f|
bf = BulletinFile.new
if f['url'].split('title=').size == 1
f['url'] = f['url']+"檔案下載"
@ -102,88 +191,4 @@ class Admin::ImportController < OrbitAdminController
bulletin.save!
end
I18n.locale = @org_locale
redirect_to('/admin/announcements')
end
def rss2_archive
unless @site_url.nil?
module_app = ModuleApp.where(:key=>"archive").first
@new_categories = {}
@categories.each do |id, category|
old_cate = Category.where(:title => category['title']["zh-tw"]).first
if old_cate.nil?
cate = Category.new
titles = {}
@site_valid_locales.each do |locale|
titles[locale] = category['title'][locale.to_s.gsub('_', '-')]
end
cate.title_translations = titles
cate.save!
module_app.categories << cate
@new_categories[id] = cate.id
else
@new_categories[id] = old_cate.id
end
end
I18n.locale = :en
@data.each do |id, file|
titles = {}
@site_valid_locales.each do |locale|
titles[locale] = file['title'][locale.to_s.gsub('_', '-')]
end
the_file = ArchiveFileMultiple.new({
:file_title_translations=>titles,
:choose_lang => @site_valid_locales,
:remote_file_url => @site_url+file['url'],
:sort_number=>file['sort_number']
})
the_file.save
archive_file = ArchiveFile.new({
:title_translations=>titles,
:sort_number=>file['sort_number']
})
archive_file.category = Category.find(@new_categories[file["category"]])
archive_file.create_user_id = current_user.id
archive_file.update_user_id = current_user.id
archive_file.save
archive_file.archive_file_multiples << the_file
end
end
I18n.locale = @org_locale
redirect_to admin_archive_files_path
end
private
def get_data
@org_locale = I18n.locale
I18n.locale = :zh_tw
@site_url = params['site_url']
@url = params['url']
uri = URI.parse(@url)
@host = uri.host
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)
@categories = data['categories']
@data = data['data']
@user = User.where(:user_name => "rulingcom").first
end
end

View File

@ -1,31 +1,291 @@
<style type="text/css">
.import_wrapper{
.import-wrapper{
padding: 10px;
}
.import_wrapper .import-url{
width: 500px;
.import-wrapper .import-url{
width: 565px;
}
.import_wrapper .btn{
.import-wrapper .btn{
margin-bottom: 10px;
}
.lead{
border-bottom: 1px solid #DDD;
#import-container{
width: 600px;
margin: 0 auto;
}
#loading{
margin: 20px 0;
text-align: center;
display:none;
}
#loading img{
width: 50px;
}
#import-head{
font-size: 18px;
text-align: center;
text-shadow: 1px 1px 1px #FFF;
padding-bottom: 10px;
margin-top: 100px;
}
#import-head i{
font-size: 64px;
}
#site-url-wrapper{
height: 100px;
}
#import-modules{
margin-top: 30px;
text-align: center;
}
.module{
text-align: center;
width: 120px;
display: inline-block;
margin: 8px 5px;
padding: 15px 0px;
}
.module i{
font-size: 48px;
border-radius: 10px;
border: 1px solid #FFF;
background: #888;
cursor: pointer;
padding: 15px 18px;
box-shadow: 0 0 10px #555 inset;
color: #FFF;
}
.module i:hover{
background: #438CDB;
box-shadow: none;
}
#import-modules .lead{
margin-bottom: 0px;
font-size: 12px;
}
.alert{
}
.module-icon{
font-size: 64px;
border-radius: 10px;
padding: 15px 18px;
color: #888;
}
#import-progress{
border: 0px solid #CCC;
text-align: center;
width: 400px;
margin: 100px auto 0 auto;
}
#import-progress .progress{
margin-bottom: 0px;
}
#import-progress-text{
font-size: 16px;
line-height: 25px;
color: #666;
height: 50px;
margin-bottom: 5px;
}
</style>
<div class="import_wrapper">
<div class="lead muted"><i class="icons-megaphone"></i><%= t("announcement.announcement") %></div>
<form method="post" action="/admin/import/rss2_news">
<input type="text" class="import-url" name="url" placeholder="RSS2 Export URL ex: http://rss2.rulingcom.com/DEMO24_ALL/export_news/"><br/>
<input type="submit" class="btn btn-primary" value="<%= t(:submit) %>">
</form>
<div id="import-container">
<div id="import-head" class="muted">
<i class='icon-cloud-download'></i><br/>
Import RSS2
</div>
<div class="import_wrapper">
<div class="lead muted"><i class="icons-archive"></i><%= t("archive.archive") %></div>
<form method="post" action="/admin/import/rss2_archive">
<input type="text" class="import-url" name="site_url" placeholder="RSS2 Site URL ex: http://rss2.rulingcom.com/DEMO24_ALL"><br/>
<input type="text" class="import-url" name="url" placeholder="RSS2 Export URL ex: http://rss2.rulingcom.com/DEMO24_ALL/export_archive/"><br/>
<input type="submit" class="btn btn-primary" value="<%= t(:submit) %>">
</form>
<div id="loading">
<%= image_tag 'preloader.gif' %><br/>
<span id="progress_msg"></span>
</div>
<div id="site-url-wrapper" class="import-wrapper">
<input type="text" class="import-url" name="url" placeholder="http://www.rulingcom.com">
<button id="check-site-url" class="btn btn-primary pull-right">Next <i class="icons-arrow-right"></i></button>
<span><a href='http://installer.tp.rulingcom.com/rss2-export-api.zip'>Download Rss2 Export API</a></span>
</div>
<div id="import-modules" class="hide">
<div id="member-module" class="module" onclick="importModule('member')">
<div class="lead muted">
<i class="icons-users"></i><br/>
<%= t("member_") %>
</div>
</div>
<div id="announcement-module" class="module" onclick="importModule('announcement')">
<div class="lead muted">
<i class="icons-megaphone"></i><br/>
<%= t("announcement.announcement") %>
</div>
</div>
<div id="archive-module" class="module" onclick="importModule('archive')">
<div class="lead muted">
<i class="icons-archive"></i><br/>
<%= t("archive.archive") %>
</div>
</div>
<div id="page-module" class="module" onclick="importModule('page')">
<div class="lead muted">
<i class="icons-newspaper"></i><br/>
<%= t("page_content.page") %>
</div>
</div>
</div>
<div id="import-progress" class="hide">
<div class="head" style="border: 0px solid #CCC; margin: 5px; text-align: center;">
<i class=""></i>
</div>
<div class="content" style="border: 0px solid #CCC; height: 100px; margin: 5px">
<div class="progress">
<div class="bar" style="width: 0%;"></div>
</div>
<div id="import-progress-text"></div>
<button id="import-start-btn" class="btn btn-primary pull-right">Start</i></button>
<button id="import-back-btn" class="btn pull-left">Back</i></button>
</div>
</div>
<div class="alert alert-danger hide">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
<span id="alert-msg"><%= @msg %></span>
</div>
</div>
<script type="text/javascript">
var url;
var categories=null;
var dataList=null;
var module;
var progress = 0;
$(".import-url").keyup(function(e){
var code = (e.keyCode ? e.keyCode : e.which);
if (code==13) { checkSiteUrl(); }
});
$("#check-site-url").click(function(){checkSiteUrl();});
$("#import-start-btn").click(function(){getModuleCategories()});
$("#import-back-btn").click(function(){
$("#import-progress").fadeOut(300,function(){
$("#import-head").fadeIn(0);
$("#import-modules").fadeIn(300);
});
});
var importModule = function(m){
module = m;
dataList=null;
categories=null;
$('#import-progress i').attr('class', $('#'+m+'-module i').attr('class')+' module-icon');
$("#import-progress .bar").css('width','0%');
$("#import-progress-text").html("");
$("#import-modules").fadeOut(300,function(){
$("#import-head").fadeOut(0);
$("#import-progress").fadeIn(300,function(){
});
});
}
var getModuleCategories= function(){
$("#import-progress .bar").css('width','0%');
$("#import-progress-text").html("Importing Categories<br/><br/>");
$.ajax({
type: 'GET',
dataType: 'json',
url: '<%= admin_import_module_categories_path %>',
data: {module: module, url: url+'?module='+module+'&type=categories'},
success: function(data){
$("#import-progress .bar").css('width','100%');
$("#import-progress-text").html("Done<br/><br/>");
categories = data;
getModuleDataList();
}
});
}
var getModuleDataList = function(){
$("#import-progress .bar").css('width','0%');
$.ajax({
type: 'GET',
dataType: 'json',
url: '<%= admin_import_module_data_list_path %>',
data: {module: module, url: url+'?module='+module+'&type=dataList'},
success: function(data){
dataList = data;
importModuleDatas();
}
});
}
var importModuleDatas = function(){
$("#import-progress .bar").css('width','0%');
$("#import-progress-text").html("Start import...<br/><br/>");
if(dataList!=null && categories!=null){
$.each(dataList, function(key, val){
$.ajax({
type: 'GET',
dataType: 'json',
async: true,
url: '<%= admin_import_module_data_path %>?&category='+categories[val]['id'],
data: {module: module, url: url+'?module='+module+'&type=data&Sn='+key},
success: function(data){
progress++;
percentage = parseInt((progress/Object.keys(dataList).length)*100)+'%';
$("#import-progress .bar").css('width',percentage);
$("#import-progress-text").html(progress+' / '+Object.keys(dataList).length+'<br/>'+percentage);
if(percentage=="100%"){
$("#import-progress").delay(1000).fadeOut(300,function(){
$("#import-head").fadeIn(0);
$("#import-modules").fadeIn(300);
});
}
}
});
});
}else{
setTimeout("importModuleDatas()", 3000);
}
}
var checkSiteUrl = function(){
url = $(".import-url").val();
url = (url[url.length-1]=='/') ? url+'export/' : url+'/export/';
$(".alert").hide();
if(/http[s]?:\/\/[a-zA-Z0-9.-\/]+/.test(url)){
$("#site-url-wrapper").fadeOut(300, function(){
$("#progress_msg").html("Checking connection...");
$("#loading").fadeIn(0);
$.getJSON('<%= admin_import_check_url_path %>', {url: url},function(data){
$("#loading").fadeOut(function(){
if(data['status']=="ok"){
$("#import-head").animate({ marginTop: '0px' },{
duration: 300,
complete: function() {
$("#import-modules").fadeIn(300);
}
});
}else{
$("#alert-msg").html(data['status']);
$(".alert").fadeIn(300);
$("#site-url-wrapper").fadeIn(300);
}
});
});
});
}else{
$("#alert-msg").html("Invalid URL");
$(".alert").fadeIn(300).delay(2000).fadeOut(300);
}
}
</script>

View File

@ -20,6 +20,8 @@
<li title="<%= t('update_manager') %>"><%= link_to admin_site_update_manager_path(current_site), :class => active_for_action('sites', 'update_manager') do %><span><i class="icon-refresh"></i></span><%end%></li>
<li title="<%= t("site.system_preference") %>"><%= link_to admin_site_system_info_path(current_site), :class => active_for_action('sites', 'system_info') do %><span><i class="icons-info-2"></i></span><%end%></li>
<li title="<%= t("site.import_rss2") %>"><%= link_to admin_import_path, :class => active_for_action('import','') do %><span><i class="icon-cloud-download"></i></span><%end%></li>
</ul>
</div>
<div class="sub-nav-arrow"></div>

View File

@ -484,6 +484,7 @@ en:
frontend_open: Frontend Open
disable_personal_desktop: Disable Personal Desktop
header: Site header
import_rss2: Import RSS2
info: Site information
keywords: Site keywords
keywords_help: Keyword Guide

View File

@ -480,6 +480,7 @@ zh_tw:
footer: 網站頁尾
footer_help: 網站頁尾說明
header: 網站頁首
import_rss2: 匯入RSS2
info: 網站資訊
keywords: 搜尋關鍵字
keywords_help: 關鍵字說明

View File

@ -199,6 +199,10 @@ Orbit::Application.routes.draw do
get 'module_store' => 'module_store#index'
get "import" => "import#index"
get "import/check_url" => "import#check_url"
get "import/module_categories" => "import#module_categories"
get "import/module_data_list" => "import#module_data_list"
get "import/module_data" => "import#module_data"
post "import/rss2_news" => "import#rss2_news"
post "import/rss2_archive" => "import#rss2_archive"
end