Compare commits
7 Commits
master
...
ntu_ga_sub
Author | SHA1 | Date |
---|---|---|
Bernie Chiu | a85d87fc1f | |
thomaschen | 5c8f822993 | |
Manson Wang | b9f62c6382 | |
thomaschen | a247b1042a | |
Manson Wang | 5ce584a75a | |
Manson Wang | 72d3fa428d | |
Manson Wang | 4c8c7b19ff |
1
Gemfile
1
Gemfile
|
@ -41,6 +41,7 @@ gem 'fb_graph'
|
||||||
gem 'rack-gridfs'
|
gem 'rack-gridfs'
|
||||||
gem 'radius'
|
gem 'radius'
|
||||||
gem 'rake'
|
gem 'rake'
|
||||||
|
gem 'roo'
|
||||||
# gem 'remotipart'
|
# gem 'remotipart'
|
||||||
gem 'resque', :require => 'resque/server' # background jobs
|
gem 'resque', :require => 'resque/server' # background jobs
|
||||||
gem 'resque-scheduler' # job scheduling
|
gem 'resque-scheduler' # job scheduling
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 7.4 KiB |
|
@ -0,0 +1,33 @@
|
||||||
|
window.SocialShareButton =
|
||||||
|
openUrl : (url) ->
|
||||||
|
window.open(url)
|
||||||
|
false
|
||||||
|
|
||||||
|
share : (el) ->
|
||||||
|
site = $(el).data('site')
|
||||||
|
title = encodeURIComponent($(el).parent().data('title'))
|
||||||
|
img = encodeURIComponent($(el).parent().data("img"))
|
||||||
|
fb_url = encodeURIComponent($(el).parent().data("fb_url"))
|
||||||
|
url = encodeURIComponent(location.href)
|
||||||
|
switch site
|
||||||
|
when "weibo"
|
||||||
|
SocialShareButton.openUrl("http://v.t.sina.com.cn/share/share.php?url=#{url}&pic=#{img}&title=#{title}&content=utf-8")
|
||||||
|
when "twitter"
|
||||||
|
SocialShareButton.openUrl("https://twitter.com/home?status=#{title}: #{url}")
|
||||||
|
when "douban"
|
||||||
|
SocialShareButton.openUrl("http://www.douban.com/recommend/?url=#{url}&title=#{title}&image=#{img}")
|
||||||
|
when "facebook"
|
||||||
|
SocialShareButton.openUrl("http://www.facebook.com/sharer.php?t=#{title}&u=#{fb_url}")
|
||||||
|
when "qq"
|
||||||
|
SocialShareButton.openUrl("http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=#{url}&title=#{title}&pics=#{img}")
|
||||||
|
when "tqq"
|
||||||
|
SocialShareButton.openUrl("http://share.v.t.qq.com/index.php?c=share&a=index&url=#{url}&title=#{title}&pic=#{img}")
|
||||||
|
when "baidu"
|
||||||
|
SocialShareButton.openUrl("http://apps.hi.baidu.com/share/?url=#{url}&title=#{title}&content=")
|
||||||
|
when "kaixin001"
|
||||||
|
SocialShareButton.openUrl("http://www.kaixin001.com/rest/records.php?url=#{url}&content=#{title}&style=11&pic=#{img}")
|
||||||
|
when "renren"
|
||||||
|
SocialShareButton.openUrl("http://widget.renren.com/dialog/share?resourceUrl=#{url}&title=#{title}&description=")
|
||||||
|
when "google_plus"
|
||||||
|
SocialShareButton.openUrl("https://plus.google.com/share?url=#{url}&t=#{title}")
|
||||||
|
false
|
|
@ -10,7 +10,7 @@ $(document).ready(function() {
|
||||||
type: 'GET',
|
type: 'GET',
|
||||||
url: $(this).attr("rel"),
|
url: $(this).attr("rel"),
|
||||||
dataType: 'script',
|
dataType: 'script',
|
||||||
data: {ids: ids},
|
data: {field: $(this).attr("field"), ids: ids},
|
||||||
success: function (msg) {
|
success: function (msg) {
|
||||||
$("#member-filter").modal('show'); },
|
$("#member-filter").modal('show'); },
|
||||||
error: function(){
|
error: function(){
|
||||||
|
@ -20,6 +20,11 @@ $(document).ready(function() {
|
||||||
});
|
});
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$(document).on('click', ".remove_user", function(){
|
||||||
|
$(this).parent().remove();
|
||||||
|
});
|
||||||
|
|
||||||
$("#remove_users").on('click', function(){
|
$("#remove_users").on('click', function(){
|
||||||
var ids = [];
|
var ids = [];
|
||||||
var users = $('.selected_user input[type="checkbox"]:checked');
|
var users = $('.selected_user input[type="checkbox"]:checked');
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
$(document).ajaxStop(function() {
|
||||||
|
$('.nav').find('.dropdown').on({
|
||||||
|
mouseleave: function() {
|
||||||
|
$(this).removeClass("open");
|
||||||
|
},
|
||||||
|
mouseenter: function() {
|
||||||
|
$(this).addClass("open")
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,230 @@
|
||||||
|
/* Member Filter */
|
||||||
|
#select_user #select_user_modal.modal {
|
||||||
|
width: 80%;
|
||||||
|
margin-left: -40%;
|
||||||
|
}
|
||||||
|
#select_user #select_user_modal .modal-body {
|
||||||
|
max-height: 425px;
|
||||||
|
}
|
||||||
|
#select_user #select_user_modal .modal-body form {
|
||||||
|
margin-bottom: 0px;
|
||||||
|
}
|
||||||
|
#select_user #select_user_modal .modal-body form fieldset {
|
||||||
|
min-height: 360px;
|
||||||
|
}
|
||||||
|
#select_user #select_user_modal .modal-body .radio.inline,
|
||||||
|
#select_user #select_user_modal .modal-body .checkbox.inline {
|
||||||
|
display: inline-block;
|
||||||
|
padding-top: 5px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
vertical-align: middle;
|
||||||
|
min-width: 100px;
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
#select_user #select_user_modal .modal-body .form-actions {
|
||||||
|
margin: 20px 0 0;
|
||||||
|
padding: 10px 0 0;
|
||||||
|
background-color: transparent;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
#select_user #select_user_modal .modal-body .tabs-left > .nano {
|
||||||
|
width: 160px;
|
||||||
|
min-height: 425px;
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
#select_user #select_user_modal .modal-body .tabs-left > .nano .pane {
|
||||||
|
right: 6px;
|
||||||
|
}
|
||||||
|
#select_user #select_user_modal .modal-body .tabs-left > .nano > .content > .nav-tabs {
|
||||||
|
width: 140px;
|
||||||
|
float: left;
|
||||||
|
margin-bottom: 0;
|
||||||
|
margin-right: 0;
|
||||||
|
border-right: 1px solid #ddd;
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
#select_user #select_user_modal .modal-body .tabs-left > .nano > .content > .nav-tabs > li {
|
||||||
|
float: none;
|
||||||
|
}
|
||||||
|
#select_user #select_user_modal .modal-body .tabs-left > .nano > .content > .nav-tabs > li > a {
|
||||||
|
min-width: 74px;
|
||||||
|
margin-right: 0;
|
||||||
|
margin-bottom: 3px;
|
||||||
|
}
|
||||||
|
#select_user #select_user_modal .modal-body .tabs-left > .nano > .content > .nav-tabs > li > a {
|
||||||
|
margin-right: -1px;
|
||||||
|
-webkit-border-radius: 4px 0 0 4px;
|
||||||
|
-moz-border-radius: 4px 0 0 4px;
|
||||||
|
border-radius: 4px 0 0 4px;
|
||||||
|
}
|
||||||
|
#select_user #select_user_modal .modal-body .tabs-left > .nano > .content > .nav-tabs > li > a:hover {
|
||||||
|
border-color: #eeeeee #dddddd #eeeeee #eeeeee;
|
||||||
|
}
|
||||||
|
#select_user #select_user_modal .modal-body .tabs-left > .nano > .content > .nav-tabs .active > a,
|
||||||
|
#select_user #select_user_modal .modal-body .tabs-left > .nano > .content > .nav-tabs .active > a:hover {
|
||||||
|
border-color: #ddd transparent #ddd #ddd;
|
||||||
|
*border-right-color: #ffffff;
|
||||||
|
}
|
||||||
|
#select_user #select_user_modal .member-filter-options {
|
||||||
|
float: left;
|
||||||
|
display: inline-block;
|
||||||
|
width: 175px;
|
||||||
|
min-height: 425px;
|
||||||
|
margin-right: 10px;
|
||||||
|
padding: 0 10px 0 0;
|
||||||
|
}
|
||||||
|
#select_user #select_user_modal .member-filter-options select {
|
||||||
|
width: 165px;
|
||||||
|
}
|
||||||
|
#select_user #select_user_modal .member-filter-options .btn {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
#select_user #select_user_modal .member-filter-result {
|
||||||
|
padding-left: 15px;
|
||||||
|
min-height: 360px;
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Check Box Card */
|
||||||
|
.checkbox-card {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.checkbox-card li {
|
||||||
|
position: relative;
|
||||||
|
list-style: none;
|
||||||
|
color: #FFFFFF;
|
||||||
|
width: 180px;
|
||||||
|
height: 40px;
|
||||||
|
margin: 0 10px 10px 0;
|
||||||
|
float: left;
|
||||||
|
display: inline-block;
|
||||||
|
background-color: #cccccc;
|
||||||
|
overflow: hidden;
|
||||||
|
-webkit-border-radius: 3px;
|
||||||
|
-moz-border-radius: 3px;
|
||||||
|
border-radius: 3px;
|
||||||
|
-webkit-transition: all .2s linear;
|
||||||
|
-moz-transition: all .2s linear;
|
||||||
|
-o-transition: all .2s linear;
|
||||||
|
transition: all .2s linear;
|
||||||
|
}
|
||||||
|
.checkbox-card li.mark {
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
|
||||||
|
filter: alpha(opacity=0);
|
||||||
|
opacity: 0;
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
.checkbox-card li:hover {
|
||||||
|
background-color: #0088cc;
|
||||||
|
}
|
||||||
|
.checkbox-card li:after {
|
||||||
|
content: "";
|
||||||
|
display: block;
|
||||||
|
clear: both;
|
||||||
|
height: 0;
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
.checkbox-card li.active:before {
|
||||||
|
-webkit-text-size-adjust : none;
|
||||||
|
font-family: FontAwesome;
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
color: #FFF;
|
||||||
|
text-decoration: inherit;
|
||||||
|
content: "\f00c";
|
||||||
|
position: absolute;
|
||||||
|
right: 0px;
|
||||||
|
top: 0px;
|
||||||
|
line-height: 14px;
|
||||||
|
text-indent: 10px;
|
||||||
|
font-size: 10px;
|
||||||
|
width: 0px;
|
||||||
|
height: 0px;
|
||||||
|
border-style: solid;
|
||||||
|
border-width: 0 22px 22px 0;
|
||||||
|
border-color: transparent #51a351 transparent transparent;
|
||||||
|
}
|
||||||
|
.checkbox-card li.active label {
|
||||||
|
}
|
||||||
|
.checkbox-card li label {
|
||||||
|
margin-bottom: 0px;
|
||||||
|
overflow: hidden;
|
||||||
|
-webkit-border-radius: 3px;
|
||||||
|
-moz-border-radius: 3px;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
.checkbox-card li input {
|
||||||
|
opacity: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
margin: 0;
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
.checkbox-card li label span {
|
||||||
|
-webkit-text-size-adjust : none;
|
||||||
|
font-size: 10px;
|
||||||
|
display: block;
|
||||||
|
width: 130px;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
color: #666666;
|
||||||
|
margin-top: -3px;
|
||||||
|
}
|
||||||
|
.checkbox-card li:hover label span,
|
||||||
|
.checkbox-card li:hover label span.user-name {
|
||||||
|
color: #FFFFFF;
|
||||||
|
}
|
||||||
|
.checkbox-card li label span.user-name {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #363636;
|
||||||
|
padding: 2px 0 0;
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
.checkbox-card li .user-pic {
|
||||||
|
float: left;
|
||||||
|
margin-right: 5px;
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
}
|
||||||
|
#selected_users .selected_user {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
#selected_users .selected_user .remove_user {
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
.promoter {
|
||||||
|
border-color: #CCCCCC;
|
||||||
|
border-style: solid;
|
||||||
|
border-width: 0 1px;
|
||||||
|
padding: 0 10px 5px 10px;
|
||||||
|
}
|
||||||
|
.promoter > div {
|
||||||
|
border-bottom: 1px solid #CCCCCC;
|
||||||
|
}
|
||||||
|
.promoter > div:after {
|
||||||
|
content: "";
|
||||||
|
clear: both;
|
||||||
|
display: block;
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
.promoter > div > span {
|
||||||
|
display: block;
|
||||||
|
margin-left: 70px;
|
||||||
|
padding-bottom: 5px;
|
||||||
|
}
|
||||||
|
.promoter p {
|
||||||
|
width: 70px;
|
||||||
|
float: left;
|
||||||
|
text-align:right;
|
||||||
|
}*/
|
|
@ -0,0 +1,90 @@
|
||||||
|
.social-share-button-baidu {
|
||||||
|
display:inline-block;
|
||||||
|
width:16px;
|
||||||
|
height:16px;
|
||||||
|
background:url("/assets/social-share-button.png") 0px 0px no-repeat;
|
||||||
|
}
|
||||||
|
.social-share-button-delicious {
|
||||||
|
display:inline-block;
|
||||||
|
width:16px;
|
||||||
|
height:16px;
|
||||||
|
background:url("/assets/social-share-button.png") -16px 0px no-repeat;
|
||||||
|
}
|
||||||
|
.social-share-button-douban {
|
||||||
|
display:inline-block;
|
||||||
|
width:16px;
|
||||||
|
height:16px;
|
||||||
|
background:url("/assets/social-share-button.png") 0px -16px no-repeat;
|
||||||
|
}
|
||||||
|
.social-share-button-email {
|
||||||
|
display:inline-block;
|
||||||
|
width:16px;
|
||||||
|
height:16px;
|
||||||
|
background:url("/assets/social-share-button.png") -16px -16px no-repeat;
|
||||||
|
}
|
||||||
|
.social-share-button-facebook {
|
||||||
|
display:inline-block;
|
||||||
|
width:16px;
|
||||||
|
height:16px;
|
||||||
|
background:url("/assets/social-share-button.png") -32px 0px no-repeat;
|
||||||
|
}
|
||||||
|
.social-share-button-flickr {
|
||||||
|
display:inline-block;
|
||||||
|
width:16px;
|
||||||
|
height:16px;
|
||||||
|
background:url("/assets/social-share-button.png") -32px -16px no-repeat;
|
||||||
|
}
|
||||||
|
.social-share-button-google {
|
||||||
|
display:inline-block;
|
||||||
|
width:16px;
|
||||||
|
height:16px;
|
||||||
|
background:url("/assets/social-share-button.png") 0px -32px no-repeat;
|
||||||
|
}
|
||||||
|
.social-share-button-google_plus {
|
||||||
|
display:inline-block;
|
||||||
|
width:16px;
|
||||||
|
height:16px;
|
||||||
|
background:url("/assets/social-share-button.png") -16px -32px no-repeat;
|
||||||
|
}
|
||||||
|
.social-share-button-kaixin001 {
|
||||||
|
display:inline-block;
|
||||||
|
width:16px;
|
||||||
|
height:16px;
|
||||||
|
background:url("/assets/social-share-button.png") -32px -32px no-repeat;
|
||||||
|
}
|
||||||
|
.social-share-button-qq {
|
||||||
|
display:inline-block;
|
||||||
|
width:16px;
|
||||||
|
height:16px;
|
||||||
|
background:url("/assets/social-share-button.png") -48px 0px no-repeat;
|
||||||
|
}
|
||||||
|
.social-share-button-renren {
|
||||||
|
display:inline-block;
|
||||||
|
width:16px;
|
||||||
|
height:16px;
|
||||||
|
background:url("/assets/social-share-button.png") -48px -16px no-repeat;
|
||||||
|
}
|
||||||
|
.social-share-button-tqq {
|
||||||
|
display:inline-block;
|
||||||
|
width:16px;
|
||||||
|
height:16px;
|
||||||
|
background:url("/assets/social-share-button.png") -48px -32px no-repeat;
|
||||||
|
}
|
||||||
|
.social-share-button-twitter {
|
||||||
|
display:inline-block;
|
||||||
|
width:16px;
|
||||||
|
height:16px;
|
||||||
|
background:url("/assets/social-share-button.png") 0px -48px no-repeat;
|
||||||
|
}
|
||||||
|
.social-share-button-weibo {
|
||||||
|
display:inline-block;
|
||||||
|
width:16px;
|
||||||
|
height:16px;
|
||||||
|
background:url("/assets/social-share-button.png") -16px -48px no-repeat;
|
||||||
|
}
|
||||||
|
.social-share-button-rss {
|
||||||
|
display:inline-block;
|
||||||
|
width:16px;
|
||||||
|
height:16px;
|
||||||
|
background:url("/assets/social-share-button.png") -32px -48px no-repeat;
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
# encoding: utf-8
|
||||||
|
|
||||||
|
class SessionsController < Devise::SessionsController
|
||||||
|
prepend_before_filter :require_no_authentication, :only => [ :new, :create ]
|
||||||
|
|
||||||
|
|
||||||
|
def create
|
||||||
|
@site = Site.first
|
||||||
|
|
||||||
|
private_key = OpenSSL::PKey::RSA.new(@site.private_key)
|
||||||
|
wresult = private_key.private_decrypt(request.params['wresult'])
|
||||||
|
|
||||||
|
@ids = wresult.split("@")
|
||||||
|
|
||||||
|
login_uid = @ids[0]
|
||||||
|
|
||||||
|
resource = User.first(conditions:{user_id: login_uid})
|
||||||
|
|
||||||
|
if !resource.blank?
|
||||||
|
resource_name = resource.class.to_s.downcase
|
||||||
|
sign_in(resource_name, resource)
|
||||||
|
session[:user_id_type] = "myntu"
|
||||||
|
redirect_to after_sign_in_path_for(resource)
|
||||||
|
else
|
||||||
|
flash[:error] = "很抱歉,您無此權限或帳號登入本站,請洽本站管理員<br />Sorry, you don't have the account or authority to login. Please contact the website administrator."
|
||||||
|
redirect_to :root
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
@user_id_type = session[:user_id_type]
|
||||||
|
sign_out
|
||||||
|
if @user_id_type == "myntu"
|
||||||
|
redirect_to "https://adfs.ntu.edu.tw/adfs/ls/?wa=wsignout1.0&wreply=https://galogin.ntu.edu.tw"
|
||||||
|
else
|
||||||
|
redirect_to root_path
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
|
@ -194,7 +194,8 @@ module ApplicationHelper
|
||||||
stylesheets << "<link href='#{asset_path 'orbit_bar_bootstrap'}' rel='stylesheet' type='text/css' />\n"
|
stylesheets << "<link href='#{asset_path 'orbit_bar_bootstrap'}' rel='stylesheet' type='text/css' />\n"
|
||||||
stylesheets << "<link href='#{page.design.css_reset.file.url}' rel='stylesheet' type='text/css' />\n" if page.design.css_reset
|
stylesheets << "<link href='#{page.design.css_reset.file.url}' rel='stylesheet' type='text/css' />\n" if page.design.css_reset
|
||||||
# stylesheets << "<link href='#{asset_path 'banner_nav.css'}' rel='stylesheet' type='text/css' />\n"
|
# stylesheets << "<link href='#{asset_path 'banner_nav.css'}' rel='stylesheet' type='text/css' />\n"
|
||||||
# stylesheets << "<link href='#{asset_path 'default_widget.css'}' rel='stylesheet' type='text/css' />\n"
|
# stylesheets << "<link href='#{asset_path 'default_widget.css'}' rel='stylesheet' type='text/css' />\n"
|
||||||
|
stylesheets << "<link href='/assets/social-share-button.css' rel='stylesheet' type='text/css' />\n"
|
||||||
stylesheets << "<link href='#{page.design.css_default.file.url}' rel='stylesheet' type='text/css' />\n" if page.design.css_default
|
stylesheets << "<link href='#{page.design.css_default.file.url}' rel='stylesheet' type='text/css' />\n" if page.design.css_default
|
||||||
theme = page.design.themes.detect{ |d| d.id == page.theme_id }
|
theme = page.design.themes.detect{ |d| d.id == page.theme_id }
|
||||||
stylesheets << "<link href='#{theme.file.url}' rel='stylesheet' type='text/css' />\n" if theme
|
stylesheets << "<link href='#{theme.file.url}' rel='stylesheet' type='text/css' />\n" if theme
|
||||||
|
@ -203,8 +204,12 @@ module ApplicationHelper
|
||||||
|
|
||||||
def page_javascripts(page, edit=nil)
|
def page_javascripts(page, edit=nil)
|
||||||
javascripts = ''
|
javascripts = ''
|
||||||
|
unless edit
|
||||||
|
javascripts << "<script type='text/javascript' src='/assets/orbit-bar-search.js'></script>\n"
|
||||||
|
end
|
||||||
# javascripts << "<script type='text/javascript' src='/assets/lib/jquery.preload-min.js'></script>\n"
|
# javascripts << "<script type='text/javascript' src='/assets/lib/jquery.preload-min.js'></script>\n"
|
||||||
# javascripts << "<script type='text/javascript' src='/assets/jquery.cycle.all.latest.js'></script>\n"
|
# javascripts << "<script type='text/javascript' src='/assets/jquery.cycle.all.latest.js'></script>\n"
|
||||||
|
javascripts << "<script type='text/javascript' src='/assets/lib/social-share-button.js'></script>\n"
|
||||||
page.design.javascripts.each do |js|
|
page.design.javascripts.each do |js|
|
||||||
javascripts << "<script type='text/javascript' src='#{js.file.url}'></script>"
|
javascripts << "<script type='text/javascript' src='#{js.file.url}'></script>"
|
||||||
end
|
end
|
||||||
|
@ -301,7 +306,7 @@ module ApplicationHelper
|
||||||
|
|
||||||
# NTU link
|
# NTU link
|
||||||
def get_link(site_number)
|
def get_link(site_number)
|
||||||
"http://#{request.host}:2#{site_number}00"
|
"http://#{site_number}.#{request.domain(3)}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def sortable(column, title = nil, options = {})
|
def sortable(column, title = nil, options = {})
|
||||||
|
|
|
@ -355,7 +355,7 @@ module OrbitBackendHelper
|
||||||
if object.is_a?(klass.constantize)
|
if object.is_a?(klass.constantize)
|
||||||
autorized ||= object.user_can_sub_manage?(current_user)
|
autorized ||= object.user_can_sub_manage?(current_user)
|
||||||
else
|
else
|
||||||
autorized ||= object.send(klass.underscore).user_can_sub_manage?(current_user)
|
autorized ||= object.send(klass.underscore).user_can_sub_manage?(current_user) rescue nil
|
||||||
end
|
end
|
||||||
autorized
|
autorized
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
class GetAnnouncementFromRss
|
||||||
|
@queue = :high
|
||||||
|
|
||||||
|
def self.perform()
|
||||||
|
%x(ruby "#{Rails.root}/lib/rss_ntu_job.rb")
|
||||||
|
end
|
||||||
|
end
|
|
@ -28,6 +28,7 @@
|
||||||
<div class="form-actions">
|
<div class="form-actions">
|
||||||
<button type="button" class="btn" data-dismiss="modal"><%= t(:cancel) %></button>
|
<button type="button" class="btn" data-dismiss="modal"><%= t(:cancel) %></button>
|
||||||
<%= submit_tag t(:submit), class: "btn btn-primary" %>
|
<%= submit_tag t(:submit), class: "btn btn-primary" %>
|
||||||
|
<%= hidden_field_tag field, @field %>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
@ -53,6 +54,7 @@
|
||||||
<div class="form-actions condition">
|
<div class="form-actions condition">
|
||||||
<button type="button" class="btn" data-dismiss="modal"><%= t(:cancel) %></button>
|
<button type="button" class="btn" data-dismiss="modal"><%= t(:cancel) %></button>
|
||||||
<%= submit_tag t(:submit), class: "btn btn-primary" %>
|
<%= submit_tag t(:submit), class: "btn btn-primary" %>
|
||||||
|
<%= hidden_field_tag field, @field %>
|
||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
<% unless users.blank? %>
|
||||||
|
<div class="promoter-block">
|
||||||
|
<p class="promoter-title"><%= t(:promoter) %>:</p>
|
||||||
|
<ul>
|
||||||
|
<% users.each do |user| %>
|
||||||
|
<li class="promoter">
|
||||||
|
<p>
|
||||||
|
<%= link_to user.name, "mailto:#{user.email}", class: "promoter-name" %> / <span class="promoter-phone"><%= user.office_tel %></span>
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
<% end %>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
|
@ -0,0 +1,16 @@
|
||||||
|
<% content_for :page_specific_javascript do -%>
|
||||||
|
<%= javascript_include_tag "member-selection" %>
|
||||||
|
<%= javascript_include_tag "lib/jquery.nanoscroller" %>
|
||||||
|
<%= javascript_include_tag "lib/checkbox.card" %>
|
||||||
|
<% end -%>
|
||||||
|
<% content_for :page_specific_css do -%>
|
||||||
|
<%= stylesheet_link_tag "member_select" %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div id="selected_users">
|
||||||
|
<%= render partial: 'admin/member_selects/user', collection: users, locals: {field: field} %>
|
||||||
|
<%= hidden_field_tag field %>
|
||||||
|
</div>
|
||||||
|
<%= link_to t(:add), '#', class: 'btn btn-primary btn-small select_user_modal', rel: select_members_admin_member_selects_path, field: field %>
|
||||||
|
</div>
|
|
@ -12,10 +12,11 @@
|
||||||
<input name="utf8" type="hidden" value="" />
|
<input name="utf8" type="hidden" value="" />
|
||||||
<input name="authenticity_token" type="hidden" value="" />
|
<input name="authenticity_token" type="hidden" value="" />
|
||||||
</div>
|
</div>
|
||||||
<!-- <div class="other-sign-in">
|
<div class="other-sign-in">
|
||||||
<a class="btn btn-primary" type="submit">Other Sign In</a>
|
<% @request_hosts = request.host_with_port.split(".") %>
|
||||||
|
<a class="btn btn-primary" type="submit" href="https://adfs.ntu.edu.tw/adfs/ls/?wa=wsignin1.0&wtrealm=https://galogin.ntu.edu.tw/saml_login&wctx=<%= @request_hosts[0] %>">使用計中帳號登入</a>
|
||||||
<p>or</p>
|
<p>or</p>
|
||||||
</div> -->
|
</div>
|
||||||
<div class="form-block">
|
<div class="form-block">
|
||||||
<div class="form-list clearfix">
|
<div class="form-list clearfix">
|
||||||
<form class="content" accept-charset="UTF-8" action="/users/sign_in" method="post">
|
<form class="content" accept-charset="UTF-8" action="/users/sign_in" method="post">
|
||||||
|
|
|
@ -13,6 +13,16 @@
|
||||||
</form>
|
</form>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
<!-- ntu sites -->
|
||||||
|
<li id="orbit-tag" class="dropdown">
|
||||||
|
<a class="dropdown-toggle orbit-bar-language" data-icons="" href="#" data-toggle="dropdown"></a>
|
||||||
|
<ul class="dropdown-menu language-menu">
|
||||||
|
<% t('ntu.site_names').each do |site| %>
|
||||||
|
<li><%= link_to site[1], get_link(site[0]) %></li>
|
||||||
|
<% end %>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
<!-- Language -->
|
<!-- Language -->
|
||||||
<li id="orbit-language" class="dropdown">
|
<li id="orbit-language" class="dropdown">
|
||||||
<a href="#" role="button" class="dropdown-toggle" data-toggle="dropdown"><%= t(:_locale, :locale => I18n.locale) %></a>
|
<a href="#" role="button" class="dropdown-toggle" data-toggle="dropdown"><%= t(:_locale, :locale => I18n.locale) %></a>
|
||||||
|
@ -36,7 +46,7 @@
|
||||||
<% if @site.desktop_closed %>
|
<% if @site.desktop_closed %>
|
||||||
<li><%= link_to content_tag(:i, nil, class: 'icons-screen') + ' ' + t(:desktop), desktop_path, tabindex: '-1' %></li>
|
<li><%= link_to content_tag(:i, nil, class: 'icons-screen') + ' ' + t(:desktop), desktop_path, tabindex: '-1' %></li>
|
||||||
<% end %>
|
<% end %>
|
||||||
<li><%= link_to content_tag(:i, nil, class: 'icons-logout') + ' ' + t(:logout), destroy_user_session_path, tabindex: '-1' %></li>
|
<li><%= link_to content_tag(:i, nil, class: 'icons-logout') + ' ' + t(:logout), user_logout_path, tabindex: '-1' %></li>
|
||||||
<li class="divider"></li>
|
<li class="divider"></li>
|
||||||
<li><a tabindex="-1" href="#"><i class="icons-lifebuoy"></i> <%= t(:help) %></a></li>
|
<li><a tabindex="-1" href="#"><i class="icons-lifebuoy"></i> <%= t(:help) %></a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -56,6 +66,12 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<%= form_for :user, url: user_session_path, html: {class: 'container'} do |f| %>
|
<%= form_for :user, url: user_session_path, html: {class: 'container'} do |f| %>
|
||||||
|
|
||||||
|
<div class="other-sign-in">
|
||||||
|
<% @request_hosts = request.host_with_port.split(".") %>
|
||||||
|
<a class="btn btn-primary" type="submit" href="https://adfs.ntu.edu.tw/adfs/ls/?wa=wsignin1.0&wtrealm=https://galogin.ntu.edu.tw/saml_login&wctx=<%= @request_hosts[0] %>">使用計中帳號登入</a>
|
||||||
|
<p>or</p>
|
||||||
|
</div>
|
||||||
<div class="input-prepend">
|
<div class="input-prepend">
|
||||||
<span class="add-on">
|
<span class="add-on">
|
||||||
<i class="icon-user"></i>
|
<i class="icon-user"></i>
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
#built-in-modules
|
#built-in-modules
|
||||||
gem 'announcement', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-announcement.git'
|
gem 'announcement', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-announcement.git', :branch => 'ntu_ga'
|
||||||
gem 'gallery', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-gallery.git'
|
gem 'gallery', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-gallery.git'
|
||||||
gem 'member', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-member.git'
|
gem 'member', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-member.git'
|
||||||
gem 'member_staff', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-memberstaff.git'
|
gem 'member_staff', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-memberstaff.git', :branch => 'ntu_ga'
|
||||||
gem 'page_content', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-pagecontent.git'
|
gem 'page_content', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-pagecontent.git', :branch => 'ntu_ga'
|
||||||
gem 'personal_book', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-personalbook.git'
|
gem 'personal_book', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-personalbook.git'
|
||||||
gem 'personal_conference', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-personalconference.git'
|
gem 'personal_conference', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-personalconference.git'
|
||||||
gem 'personal_diploma', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-personaldiploma.git'
|
gem 'personal_diploma', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-personaldiploma.git'
|
||||||
|
@ -15,3 +15,9 @@ gem 'personal_patent', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-
|
||||||
gem 'personal_project', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-personalproject.git'
|
gem 'personal_project', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-personalproject.git'
|
||||||
gem 'personal_research', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-personalresearch.git'
|
gem 'personal_research', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-personalresearch.git'
|
||||||
gem 'web_resource', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-webresource.git'
|
gem 'web_resource', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-webresource.git'
|
||||||
|
|
||||||
|
gem 'ask', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-ask.git', :branch => 'ntu_ga'
|
||||||
|
gem 'survey', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-survey.git', :branch => 'ntu_ga'
|
||||||
|
gem 'archive', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-archive.git', :branch => 'ntu_ga'
|
||||||
|
gem 'faq', '0.0.1', :git => "git@gitlab.tp.rulingcom.com:root/orbit-faq.git"
|
||||||
|
gem 'feed', '0.0.1', :git => 'git@gitlab.tp.rulingcom.com:root/orbit-feed.git'
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
if defined?(PhusionPassenger)
|
||||||
|
PhusionPassenger.on_event(:starting_worker_process) do |forked|
|
||||||
|
if forked
|
||||||
|
Resque.redis.client.disconnect
|
||||||
|
Resque.redis = Redis.new(:host => 'localhost', :port => 6379)
|
||||||
|
Resque.redis.namespace = Site.first.resque_namespace rescue APP_CONFIG['orbit']
|
||||||
|
else
|
||||||
|
# We're in conservative spawning mode. We don't need to do anything.
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -391,6 +391,7 @@ en:
|
||||||
system_email: System Email
|
system_email: System Email
|
||||||
preview: Preview
|
preview: Preview
|
||||||
profile: Profile
|
profile: Profile
|
||||||
|
promoter: Promoter
|
||||||
publications: Publications
|
publications: Publications
|
||||||
purchase: Purchase
|
purchase: Purchase
|
||||||
quantity: Quantity
|
quantity: Quantity
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
en:
|
||||||
|
|
||||||
|
ntu:
|
||||||
|
rss_origin: Back to NTU Announcements
|
||||||
|
site_names:
|
||||||
|
"www": "Dean of General Affairs"
|
||||||
|
"sec": "Office of the Dean and Secretariat"
|
||||||
|
"doc": "Documentation Division"
|
||||||
|
"general": "General Service Division"
|
||||||
|
"property": "Property Management Division"
|
||||||
|
"construction": "Construction and Maintenance Division"
|
||||||
|
"cashier": "Cashier Division"
|
||||||
|
"procurement": "Procurement Division"
|
||||||
|
"fss": "Facilities Service Division"
|
||||||
|
"police": "Campus Security"
|
||||||
|
"social": "General Affairs Division, College of Social Science"
|
||||||
|
"medicine": "General Service Division, College of Medicine"
|
|
@ -0,0 +1,17 @@
|
||||||
|
zh_tw:
|
||||||
|
|
||||||
|
ntu:
|
||||||
|
rss_origin: 回臺大校園公佈欄
|
||||||
|
site_names:
|
||||||
|
"www": "總務處"
|
||||||
|
"sec": "總務長室暨總務處秘書室"
|
||||||
|
"doc": "文書組"
|
||||||
|
"general": "事務組"
|
||||||
|
"property": "保管組"
|
||||||
|
"construction": "營繕組"
|
||||||
|
"cashier": "出納組"
|
||||||
|
"procurement": "採購組"
|
||||||
|
"fss": "經營管理組"
|
||||||
|
"police": "駐警隊"
|
||||||
|
"social": "社科院總務分處"
|
||||||
|
"medicine": "醫學院總務分處"
|
|
@ -393,6 +393,7 @@ zh_tw:
|
||||||
sidebar_nav: 側欄導引
|
sidebar_nav: 側欄導引
|
||||||
system_email: 系統信箱
|
system_email: 系統信箱
|
||||||
profile: 基本資料
|
profile: 基本資料
|
||||||
|
promoter: 承辦人
|
||||||
publications: 著作
|
publications: 著作
|
||||||
purchase: 購買
|
purchase: 購買
|
||||||
quantity: 數量
|
quantity: 數量
|
||||||
|
|
|
@ -8,4 +8,10 @@ generate_system_summary:
|
||||||
cron: 0 0 12 * * *
|
cron: 0 0 12 * * *
|
||||||
class: GenerateSystemSummary
|
class: GenerateSystemSummary
|
||||||
args:
|
args:
|
||||||
description: Generate the system status such as disk free space,package version list for showing at site tab
|
description: Generate the system status such as disk free space,package version list for showing at site tab
|
||||||
|
|
||||||
|
get_announcement_from_rss:
|
||||||
|
cron: "30 * * * * *"
|
||||||
|
class: GetAnnouncementFromRss
|
||||||
|
args:
|
||||||
|
description: Loop through the announcement RSS until 24h ago
|
|
@ -8,6 +8,11 @@ Orbit::Application.routes.draw do
|
||||||
match "/users_passwd" => "desktop/registrations#update", :as => :users_passwd, :via => :put
|
match "/users_passwd" => "desktop/registrations#update", :as => :users_passwd, :via => :put
|
||||||
end
|
end
|
||||||
|
|
||||||
|
devise_scope :user do
|
||||||
|
get 'user_login' => 'sessions#create'
|
||||||
|
match 'user_logout' => 'sessions#destroy'
|
||||||
|
end
|
||||||
|
|
||||||
mount Resque::Server, :at => "/admin/resque"
|
mount Resque::Server, :at => "/admin/resque"
|
||||||
mount Rack::GridFS::Endpoint.new(:db => Mongoid.database,:lookup=>:path), :at => "gridfs"
|
mount Rack::GridFS::Endpoint.new(:db => Mongoid.database,:lookup=>:path), :at => "gridfs"
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,115 @@
|
||||||
|
# encoding: utf-8
|
||||||
|
require 'rss'
|
||||||
|
require 'mongo'
|
||||||
|
require 'mongoid'
|
||||||
|
|
||||||
|
# Change this according to local DB
|
||||||
|
DB_NAME = "orbit_site_new"
|
||||||
|
|
||||||
|
Mongoid.configure do |config|
|
||||||
|
config.master = Mongo::Connection.new("localhost", 27017).db("#{DB_NAME}")
|
||||||
|
end
|
||||||
|
|
||||||
|
class Bulletin
|
||||||
|
include Mongoid::Document
|
||||||
|
include Mongoid::Timestamps
|
||||||
|
include Mongoid::MultiParameterAttributes
|
||||||
|
end
|
||||||
|
|
||||||
|
class BufferCategory
|
||||||
|
include Mongoid::Document
|
||||||
|
include Mongoid::Timestamps
|
||||||
|
end
|
||||||
|
|
||||||
|
# Create a hash rss site list from mongodb
|
||||||
|
db = Mongo::Connection.new("localhost", 27017).db("#{DB_NAME}")
|
||||||
|
SITES = Hash[ db["announcement_feeds"].find(accepted: true).entries.collect {|f| [ f["name"], f["link"] ]} ]
|
||||||
|
CATEGORIES = Array( db["announcement_feeds"].find().entries.collect {|f| f["categories"]} )
|
||||||
|
|
||||||
|
yesterday = Time.now - 86400
|
||||||
|
two_weeks_ago = Time.new - 60 * 60 * 24 * 14
|
||||||
|
|
||||||
|
recent_feed = {}
|
||||||
|
|
||||||
|
SITES.each_with_index do |(name, url), i|
|
||||||
|
open("http://#{url}/panel/announcement/front_end/bulletins.rss?inner=true") do |rss|
|
||||||
|
# Giving 'false' parameter is for skipping irregular format of the RSS
|
||||||
|
feed = RSS::Parser.parse(rss, false)
|
||||||
|
|
||||||
|
feed.items.each do |item|
|
||||||
|
category = item.category.to_s.gsub(/\<(\/)*category\>/, '')
|
||||||
|
category = "未分類" if category.blank?
|
||||||
|
|
||||||
|
if ( item.pubDate > yesterday ) && ( CATEGORIES[i][0] == "全部" || CATEGORIES[i].include?(category) )
|
||||||
|
recent_feed[item.title.strip] = { date: item.pubDate, description: item.description.gsub("\r\n", '<br/>').strip,
|
||||||
|
link: item.link, category: category, source: name }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_category_id(category, categories, coll_cat)
|
||||||
|
db = Mongo::Connection.new("localhost", 27017).db("#{DB_NAME}")
|
||||||
|
if categories.keys.include? "rss_#{category}"
|
||||||
|
[categories["rss_#{category}"], categories]
|
||||||
|
else
|
||||||
|
cat = {
|
||||||
|
_type: "Category",
|
||||||
|
key: "rss_#{category}",
|
||||||
|
disable: false,
|
||||||
|
title: {:zh_tw => "rss_#{category}"},
|
||||||
|
created_at: Time.now,
|
||||||
|
updated_at: Time.now,
|
||||||
|
module_app_id: db["module_apps"].find({:key=>"announcement"}).first['_id']
|
||||||
|
}
|
||||||
|
categories["rss_#{category}"] = result = coll_cat.save(cat)
|
||||||
|
[result, categories]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_mongo_and_categories
|
||||||
|
db = Mongo::Connection.new("localhost", 27017).db("#{DB_NAME}")
|
||||||
|
coll_bulletin = db["bulletins"]
|
||||||
|
coll_cat = db["categories"]
|
||||||
|
|
||||||
|
categories = coll_cat.find().to_a.inject({}) do |categories, category|
|
||||||
|
categories[category['key']] = category['_id']
|
||||||
|
categories
|
||||||
|
end
|
||||||
|
|
||||||
|
[categories, coll_bulletin, coll_cat]
|
||||||
|
end
|
||||||
|
|
||||||
|
recent_feed.each do |title, bulletin|
|
||||||
|
|
||||||
|
categories, coll_bulletin, coll_cat = get_mongo_and_categories
|
||||||
|
category_id, categories = get_category_id(bulletin[:category], categories, coll_cat)
|
||||||
|
|
||||||
|
unless coll_bulletin.find_one(title: {:zh_tw => title, :en => ""})
|
||||||
|
bulletin = { _type: "Bulletin",
|
||||||
|
postdate: bulletin[:date],
|
||||||
|
created_at: bulletin[:date],
|
||||||
|
updated_at: bulletin[:date],
|
||||||
|
category_id: category_id,
|
||||||
|
title: {:zh_tw => title, :en => ""},
|
||||||
|
text: {:zh_tw => bulletin[:description], :en => ""},
|
||||||
|
available_for_zh_tw: true,
|
||||||
|
available_for_en: false,
|
||||||
|
rss_link: bulletin[:link],
|
||||||
|
rss_source: bulletin[:source],
|
||||||
|
is_top: false,
|
||||||
|
is_hot: false,
|
||||||
|
is_hidden: false }
|
||||||
|
|
||||||
|
# coll_bulletin.save(bulletin)
|
||||||
|
bulletin = Bulletin.new(bulletin)
|
||||||
|
bulletin.save!
|
||||||
|
|
||||||
|
category = { _type: "BufferCategory",
|
||||||
|
category_id: category_id,
|
||||||
|
categorizable_type: "Bulletin",
|
||||||
|
categorizable_id: bulletin.id }
|
||||||
|
buffer_category = BufferCategory.new(category)
|
||||||
|
buffer_category.save!
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue