ntu ga new ui sso server
This commit is contained in:
parent
f0f6e809af
commit
d6b165cec6
|
@ -0,0 +1,34 @@
|
||||||
|
class SamlLoginsController < ApplicationController
|
||||||
|
|
||||||
|
require "net/http"
|
||||||
|
require "uri"
|
||||||
|
require 'rexml/document'
|
||||||
|
include REXML
|
||||||
|
|
||||||
|
def index
|
||||||
|
|
||||||
|
if params[:wa] == "wsignoutcleanup1.0" #logout
|
||||||
|
|
||||||
|
redirect_to :root
|
||||||
|
|
||||||
|
else #login
|
||||||
|
|
||||||
|
|
||||||
|
@wresult = params[:wresult]
|
||||||
|
@wctx = params[:wctx]
|
||||||
|
|
||||||
|
@main_url = LIST[:sites][@wctx]['url']
|
||||||
|
@main_public_key = LIST[:sites][@wctx]['key']
|
||||||
|
|
||||||
|
@doc = REXML::Document.new @wresult
|
||||||
|
|
||||||
|
public_key = OpenSSL::PKey::RSA.new(@main_public_key)
|
||||||
|
encrypted_data = public_key.public_encrypt(@doc.elements["//saml:AttributeValue"].text)
|
||||||
|
|
||||||
|
redirect_to "http://#{@main_url}/user_login?" + { :wresult => encrypted_data }.to_param
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
|
@ -0,0 +1,7 @@
|
||||||
|
class GetAnnouncementFromRss
|
||||||
|
@queue = :high
|
||||||
|
|
||||||
|
def self.perform()
|
||||||
|
%x(ruby "#{Rails.root}/lib/rss_ntu_job.rb")
|
||||||
|
end
|
||||||
|
end
|
|
@ -80,3 +80,48 @@ default_widget_style:
|
||||||
- style3
|
- style3
|
||||||
- style4
|
- style4
|
||||||
- style5
|
- style5
|
||||||
|
|
||||||
|
sites:
|
||||||
|
www:
|
||||||
|
url: www.ga.ntu.edu.tw
|
||||||
|
key: "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx3fDAM40XvEiM5oG7YbA\nKnhc5Dyv/ZhVDzyrg95QB0ylBPtSs6g5xgkSSQMnIpAUCzdVIMrUd/A6DuH6f+T5\nccshgh3aDj3wISfgYZc9e7WY1csOItq9lOr6YG4HEABSyjVCcX/RrB8kCuuIGcvR\nRnvu/4fFb93vsVYHwGuivTYRJ+8VM8fOtIFCvbCxZsFj6r5cMl4qI4g4vaIn3xf2\ndXUCICebvdIBfMAdW29yaCScEap1oawEfdXtKCD5vYvAaRZ85jLY/FV5dYhbe1dz\n9G7+B1HI7VBm5bKV0MI1ZH2MTRczaqjLGf6ZF0FbMmcMYLx8iEGL1z0/hgOTcNT6\nrQIDAQAB\n-----END PUBLIC KEY-----\n"
|
||||||
|
ga:
|
||||||
|
url: www.ga.ntu.edu.tw
|
||||||
|
key: "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx3fDAM40XvEiM5oG7YbA\nKnhc5Dyv/ZhVDzyrg95QB0ylBPtSs6g5xgkSSQMnIpAUCzdVIMrUd/A6DuH6f+T5\nccshgh3aDj3wISfgYZc9e7WY1csOItq9lOr6YG4HEABSyjVCcX/RrB8kCuuIGcvR\nRnvu/4fFb93vsVYHwGuivTYRJ+8VM8fOtIFCvbCxZsFj6r5cMl4qI4g4vaIn3xf2\ndXUCICebvdIBfMAdW29yaCScEap1oawEfdXtKCD5vYvAaRZ85jLY/FV5dYhbe1dz\n9G7+B1HI7VBm5bKV0MI1ZH2MTRczaqjLGf6ZF0FbMmcMYLx8iEGL1z0/hgOTcNT6\nrQIDAQAB\n-----END PUBLIC KEY-----\n"
|
||||||
|
doc:
|
||||||
|
url: doc.ga.ntu.edu.tw
|
||||||
|
key: "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4aE7R0/49UBf5v4rbNiA\nnaXjPZ9rio9fjkaAZeow62yaZtoGurqf44BVj/cjQVUmLnMU4WDcZMI0osLa15+H\ndXSGCP8Upmvi+eA2UqhhBZts1IQ33rPMAjePAbpSGbNRxous0VpH7cc9BxMffQwh\nsygcbghUCEE3dVWdTFGokvgxkBzaKKTNbiqhmbuc8QIuzOvFFGkZHgqlxFHcaNYZ\n7KZJxqvuKSXsJcxIsQKzDiAPI11J3zgRdIf/CFVQv5g15gl1ieQgFdGc3jplsBcd\nrdLApPZ39+BWr9a/Gj9lgP6Ll5G/cM4Uq18a7TCWJIC9PNGw8bBDJTjnUEqmOu3R\nZQIDAQAB\n-----END PUBLIC KEY-----\n"
|
||||||
|
cashier:
|
||||||
|
url: cashier.ga.ntu.edu.tw
|
||||||
|
key: "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9wliL8gFsRn0DVZusd2h\nSoj6aQWkKq1UU6fj3vzcrb1adMy8RnKogTW6z1W9wxrcrI/GfyRz9Wop0+9+XNYx\nDH+QQ+/1po/O/MkPBGZ6WxXpH2BSCncdJdYZ9qLvlJHHRhFtczcSQki693MCDUCy\nMrMDvmL4YOowHExD7A5qrCIaYnbNcUCYMKluSLxR52AUeAuYjCwZbkgEwIQRdZ+M\n3JMgTD/9GFsvZ4c5x6n1cUnKCJNyyUIvI8jThtOnySCU8ZN17nWfKb1Cxavt17Vp\nGSdyIIL2SO9+rjOFW3PrAyX5P3xEgPYoDxA1QsYLYbj189qA0sT17xf9H7KcNzyP\n7wIDAQAB\n-----END PUBLIC KEY-----\n"
|
||||||
|
general:
|
||||||
|
url: general.ga.ntu.edu.tw
|
||||||
|
key: "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvyFUUFyaEJgsR+bYhTXx\nOA60kw82ohyHCDzkoHDT/k2xS520RZR0AzxT449qD3XfRr0+7F0c6rMx/2pBG7hS\nlHjgrTX7eQ70wV8H4OApriDIp1UDemm4+fKxcPZ6vhWqzp+3ijPdhJXe7OC9D89I\n9QKdlHPBxKFnUrBJiqn3cHGLpRrYTsKpI/Nl7VW4UJJh0k7R7P1Jqry0e+HalOLB\nBu5kl5z6iYBPy1gJ4psDHWuoNboxIgIsVR1SSLM7Mooebwx2qjm3W4VQuc7eQk0g\nh7KH4B8CrK4bC+K6lAS3ZzmTlA6M1WZPtIKv3XqEYCkyomMnkdTNZQYKbCKKlLBo\ntQIDAQAB\n-----END PUBLIC KEY-----\n"
|
||||||
|
social:
|
||||||
|
url: social.ga.ntu.edu.tw
|
||||||
|
key: "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqB8htGdGzDPs3GA76REG\nyjM0eEYdXV6ugi4hPZEViCOBg3POC5RZslA5oTCYYWfTVui8jHC2CPD3AYQLG67Z\n79g2miLHEEyDzG7dp//dc85qp0FYR2JII1y26fJutMVCgn0hth6OpfjPB2QhkgZf\nat+Ico5ppDYIx+4jX8xQr4qqRlUIAmECMAE5ATiAUqfv117GJG/fR3AsKZPYm2U1\nFhSpKT2mvC0AiqstZzxYEm4srl1ZjpJPJ7uU+ewvi/EhRyLWFGPmygP6fvg4IaKS\nG00dx7FGedyLVcSaxJCoCX5Z98hIYEStanCSzuR3FQEL0JaB8ZKKWY8dsB+U1v46\nQwIDAQAB\n-----END PUBLIC KEY-----\n"
|
||||||
|
property:
|
||||||
|
url: property.ga.ntu.edu.tw
|
||||||
|
key: "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1bmnJSRmxcehehuKBwSQ\nXiuYhAxzUOmptIk0sgciB1hK8++anXMaHXf3QA6UiXWjNyU+g2ZL1nVfVl0Qd3Ps\nxM2+hSeZRus2sw0g7CQea7NkAqLGQrpicnZ8Fgcb+0qwgClk0RVBXwJzfTDu6V+5\nL9lLEKWnSdHmoGkxkZTPMAtJpXYx9SMLtljPYGkMWKY2C1cBqPdMOl/rKTUZ9dYp\n2eJ13NTXDJJgDJOhDFHevzK/I6kwxdJbetNo4IO1dhQdbPionR5SNkkCNZvfy3k3\n68+xopPKH3xECCIuxorcePx0hyoeXS8vdmJ09VKHVUz08LBYGq2S/36V5LIc1P/6\nSQIDAQAB\n-----END PUBLIC KEY-----\n"
|
||||||
|
procurement:
|
||||||
|
url: procurement.ga.ntu.edu.tw
|
||||||
|
key: "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAze/Yr3vrpRBpeu7ohyEP\nboPvZ476dtANbvW+rMuDyKeGD5FfoZYwzF+AbMIK6KfleWizObnMM8ABC0LdBuag\nQ0Brk4FMxyKz0aXlSgG3OZiZXJaaWm2/+gqghgpBLpAPMRFnEmK2y11b/EgCxurV\nl+RZ/MgrIviRGipnU7GXfG4O7Ai21oD4lzKt3WbvuWgBdgtEsYpZMIyddWrhkUki\noM39Vm72mCyKPkysCVYCnYaMwDXVx/SKuTRHiVQZ4GNIv74rwp7BOCkfDZ8HrNLH\nr3ObCB8X0Bh9GqUUj7gYu3cFmx8lXer7qkGtGUq2wNUM0CBc01EODVO9e9RQnulA\n3wIDAQAB\n-----END PUBLIC KEY-----\n"
|
||||||
|
fss:
|
||||||
|
url: fss.ga.ntu.edu.tw
|
||||||
|
key: "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzsvi4FfIQokfP2QmiRTs\nzuxjPg7oPK7pLHNQC/AyY35H0vmkXGTc74pVvLbfSuaprLO10WVzE4bGGQmhmls1\nDqeY7EyHg1vs7GHQm1932n+Va+qDToSx7S+Zs1ZOglYAdEzBI3dyhefIcDtNUfty\n0i64RGiEzDH4yV5lecilXo5Q4/7W/HNdtw8Oe//LopOZ2Mj+Eq7Tk70WkGFDV73Z\n/jIBLBn51g2P9nrsid63OLe1X8u0l9+xSGff0fR1VlqbElBRACCrAmPvs9ceOW7H\n+yLw71elR4nMDm+/dx/zimeYUj0WaY2A3/O8xucPhSP22YCRiO1jEsAEvMXkCU9p\n8wIDAQAB\n-----END PUBLIC KEY-----\n"
|
||||||
|
medicine:
|
||||||
|
url: medicine.ga.ntu.edu.tw
|
||||||
|
key: "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwx7zQLnde6Azy/03bIxg\nkp5rM0DsKKkBbX8C5vhUADxaC2zVmVJuF0NnTGCWutNSSYsKWRKzFwEoZdzJ+8XS\nr8f9kRdEB0yu3Akv+EhZyHA7yVGyFvNAhPGVuekSmpDlpFFKanAqlhBzrhByku5A\nTqp2fXi3zHMoP6WX8QXb6SpG/y4CBpjXCI1qLCAJRw0Fkt7yMXkJnjO2q7zCKAnU\nnv6DVz5yDuBiZPfYlW09KHVWxSehgk5fvLu9Jb/s1XklPwEw1m5BPhIA1YG0QelR\nXk9Pdvwb7aM59LZx1xQZYcku0KGSqLo9rCDTD8YT47226v921yeM36Az8t8e4egU\nzwIDAQAB\n-----END PUBLIC KEY-----\n"
|
||||||
|
police:
|
||||||
|
url: police.ga.ntu.edu.tw
|
||||||
|
key: "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzKawlFWAMzA/uV/kcewd\nmtj8PcqxosmnSh7ZzJ0DumG2ieeP9oDBicqbqIEaeJVvrRzYJD2a+u8x5KKMKB8J\nHbMUpCBFlIpkDMjU/oZVMcYT9pcH51QWNvCgHG7prVykSGFz1JRvjSP6cwuZKBFd\nFFneOViETqoMIO1DbRLXsGfPvMOJY9C1xDwv1dLv0Wbj7M9N6eNz06a50bu3I4gl\nMumxWnZUabXL3G62S/Si4NM7J2jOUnkEOxJWOhcAX/iiqS9T8AHu84um2+mLQpfB\nJJFFIWCIAtU78VnIN5JSWwjFU5TsiSyCFYpGXKxUFD25cFmt3SfG0gwmrFis5Pdn\nhwIDAQAB\n-----END PUBLIC KEY-----\n"
|
||||||
|
construction:
|
||||||
|
url: construction.ga.ntu.edu.tw
|
||||||
|
key: "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvxJcKnPUDaNNyhdGpedL\n+h2OI9RDDZUTkHcvX1UvBNvlX2+dvok6sHQh2AhZoNyCUFZTbp2CRSNfIM5jXigD\nfHA3KzpN7cmGG7W7nIdBBkZU/ly4HFvkD7mGoEymB0JYgZkz59CXBx+3Zg6KLSYY\nZDoOw6wikrl643So2zFZvwHJpDkRkmX5oWWYqXOZxaZnkgbhvA3KdcH9+C1aEBYY\npY2K2MJt86k0ahW/CJfVRDb9CWSxAGir1RAPu9bRV9y9WWKKGWekH0/IqhhJPT8q\nl3v6PB1Oc6ltbOyYkS2xHbmvRxjORzGen0Xcbjzo4N8HBEoPe0Uc5iP0Y50GDjEL\nEQIDAQAB\n-----END PUBLIC KEY-----\n"
|
||||||
|
sec:
|
||||||
|
url: sec.ga.ntu.edu.tw
|
||||||
|
key: "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApsVKJ8Cvr/A0dmHR+vDS\nAYjVzGqMNJ/4pO7GwMzUZMNSkpq3b9CIjrIGg/QKj7woTHnKM39vczu5gxPXJGYN\nIo+PnWsibMDjcz2Vm8s11XXIPho/Ce+hQkWpWGzxpaH7Z/qLKSwiwHdHhlgN3fWw\njR8jYhreQYfohkRGR70h8A9TTU4YkFY/+8yIdwGns61+5tK981kMbVkm+pcgL0cP\nMN08I7MM+c87COY6IO27jVb/ALPAYpo+QUdAfEp5hlI7BQW95nB7LHOnxAm7lLTD\nhbdETUssieQUicwgDpGa2aD769nH+V3UCp0nA4yPDWyJJyKEWsD5EEK24VAcotql\nkwIDAQAB\n-----END PUBLIC KEY-----\n"
|
||||||
|
info:
|
||||||
|
url: info.ga.ntu.edu.tw
|
||||||
|
key: "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5MLcsMcedzVWjw7pd/lr\nf8GdrzV6rubsJgEBJbC2OdrloHc+7uxEwWiYNTfg4j46nY/zCuTqzV/Wcfni5pY8\n0yuOmZdH9LjK0PW5BgXYJwe/bZkQmQcIQhkoSPghR8o+kZlI0a3+3gs4eAkpxB21\nPR5Rg2fvzDkaO3WcHf13HymayIk9wn4i0NdLUXgKSWcz5XNJtVBh6jtMkDq7ioOH\nQZT9OAODFw5CW/TvXBJaAvSEdDHsCNTE4vgJO1h6qowC27mErgjilA7TM81JFp40\nwexOW/gXHc4gCsj9BY39tDTqa56QIbJjKdqx7iyHUr1jMFmII1osS1ZVATco9RrM\naQIDAQAB\n-----END PUBLIC KEY-----\n"
|
||||||
|
|
||||||
|
|
|
@ -9,3 +9,9 @@ generate_system_summary:
|
||||||
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: 0 0 [2,12] * * *
|
||||||
|
class: GetAnnouncementFromRss
|
||||||
|
args:
|
||||||
|
description: Loop through the announcement RSS until 24h ago
|
||||||
|
|
|
@ -13,6 +13,8 @@ Orbit::Application.routes.draw do
|
||||||
match 'user_logout' => 'sessions#destroy'
|
match 'user_logout' => 'sessions#destroy'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
match "saml_login" => 'saml_logins#index'
|
||||||
|
|
||||||
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,158 @@
|
||||||
|
# encoding: utf-8
|
||||||
|
|
||||||
|
require 'rss'
|
||||||
|
require 'mongo'
|
||||||
|
|
||||||
|
SITES = { "總務處-各單位公告" => "0",
|
||||||
|
"總務處-文書組" => "1",
|
||||||
|
"總務處-出納組" => "2",
|
||||||
|
"總務處-事務組" => "3",
|
||||||
|
"總務處-保管組" => "5",
|
||||||
|
"總務處-採購組" => "6",
|
||||||
|
"總務處-經營管理組" => "7",
|
||||||
|
"總務處-駐衛警察隊" => "9",
|
||||||
|
"總務處-營繕組" => "10",
|
||||||
|
"總務處-總務處" => "11",
|
||||||
|
"社會科學院-社會科學院總務分處" => "4",
|
||||||
|
"醫學院-醫學院總務分處" => "8" }
|
||||||
|
|
||||||
|
SITE_KEYS = SITES.keys
|
||||||
|
|
||||||
|
DB_BASE_NAME = "production_new"
|
||||||
|
|
||||||
|
all = {}
|
||||||
|
continue = true
|
||||||
|
i = 1
|
||||||
|
yesterday = Time.now - 86400
|
||||||
|
|
||||||
|
while continue do
|
||||||
|
open("http://ann.cc.ntu.edu.tw/asp/rss.asp?page=#{i}") do |rss|
|
||||||
|
feed = RSS::Parser.parse(rss.read.encode('utf-8', 'big5', invalid: :replace, undef: :replace, replace: '').gsub('<pubDate>Wes,', '<pubDate>Wed,').gsub(/(encoding=\"big5\")/, 'encoding="utf-8"'))
|
||||||
|
feed.items.each do |item|
|
||||||
|
if item.pubDate > yesterday
|
||||||
|
if SITE_KEYS.include?(item.author)
|
||||||
|
author = item.author.strip
|
||||||
|
category = item.category.to_s.gsub(/\<(\/)*category\>/, '')
|
||||||
|
if all[author]
|
||||||
|
all[author][item.link.strip] = {title: item.title.strip, author: author, link: item.link.strip, date: item.pubDate, category: category, description: item.description.gsub("\r\n", '<br/>').strip}
|
||||||
|
else
|
||||||
|
all[author] = {item.link.strip => {title: item.title.strip, author: author, link: item.link.strip, date: item.pubDate, category: category, description: item.description.gsub("\r\n", '<br/>').strip}}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
continue = false
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
i += 1
|
||||||
|
end
|
||||||
|
|
||||||
|
# Get corresponding category_id or create a new one
|
||||||
|
def get_category_id(category, categories, coll_cat, bulletin_module_id)
|
||||||
|
if categories.keys.include? "rss_#{category}"
|
||||||
|
[categories["rss_#{category}"], categories]
|
||||||
|
else
|
||||||
|
cat = {
|
||||||
|
_type: "Category",
|
||||||
|
module_app_id: bulletin_module_id,
|
||||||
|
key: "rss_#{category}",
|
||||||
|
disable: false,
|
||||||
|
custom: false,
|
||||||
|
title: {:zh_tw => category},
|
||||||
|
created_at: Time.now,
|
||||||
|
updated_at: Time.now
|
||||||
|
}
|
||||||
|
|
||||||
|
categories["rss_#{category}"] = result = coll_cat.save(cat)
|
||||||
|
[result, categories]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Get categories and id based on a given site number
|
||||||
|
def get_mongo_and_categories(site_number="0")
|
||||||
|
db = Mongo::Connection.new("localhost", 27017).db("#{DB_BASE_NAME}_#{site_number}")
|
||||||
|
|
||||||
|
bulletin_module_id = db["module_apps"].find(key: "announcement").first
|
||||||
|
|
||||||
|
coll_bulletin = db["bulletins"]
|
||||||
|
coll_buffer_cat = db["buffer_categories"]
|
||||||
|
coll_cat = db["categories"]
|
||||||
|
coll_bulletin_cat = db["categories"].find(module_app_id: bulletin_module_id["_id"])
|
||||||
|
|
||||||
|
categories = coll_bulletin_cat.find().to_a.inject({}) do |categories, category|
|
||||||
|
categories[category['key']] = category['_id']
|
||||||
|
categories
|
||||||
|
end
|
||||||
|
[categories, coll_bulletin, coll_cat, bulletin_module_id["_id"],coll_buffer_cat]
|
||||||
|
end
|
||||||
|
|
||||||
|
# Get main site (總務處) categories
|
||||||
|
@main_categories, @main_coll_bulletin, @main_coll_cat, @main_bulletin_module_id, @main_coll_buffer_cat = get_mongo_and_categories
|
||||||
|
@copy_categories, @copy_coll_bulletin, @copy_coll_cat, @copy_bulletin_module_id, @copy_coll_buffer_cat = get_mongo_and_categories('11')
|
||||||
|
|
||||||
|
all.each do |key, value| # Loop through all the authors
|
||||||
|
site_number = SITES[key]
|
||||||
|
categories, coll_bulletin, coll_cat, bulletin_module_id, coll_buffer_cat = get_mongo_and_categories(site_number) # Get current's site categories
|
||||||
|
value.each_value do |bul| # Loop through all the items
|
||||||
|
category_id, categories = get_category_id(bul[:category], categories, coll_cat, bulletin_module_id)
|
||||||
|
unless coll_bulletin.find_one(rss_link: bul[:link])
|
||||||
|
bulletin = { _type: "Bulletin",
|
||||||
|
postdate: bul[:date],
|
||||||
|
created_at: bul[:date],
|
||||||
|
updated_at: bul[:date],
|
||||||
|
public: true,
|
||||||
|
is_checked: true,
|
||||||
|
is_pending: false,
|
||||||
|
is_rejected: false,
|
||||||
|
category_id: category_id,
|
||||||
|
title: {:zh_tw => bul[:title]},
|
||||||
|
text: {:zh_tw => bul[:description]},
|
||||||
|
available_for_en: false,
|
||||||
|
available_for_zh_tw: true,
|
||||||
|
rss_link: bul[:link],
|
||||||
|
is_top: false,
|
||||||
|
is_hot: false,
|
||||||
|
is_hidden: false }
|
||||||
|
bs = coll_bulletin.save(bulletin)
|
||||||
|
|
||||||
|
buffer_cat = { _type: "BufferCategory",
|
||||||
|
category_id: category_id,
|
||||||
|
categorizable_type: "Bulletin",
|
||||||
|
categorizable_id: bs }
|
||||||
|
coll_buffer_cat.save(buffer_cat)
|
||||||
|
|
||||||
|
unless site_number.eql?("0") || @main_coll_bulletin.find_one(rss_link: bul[:link]) # Copy the item to the main site
|
||||||
|
|
||||||
|
category_id, @main_categories = get_category_id(bul[:category], @main_categories, @main_coll_cat, @main_bulletin_module_id)
|
||||||
|
main_bulletin = bulletin.clone
|
||||||
|
main_bulletin['_id'] = BSON::ObjectId.new
|
||||||
|
main_bulletin[:category_id] = category_id
|
||||||
|
main_bs = @main_coll_bulletin.save(main_bulletin)
|
||||||
|
|
||||||
|
main_buffer_cat = { _type: "BufferCategory",
|
||||||
|
category_id: category_id,
|
||||||
|
categorizable_type: "Bulletin",
|
||||||
|
categorizable_id: main_bs }
|
||||||
|
@main_coll_buffer_cat.save(main_buffer_cat)
|
||||||
|
|
||||||
|
category_id, @copy_categories = get_category_id(bul[:category], @copy_categories, @copy_coll_cat, @copy_bulletin_module_id)
|
||||||
|
copy_bulletin = bulletin.clone
|
||||||
|
copy_bulletin['_id'] = BSON::ObjectId.new
|
||||||
|
copy_bulletin[:category_id] = category_id
|
||||||
|
@copy_coll_bulletin.save(copy_bulletin)
|
||||||
|
copy_bs = @copy_coll_bulletin.save(copy_bulletin)
|
||||||
|
|
||||||
|
copy_buffer_cat = { _type: "BufferCategory",
|
||||||
|
category_id: category_id,
|
||||||
|
categorizable_type: "Bulletin",
|
||||||
|
categorizable_id: copy_bs }
|
||||||
|
@copy_coll_buffer_cat.save(copy_buffer_cat)
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
source "http://rubygems.org"
|
||||||
|
|
||||||
|
# Declare your gem's dependencies in survey_b.gemspec.
|
||||||
|
# Bundler will treat runtime dependencies like base dependencies, and
|
||||||
|
# development dependencies will be added by default to the :development group.
|
||||||
|
gemspec
|
||||||
|
|
||||||
|
# jquery-rails is used by the dummy application
|
||||||
|
gem "jquery-rails"
|
||||||
|
|
||||||
|
# Declare any dependencies that are still in development here instead of in
|
||||||
|
# your gemspec. These might include edge Rails or gems from your path or
|
||||||
|
# Git. Remember to move these dependencies to your gemspec before releasing
|
||||||
|
# your gem to rubygems.org.
|
||||||
|
|
||||||
|
# To use debugger
|
||||||
|
# gem 'debugger'
|
|
@ -0,0 +1,20 @@
|
||||||
|
Copyright 2013 YOURNAME
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -0,0 +1,3 @@
|
||||||
|
= SurveyB
|
||||||
|
|
||||||
|
This project rocks and uses MIT-LICENSE.
|
|
@ -0,0 +1,38 @@
|
||||||
|
#!/usr/bin/env rake
|
||||||
|
begin
|
||||||
|
require 'bundler/setup'
|
||||||
|
rescue LoadError
|
||||||
|
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
||||||
|
end
|
||||||
|
begin
|
||||||
|
require 'rdoc/task'
|
||||||
|
rescue LoadError
|
||||||
|
require 'rdoc/rdoc'
|
||||||
|
require 'rake/rdoctask'
|
||||||
|
RDoc::Task = Rake::RDocTask
|
||||||
|
end
|
||||||
|
|
||||||
|
RDoc::Task.new(:rdoc) do |rdoc|
|
||||||
|
rdoc.rdoc_dir = 'rdoc'
|
||||||
|
rdoc.title = 'SurveyB'
|
||||||
|
rdoc.options << '--line-numbers'
|
||||||
|
rdoc.rdoc_files.include('README.rdoc')
|
||||||
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Bundler::GemHelper.install_tasks
|
||||||
|
|
||||||
|
require 'rake/testtask'
|
||||||
|
|
||||||
|
Rake::TestTask.new(:test) do |t|
|
||||||
|
t.libs << 'lib'
|
||||||
|
t.libs << 'test'
|
||||||
|
t.pattern = 'test/**/*_test.rb'
|
||||||
|
t.verbose = false
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
task :default => :test
|
|
@ -0,0 +1,23 @@
|
||||||
|
class ApplicationController < ActionController::Base
|
||||||
|
protect_from_forgery
|
||||||
|
before_filter :set_locale
|
||||||
|
|
||||||
|
# Set I18n.locale
|
||||||
|
def set_locale
|
||||||
|
# update session if passed
|
||||||
|
session[:locale] = params[:locale] if params[:locale]
|
||||||
|
|
||||||
|
# set locale based on session or default
|
||||||
|
begin
|
||||||
|
# check if locale is valid for non site pages
|
||||||
|
if !VALID_LOCALES.include?(session[:locale])
|
||||||
|
I18n.locale = I18n.default_locale
|
||||||
|
else
|
||||||
|
I18n.locale = session[:locale]
|
||||||
|
end
|
||||||
|
rescue
|
||||||
|
I18n.locale = I18n.default_locale
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
81
vendor/built_in_modules/survey_b/app/controllers/panel/survey_b/back_end/periods_controller.rb
vendored
Normal file
81
vendor/built_in_modules/survey_b/app/controllers/panel/survey_b/back_end/periods_controller.rb
vendored
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
class Panel::SurveyB::BackEnd::PeriodsController < OrbitBackendController
|
||||||
|
|
||||||
|
# include AdminHelper
|
||||||
|
# include OrbitControllerLib::DivisionForDisable
|
||||||
|
|
||||||
|
# before_filter :for_app_manager
|
||||||
|
|
||||||
|
open_for_manager
|
||||||
|
|
||||||
|
# def initialize
|
||||||
|
# super
|
||||||
|
# @app_title = 'survey_b'
|
||||||
|
# end
|
||||||
|
|
||||||
|
|
||||||
|
# before_filter :force_order_for_user,:only => :index
|
||||||
|
# before_filter :for_app_sub_manager,:except => :index
|
||||||
|
|
||||||
|
|
||||||
|
def index
|
||||||
|
@periods = SurveyBPeriod.page params[:page]
|
||||||
|
respond_to do |format|
|
||||||
|
format.html # index.html.erb
|
||||||
|
format.xml { render :xml => @periods }
|
||||||
|
format.js
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def new
|
||||||
|
@period = SurveyBPeriod.new
|
||||||
|
|
||||||
|
respond_to do |format|
|
||||||
|
format.html # new.html.erb
|
||||||
|
format.xml { render :xml => @period }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
@period = SurveyBPeriod.new params[:survey_b_period]
|
||||||
|
|
||||||
|
respond_to do |format|
|
||||||
|
if @period.save
|
||||||
|
format.html { redirect_to(panel_survey_b_back_end_periods_url) }
|
||||||
|
format.xml { render :xml => @period, :status => :created, :location => @period }
|
||||||
|
else
|
||||||
|
format.html { render :action => "new" }
|
||||||
|
format.xml { render :xml => @period.errors, :status => :unprocessable_entity }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def edit
|
||||||
|
@period = SurveyBPeriod.find(params[:id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
@period = SurveyBPeriod.find(params[:id])
|
||||||
|
|
||||||
|
respond_to do |format|
|
||||||
|
if @period.update_attributes(params[:survey_b_period])
|
||||||
|
format.html { redirect_to(panel_survey_b_back_end_periods_url(:page => params[:page])) }
|
||||||
|
format.xml { head :ok }
|
||||||
|
else
|
||||||
|
format.html { render :action => "edit" }
|
||||||
|
format.xml { render :xml => @period.errors, :status => :unprocessable_entity }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
@period = SurveyBPeriod.find(params[:id])
|
||||||
|
|
||||||
|
respond_to do |format|
|
||||||
|
if @period.destroy
|
||||||
|
format.html { redirect_to(panel_survey_b_back_end_periods_url(:page => params[:page])) }
|
||||||
|
format.xml { head :ok }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
37
vendor/built_in_modules/survey_b/app/controllers/panel/survey_b/back_end/settings_controller.rb
vendored
Normal file
37
vendor/built_in_modules/survey_b/app/controllers/panel/survey_b/back_end/settings_controller.rb
vendored
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
class Panel::SurveyB::BackEnd::SettingsController < OrbitBackendController
|
||||||
|
|
||||||
|
# include AdminHelper
|
||||||
|
# include OrbitControllerLib::DivisionForDisable
|
||||||
|
|
||||||
|
# before_filter :for_app_manager
|
||||||
|
open_for_manager
|
||||||
|
|
||||||
|
# def initialize
|
||||||
|
# super
|
||||||
|
# @app_title = 'survey_b'
|
||||||
|
# end
|
||||||
|
|
||||||
|
def show
|
||||||
|
redirect_to edit_panel_survey_b_back_end_setting_path
|
||||||
|
end
|
||||||
|
|
||||||
|
def edit
|
||||||
|
@setting = SurveyBSetting.first_or_create
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
@setting = SurveyBSetting.first_or_create
|
||||||
|
|
||||||
|
respond_to do |format|
|
||||||
|
if @setting.update_attributes(params[:survey_b_setting])
|
||||||
|
format.html { redirect_to(panel_survey_b_back_end_periods_url) }
|
||||||
|
format.xml { head :ok }
|
||||||
|
else
|
||||||
|
format.html { render :action => "edit" }
|
||||||
|
format.xml { render :xml => @setting.errors, :status => :unprocessable_entity }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
end
|
168
vendor/built_in_modules/survey_b/app/controllers/panel/survey_b/back_end/survey_b_controller.rb
vendored
Normal file
168
vendor/built_in_modules/survey_b/app/controllers/panel/survey_b/back_end/survey_b_controller.rb
vendored
Normal file
|
@ -0,0 +1,168 @@
|
||||||
|
class Panel::SurveyB::BackEnd::SurveyBController < OrbitBackendController
|
||||||
|
# include AdminHelper
|
||||||
|
# include OrbitControllerLib::DivisionForDisable
|
||||||
|
|
||||||
|
# before_filter :for_app_manager
|
||||||
|
|
||||||
|
open_for_manager
|
||||||
|
|
||||||
|
#before_filter :force_order_for_user,:only => :index
|
||||||
|
#before_filter :for_app_sub_manager,:except => :index
|
||||||
|
|
||||||
|
|
||||||
|
# def initialize
|
||||||
|
# super
|
||||||
|
# @app_title = 'survey_b'
|
||||||
|
# end
|
||||||
|
|
||||||
|
def index
|
||||||
|
if params[:period] && @period = SurveyBPeriod.find(params[:period])
|
||||||
|
@answers = ::SurveyBAnswer.where(:created_at.gte => @period.start_date, :created_at.lte => @period.end_date)
|
||||||
|
else
|
||||||
|
@answers = ::SurveyBAnswer.all
|
||||||
|
end
|
||||||
|
if params[:sort]
|
||||||
|
options = params[:sort_options]
|
||||||
|
options = [options] if !options.class.eql?(Array)
|
||||||
|
options.each do |option|
|
||||||
|
@answers = @answers.order_by(option, params[:direction])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
@answers = @answers.page(params[:page]).per(10)
|
||||||
|
respond_to do |format|
|
||||||
|
format.html # index.html.erb
|
||||||
|
format.xml { render :xml => @answers }
|
||||||
|
format.js
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
@answers = SurveyBAnswer.find(params[:id])
|
||||||
|
# @bulletin.bulletin_files.destroy
|
||||||
|
@answers.destroy
|
||||||
|
|
||||||
|
respond_to do |format|
|
||||||
|
|
||||||
|
format.html { redirect_to(panel_survey_b_back_end_survey_b_index_path(:period => params[:period], :page => params[:page])) }
|
||||||
|
# format.xml { head :ok }
|
||||||
|
format.js
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete
|
||||||
|
if params[:ids]
|
||||||
|
answers = SurveyBAnswer.any_in(:_id => params[:ids]).destroy_all
|
||||||
|
end
|
||||||
|
redirect_to panel_survey_b_back_end_survey_b_index_url(:direction => params[:direction], :sort => params[:sort], :sort_options => params[:sort_options])
|
||||||
|
end
|
||||||
|
|
||||||
|
def result
|
||||||
|
if params[:period] && @period = SurveyBPeriod.find(params[:period])
|
||||||
|
@answers = ::SurveyBAnswer.where(:created_at.gte => @period.start_date, :created_at.lte => @period.end_date)
|
||||||
|
else
|
||||||
|
@answers = ::SurveyBAnswer.all
|
||||||
|
end
|
||||||
|
@results = Hash[(t('survey_b.institutions').keys + [ 'all' ]).map do |i_key|
|
||||||
|
[i_key, Hash[(t('survey_b.questions').keys + ['count', 'sum', 'sum7'] ).map{|q_key| [q_key, 0] }].merge({ 'count' => 0, 'sum' => 0, 'sum7' => 0 })]
|
||||||
|
end]
|
||||||
|
[:good_institutions, :bad_institutions].each do |item|
|
||||||
|
@results[item] = Hash[t('survey_b.institutions').map{|k, i| [k, 0] }]
|
||||||
|
end
|
||||||
|
[:person_question, :rate_question, :quality_question].each do |item|
|
||||||
|
@results[item] = t("survey_b.#{item}_options").map{|o| 0 }
|
||||||
|
end
|
||||||
|
@answers.each do |answer|
|
||||||
|
t('survey_b.institutions').each do |i_key, institution|
|
||||||
|
if answer[i_key.to_s]
|
||||||
|
@results[i_key]['count'] += 1
|
||||||
|
t('survey_b.questions').keys.each do |q_key|
|
||||||
|
point = 10 - ( answer[i_key.to_s][q_key.to_s].to_i * 2 )
|
||||||
|
@results[i_key][q_key] += point
|
||||||
|
@results[i_key]['sum'] += point
|
||||||
|
if q_key != :question6
|
||||||
|
@results[i_key]['sum7'] += point
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
[:good_institutions, :bad_institutions].each do |item|
|
||||||
|
if answer[item.to_s]
|
||||||
|
answer[item.to_s].each do |institution|
|
||||||
|
@results[item][institution] += 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
[:person_question, :rate_question, :quality_question].each do |item|
|
||||||
|
if answer[item.to_s]
|
||||||
|
@results[item][answer[item.to_s].to_i] += 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
t('survey_b.institutions').each do |i_key, institution|
|
||||||
|
(t('survey_b.questions').keys + ['count', 'sum', 'sum7'] ).each do |q_key|
|
||||||
|
@results['all'][q_key] += @results[i_key][q_key]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def export
|
||||||
|
|
||||||
|
if params[:period] && @period = SurveyBPeriod.find(params[:period])
|
||||||
|
@answers = ::SurveyBAnswer.where(:created_at.gte => @period.start_date, :created_at.lte => @period.end_date)
|
||||||
|
@comment_question = ::SurveyBAnswer.where(:created_at.gte => @period.start_date, :created_at.lte => @period.end_date, :comment_question.nin => [''])
|
||||||
|
else
|
||||||
|
@answers = ::SurveyBAnswer.all
|
||||||
|
@comment_question = ::SurveyBAnswer.where(:comment_question.nin => [''])
|
||||||
|
end
|
||||||
|
@results = Hash[(t('survey_b.institutions').keys + [ 'all' ]).map do |i_key|
|
||||||
|
[i_key, Hash[(t('survey_b.questions').keys + ['count', 'sum', 'sum7'] ).map{|q_key| [q_key, 0] }].merge({ 'count' => 0, 'sum' => 0, 'sum7' => 0 })]
|
||||||
|
end]
|
||||||
|
[:good_institutions, :bad_institutions].each do |item|
|
||||||
|
@results[item] = Hash[t('survey_b.institutions').map{|k, i| [k, 0] }]
|
||||||
|
end
|
||||||
|
[:person_question, :rate_question, :quality_question].each do |item|
|
||||||
|
@results[item] = t("survey_b.#{item}_options").map{|o| 0 }
|
||||||
|
end
|
||||||
|
@answers.each do |answer|
|
||||||
|
t('survey_b.institutions').each do |i_key, institution|
|
||||||
|
if answer[i_key.to_s]
|
||||||
|
@results[i_key]['count'] += 1
|
||||||
|
t('survey_b.questions').keys.each do |q_key|
|
||||||
|
point = 10 - ( answer[i_key.to_s][q_key.to_s].to_i * 2 )
|
||||||
|
@results[i_key][q_key] += point
|
||||||
|
@results[i_key]['sum'] += point
|
||||||
|
if q_key != :question6
|
||||||
|
@results[i_key]['sum7'] += point
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
[:good_institutions, :bad_institutions].each do |item|
|
||||||
|
if answer[item.to_s]
|
||||||
|
answer[item.to_s].each do |institution|
|
||||||
|
@results[item][institution] += 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
[:person_question, :rate_question, :quality_question].each do |item|
|
||||||
|
if answer[item.to_s]
|
||||||
|
@results[item][answer[item.to_s].to_i] += 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
t('survey_b.institutions').each do |i_key, institution|
|
||||||
|
(t('survey_b.questions').keys + ['count', 'sum', 'sum7'] ).each do |q_key|
|
||||||
|
@results['all'][q_key] += @results[i_key][q_key]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@setting = SurveyBSetting.first
|
||||||
|
|
||||||
|
headers['Content-Type'] = "application/vnd.ms-excel"
|
||||||
|
headers['Content-Disposition'] = "attachment; filename=#{@period.title}.xls"
|
||||||
|
headers['Cache-Control'] = ''
|
||||||
|
|
||||||
|
render :layout => false
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
88
vendor/built_in_modules/survey_b/app/controllers/panel/survey_b/front_end/survey_b_controller.rb
vendored
Normal file
88
vendor/built_in_modules/survey_b/app/controllers/panel/survey_b/front_end/survey_b_controller.rb
vendored
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
class Panel::SurveyB::FrontEnd::SurveyBController < OrbitWidgetController
|
||||||
|
helper ApplicationHelper
|
||||||
|
|
||||||
|
def index
|
||||||
|
if params[:period].nil?
|
||||||
|
@period = SurveyBPeriod.get_current_survey()
|
||||||
|
else
|
||||||
|
@period = SurveyBPeriod.find(params[:period])
|
||||||
|
end
|
||||||
|
|
||||||
|
redirect_standalone panel_survey_b_front_end_survey_b_index_path( :standalone => 'true') do
|
||||||
|
@setting = SurveyBSetting.first_or_create
|
||||||
|
if params[:agree] == '1'
|
||||||
|
# @period = SurveyBPeriod.first
|
||||||
|
render :index, :layout => 'standalone'
|
||||||
|
else
|
||||||
|
# Escape from error when announcement is empty
|
||||||
|
if @setting.announcement.nil?
|
||||||
|
@setting.announcement = " "
|
||||||
|
end
|
||||||
|
render :announcement, :layout => 'standalone'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
answer = params[:answer]
|
||||||
|
@answer_model = ::SurveyBAnswer.new
|
||||||
|
not_answered = true
|
||||||
|
[:contact_name, :contact_phone, :contact_e_mail, :person_question, :rate_question, :quality_question].each do |item|
|
||||||
|
if answer[item].blank?
|
||||||
|
@answer_model.errors.add t("survey_b.#{item.to_s}_label"), t('survey_b.not_answered')
|
||||||
|
else
|
||||||
|
@answer_model[item] = answer[item]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
@answer_model[:comment_question] = answer[:comment_question]
|
||||||
|
[:good_institutions, :bad_institutions].each do |item|
|
||||||
|
t('survey_b.institutions').each do |i_key, institution|
|
||||||
|
if answer[item][i_key] == '1'
|
||||||
|
@answer_model[item] ||= []
|
||||||
|
@answer_model[item].push i_key
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
t('survey_b.institutions').each do |i_key, institution|
|
||||||
|
if answer["institution_check"][i_key] == '1'
|
||||||
|
not_answered = false
|
||||||
|
@answer_model[i_key] ||= {}
|
||||||
|
t('survey_b.questions').each do |q_key, question|
|
||||||
|
if answer[i_key] && answer[i_key][q_key]
|
||||||
|
@answer_model[i_key][q_key] = answer[i_key][q_key]
|
||||||
|
else
|
||||||
|
@answer_model.errors.add institution + question, t('survey_b.not_answered')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not_answered
|
||||||
|
@answer_model.errors.add t('survey_b.institution_check_label'), t('survey_b.not_answered')
|
||||||
|
end
|
||||||
|
if @answer_model.errors.empty?
|
||||||
|
@answer_model.save!
|
||||||
|
render :answer_success
|
||||||
|
else
|
||||||
|
@answer_error = @answer_model.errors.full_messages.join(',')
|
||||||
|
render :answer_error
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def redirect_standalone url
|
||||||
|
unless params[:standalone] == 'true'
|
||||||
|
@redirect_url = url
|
||||||
|
render :redirect_standalone
|
||||||
|
else
|
||||||
|
module_app = ModuleApp.first(:conditions => {:key => 'survey_b'})
|
||||||
|
@item = Item.where(module_app_id: module_app.id).first
|
||||||
|
|
||||||
|
if @period
|
||||||
|
yield
|
||||||
|
else
|
||||||
|
# render :no_survey
|
||||||
|
# render :json => "No Survey"
|
||||||
|
render :no_survey, :layout => 'standalone'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,5 @@
|
||||||
|
class SurveyBAnswer
|
||||||
|
include Mongoid::Document
|
||||||
|
include Mongoid::Timestamps
|
||||||
|
|
||||||
|
end
|
|
@ -0,0 +1,41 @@
|
||||||
|
class SurveyBPeriod
|
||||||
|
include Mongoid::Document
|
||||||
|
include Mongoid::Timestamps
|
||||||
|
|
||||||
|
field :title, :type => String
|
||||||
|
field :start_date, :type => DateTime
|
||||||
|
field :end_date, :type => DateTime
|
||||||
|
|
||||||
|
validates :start_date, :end_date, :presence => true
|
||||||
|
|
||||||
|
def self.get_current_survey
|
||||||
|
self.where(:start_date.lte => Time.now, :end_date.gte => Time.now).first
|
||||||
|
end
|
||||||
|
|
||||||
|
def isAvailable?
|
||||||
|
if start_date <= Time.now and end_date >= Time.now
|
||||||
|
return true
|
||||||
|
else
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_status_type
|
||||||
|
# status type
|
||||||
|
# reference to config/locales/en.yml and zh-tw.yml
|
||||||
|
# status_types:
|
||||||
|
# type1: 調查中
|
||||||
|
# type2: 未開始
|
||||||
|
# type3: 已結束
|
||||||
|
|
||||||
|
if start_date <= Time.now and end_date >= Time.now
|
||||||
|
return "type1"
|
||||||
|
end
|
||||||
|
if start_date > Time.now
|
||||||
|
return "type2"
|
||||||
|
end
|
||||||
|
if end_date < Time.now
|
||||||
|
return "type3"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,17 @@
|
||||||
|
class SurveyBSetting
|
||||||
|
|
||||||
|
include Mongoid::Document
|
||||||
|
|
||||||
|
field :description, :localize => true
|
||||||
|
field :announcement, :localize => true
|
||||||
|
|
||||||
|
def self.first_or_create
|
||||||
|
setting = self.first
|
||||||
|
unless setting
|
||||||
|
setting = self.new
|
||||||
|
setting.save
|
||||||
|
end
|
||||||
|
setting
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
68
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/periods/_form.html.erb
vendored
Normal file
68
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/periods/_form.html.erb
vendored
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
<% content_for :page_specific_css do %>
|
||||||
|
<%= stylesheet_link_tag "lib/main-forms" %>
|
||||||
|
<%= stylesheet_link_tag "lib/fileupload" %>
|
||||||
|
<%= stylesheet_link_tag "lib/main-list" %>
|
||||||
|
<% end %>
|
||||||
|
<% content_for :page_specific_javascript do %>
|
||||||
|
<%= javascript_include_tag "lib/bootstrap-fileupload" %>
|
||||||
|
<%= javascript_include_tag "lib/bootstrap-datetimepicker" %>
|
||||||
|
<%= javascript_include_tag "lib/datetimepicker/datetimepicker.js" %>
|
||||||
|
<%= javascript_include_tag "lib/module-area" %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<%= f.error_messages %>
|
||||||
|
|
||||||
|
<%= @period.errors.full_messages.join ', ' %>
|
||||||
|
|
||||||
|
<!-- Input Area -->
|
||||||
|
<div class="input-area">
|
||||||
|
|
||||||
|
<!-- Module Tabs -->
|
||||||
|
<div class="nav-name"><strong><%= t(:module) %></strong></div>
|
||||||
|
<ul class="nav nav-pills module-nav">
|
||||||
|
<li class="active">
|
||||||
|
<a href="#basic" data-toggle="tab"><%= t(:basic) %></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<!-- Module -->
|
||||||
|
<div class="tab-content module-area">
|
||||||
|
|
||||||
|
<!-- Basic Module -->
|
||||||
|
<div class="tab-pane fade in active" id="basic">
|
||||||
|
|
||||||
|
<!-- title -->
|
||||||
|
<div class="control-group">
|
||||||
|
<label class="control-label muted"><%= t("survey_b.period_title") %></label>
|
||||||
|
<div class="controls">
|
||||||
|
<%= f.text_field :title %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Date Time Picker -->
|
||||||
|
<div class="control-group">
|
||||||
|
<label class="control-label muted"><%= t("survey.postdate") %></label>
|
||||||
|
<div class="controls">
|
||||||
|
<%= f.datetime_picker :start_date, :no_label => true %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="control-group">
|
||||||
|
<label class="control-label muted"><%= t("survey.deadline") %></label>
|
||||||
|
<div class="controls">
|
||||||
|
<%= f.datetime_picker :end_date, :no_label => true %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Form Actions -->
|
||||||
|
<div class="form-actions">
|
||||||
|
<%= hidden_field_tag 'page', params[:page] if !params[:page].blank? %>
|
||||||
|
<%= f.submit t('submit'), class: 'btn btn-primary' %>
|
||||||
|
<%= link_to t('cancel'), get_go_back, :class=>"btn" %>
|
||||||
|
</div>
|
33
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/periods/_period.html.erb
vendored
Normal file
33
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/periods/_period.html.erb
vendored
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
<tr class="with_action">
|
||||||
|
<td>
|
||||||
|
<%= link_to period.title, panel_survey_b_front_end_survey_b_index_path(:period => period, :standalone => true), :target=>"_blank" %>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="<%= result_panel_survey_b_back_end_survey_b_index_path(:period => period.id)%>">
|
||||||
|
<%= display_date_time period.start_date %>
|
||||||
|
-
|
||||||
|
<%= display_date_time period.end_date %>
|
||||||
|
</a>
|
||||||
|
<div class="quick-edit">
|
||||||
|
<ul class="nav nav-pills hide">
|
||||||
|
<li><%= link_to t('survey_b.result'), result_panel_survey_b_back_end_survey_b_index_path(:period => period, :page => params[:page]) %></li>
|
||||||
|
<li><%= link_to t(:list_), panel_survey_b_back_end_survey_b_index_path(:period => period, :page => params[:page]) %></li>
|
||||||
|
<li><%= link_to t('edit'), edit_panel_survey_b_back_end_period_path(period, :page => params[:page]) %></li>
|
||||||
|
<li><%= link_to t(:delete_), panel_survey_b_back_end_period_path(period), :confirm => t('sure?'), :method => :delete %></li>
|
||||||
|
<li><%= link_to t('survey_b.export'), export_panel_survey_b_back_end_survey_b_index_path(:period => period, :page => params[:page]) %></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<% status_type = t('survey_b.status_types') %>
|
||||||
|
<% if period.start_date > Time.now %>
|
||||||
|
<span class="label label-info"><%= status_type[:type2] %></span>
|
||||||
|
<% end %>
|
||||||
|
<% if period.start_date <= Time.now and period.end_date >= Time.now %>
|
||||||
|
<span class="label label-success"><%= status_type[:type1] %></span>
|
||||||
|
<% end %>
|
||||||
|
<% if period.end_date < Time.now %>
|
||||||
|
<span class="label"><%= status_type[:type3] %></span>
|
||||||
|
<% end %>
|
||||||
|
</td>
|
||||||
|
</tr>
|
6
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/periods/edit.html.erb
vendored
Normal file
6
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/periods/edit.html.erb
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<h1><%= t(:edit) + t('survey_b.period') %></h1>
|
||||||
|
<%= form_for @period, url: panel_survey_b_back_end_period_path(@period), html: {class: "form-horizontal main-forms previewable"} do |f| %>
|
||||||
|
<fieldset>
|
||||||
|
<%= render :partial => 'form', :locals => {:f => f} %>
|
||||||
|
</fieldset>
|
||||||
|
<% end %>
|
19
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/periods/index.html.erb
vendored
Normal file
19
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/periods/index.html.erb
vendored
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
<table class="table main-list">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th width="20%"><%= t('survey_b.period_title') %></th>
|
||||||
|
<th width="20%"><%= t('survey_b.period') %></th>
|
||||||
|
<th><%= t('survey_b.status') %></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody id="tbody_survey_periods" class="sort-holder">
|
||||||
|
<%= render :partial => 'period', :collection => @periods %>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<div class="form-actions form-fixed pagination-right">
|
||||||
|
<%= link_to t(:add) + t('survey_b.period'), new_panel_survey_b_back_end_period_path, :class => 'btn btn-primary pull-right' %>
|
||||||
|
<div id="survey_periods_pagination" class="paginationFixed">
|
||||||
|
<%= paginate @periods %>
|
||||||
|
</div>
|
||||||
|
</div>
|
2
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/periods/index.js.erb
vendored
Normal file
2
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/periods/index.js.erb
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
$("#tbody_survey_periods").html("<%= j render :partial => 'answer', :collection => @periods %>");
|
||||||
|
$("#survey_periods_pagination").html("<%= j paginate @periods %>");
|
6
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/periods/new.html.erb
vendored
Normal file
6
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/periods/new.html.erb
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<h1><%=t(:add) + t('survey_b.period') %></h1>
|
||||||
|
<%= form_for @period, url: panel_survey_b_back_end_periods_path, html: {class: "form-horizontal main-forms previewable"} do |f| %>
|
||||||
|
<fieldset>
|
||||||
|
<%= render partial: 'form', locals: {f: f} %>
|
||||||
|
</fieldset>
|
||||||
|
<% end %>
|
72
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/settings/_form.html.erb
vendored
Normal file
72
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/settings/_form.html.erb
vendored
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
<% # encoding: utf-8 %>
|
||||||
|
<% content_for :page_specific_css do %>
|
||||||
|
<%= stylesheet_link_tag "lib/main-forms" %>
|
||||||
|
<%= stylesheet_link_tag "lib/fileupload" %>
|
||||||
|
<%= stylesheet_link_tag "lib/main-list" %>
|
||||||
|
<% end %>
|
||||||
|
<% content_for :page_specific_javascript do %>
|
||||||
|
<%= javascript_include_tag "lib/bootstrap-fileupload" %>
|
||||||
|
<%= javascript_include_tag "lib/bootstrap-datetimepicker" %>
|
||||||
|
<%= javascript_include_tag "lib/datetimepicker/datetimepicker.js" %>
|
||||||
|
<%= javascript_include_tag "lib/module-area" %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<%= f.error_messages %>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Input Area -->
|
||||||
|
<div class="input-area">
|
||||||
|
|
||||||
|
<!-- Language Tabs -->
|
||||||
|
<div class="nav-name"><strong><%= t(:language) %></strong></div>
|
||||||
|
<ul class="nav nav-pills language-nav">
|
||||||
|
<% @site_in_use_locales.each_with_index do |locale, i| %>
|
||||||
|
<li class="<%= 'active' if i == 0 %>">
|
||||||
|
<a data-toggle="tab" href=".<%= locale %>"><%= I18nVariable.from_locale(locale) %></a>
|
||||||
|
</li>
|
||||||
|
<% end %>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<!-- Language -->
|
||||||
|
<div class="tab-content language-area">
|
||||||
|
|
||||||
|
<% @site_in_use_locales.each_with_index do |locale, i| %>
|
||||||
|
|
||||||
|
<div class="<%= locale %> tab-pane fade <%= ( i == 0 ) ? "in active" : '' %>">
|
||||||
|
|
||||||
|
<!-- Description -->
|
||||||
|
<div class="control-group input-subtitle">
|
||||||
|
<label class="control-label muted"><%= t('survey_b.description') %></label>
|
||||||
|
<div class="controls">
|
||||||
|
<div class="textarea">
|
||||||
|
<%= f.fields_for :description_translations do |f| %>
|
||||||
|
<%= f.text_area locale, rows: 7, class: "input-block-level", value: (@setting.description_translations[locale] rescue nil) %>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Announcement -->
|
||||||
|
<div class="control-group input-content">
|
||||||
|
<label class="control-label muted"><%= t('survey_b.announcement') %></label>
|
||||||
|
<div class="controls">
|
||||||
|
<div class="textarea">
|
||||||
|
<%= f.fields_for :announcement_translations do |f| %>
|
||||||
|
<%= f.text_area locale, rows: 7, class: "input-block-level", :value => (@setting.announcement_translations[locale] rescue nil) %>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Form Actions -->
|
||||||
|
<div class="form-actions">
|
||||||
|
<%= f.submit t('submit'), class: 'btn btn-primary' %>
|
||||||
|
<%= link_to t('cancel'), get_go_back, :class=>"btn" %>
|
||||||
|
</div>
|
7
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/settings/edit.html.erb
vendored
Normal file
7
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/settings/edit.html.erb
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
|
||||||
|
<h1><%= t('survey_b.setting') %></h1>
|
||||||
|
<%= form_for @setting, url: panel_survey_b_back_end_setting_path, html: {class: "form-horizontal main-forms previewable"} do |f| %>
|
||||||
|
<fieldset>
|
||||||
|
<%= render :partial => 'form', :locals => {:f => f} %>
|
||||||
|
</fieldset>
|
||||||
|
<% end %>
|
13
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/survey_b/_answer.html.erb
vendored
Normal file
13
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/survey_b/_answer.html.erb
vendored
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
<tr id="<%= dom_id answer %>" class="with_action">
|
||||||
|
<td>
|
||||||
|
<%= check_box_tag 'to_delete[]', answer.id, false, :class => "checkbox_in_list" %>
|
||||||
|
</td>
|
||||||
|
<% [:contact_name, :contact_phone, :contact_e_mail, :comment_question].each do |question| %>
|
||||||
|
<td>
|
||||||
|
<%= answer[question] %>
|
||||||
|
</td>
|
||||||
|
<% end %>
|
||||||
|
<td>
|
||||||
|
<%= answer.created_at %>
|
||||||
|
</td>
|
||||||
|
</tr>
|
11
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/survey_b/_filter.html.erb
vendored
Normal file
11
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/survey_b/_filter.html.erb
vendored
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<div id='filter' class="subnav">
|
||||||
|
<div class="filters accordion-group">
|
||||||
|
<div id="sort_headers" class="table-label">
|
||||||
|
<%= render 'sort_headers' %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<% content_for :page_specific_javascript do %>
|
||||||
|
<%= javascript_include_tag "sort_header" %>
|
||||||
|
<% end %>
|
|
@ -0,0 +1,7 @@
|
||||||
|
<% _sort_args = [] %>
|
||||||
|
<% [:contact_name, :contact_phone, :contact_e_mail, :comment_question].each do |question| %>
|
||||||
|
<% _sort_args.push [question.to_s, question.to_s, 'span1', t("survey_b.#{question}_label")] %>
|
||||||
|
<% end %>
|
||||||
|
<% _sort_args.push ['created_at', 'created_at','span1', 'created_at'] %>
|
||||||
|
<%= render_sort_bar(true, delete_panel_survey_b_back_end_survey_b_index_path(:direction => params[:direction], :sort => params[:sort], :sort_options => params[:sort_options]),
|
||||||
|
*_sort_args).html_safe %>
|
257
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/survey_b/export.html.erb
vendored
Normal file
257
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/survey_b/export.html.erb
vendored
Normal file
|
@ -0,0 +1,257 @@
|
||||||
|
<table border="1">
|
||||||
|
<tr>
|
||||||
|
<td>標題</td>
|
||||||
|
<td><%= @period.title rescue '' %></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>問卷前言</td>
|
||||||
|
<td><%= @setting.description rescue '' %></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>填答人數</td>
|
||||||
|
<td><%= @answers.count rescue '' %></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
一 、 顧客滿意填表人身分分析
|
||||||
|
<table border="1">
|
||||||
|
<tr>
|
||||||
|
<td>身份</td>
|
||||||
|
<% @results[:person_question].each_with_index do |count, option| %>
|
||||||
|
<td><%= t("survey_b.person_question_options")[option] %></td>
|
||||||
|
<% end %>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>填答人數</td>
|
||||||
|
<% @results[:person_question].each_with_index do |count, option| %>
|
||||||
|
<td><%= count %></td>
|
||||||
|
<% end %>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>比例</td>
|
||||||
|
<% @results[:person_question].each_with_index do |count, option| %>
|
||||||
|
<% @pcount = count.to_f / @answers.count %>
|
||||||
|
<td><%= @pcount == 0 ? "0" : sprintf("%.2f", @pcount * 100 ) %>%</td>
|
||||||
|
<% end %>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
二、 整體行政品質表現比較分析
|
||||||
|
|
||||||
|
<br /><br />
|
||||||
|
對於總務處這一、二年之行政品質表現,您感覺是
|
||||||
|
<table border="1">
|
||||||
|
<tr>
|
||||||
|
<td>行政品質表現</td>
|
||||||
|
<% @results[:quality_question].each_with_index do |count, option| %>
|
||||||
|
<td><%= t("survey_b.quality_question_options")[option] %></td>
|
||||||
|
<% end %>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>填答人數</td>
|
||||||
|
<% @qcount = 0 %>
|
||||||
|
<% @results[:quality_question].each_with_index do |count, option| %>
|
||||||
|
<td><%= count %></td>
|
||||||
|
<% @qcount = @qcount + count %>
|
||||||
|
<% end %>
|
||||||
|
<td><%= @qcount %></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>比例</td>
|
||||||
|
<% @tqcount = 0 %>
|
||||||
|
<% @results[:quality_question].each_with_index do |count, option| %>
|
||||||
|
<% @pcount = count.to_f / @qcount %>
|
||||||
|
<td><%= @pcount == 0 ? "0" : sprintf("%.2f", @pcount * 100 ) %>%</td>
|
||||||
|
<% @tqcount = @tqcount + @pcount %>
|
||||||
|
<% end %>
|
||||||
|
<td><%= @tqcount %></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
對本處整體行政品質表現給予評鑑分數
|
||||||
|
<table border="1">
|
||||||
|
<tr>
|
||||||
|
<td>行政品質表現</td>
|
||||||
|
<% @results[:rate_question].each_with_index do |count, option| %>
|
||||||
|
<td><%= t("survey_b.rate_question_options")[option] %></td>
|
||||||
|
<% end %>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>填答人數</td>
|
||||||
|
<% @rcount = 0 %>
|
||||||
|
<% @results[:rate_question].each_with_index do |count, option| %>
|
||||||
|
<td><%= count %></td>
|
||||||
|
<% @rcount = @rcount + count %>
|
||||||
|
<% end %>
|
||||||
|
<td><%= @rcount %></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>比例</td>
|
||||||
|
<% @tqcount = 0 %>
|
||||||
|
<% @results[:rate_question].each_with_index do |count, option| %>
|
||||||
|
<% @pcount = count.to_f / @rcount %>
|
||||||
|
<td><%= @pcount == 0 ? "0" : sprintf("%.2f", @pcount * 100 ) %>%</td>
|
||||||
|
<% @tqcount = @tqcount + @pcount %>
|
||||||
|
<% end %>
|
||||||
|
<td><%= @tqcount %></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
以您與總務處各單位接觸之經驗,您覺得以下哪一組的服務品質較優。 (可複選)
|
||||||
|
<table border="1">
|
||||||
|
<tr>
|
||||||
|
<td>組別</td>
|
||||||
|
<% @results[:good_institutions].each do |institution, count| %>
|
||||||
|
<td><%= t("survey_b.institutions.#{institution}") %></td>
|
||||||
|
<% end %>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>人數</td>
|
||||||
|
<% @gcount = 0 %>
|
||||||
|
<% @results[:good_institutions].each do |institution, count| %>
|
||||||
|
<td><%= count %></td>
|
||||||
|
<% @gcount = @gcount + count %>
|
||||||
|
<% end %>
|
||||||
|
<td><%= @gcount %></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>比例</td>
|
||||||
|
<% @tqcount = 0 %>
|
||||||
|
<% @results[:good_institutions].each do |institution, count| %>
|
||||||
|
<% @pcount = count.to_f / @gcount %>
|
||||||
|
<td><%= @pcount == 0 ? "0" : sprintf("%.2f", @pcount * 100 ) %>%</td>
|
||||||
|
<% @tqcount = @tqcount + @pcount %>
|
||||||
|
<% end %>
|
||||||
|
<td><%= @tqcount %></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
以您與總務處各單位接觸之經驗,您覺得以下哪一組的服務品質尚待改進。 (可複選)
|
||||||
|
<table border="1">
|
||||||
|
<tr>
|
||||||
|
<td>組別</td>
|
||||||
|
<% @results[:bad_institutions].each do |institution, count| %>
|
||||||
|
<td><%= t("survey_b.institutions.#{institution}") %></td>
|
||||||
|
<% end %>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>人數</td>
|
||||||
|
<% @bcount = 0 %>
|
||||||
|
<% @results[:bad_institutions].each do |institution, count| %>
|
||||||
|
<td><%= count %></td>
|
||||||
|
<% @bcount = @bcount + count %>
|
||||||
|
<% end %>
|
||||||
|
<td><%= @bcount %></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>比例</td>
|
||||||
|
<% @tqcount = 0 %>
|
||||||
|
<% @results[:bad_institutions].each do |institution, count| %>
|
||||||
|
<% @pcount = count.to_f / @bcount %>
|
||||||
|
<td><%= @pcount == 0 ? "0" : sprintf("%.2f", @pcount * 100 ) %>%</td>
|
||||||
|
<% @tqcount = @tqcount + @pcount %>
|
||||||
|
<% end %>
|
||||||
|
<td><%= @tqcount %></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<br /><br />
|
||||||
|
三、 各單位顧客滿意度調查分析
|
||||||
|
<table border="1">
|
||||||
|
<tr>
|
||||||
|
<td>組別</td>
|
||||||
|
<% @results[:bad_institutions].each do |institution, count| %>
|
||||||
|
<td><%= t("survey_b.institutions.#{institution}") %></td>
|
||||||
|
<% end %>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<% @tcount = 0 %>
|
||||||
|
<td><%= t('survey_b.answered_sum') %></td>
|
||||||
|
<% t('survey_b.institutions').each do |i_key, institution| %>
|
||||||
|
<% if @results[i_key]['count'] == 0 %>
|
||||||
|
<td><%= t('survey_b.no_data') %></td>
|
||||||
|
<% @tcount = @tcount + @results[i_key]['count'] %>
|
||||||
|
<% else %>
|
||||||
|
<td><%= sprintf("%.2f", ( @results[i_key]['sum'].to_f / t('survey_b.questions').count.to_f ) / @results[i_key]['count'].to_f ) %></td>
|
||||||
|
<% @tcount = @tcount + (( @results[i_key]['sum'].to_f / t('survey_b.questions').count.to_f ) / @results[i_key]['count'].to_f ) %>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
<td><%= @tcount %></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<% @tcount = 0 %>
|
||||||
|
<td><%= t('survey_b.answered_sum7') %></td>
|
||||||
|
<% t('survey_b.institutions').each do |i_key, institution| %>
|
||||||
|
<% if @results[i_key]['count'] == 0 %>
|
||||||
|
<td><%= t('survey_b.no_data') %></td>
|
||||||
|
<% @tcount = @tcount + @results[i_key]['count'] %>
|
||||||
|
<% else %>
|
||||||
|
<td><%= sprintf("%.2f", ( @results[i_key]['sum7'].to_f / 7.0 ) / @results[i_key]['count'].to_f ) %></td>
|
||||||
|
<% @tcount = @tcount + ( ( @results[i_key]['sum7'].to_f / 7.0 ) / @results[i_key]['count'].to_f ) %>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
<td><%= @tcount %></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<% @tcount = 0 %>
|
||||||
|
<td><%= t('survey_b.answered_count') %></td>
|
||||||
|
<% t('survey_b.institutions').each do |i_key, institution| %>
|
||||||
|
<td><%= @results[i_key]['count'] %></td>
|
||||||
|
<% @tcount = @tcount + @results[i_key]['count'] %>
|
||||||
|
<% end %>
|
||||||
|
<td><%= @tcount %></td>
|
||||||
|
</tr>
|
||||||
|
<% t('survey_b.questions').each do |q_key, question| %>
|
||||||
|
<% @tcount = 0 %>
|
||||||
|
<tr>
|
||||||
|
<td><%= question.sub /\d\./, '' %></td>
|
||||||
|
|
||||||
|
<% t('survey_b.institutions').each do |i_key, institution| %>
|
||||||
|
<% if @results[i_key]['count'] == 0 %>
|
||||||
|
<td><%= t('survey_b.no_data') %></td>
|
||||||
|
<% @tcount = @tcount + @results[i_key]['count'] %>
|
||||||
|
<% else %>
|
||||||
|
<td><%= sprintf("%.2f", ( @results[i_key][q_key].to_f / @results[i_key]['count'].to_f )) %></td>
|
||||||
|
<% @tcount = @tcount + ( @results[i_key][q_key].to_f / @results[i_key]['count'].to_f ) %>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
<td><%= @tcount %></td>
|
||||||
|
</tr>
|
||||||
|
<% end %>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
<br /><br />
|
||||||
|
您覺得本處之行政品質有那些地方尚待改進嗎?
|
||||||
|
<table border="1">
|
||||||
|
<tr>
|
||||||
|
<td>填答人數</td>
|
||||||
|
<td><%= @comment_question.count %></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
<br /><br />
|
||||||
|
<table border="0">
|
||||||
|
<tr>
|
||||||
|
<td>發佈日期</td>
|
||||||
|
<td><%= display_date_time @period.start_date %></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>截止日期</td>
|
||||||
|
<td><%= display_date_time @period.end_date %></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
33
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/survey_b/index.html.erb
vendored
Normal file
33
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/survey_b/index.html.erb
vendored
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
<% set_default_index do
|
||||||
|
objects @answers
|
||||||
|
quick_edit_link type: 'delete',
|
||||||
|
link: 'panel_survey_b_back_end_survey_b_path',
|
||||||
|
link_option: ":period=>params[:period],:page=>params[:page]"
|
||||||
|
|
||||||
|
field db_field: 'contact_name',
|
||||||
|
translation: 'survey_b.contact_name_label',
|
||||||
|
quick_edit: true,
|
||||||
|
sort: 'contact_name',
|
||||||
|
header_class: 'span3'
|
||||||
|
field db_field: 'contact_phone',
|
||||||
|
translation: 'survey_b.contact_phone_label',
|
||||||
|
sort: 'contact_phone',
|
||||||
|
header_class: 'span3'
|
||||||
|
field db_field: 'contact_e_mail',
|
||||||
|
translation: 'survey_b.contact_e_mail_label',
|
||||||
|
sort: 'contact_e_mail',
|
||||||
|
header_class: 'span5'
|
||||||
|
field db_field: 'comment_question',
|
||||||
|
translation: 'survey_b.comment_question_label',
|
||||||
|
sort: 'comment_question',
|
||||||
|
header_class: 'span5'
|
||||||
|
field db_field: 'created_at',
|
||||||
|
translation: 'survey_b.created_at',
|
||||||
|
display_option: 'display_date_time(value)',
|
||||||
|
hide: 'phone',
|
||||||
|
sort: 'created_at'
|
||||||
|
footer link: 'panel_survey_b_back_end_periods_path',
|
||||||
|
link_name: t(:back) + t('survey_b.survey_b')
|
||||||
|
end %>
|
||||||
|
|
||||||
|
<%= render 'admin/default_index/index' %>
|
4
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/survey_b/index.js.erb
vendored
Normal file
4
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/survey_b/index.js.erb
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
$("#delete_all").attr("action", "<%= delete_panel_survey_b_back_end_survey_b_index_path(:direction => params[:direction], :sort => params[:sort], :filter => @filter, :new_filter => nil, :sort_options => params[:sort_options]) %>");
|
||||||
|
$("#sort_headers").html("<%= j render 'sort_headers' %>");
|
||||||
|
$("#tbody_survey_answers").html("<%= j render :partial => 'answer', :collection => @answers %>");
|
||||||
|
$("#survey_answers_pagination").html("<%= j paginate @answers %>");
|
134
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/survey_b/result.html.erb
vendored
Normal file
134
vendor/built_in_modules/survey_b/app/views/panel/survey_b/back_end/survey_b/result.html.erb
vendored
Normal file
|
@ -0,0 +1,134 @@
|
||||||
|
<% if @period %>
|
||||||
|
<h1><%= @period.title %></h1>
|
||||||
|
<h4>
|
||||||
|
<%= t('survey_b.period') %>:
|
||||||
|
<%= display_date_time @period.start_date %>
|
||||||
|
-
|
||||||
|
<%= display_date_time @period.end_date %>
|
||||||
|
</h4>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<table class="table main-list">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th></th>
|
||||||
|
<th><%= t('survey_b.answered_sum') %></th>
|
||||||
|
<th><%= t('survey_b.answered_sum7') %></th>
|
||||||
|
<th><%= t('survey_b.answered_count') %></th>
|
||||||
|
<% t('survey_b.questions').each do |q_key, question| %>
|
||||||
|
<th>
|
||||||
|
<%= question.sub /\d\./, '' %>
|
||||||
|
</th>
|
||||||
|
<% end %>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<% (t('survey_b.institutions').merge({ 'all' => t('survey_b.answered_sum') })).each do |i_key, institution| %>
|
||||||
|
<tr>
|
||||||
|
<td><%= institution %></td>
|
||||||
|
<td>
|
||||||
|
<% if @results[i_key]['count'] == 0 %>
|
||||||
|
<%= t('survey_b.no_data') %>
|
||||||
|
<% else %>
|
||||||
|
<%= sprintf("%.2f", ( @results[i_key]['sum'].to_f / t('survey_b.questions').count.to_f ) / @results[i_key]['count'].to_f ) %>
|
||||||
|
<%#= ( ( @results[i_key]['sum'].to_f / t('survey_b.questions').count.to_f ) / @results[i_key]['count'].to_f ).round(2) %>
|
||||||
|
<% end %>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<% if @results[i_key]['count'] == 0 %>
|
||||||
|
<%= t('survey_b.no_data') %>
|
||||||
|
<% else %>
|
||||||
|
<%= sprintf("%.2f", ( @results[i_key]['sum7'].to_f / 7.0 ) / @results[i_key]['count'].to_f ) %>
|
||||||
|
<%#= ( ( @results[i_key]['sum7'].to_f / 7.0 ) / @results[i_key]['count'].to_f ).round(2) %>
|
||||||
|
<% end %>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<%= @results[i_key]['count'] %>
|
||||||
|
</td>
|
||||||
|
<% t('survey_b.questions').each do |q_key, question| %>
|
||||||
|
<td>
|
||||||
|
<% if @results[i_key]['count'] == 0 %>
|
||||||
|
<%= t('survey_b.no_data') %>
|
||||||
|
<% else %>
|
||||||
|
<%= sprintf("%.2f", ( @results[i_key][q_key].to_f / @results[i_key]['count'].to_f )) %>
|
||||||
|
<%#= ( @results[i_key][q_key].to_f / @results[i_key]['count'].to_f ).round(2) %>
|
||||||
|
<% end %>
|
||||||
|
</td>
|
||||||
|
<% end %>
|
||||||
|
</tr>
|
||||||
|
<% end %>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<% [:good_institutions, :bad_institutions, :person_question, :rate_question, :quality_question].each do |item| %>
|
||||||
|
<li>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td><div id="<%= item.to_s %>_chart" style="width: 600px; height: 300px;"></div>
|
||||||
|
</td>
|
||||||
|
<td><div id="<%= item.to_s %>_bar_chart" style="width: 600px; height: 300px;"></div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<% end %>
|
||||||
|
</ul>
|
||||||
|
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
window.google.load("visualization", "1", {packages: ["columnchart"]});
|
||||||
|
window.google.load("visualization", "1", {packages:["corechart"]});
|
||||||
|
window.google.setOnLoadCallback(function(){
|
||||||
|
<% [:good_institutions, :bad_institutions].each do |item| %>
|
||||||
|
|
||||||
|
<% @tcount = 0 %>
|
||||||
|
var data_<%= item %> = google.visualization.arrayToDataTable([
|
||||||
|
['<%= t("survey_b.#{item}_label") %>', ''],
|
||||||
|
<% @results[item].each do |institution, count| %>
|
||||||
|
['<%= t("survey_b.institutions.#{institution}") %>', <%= count %>],
|
||||||
|
<% @tcount = @tcount + count %>
|
||||||
|
<% end %>
|
||||||
|
]);
|
||||||
|
var chart_<%= item %> = new google.visualization.PieChart(document.getElementById('<%= item.to_s %>_chart'));
|
||||||
|
chart_<%= item %>.draw(data_<%= item %>, {title: '<%= t("survey_b.#{item}_label") %>'});
|
||||||
|
|
||||||
|
//bar
|
||||||
|
|
||||||
|
var data_bar_<%= item %> = google.visualization.arrayToDataTable([
|
||||||
|
['<%= t("survey_b.#{item}_label") %>', '%'],
|
||||||
|
<% @results[item].each do |institution, count| %>
|
||||||
|
['<%= t("survey_b.institutions.#{institution}") %>', <%= count == 0 ? "0" : sprintf("%.2f", (count.to_f / @tcount ) * 100 ) %>],
|
||||||
|
<% end %>
|
||||||
|
]);
|
||||||
|
var bar_chart_<%= item %> = new google.visualization.ColumnChart(document.getElementById("<%= item.to_s %>_bar_chart"));
|
||||||
|
bar_chart_<%= item %>.draw(data_bar_<%= item %>, {title: '<%= t("survey_b.#{item}_label") %>'});
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% [:person_question, :rate_question, :quality_question].each do |item| %>
|
||||||
|
|
||||||
|
<% @tcount = 0 %>
|
||||||
|
var data_<%= item %> = google.visualization.arrayToDataTable([
|
||||||
|
['<%= t("survey_b.#{item}_label") %>', ''],
|
||||||
|
<% @results[item].each_with_index do |count, option| %>
|
||||||
|
['<%= t("survey_b.#{item}_options")[option] %>', <%= count %>],
|
||||||
|
<% @tcount = @tcount + count %>
|
||||||
|
<% end %>
|
||||||
|
]);
|
||||||
|
var chart_<%= item %> = new google.visualization.PieChart(document.getElementById('<%= item.to_s %>_chart'));
|
||||||
|
chart_<%= item %>.draw(data_<%= item %>, {title: '<%= t("survey_b.#{item}_label") %>'});
|
||||||
|
|
||||||
|
//bar
|
||||||
|
|
||||||
|
var data_bar_<%= item %> = google.visualization.arrayToDataTable([
|
||||||
|
['<%= t("survey_b.#{item}_label") %>', '%'],
|
||||||
|
<% @results[item].each_with_index do |count, option| %>
|
||||||
|
['<%= t("survey_b.#{item}_options")[option] %>', <%= count == 0 ? "0" : sprintf("%.2f", (count.to_f / @tcount ) * 100 ) %>],
|
||||||
|
<% end %>
|
||||||
|
]);
|
||||||
|
|
||||||
|
var bar_chart_<%= item %> = new google.visualization.ColumnChart(document.getElementById("<%= item.to_s %>_bar_chart"));
|
||||||
|
bar_chart_<%= item %>.draw(data_bar_<%= item %>, {title: '<%= t("survey_b.#{item}_label") %>'});
|
||||||
|
<% end %>
|
||||||
|
});
|
||||||
|
</script>
|
|
@ -0,0 +1 @@
|
||||||
|
alert("<%= @answer_error %>");
|
|
@ -0,0 +1,2 @@
|
||||||
|
alert("<%= t('survey.answer_success')%>");
|
||||||
|
window.location.href = "<%= root_path %>";
|
|
@ -0,0 +1,32 @@
|
||||||
|
<h1><%= @period.title %></h1>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<section>
|
||||||
|
<div class="o-question">
|
||||||
|
<% if @period.isAvailable? %>
|
||||||
|
<%= form_for :answer, :url => panel_survey_b_front_end_survey_b_index_path, :method => :get, :html => {:class => 'survey_b clear'} do |f| %>
|
||||||
|
<%= f.hidden_field :standalone, :value => true, :name => :standalone %>
|
||||||
|
<%= f.hidden_field :period_id, :value => @period.id, :name => :period %>
|
||||||
|
<p>
|
||||||
|
<%= p @setting.announcement.gsub("\n", '<br />').html_safe %>
|
||||||
|
</p>
|
||||||
|
<br />
|
||||||
|
<p>
|
||||||
|
<%= f.check_box :agree, :name => :agree %>
|
||||||
|
<%= f.label :agree, t('survey_b.agree_check'), :style => "display:inline" %>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="o-question-action">
|
||||||
|
<%= f.submit t('submit'), :class => 'survey-submit' %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
<% else %>
|
||||||
|
<% status_type = t('survey_b.status_types') %>
|
||||||
|
<p class="text-warning"><h4><%= t('survey_b.survey_b') + status_type[@period.get_status_type.to_sym] %></h4></p>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
<% content_for :page_stylesheets do %>
|
||||||
|
<link href='/assets/questionnaire.css' rel='stylesheet' type='text/css' />
|
||||||
|
<% end %>
|
|
@ -0,0 +1,4 @@
|
||||||
|
<script type="text/javascript">
|
||||||
|
<%= render 'answer_error' %>
|
||||||
|
window.history.back();
|
||||||
|
</script>
|
|
@ -0,0 +1 @@
|
||||||
|
<%= render 'answer_error' %>
|
|
@ -0,0 +1,3 @@
|
||||||
|
<script type="text/javascript">
|
||||||
|
<%= render 'answer_success' %>
|
||||||
|
</script>
|
|
@ -0,0 +1 @@
|
||||||
|
<%= render 'answer_success' %>
|
145
vendor/built_in_modules/survey_b/app/views/panel/survey_b/front_end/survey_b/index.html.erb
vendored
Normal file
145
vendor/built_in_modules/survey_b/app/views/panel/survey_b/front_end/survey_b/index.html.erb
vendored
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
<% # encoding: utf-8 %>
|
||||||
|
<% institutions = t('survey_b.institutions') %>
|
||||||
|
<h1><%= @period.title %></h1>
|
||||||
|
<div>
|
||||||
|
<section>
|
||||||
|
<div class="o-question">
|
||||||
|
<%= form_for :answer, :url => panel_survey_b_front_end_survey_b_index_path(:standalone => true), :html => {:class => 'survey_b clear'} do |f| %>
|
||||||
|
<div class="o-question-description">
|
||||||
|
<%= @setting.description.gsub("\n", '<br />').html_safe %>
|
||||||
|
</div>
|
||||||
|
<ol class="o-question-list">
|
||||||
|
<li class="question-item institution_check">
|
||||||
|
<%= f.label :institution_check, t('survey_b.institution_check_label'), :class => "o-question-title" %>
|
||||||
|
<%= f.fields_for :institution_check do |cf| %>
|
||||||
|
<% institutions.each do |key, institution_name| %>
|
||||||
|
<div style="display: inline; margin-right: 60px;">
|
||||||
|
<%= cf.check_box key, :'data-institution' => key %>
|
||||||
|
<%= cf.label key, institution_name, :style => "display:inline" %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
</li>
|
||||||
|
<% institutions.each do |key, institution_name| %>
|
||||||
|
<li class="question-item <%= key%>_group_wrapper hide">
|
||||||
|
<%= f.label "#{key}_group", t('survey_b.institution_group_label', :institution => institution_name), :class => "o-question-title" %>
|
||||||
|
<%= f.fields_for key do |rgf| %>
|
||||||
|
<table class="o-question-group view-grid">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th></th>
|
||||||
|
<% t('survey_b.degrees').each do |degree| %>
|
||||||
|
<th>
|
||||||
|
<%= degree %>
|
||||||
|
</th>
|
||||||
|
<% end %>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<% j = 0 %>
|
||||||
|
<% t('survey_b.questions').each do |q_key, question| %>
|
||||||
|
<tr<%= (' class="odd"').html_safe if (j % 2 == 0) %>>
|
||||||
|
<th class="o-question-title" style="text-align: right;">
|
||||||
|
<%= question %>
|
||||||
|
</th>
|
||||||
|
<% t('survey_b.degrees').each_with_index do |degree, d| %>
|
||||||
|
<td>
|
||||||
|
<%= rgf.radio_button q_key, d %>
|
||||||
|
</td>
|
||||||
|
<% end %>
|
||||||
|
</tr>
|
||||||
|
<% j += 1 %>
|
||||||
|
<% end %>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<% end %>
|
||||||
|
</li>
|
||||||
|
<% end %>
|
||||||
|
<li class"question-item">
|
||||||
|
<%= f.label :quality_question, t('survey_b.quality_question_label'), :class => "o-question-title" %>
|
||||||
|
<ul class="o-question-group view-list">
|
||||||
|
<% t('survey_b.quality_question_options').each_with_index do |option, i| %>
|
||||||
|
<li>
|
||||||
|
<%= f.radio_button :quality_question, i %>
|
||||||
|
<%= f.label "quality_question_#{i}", option, :class => 'o-question-option' %>
|
||||||
|
</li>
|
||||||
|
<% end %>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<% [:good_institutions, :bad_institutions].each do |item| %>
|
||||||
|
<li class"question-item">
|
||||||
|
<%= f.label item, t("survey_b.#{item.to_s}_label"), :class => "o-question-title" %>
|
||||||
|
<%= f.fields_for item do |cf| %>
|
||||||
|
<% institutions.each do |key, institution_name| %>
|
||||||
|
<div style="display: inline; margin-right: 60px;">
|
||||||
|
<%= cf.check_box key, :'data-institution' => key %>
|
||||||
|
<%= cf.label key, institution_name, :style => "display:inline" %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
</li>
|
||||||
|
<% end %>
|
||||||
|
<li class"question-item">
|
||||||
|
<%= f.label :rate_question, t('survey_b.rate_question_label'), :class => "o-question-title" %>
|
||||||
|
<ul class="o-question-group view-list">
|
||||||
|
<% t('survey_b.rate_question_options').each_with_index do |option, i| %>
|
||||||
|
<li>
|
||||||
|
<%= f.radio_button :rate_question, i %>
|
||||||
|
<%= f.label "quality_question_#{i}", option, :class => 'o-question-option' %>
|
||||||
|
</li>
|
||||||
|
<% end %>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li class"question-item">
|
||||||
|
<%= f.label :person_question, t('survey_b.person_question_label'), :class => "o-question-title" %>
|
||||||
|
<ul class="o-question-group view-list">
|
||||||
|
<% t('survey_b.person_question_options').each_with_index do |option, i| %>
|
||||||
|
<li>
|
||||||
|
<%= f.radio_button :person_question, i %>
|
||||||
|
<%= f.label "quality_question_#{i}", option, :class => 'o-question-option' %>
|
||||||
|
</li>
|
||||||
|
<% end %>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li class"question-item">
|
||||||
|
<p><%= t('survey_b.comment_question_notice') %></p>
|
||||||
|
<%= f.label :comment_question, t('survey_b.comment_question_label'), :class => "o-question-title" %>
|
||||||
|
<%= f.text_area :comment_question, :rows => 5 %>
|
||||||
|
</li>
|
||||||
|
<li class"question-item">
|
||||||
|
<p><%== t('survey_b.contact_notice') %></p>
|
||||||
|
<% [:contact_name, :contact_phone, :contact_e_mail].each do |item| %>
|
||||||
|
<%= f.label :item, t("survey_b.#{item.to_s}_label"), :class => "o-question-title" %>
|
||||||
|
<%= f.text_field item %>
|
||||||
|
<% end %>
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
<div class="o-question-action">
|
||||||
|
<%= f.submit t('submit'), :class => 'survey-submit' %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
<% content_for :page_stylesheets do %>
|
||||||
|
<link href='/assets/questionnaire.css' rel='stylesheet' type='text/css' />
|
||||||
|
<% end %>
|
||||||
|
<script type="text/javascript" src="/assets/jquery.form.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
$('form.survey_b').ajaxForm({
|
||||||
|
beforeSubmit: function(a,f,o) {
|
||||||
|
o.dataType = 'script';
|
||||||
|
},
|
||||||
|
success: function(data) {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$('.institution_check input[type=checkbox]').on('click', function(){
|
||||||
|
$institution_group_wrapper = $('.' + $(this).attr('data-institution') + '_group_wrapper');
|
||||||
|
if ( $(this).attr('checked') ) {
|
||||||
|
$institution_group_wrapper.show();
|
||||||
|
} else {
|
||||||
|
$institution_group_wrapper.hide();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
|
@ -0,0 +1,6 @@
|
||||||
|
<h1><%= t('survey_b.no_survey') %></h1>
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(document).ready().delay(2000).queue(function() {
|
||||||
|
window.location.href = "<%= root_path %>";
|
||||||
|
});
|
||||||
|
</script>
|
|
@ -0,0 +1,3 @@
|
||||||
|
<script type="text/javascript">
|
||||||
|
window.location.href = "<%= @redirect_url %>";
|
||||||
|
</script>
|
|
@ -0,0 +1,105 @@
|
||||||
|
en:
|
||||||
|
|
||||||
|
survey_b:
|
||||||
|
survey_b: 滿意度調查
|
||||||
|
result: 結果
|
||||||
|
export: 匯出
|
||||||
|
|
||||||
|
setting: 設定
|
||||||
|
description: 前言
|
||||||
|
announcement: 個資宣告
|
||||||
|
agree_check: 同意
|
||||||
|
|
||||||
|
created_at: 日期
|
||||||
|
|
||||||
|
institution_check_label: 您與本處有業務接觸之單位為:(請點選)
|
||||||
|
institution_group_label: "您對 %{institution} 所提供之"
|
||||||
|
|
||||||
|
not_answered: 沒有回答
|
||||||
|
|
||||||
|
period: 調查期間
|
||||||
|
period_title: 問卷標題
|
||||||
|
no_survey: 尚無滿意度調查
|
||||||
|
|
||||||
|
status: 狀態
|
||||||
|
status_types:
|
||||||
|
type1: 調查中
|
||||||
|
type2: 未開始
|
||||||
|
type3: 已結束
|
||||||
|
|
||||||
|
no_data: 沒有數據
|
||||||
|
answered_count: 答題人數
|
||||||
|
answered_sum: 整體平均
|
||||||
|
answered_sum7: 七項平均
|
||||||
|
|
||||||
|
institutions:
|
||||||
|
institution1: 文書組
|
||||||
|
institution2: 事務組
|
||||||
|
institution3: 保管組
|
||||||
|
institution4: 營繕組
|
||||||
|
institution5: 出納組
|
||||||
|
institution6: 採購組
|
||||||
|
institution7: 經營管理組
|
||||||
|
institution8: 駐警隊
|
||||||
|
institution9: 社科院總務分處
|
||||||
|
institution10: 醫學院總務分處
|
||||||
|
# institution11: 總務處秘書室
|
||||||
|
|
||||||
|
degrees:
|
||||||
|
- 很滿意
|
||||||
|
- 滿意
|
||||||
|
- 尚可
|
||||||
|
- 不滿意
|
||||||
|
- 非常不滿意
|
||||||
|
|
||||||
|
questions:
|
||||||
|
question1: 1.服務態度
|
||||||
|
question2: 2.主動服務之精神
|
||||||
|
question3: 3.電話禮貌
|
||||||
|
question4: 4.電話接聽速度
|
||||||
|
question5: 5.承辦人專業態度
|
||||||
|
question6: 6.辦公室環境
|
||||||
|
question7: 7.業務辦理效率
|
||||||
|
question8: 8.電腦化作業
|
||||||
|
|
||||||
|
quality_question_column: 行政品質
|
||||||
|
quality_question_label: 對於總務處這一、二年之行政品質表現,您感覺是
|
||||||
|
quality_question_options:
|
||||||
|
- 有顯著改善
|
||||||
|
- 有些改善
|
||||||
|
- 沒有改善
|
||||||
|
- 降低
|
||||||
|
|
||||||
|
good_institutions_column: 品質較優
|
||||||
|
good_institutions_label: 以您與總務處各單位接觸之經驗,您覺得那一組的服務品質較優。(可複選,可不選)
|
||||||
|
bad_institutions_column: 尚待改進
|
||||||
|
bad_institutions_label: 以您與總務處各單位接觸之經驗,您覺得那一組的服務品質尚待改進。(可複選,可不選)
|
||||||
|
|
||||||
|
rate_question_column: 評鑑分數
|
||||||
|
rate_question_label: 若請您對本處整體行政品質表現給予評鑑分數,您會給幾分?
|
||||||
|
rate_question_options:
|
||||||
|
- 90分以上(極優)
|
||||||
|
- 80分至90分(優良)
|
||||||
|
- 70分至80分(尚可)
|
||||||
|
- 60至70分(待提昇)
|
||||||
|
- 60分以下(亟待改善)
|
||||||
|
|
||||||
|
person_question_column: 身分
|
||||||
|
person_question_label: 您的身分是
|
||||||
|
person_question_options:
|
||||||
|
- 教師
|
||||||
|
- 職工
|
||||||
|
- 學生
|
||||||
|
- 廠商
|
||||||
|
- 其他
|
||||||
|
|
||||||
|
comment_question_notice: 您覺得本處之行政品質有那些地方尚有待改進嗎?(歡迎您將反應意見具體描述,以供我們檢討改進,謝謝您的指教!)
|
||||||
|
comment_question_label: 意見欄:
|
||||||
|
|
||||||
|
contact_notice: 請您填寫以下個人資料,這些資訊僅供調查結束後辦理抽獎活動,及加速處理回覆您的建議事項之用。您的個人資料絕不會外流,請放心填寫!總務處感謝您的支持與愛護。
|
||||||
|
contact_name_label: 填表人
|
||||||
|
contact_phone_label: 聯絡電話
|
||||||
|
contact_e_mail_label: e-mail
|
||||||
|
|
||||||
|
frontend:
|
||||||
|
survey_b: 滿意度調查前台
|
|
@ -0,0 +1,105 @@
|
||||||
|
zh_tw:
|
||||||
|
|
||||||
|
survey_b:
|
||||||
|
survey_b: 滿意度調查
|
||||||
|
result: 結果
|
||||||
|
export: 匯出
|
||||||
|
|
||||||
|
setting: 設定
|
||||||
|
description: 前言
|
||||||
|
announcement: 個資宣告
|
||||||
|
agree_check: 同意
|
||||||
|
|
||||||
|
created_at: 日期
|
||||||
|
|
||||||
|
institution_check_label: 您與本處有業務接觸之單位為:(請點選)
|
||||||
|
institution_group_label: "您對 %{institution} 所提供之"
|
||||||
|
|
||||||
|
not_answered: 沒有回答
|
||||||
|
|
||||||
|
period: 調查期間
|
||||||
|
period_title: 問卷標題
|
||||||
|
no_survey: 尚無滿意度調查
|
||||||
|
|
||||||
|
status: 狀態
|
||||||
|
status_types:
|
||||||
|
type1: 調查中
|
||||||
|
type2: 未開始
|
||||||
|
type3: 已結束
|
||||||
|
|
||||||
|
no_data: 沒有數據
|
||||||
|
answered_count: 答題人數
|
||||||
|
answered_sum: 整體平均
|
||||||
|
answered_sum7: 七項平均
|
||||||
|
|
||||||
|
institutions:
|
||||||
|
institution1: 文書組
|
||||||
|
institution2: 事務組
|
||||||
|
institution3: 保管組
|
||||||
|
institution4: 營繕組
|
||||||
|
institution5: 出納組
|
||||||
|
institution6: 採購組
|
||||||
|
institution7: 經營管理組
|
||||||
|
institution8: 駐警隊
|
||||||
|
institution9: 社科院總務分處
|
||||||
|
institution10: 醫學院總務分處
|
||||||
|
# institution11: 總務處秘書室
|
||||||
|
|
||||||
|
degrees:
|
||||||
|
- 很滿意
|
||||||
|
- 滿意
|
||||||
|
- 尚可
|
||||||
|
- 不滿意
|
||||||
|
- 非常不滿意
|
||||||
|
|
||||||
|
questions:
|
||||||
|
question1: 1.服務態度
|
||||||
|
question2: 2.主動服務之精神
|
||||||
|
question3: 3.電話禮貌
|
||||||
|
question4: 4.電話接聽速度
|
||||||
|
question5: 5.承辦人專業態度
|
||||||
|
question6: 6.辦公室環境
|
||||||
|
question7: 7.業務辦理效率
|
||||||
|
question8: 8.電腦化作業
|
||||||
|
|
||||||
|
quality_question_column: 行政品質
|
||||||
|
quality_question_label: 對於總務處這一、二年之行政品質表現,您感覺是
|
||||||
|
quality_question_options:
|
||||||
|
- 有顯著改善
|
||||||
|
- 有些改善
|
||||||
|
- 沒有改善
|
||||||
|
- 降低
|
||||||
|
|
||||||
|
good_institutions_column: 品質較優
|
||||||
|
good_institutions_label: 以您與總務處各單位接觸之經驗,您覺得那一組的服務品質較優。(可複選,可不選)
|
||||||
|
bad_institutions_column: 尚待改進
|
||||||
|
bad_institutions_label: 以您與總務處各單位接觸之經驗,您覺得那一組的服務品質尚待改進。(可複選,可不選)
|
||||||
|
|
||||||
|
rate_question_column: 評鑑分數
|
||||||
|
rate_question_label: 若請您對本處整體行政品質表現給予評鑑分數,您會給幾分?
|
||||||
|
rate_question_options:
|
||||||
|
- 90分以上(極優)
|
||||||
|
- 80分至90分(優良)
|
||||||
|
- 70分至80分(尚可)
|
||||||
|
- 60至70分(待提昇)
|
||||||
|
- 60分以下(亟待改善)
|
||||||
|
|
||||||
|
person_question_column: 身分
|
||||||
|
person_question_label: 您的身分是
|
||||||
|
person_question_options:
|
||||||
|
- 教師
|
||||||
|
- 職工
|
||||||
|
- 學生
|
||||||
|
- 廠商
|
||||||
|
- 其他
|
||||||
|
|
||||||
|
comment_question_notice: 您覺得本處之行政品質有那些地方尚有待改進嗎?(歡迎您將反應意見具體描述,以供我們檢討改進,謝謝您的指教!)
|
||||||
|
comment_question_label: 意見欄:
|
||||||
|
|
||||||
|
contact_notice: 請您填寫以下個人資料,這些資訊僅供調查結束後辦理抽獎活動,及加速處理回覆您的建議事項之用。您的個人資料絕不會外流,請放心填寫!總務處感謝您的支持與愛護。
|
||||||
|
contact_name_label: 填表人
|
||||||
|
contact_phone_label: 聯絡電話
|
||||||
|
contact_e_mail_label: e-mail
|
||||||
|
|
||||||
|
frontend:
|
||||||
|
survey_b: 滿意度調查前台
|
|
@ -0,0 +1,24 @@
|
||||||
|
Rails.application.routes.draw do
|
||||||
|
|
||||||
|
namespace :panel do
|
||||||
|
namespace :survey_b do
|
||||||
|
namespace :back_end do
|
||||||
|
resources :survey_b do
|
||||||
|
collection do
|
||||||
|
get 'result'
|
||||||
|
get 'delete'
|
||||||
|
get 'export'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
resources :periods
|
||||||
|
resource :setting
|
||||||
|
end
|
||||||
|
namespace :front_end do
|
||||||
|
resources :survey_b do
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
match "/appfront/*path" => redirect("/panel/*path")
|
||||||
|
end
|
|
@ -0,0 +1,61 @@
|
||||||
|
module SurveyB
|
||||||
|
OrbitApp.registration "SurveyB",:type=> 'ModuleApp' do
|
||||||
|
module_label 'survey_b.survey_b'
|
||||||
|
base_url File.expand_path File.dirname(__FILE__)
|
||||||
|
|
||||||
|
version "0.1"
|
||||||
|
organization "Rulingcom"
|
||||||
|
author "RD dep"
|
||||||
|
intro "I am intro"
|
||||||
|
update_info 'some update_info'
|
||||||
|
|
||||||
|
front_end do
|
||||||
|
app_page 'survey_b' do
|
||||||
|
frontend_i18n "survey_b.frontend.survey_b"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
authorizable
|
||||||
|
|
||||||
|
widgets do
|
||||||
|
customize_widget "widget1" do
|
||||||
|
widget_i18n "survey_b.widget.widget1"
|
||||||
|
style []
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
side_bar do
|
||||||
|
head_label_i18n 'survey_b.survey_b',:icon_class=>"icons-bars"
|
||||||
|
available_for [:admin,:manager,:sub_manager]
|
||||||
|
active_for_controllers ({:private=>['survey_b', 'periods', 'settings']})
|
||||||
|
|
||||||
|
head_link_path "panel_survey_b_back_end_periods_path"
|
||||||
|
|
||||||
|
# context_link 'survey_b.result',
|
||||||
|
# :link_path=>"result_panel_survey_b_back_end_survey_b_index_path" ,
|
||||||
|
# :priority=>1,
|
||||||
|
# :active_for_action=>{:survey_b=>:result},
|
||||||
|
# :available_for => [:manager]
|
||||||
|
|
||||||
|
context_link 'list_',
|
||||||
|
:link_path=>"panel_survey_b_back_end_periods_path" ,
|
||||||
|
:priority=>1,
|
||||||
|
:active_for_action=>{:survey_b=>:index},
|
||||||
|
:available_for => [:manager]
|
||||||
|
|
||||||
|
# context_link 'survey_b.period',
|
||||||
|
# :link_path=>"panel_survey_b_back_end_periods_path" ,
|
||||||
|
# :priority=>1,
|
||||||
|
# :active_for_action=>{:periods=>:index},
|
||||||
|
# :available_for => [:manager]
|
||||||
|
|
||||||
|
context_link 'survey_b.setting',
|
||||||
|
:link_path=>"edit_panel_survey_b_back_end_setting_path" ,
|
||||||
|
:priority=>1,
|
||||||
|
:active_for_action=>{:settings=>[:edit, :update]},
|
||||||
|
:available_for => [:manager]
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
|
@ -0,0 +1,2 @@
|
||||||
|
module SurveyB
|
||||||
|
end
|
|
@ -0,0 +1,3 @@
|
||||||
|
module SurveyB
|
||||||
|
VERSION = "0.0.1"
|
||||||
|
end
|
|
@ -0,0 +1,4 @@
|
||||||
|
# desc "Explaining what the task does"
|
||||||
|
# task :survey_b do
|
||||||
|
# # Task goes here
|
||||||
|
# end
|
|
@ -0,0 +1,22 @@
|
||||||
|
$:.push File.expand_path("../lib", __FILE__)
|
||||||
|
|
||||||
|
# Maintain your gem's version:
|
||||||
|
require "survey_b/version"
|
||||||
|
|
||||||
|
# Describe your gem and declare its dependencies:
|
||||||
|
Gem::Specification.new do |s|
|
||||||
|
s.name = "survey_b"
|
||||||
|
s.version = SurveyB::VERSION
|
||||||
|
s.authors = ["TODO: Your name"]
|
||||||
|
s.email = ["TODO: Your email"]
|
||||||
|
s.homepage = "TODO"
|
||||||
|
s.summary = "TODO: Summary of SurveyB."
|
||||||
|
s.description = "TODO: Description of SurveyB."
|
||||||
|
|
||||||
|
s.files = Dir["{app,config,db,lib}/**/*"] + ["MIT-LICENSE", "Rakefile", "README.rdoc"]
|
||||||
|
s.test_files = Dir["test/**/*"]
|
||||||
|
|
||||||
|
s.add_dependency "rails", "~> 3.2.12"
|
||||||
|
|
||||||
|
s.add_development_dependency "sqlite3"
|
||||||
|
end
|
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"title": "survey_b",
|
||||||
|
"version": "0.1",
|
||||||
|
"organization": "Rulingcom",
|
||||||
|
"author": "RD dep",
|
||||||
|
"intro": "survey_b",
|
||||||
|
"update_info": "Some info",
|
||||||
|
"create_date": "05-14-2013",
|
||||||
|
"widgets": ["survey_bs"],
|
||||||
|
"category": [],
|
||||||
|
"enable_frontend": true
|
||||||
|
}
|
|
@ -0,0 +1,261 @@
|
||||||
|
== Welcome to Rails
|
||||||
|
|
||||||
|
Rails is a web-application framework that includes everything needed to create
|
||||||
|
database-backed web applications according to the Model-View-Control pattern.
|
||||||
|
|
||||||
|
This pattern splits the view (also called the presentation) into "dumb"
|
||||||
|
templates that are primarily responsible for inserting pre-built data in between
|
||||||
|
HTML tags. The model contains the "smart" domain objects (such as Account,
|
||||||
|
Product, Person, Post) that holds all the business logic and knows how to
|
||||||
|
persist themselves to a database. The controller handles the incoming requests
|
||||||
|
(such as Save New Account, Update Product, Show Post) by manipulating the model
|
||||||
|
and directing data to the view.
|
||||||
|
|
||||||
|
In Rails, the model is handled by what's called an object-relational mapping
|
||||||
|
layer entitled Active Record. This layer allows you to present the data from
|
||||||
|
database rows as objects and embellish these data objects with business logic
|
||||||
|
methods. You can read more about Active Record in
|
||||||
|
link:files/vendor/rails/activerecord/README.html.
|
||||||
|
|
||||||
|
The controller and view are handled by the Action Pack, which handles both
|
||||||
|
layers by its two parts: Action View and Action Controller. These two layers
|
||||||
|
are bundled in a single package due to their heavy interdependence. This is
|
||||||
|
unlike the relationship between the Active Record and Action Pack that is much
|
||||||
|
more separate. Each of these packages can be used independently outside of
|
||||||
|
Rails. You can read more about Action Pack in
|
||||||
|
link:files/vendor/rails/actionpack/README.html.
|
||||||
|
|
||||||
|
|
||||||
|
== Getting Started
|
||||||
|
|
||||||
|
1. At the command prompt, create a new Rails application:
|
||||||
|
<tt>rails new myapp</tt> (where <tt>myapp</tt> is the application name)
|
||||||
|
|
||||||
|
2. Change directory to <tt>myapp</tt> and start the web server:
|
||||||
|
<tt>cd myapp; rails server</tt> (run with --help for options)
|
||||||
|
|
||||||
|
3. Go to http://localhost:3000/ and you'll see:
|
||||||
|
"Welcome aboard: You're riding Ruby on Rails!"
|
||||||
|
|
||||||
|
4. Follow the guidelines to start developing your application. You can find
|
||||||
|
the following resources handy:
|
||||||
|
|
||||||
|
* The Getting Started Guide: http://guides.rubyonrails.org/getting_started.html
|
||||||
|
* Ruby on Rails Tutorial Book: http://www.railstutorial.org/
|
||||||
|
|
||||||
|
|
||||||
|
== Debugging Rails
|
||||||
|
|
||||||
|
Sometimes your application goes wrong. Fortunately there are a lot of tools that
|
||||||
|
will help you debug it and get it back on the rails.
|
||||||
|
|
||||||
|
First area to check is the application log files. Have "tail -f" commands
|
||||||
|
running on the server.log and development.log. Rails will automatically display
|
||||||
|
debugging and runtime information to these files. Debugging info will also be
|
||||||
|
shown in the browser on requests from 127.0.0.1.
|
||||||
|
|
||||||
|
You can also log your own messages directly into the log file from your code
|
||||||
|
using the Ruby logger class from inside your controllers. Example:
|
||||||
|
|
||||||
|
class WeblogController < ActionController::Base
|
||||||
|
def destroy
|
||||||
|
@weblog = Weblog.find(params[:id])
|
||||||
|
@weblog.destroy
|
||||||
|
logger.info("#{Time.now} Destroyed Weblog ID ##{@weblog.id}!")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
The result will be a message in your log file along the lines of:
|
||||||
|
|
||||||
|
Mon Oct 08 14:22:29 +1000 2007 Destroyed Weblog ID #1!
|
||||||
|
|
||||||
|
More information on how to use the logger is at http://www.ruby-doc.org/core/
|
||||||
|
|
||||||
|
Also, Ruby documentation can be found at http://www.ruby-lang.org/. There are
|
||||||
|
several books available online as well:
|
||||||
|
|
||||||
|
* Programming Ruby: http://www.ruby-doc.org/docs/ProgrammingRuby/ (Pickaxe)
|
||||||
|
* Learn to Program: http://pine.fm/LearnToProgram/ (a beginners guide)
|
||||||
|
|
||||||
|
These two books will bring you up to speed on the Ruby language and also on
|
||||||
|
programming in general.
|
||||||
|
|
||||||
|
|
||||||
|
== Debugger
|
||||||
|
|
||||||
|
Debugger support is available through the debugger command when you start your
|
||||||
|
Mongrel or WEBrick server with --debugger. This means that you can break out of
|
||||||
|
execution at any point in the code, investigate and change the model, and then,
|
||||||
|
resume execution! You need to install ruby-debug to run the server in debugging
|
||||||
|
mode. With gems, use <tt>sudo gem install ruby-debug</tt>. Example:
|
||||||
|
|
||||||
|
class WeblogController < ActionController::Base
|
||||||
|
def index
|
||||||
|
@posts = Post.all
|
||||||
|
debugger
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
So the controller will accept the action, run the first line, then present you
|
||||||
|
with a IRB prompt in the server window. Here you can do things like:
|
||||||
|
|
||||||
|
>> @posts.inspect
|
||||||
|
=> "[#<Post:0x14a6be8
|
||||||
|
@attributes={"title"=>nil, "body"=>nil, "id"=>"1"}>,
|
||||||
|
#<Post:0x14a6620
|
||||||
|
@attributes={"title"=>"Rails", "body"=>"Only ten..", "id"=>"2"}>]"
|
||||||
|
>> @posts.first.title = "hello from a debugger"
|
||||||
|
=> "hello from a debugger"
|
||||||
|
|
||||||
|
...and even better, you can examine how your runtime objects actually work:
|
||||||
|
|
||||||
|
>> f = @posts.first
|
||||||
|
=> #<Post:0x13630c4 @attributes={"title"=>nil, "body"=>nil, "id"=>"1"}>
|
||||||
|
>> f.
|
||||||
|
Display all 152 possibilities? (y or n)
|
||||||
|
|
||||||
|
Finally, when you're ready to resume execution, you can enter "cont".
|
||||||
|
|
||||||
|
|
||||||
|
== Console
|
||||||
|
|
||||||
|
The console is a Ruby shell, which allows you to interact with your
|
||||||
|
application's domain model. Here you'll have all parts of the application
|
||||||
|
configured, just like it is when the application is running. You can inspect
|
||||||
|
domain models, change values, and save to the database. Starting the script
|
||||||
|
without arguments will launch it in the development environment.
|
||||||
|
|
||||||
|
To start the console, run <tt>rails console</tt> from the application
|
||||||
|
directory.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
|
||||||
|
* Passing the <tt>-s, --sandbox</tt> argument will rollback any modifications
|
||||||
|
made to the database.
|
||||||
|
* Passing an environment name as an argument will load the corresponding
|
||||||
|
environment. Example: <tt>rails console production</tt>.
|
||||||
|
|
||||||
|
To reload your controllers and models after launching the console run
|
||||||
|
<tt>reload!</tt>
|
||||||
|
|
||||||
|
More information about irb can be found at:
|
||||||
|
link:http://www.rubycentral.org/pickaxe/irb.html
|
||||||
|
|
||||||
|
|
||||||
|
== dbconsole
|
||||||
|
|
||||||
|
You can go to the command line of your database directly through <tt>rails
|
||||||
|
dbconsole</tt>. You would be connected to the database with the credentials
|
||||||
|
defined in database.yml. Starting the script without arguments will connect you
|
||||||
|
to the development database. Passing an argument will connect you to a different
|
||||||
|
database, like <tt>rails dbconsole production</tt>. Currently works for MySQL,
|
||||||
|
PostgreSQL and SQLite 3.
|
||||||
|
|
||||||
|
== Description of Contents
|
||||||
|
|
||||||
|
The default directory structure of a generated Ruby on Rails application:
|
||||||
|
|
||||||
|
|-- app
|
||||||
|
| |-- assets
|
||||||
|
| |-- images
|
||||||
|
| |-- javascripts
|
||||||
|
| `-- stylesheets
|
||||||
|
| |-- controllers
|
||||||
|
| |-- helpers
|
||||||
|
| |-- mailers
|
||||||
|
| |-- models
|
||||||
|
| `-- views
|
||||||
|
| `-- layouts
|
||||||
|
|-- config
|
||||||
|
| |-- environments
|
||||||
|
| |-- initializers
|
||||||
|
| `-- locales
|
||||||
|
|-- db
|
||||||
|
|-- doc
|
||||||
|
|-- lib
|
||||||
|
| `-- tasks
|
||||||
|
|-- log
|
||||||
|
|-- public
|
||||||
|
|-- script
|
||||||
|
|-- test
|
||||||
|
| |-- fixtures
|
||||||
|
| |-- functional
|
||||||
|
| |-- integration
|
||||||
|
| |-- performance
|
||||||
|
| `-- unit
|
||||||
|
|-- tmp
|
||||||
|
| |-- cache
|
||||||
|
| |-- pids
|
||||||
|
| |-- sessions
|
||||||
|
| `-- sockets
|
||||||
|
`-- vendor
|
||||||
|
|-- assets
|
||||||
|
`-- stylesheets
|
||||||
|
`-- plugins
|
||||||
|
|
||||||
|
app
|
||||||
|
Holds all the code that's specific to this particular application.
|
||||||
|
|
||||||
|
app/assets
|
||||||
|
Contains subdirectories for images, stylesheets, and JavaScript files.
|
||||||
|
|
||||||
|
app/controllers
|
||||||
|
Holds controllers that should be named like weblogs_controller.rb for
|
||||||
|
automated URL mapping. All controllers should descend from
|
||||||
|
ApplicationController which itself descends from ActionController::Base.
|
||||||
|
|
||||||
|
app/models
|
||||||
|
Holds models that should be named like post.rb. Models descend from
|
||||||
|
ActiveRecord::Base by default.
|
||||||
|
|
||||||
|
app/views
|
||||||
|
Holds the template files for the view that should be named like
|
||||||
|
weblogs/index.html.erb for the WeblogsController#index action. All views use
|
||||||
|
eRuby syntax by default.
|
||||||
|
|
||||||
|
app/views/layouts
|
||||||
|
Holds the template files for layouts to be used with views. This models the
|
||||||
|
common header/footer method of wrapping views. In your views, define a layout
|
||||||
|
using the <tt>layout :default</tt> and create a file named default.html.erb.
|
||||||
|
Inside default.html.erb, call <% yield %> to render the view using this
|
||||||
|
layout.
|
||||||
|
|
||||||
|
app/helpers
|
||||||
|
Holds view helpers that should be named like weblogs_helper.rb. These are
|
||||||
|
generated for you automatically when using generators for controllers.
|
||||||
|
Helpers can be used to wrap functionality for your views into methods.
|
||||||
|
|
||||||
|
config
|
||||||
|
Configuration files for the Rails environment, the routing map, the database,
|
||||||
|
and other dependencies.
|
||||||
|
|
||||||
|
db
|
||||||
|
Contains the database schema in schema.rb. db/migrate contains all the
|
||||||
|
sequence of Migrations for your schema.
|
||||||
|
|
||||||
|
doc
|
||||||
|
This directory is where your application documentation will be stored when
|
||||||
|
generated using <tt>rake doc:app</tt>
|
||||||
|
|
||||||
|
lib
|
||||||
|
Application specific libraries. Basically, any kind of custom code that
|
||||||
|
doesn't belong under controllers, models, or helpers. This directory is in
|
||||||
|
the load path.
|
||||||
|
|
||||||
|
public
|
||||||
|
The directory available for the web server. Also contains the dispatchers and the
|
||||||
|
default HTML files. This should be set as the DOCUMENT_ROOT of your web
|
||||||
|
server.
|
||||||
|
|
||||||
|
script
|
||||||
|
Helper scripts for automation and generation.
|
||||||
|
|
||||||
|
test
|
||||||
|
Unit and functional tests along with fixtures. When using the rails generate
|
||||||
|
command, template test files will be generated for you and placed in this
|
||||||
|
directory.
|
||||||
|
|
||||||
|
vendor
|
||||||
|
External libraries that the application depends on. Also includes the plugins
|
||||||
|
subdirectory. If the app has frozen rails, those gems also go here, under
|
||||||
|
vendor/rails/. This directory is in the load path.
|
|
@ -0,0 +1,7 @@
|
||||||
|
#!/usr/bin/env rake
|
||||||
|
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
||||||
|
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
||||||
|
|
||||||
|
require File.expand_path('../config/application', __FILE__)
|
||||||
|
|
||||||
|
Dummy::Application.load_tasks
|
15
vendor/built_in_modules/survey_b/test/dummy/app/assets/javascripts/application.js
vendored
Normal file
15
vendor/built_in_modules/survey_b/test/dummy/app/assets/javascripts/application.js
vendored
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
||||||
|
// listed below.
|
||||||
|
//
|
||||||
|
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
||||||
|
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
|
||||||
|
//
|
||||||
|
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
||||||
|
// the compiled file.
|
||||||
|
//
|
||||||
|
// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
|
||||||
|
// GO AFTER THE REQUIRES BELOW.
|
||||||
|
//
|
||||||
|
//= require jquery
|
||||||
|
//= require jquery_ujs
|
||||||
|
//= require_tree .
|
13
vendor/built_in_modules/survey_b/test/dummy/app/assets/stylesheets/application.css
vendored
Normal file
13
vendor/built_in_modules/survey_b/test/dummy/app/assets/stylesheets/application.css
vendored
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
/*
|
||||||
|
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
||||||
|
* listed below.
|
||||||
|
*
|
||||||
|
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
||||||
|
* or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
|
||||||
|
*
|
||||||
|
* You're free to add application-wide styles to this file and they'll appear at the top of the
|
||||||
|
* compiled file, but it's generally better to create a new file per style scope.
|
||||||
|
*
|
||||||
|
*= require_self
|
||||||
|
*= require_tree .
|
||||||
|
*/
|
3
vendor/built_in_modules/survey_b/test/dummy/app/controllers/application_controller.rb
vendored
Normal file
3
vendor/built_in_modules/survey_b/test/dummy/app/controllers/application_controller.rb
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
class ApplicationController < ActionController::Base
|
||||||
|
protect_from_forgery
|
||||||
|
end
|
2
vendor/built_in_modules/survey_b/test/dummy/app/helpers/application_helper.rb
vendored
Normal file
2
vendor/built_in_modules/survey_b/test/dummy/app/helpers/application_helper.rb
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
module ApplicationHelper
|
||||||
|
end
|
14
vendor/built_in_modules/survey_b/test/dummy/app/views/layouts/application.html.erb
vendored
Normal file
14
vendor/built_in_modules/survey_b/test/dummy/app/views/layouts/application.html.erb
vendored
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Dummy</title>
|
||||||
|
<%= stylesheet_link_tag "application", :media => "all" %>
|
||||||
|
<%= javascript_include_tag "application" %>
|
||||||
|
<%= csrf_meta_tags %>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<%= yield %>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,4 @@
|
||||||
|
# This file is used by Rack-based servers to start the application.
|
||||||
|
|
||||||
|
require ::File.expand_path('../config/environment', __FILE__)
|
||||||
|
run Dummy::Application
|
|
@ -0,0 +1,59 @@
|
||||||
|
require File.expand_path('../boot', __FILE__)
|
||||||
|
|
||||||
|
require 'rails/all'
|
||||||
|
|
||||||
|
Bundler.require
|
||||||
|
require "survey_b"
|
||||||
|
|
||||||
|
module Dummy
|
||||||
|
class Application < Rails::Application
|
||||||
|
# Settings in config/environments/* take precedence over those specified here.
|
||||||
|
# Application configuration should go into files in config/initializers
|
||||||
|
# -- all .rb files in that directory are automatically loaded.
|
||||||
|
|
||||||
|
# Custom directories with classes and modules you want to be autoloadable.
|
||||||
|
# config.autoload_paths += %W(#{config.root}/extras)
|
||||||
|
|
||||||
|
# Only load the plugins named here, in the order given (default is alphabetical).
|
||||||
|
# :all can be used as a placeholder for all plugins not explicitly named.
|
||||||
|
# config.plugins = [ :exception_notification, :ssl_requirement, :all ]
|
||||||
|
|
||||||
|
# Activate observers that should always be running.
|
||||||
|
# config.active_record.observers = :cacher, :garbage_collector, :forum_observer
|
||||||
|
|
||||||
|
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
|
||||||
|
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
|
||||||
|
# config.time_zone = 'Central Time (US & Canada)'
|
||||||
|
|
||||||
|
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
|
||||||
|
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
|
||||||
|
# config.i18n.default_locale = :de
|
||||||
|
|
||||||
|
# Configure the default encoding used in templates for Ruby 1.9.
|
||||||
|
config.encoding = "utf-8"
|
||||||
|
|
||||||
|
# Configure sensitive parameters which will be filtered from the log file.
|
||||||
|
config.filter_parameters += [:password]
|
||||||
|
|
||||||
|
# Enable escaping HTML in JSON.
|
||||||
|
config.active_support.escape_html_entities_in_json = true
|
||||||
|
|
||||||
|
# Use SQL instead of Active Record's schema dumper when creating the database.
|
||||||
|
# This is necessary if your schema can't be completely dumped by the schema dumper,
|
||||||
|
# like if you have constraints or database-specific column types
|
||||||
|
# config.active_record.schema_format = :sql
|
||||||
|
|
||||||
|
# Enforce whitelist mode for mass assignment.
|
||||||
|
# This will create an empty whitelist of attributes available for mass-assignment for all models
|
||||||
|
# in your app. As such, your models will need to explicitly whitelist or blacklist accessible
|
||||||
|
# parameters by using an attr_accessible or attr_protected declaration.
|
||||||
|
config.active_record.whitelist_attributes = true
|
||||||
|
|
||||||
|
# Enable the asset pipeline
|
||||||
|
config.assets.enabled = true
|
||||||
|
|
||||||
|
# Version of your assets, change this if you want to expire all your assets
|
||||||
|
config.assets.version = '1.0'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
require 'rubygems'
|
||||||
|
gemfile = File.expand_path('../../../../Gemfile', __FILE__)
|
||||||
|
|
||||||
|
if File.exist?(gemfile)
|
||||||
|
ENV['BUNDLE_GEMFILE'] = gemfile
|
||||||
|
require 'bundler'
|
||||||
|
Bundler.setup
|
||||||
|
end
|
||||||
|
|
||||||
|
$:.unshift File.expand_path('../../../../lib', __FILE__)
|
|
@ -0,0 +1,25 @@
|
||||||
|
# SQLite version 3.x
|
||||||
|
# gem install sqlite3
|
||||||
|
#
|
||||||
|
# Ensure the SQLite 3 gem is defined in your Gemfile
|
||||||
|
# gem 'sqlite3'
|
||||||
|
development:
|
||||||
|
adapter: sqlite3
|
||||||
|
database: db/development.sqlite3
|
||||||
|
pool: 5
|
||||||
|
timeout: 5000
|
||||||
|
|
||||||
|
# Warning: The database defined as "test" will be erased and
|
||||||
|
# re-generated from your development database when you run "rake".
|
||||||
|
# Do not set this db to the same as development or production.
|
||||||
|
test:
|
||||||
|
adapter: sqlite3
|
||||||
|
database: db/test.sqlite3
|
||||||
|
pool: 5
|
||||||
|
timeout: 5000
|
||||||
|
|
||||||
|
production:
|
||||||
|
adapter: sqlite3
|
||||||
|
database: db/production.sqlite3
|
||||||
|
pool: 5
|
||||||
|
timeout: 5000
|
|
@ -0,0 +1,5 @@
|
||||||
|
# Load the rails application
|
||||||
|
require File.expand_path('../application', __FILE__)
|
||||||
|
|
||||||
|
# Initialize the rails application
|
||||||
|
Dummy::Application.initialize!
|
37
vendor/built_in_modules/survey_b/test/dummy/config/environments/development.rb
vendored
Normal file
37
vendor/built_in_modules/survey_b/test/dummy/config/environments/development.rb
vendored
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
Dummy::Application.configure do
|
||||||
|
# Settings specified here will take precedence over those in config/application.rb
|
||||||
|
|
||||||
|
# In the development environment your application's code is reloaded on
|
||||||
|
# every request. This slows down response time but is perfect for development
|
||||||
|
# since you don't have to restart the web server when you make code changes.
|
||||||
|
config.cache_classes = false
|
||||||
|
|
||||||
|
# Log error messages when you accidentally call methods on nil.
|
||||||
|
config.whiny_nils = true
|
||||||
|
|
||||||
|
# Show full error reports and disable caching
|
||||||
|
config.consider_all_requests_local = true
|
||||||
|
config.action_controller.perform_caching = false
|
||||||
|
|
||||||
|
# Don't care if the mailer can't send
|
||||||
|
config.action_mailer.raise_delivery_errors = false
|
||||||
|
|
||||||
|
# Print deprecation notices to the Rails logger
|
||||||
|
config.active_support.deprecation = :log
|
||||||
|
|
||||||
|
# Only use best-standards-support built into browsers
|
||||||
|
config.action_dispatch.best_standards_support = :builtin
|
||||||
|
|
||||||
|
# Raise exception on mass assignment protection for Active Record models
|
||||||
|
config.active_record.mass_assignment_sanitizer = :strict
|
||||||
|
|
||||||
|
# Log the query plan for queries taking more than this (works
|
||||||
|
# with SQLite, MySQL, and PostgreSQL)
|
||||||
|
config.active_record.auto_explain_threshold_in_seconds = 0.5
|
||||||
|
|
||||||
|
# Do not compress assets
|
||||||
|
config.assets.compress = false
|
||||||
|
|
||||||
|
# Expands the lines which load the assets
|
||||||
|
config.assets.debug = true
|
||||||
|
end
|
67
vendor/built_in_modules/survey_b/test/dummy/config/environments/production.rb
vendored
Normal file
67
vendor/built_in_modules/survey_b/test/dummy/config/environments/production.rb
vendored
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
Dummy::Application.configure do
|
||||||
|
# Settings specified here will take precedence over those in config/application.rb
|
||||||
|
|
||||||
|
# Code is not reloaded between requests
|
||||||
|
config.cache_classes = true
|
||||||
|
|
||||||
|
# Full error reports are disabled and caching is turned on
|
||||||
|
config.consider_all_requests_local = false
|
||||||
|
config.action_controller.perform_caching = true
|
||||||
|
|
||||||
|
# Disable Rails's static asset server (Apache or nginx will already do this)
|
||||||
|
config.serve_static_assets = false
|
||||||
|
|
||||||
|
# Compress JavaScripts and CSS
|
||||||
|
config.assets.compress = true
|
||||||
|
|
||||||
|
# Don't fallback to assets pipeline if a precompiled asset is missed
|
||||||
|
config.assets.compile = false
|
||||||
|
|
||||||
|
# Generate digests for assets URLs
|
||||||
|
config.assets.digest = true
|
||||||
|
|
||||||
|
# Defaults to nil and saved in location specified by config.assets.prefix
|
||||||
|
# config.assets.manifest = YOUR_PATH
|
||||||
|
|
||||||
|
# Specifies the header that your server uses for sending files
|
||||||
|
# config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
|
||||||
|
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
|
||||||
|
|
||||||
|
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
|
||||||
|
# config.force_ssl = true
|
||||||
|
|
||||||
|
# See everything in the log (default is :info)
|
||||||
|
# config.log_level = :debug
|
||||||
|
|
||||||
|
# Prepend all log lines with the following tags
|
||||||
|
# config.log_tags = [ :subdomain, :uuid ]
|
||||||
|
|
||||||
|
# Use a different logger for distributed setups
|
||||||
|
# config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
|
||||||
|
|
||||||
|
# Use a different cache store in production
|
||||||
|
# config.cache_store = :mem_cache_store
|
||||||
|
|
||||||
|
# Enable serving of images, stylesheets, and JavaScripts from an asset server
|
||||||
|
# config.action_controller.asset_host = "http://assets.example.com"
|
||||||
|
|
||||||
|
# Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)
|
||||||
|
# config.assets.precompile += %w( search.js )
|
||||||
|
|
||||||
|
# Disable delivery errors, bad email addresses will be ignored
|
||||||
|
# config.action_mailer.raise_delivery_errors = false
|
||||||
|
|
||||||
|
# Enable threaded mode
|
||||||
|
# config.threadsafe!
|
||||||
|
|
||||||
|
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
|
||||||
|
# the I18n.default_locale when a translation can not be found)
|
||||||
|
config.i18n.fallbacks = true
|
||||||
|
|
||||||
|
# Send deprecation notices to registered listeners
|
||||||
|
config.active_support.deprecation = :notify
|
||||||
|
|
||||||
|
# Log the query plan for queries taking more than this (works
|
||||||
|
# with SQLite, MySQL, and PostgreSQL)
|
||||||
|
# config.active_record.auto_explain_threshold_in_seconds = 0.5
|
||||||
|
end
|
|
@ -0,0 +1,37 @@
|
||||||
|
Dummy::Application.configure do
|
||||||
|
# Settings specified here will take precedence over those in config/application.rb
|
||||||
|
|
||||||
|
# The test environment is used exclusively to run your application's
|
||||||
|
# test suite. You never need to work with it otherwise. Remember that
|
||||||
|
# your test database is "scratch space" for the test suite and is wiped
|
||||||
|
# and recreated between test runs. Don't rely on the data there!
|
||||||
|
config.cache_classes = true
|
||||||
|
|
||||||
|
# Configure static asset server for tests with Cache-Control for performance
|
||||||
|
config.serve_static_assets = true
|
||||||
|
config.static_cache_control = "public, max-age=3600"
|
||||||
|
|
||||||
|
# Log error messages when you accidentally call methods on nil
|
||||||
|
config.whiny_nils = true
|
||||||
|
|
||||||
|
# Show full error reports and disable caching
|
||||||
|
config.consider_all_requests_local = true
|
||||||
|
config.action_controller.perform_caching = false
|
||||||
|
|
||||||
|
# Raise exceptions instead of rendering exception templates
|
||||||
|
config.action_dispatch.show_exceptions = false
|
||||||
|
|
||||||
|
# Disable request forgery protection in test environment
|
||||||
|
config.action_controller.allow_forgery_protection = false
|
||||||
|
|
||||||
|
# Tell Action Mailer not to deliver emails to the real world.
|
||||||
|
# The :test delivery method accumulates sent emails in the
|
||||||
|
# ActionMailer::Base.deliveries array.
|
||||||
|
config.action_mailer.delivery_method = :test
|
||||||
|
|
||||||
|
# Raise exception on mass assignment protection for Active Record models
|
||||||
|
config.active_record.mass_assignment_sanitizer = :strict
|
||||||
|
|
||||||
|
# Print deprecation notices to the stderr
|
||||||
|
config.active_support.deprecation = :stderr
|
||||||
|
end
|
7
vendor/built_in_modules/survey_b/test/dummy/config/initializers/backtrace_silencers.rb
vendored
Normal file
7
vendor/built_in_modules/survey_b/test/dummy/config/initializers/backtrace_silencers.rb
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# Be sure to restart your server when you modify this file.
|
||||||
|
|
||||||
|
# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
|
||||||
|
# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
|
||||||
|
|
||||||
|
# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
|
||||||
|
# Rails.backtrace_cleaner.remove_silencers!
|
15
vendor/built_in_modules/survey_b/test/dummy/config/initializers/inflections.rb
vendored
Normal file
15
vendor/built_in_modules/survey_b/test/dummy/config/initializers/inflections.rb
vendored
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
# Be sure to restart your server when you modify this file.
|
||||||
|
|
||||||
|
# Add new inflection rules using the following format
|
||||||
|
# (all these examples are active by default):
|
||||||
|
# ActiveSupport::Inflector.inflections do |inflect|
|
||||||
|
# inflect.plural /^(ox)$/i, '\1en'
|
||||||
|
# inflect.singular /^(ox)en/i, '\1'
|
||||||
|
# inflect.irregular 'person', 'people'
|
||||||
|
# inflect.uncountable %w( fish sheep )
|
||||||
|
# end
|
||||||
|
#
|
||||||
|
# These inflection rules are supported but not enabled by default:
|
||||||
|
# ActiveSupport::Inflector.inflections do |inflect|
|
||||||
|
# inflect.acronym 'RESTful'
|
||||||
|
# end
|
5
vendor/built_in_modules/survey_b/test/dummy/config/initializers/mime_types.rb
vendored
Normal file
5
vendor/built_in_modules/survey_b/test/dummy/config/initializers/mime_types.rb
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# Be sure to restart your server when you modify this file.
|
||||||
|
|
||||||
|
# Add new mime types for use in respond_to blocks:
|
||||||
|
# Mime::Type.register "text/richtext", :rtf
|
||||||
|
# Mime::Type.register_alias "text/html", :iphone
|
7
vendor/built_in_modules/survey_b/test/dummy/config/initializers/secret_token.rb
vendored
Normal file
7
vendor/built_in_modules/survey_b/test/dummy/config/initializers/secret_token.rb
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# Be sure to restart your server when you modify this file.
|
||||||
|
|
||||||
|
# Your secret key for verifying the integrity of signed cookies.
|
||||||
|
# If you change this key, all old signed cookies will become invalid!
|
||||||
|
# Make sure the secret is at least 30 characters and all random,
|
||||||
|
# no regular words or you'll be exposed to dictionary attacks.
|
||||||
|
Dummy::Application.config.secret_token = 'd7805d46c934ccf6140641370f099c8cabadbfcf7dbafc17f06c1b4750b9bc1ef733a96efba7389aa14ecfb942607d142a4a979e76040ce0df9a06944d45fb70'
|
8
vendor/built_in_modules/survey_b/test/dummy/config/initializers/session_store.rb
vendored
Normal file
8
vendor/built_in_modules/survey_b/test/dummy/config/initializers/session_store.rb
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# Be sure to restart your server when you modify this file.
|
||||||
|
|
||||||
|
Dummy::Application.config.session_store :cookie_store, key: '_dummy_session'
|
||||||
|
|
||||||
|
# Use the database for sessions instead of the cookie-based default,
|
||||||
|
# which shouldn't be used to store highly confidential information
|
||||||
|
# (create the session table with "rails generate session_migration")
|
||||||
|
# Dummy::Application.config.session_store :active_record_store
|
14
vendor/built_in_modules/survey_b/test/dummy/config/initializers/wrap_parameters.rb
vendored
Normal file
14
vendor/built_in_modules/survey_b/test/dummy/config/initializers/wrap_parameters.rb
vendored
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
# Be sure to restart your server when you modify this file.
|
||||||
|
#
|
||||||
|
# This file contains settings for ActionController::ParamsWrapper which
|
||||||
|
# is enabled by default.
|
||||||
|
|
||||||
|
# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
|
||||||
|
ActiveSupport.on_load(:action_controller) do
|
||||||
|
wrap_parameters format: [:json]
|
||||||
|
end
|
||||||
|
|
||||||
|
# Disable root element in JSON by default.
|
||||||
|
ActiveSupport.on_load(:active_record) do
|
||||||
|
self.include_root_in_json = false
|
||||||
|
end
|
|
@ -0,0 +1,5 @@
|
||||||
|
# Sample localization file for English. Add more files in this directory for other locales.
|
||||||
|
# See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
|
||||||
|
|
||||||
|
en:
|
||||||
|
hello: "Hello world"
|
|
@ -0,0 +1,58 @@
|
||||||
|
Dummy::Application.routes.draw do
|
||||||
|
# The priority is based upon order of creation:
|
||||||
|
# first created -> highest priority.
|
||||||
|
|
||||||
|
# Sample of regular route:
|
||||||
|
# match 'products/:id' => 'catalog#view'
|
||||||
|
# Keep in mind you can assign values other than :controller and :action
|
||||||
|
|
||||||
|
# Sample of named route:
|
||||||
|
# match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase
|
||||||
|
# This route can be invoked with purchase_url(:id => product.id)
|
||||||
|
|
||||||
|
# Sample resource route (maps HTTP verbs to controller actions automatically):
|
||||||
|
# resources :products
|
||||||
|
|
||||||
|
# Sample resource route with options:
|
||||||
|
# resources :products do
|
||||||
|
# member do
|
||||||
|
# get 'short'
|
||||||
|
# post 'toggle'
|
||||||
|
# end
|
||||||
|
#
|
||||||
|
# collection do
|
||||||
|
# get 'sold'
|
||||||
|
# end
|
||||||
|
# end
|
||||||
|
|
||||||
|
# Sample resource route with sub-resources:
|
||||||
|
# resources :products do
|
||||||
|
# resources :comments, :sales
|
||||||
|
# resource :seller
|
||||||
|
# end
|
||||||
|
|
||||||
|
# Sample resource route with more complex sub-resources
|
||||||
|
# resources :products do
|
||||||
|
# resources :comments
|
||||||
|
# resources :sales do
|
||||||
|
# get 'recent', :on => :collection
|
||||||
|
# end
|
||||||
|
# end
|
||||||
|
|
||||||
|
# Sample resource route within a namespace:
|
||||||
|
# namespace :admin do
|
||||||
|
# # Directs /admin/products/* to Admin::ProductsController
|
||||||
|
# # (app/controllers/admin/products_controller.rb)
|
||||||
|
# resources :products
|
||||||
|
# end
|
||||||
|
|
||||||
|
# You can have the root of your site routed with "root"
|
||||||
|
# just remember to delete public/index.html.
|
||||||
|
# root :to => 'welcome#index'
|
||||||
|
|
||||||
|
# See how all your routes lay out with "rake routes"
|
||||||
|
|
||||||
|
# This is a legacy wild controller route that's not recommended for RESTful applications.
|
||||||
|
# Note: This route will make all actions in every controller accessible via GET requests.
|
||||||
|
# match ':controller(/:action(/:id))(.:format)'
|
||||||
|
end
|
|
@ -0,0 +1,26 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>The page you were looking for doesn't exist (404)</title>
|
||||||
|
<style type="text/css">
|
||||||
|
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
||||||
|
div.dialog {
|
||||||
|
width: 25em;
|
||||||
|
padding: 0 4em;
|
||||||
|
margin: 4em auto 0 auto;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
border-right-color: #999;
|
||||||
|
border-bottom-color: #999;
|
||||||
|
}
|
||||||
|
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<!-- This file lives in public/404.html -->
|
||||||
|
<div class="dialog">
|
||||||
|
<h1>The page you were looking for doesn't exist.</h1>
|
||||||
|
<p>You may have mistyped the address or the page may have moved.</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,26 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>The change you wanted was rejected (422)</title>
|
||||||
|
<style type="text/css">
|
||||||
|
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
||||||
|
div.dialog {
|
||||||
|
width: 25em;
|
||||||
|
padding: 0 4em;
|
||||||
|
margin: 4em auto 0 auto;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
border-right-color: #999;
|
||||||
|
border-bottom-color: #999;
|
||||||
|
}
|
||||||
|
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<!-- This file lives in public/422.html -->
|
||||||
|
<div class="dialog">
|
||||||
|
<h1>The change you wanted was rejected.</h1>
|
||||||
|
<p>Maybe you tried to change something you didn't have access to.</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,25 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>We're sorry, but something went wrong (500)</title>
|
||||||
|
<style type="text/css">
|
||||||
|
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
||||||
|
div.dialog {
|
||||||
|
width: 25em;
|
||||||
|
padding: 0 4em;
|
||||||
|
margin: 4em auto 0 auto;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
border-right-color: #999;
|
||||||
|
border-bottom-color: #999;
|
||||||
|
}
|
||||||
|
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<!-- This file lives in public/500.html -->
|
||||||
|
<div class="dialog">
|
||||||
|
<h1>We're sorry, but something went wrong.</h1>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,6 @@
|
||||||
|
#!/usr/bin/env ruby
|
||||||
|
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
|
||||||
|
|
||||||
|
APP_PATH = File.expand_path('../../config/application', __FILE__)
|
||||||
|
require File.expand_path('../../config/boot', __FILE__)
|
||||||
|
require 'rails/commands'
|
|
@ -0,0 +1,7 @@
|
||||||
|
require 'test_helper'
|
||||||
|
|
||||||
|
class SurveyBTest < ActiveSupport::TestCase
|
||||||
|
test "truth" do
|
||||||
|
assert_kind_of Module, SurveyB
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,15 @@
|
||||||
|
# Configure Rails Environment
|
||||||
|
ENV["RAILS_ENV"] = "test"
|
||||||
|
|
||||||
|
require File.expand_path("../dummy/config/environment.rb", __FILE__)
|
||||||
|
require "rails/test_help"
|
||||||
|
|
||||||
|
Rails.backtrace_cleaner.remove_silencers!
|
||||||
|
|
||||||
|
# Load support files
|
||||||
|
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
||||||
|
|
||||||
|
# Load fixtures from the engine
|
||||||
|
if ActiveSupport::TestCase.method_defined?(:fixture_path=)
|
||||||
|
ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__)
|
||||||
|
end
|
Reference in New Issue