Compare commits

..
Author SHA1 Message Date
Matt K. Fu e6511cbcdd fix default widget query 2013-08-23 11:03:28 +08:00
chris f664c3715c Changes for ntue (mail app) 2013-07-30 18:28:26 +08:00
chris fa1c731ad3 Remove registerable 2013-07-30 18:24:05 +08:00
harrybomrah 2c24e788b0 fixed frontend 2013-07-23 18:32:24 +08:00
chris 26a8be2f0f Fix bulletins_controller.rb missing 'end' 2013-07-19 19:52:44 +08:00
chris fa51d16879 Remove space causing error in rake 2013-07-19 19:23:25 +08:00
chris ceff21fd1f Fix migrate.rake 2013-07-19 19:15:45 +08:00
harrybomrah 1357124f6f backend theater for ie fixed 2013-07-19 18:40:19 +08:00
harrybomrah 8c3fb43bf5 theater view fixed in IE 2013-07-19 18:40:09 +08:00
chris 71e8b3c042 Change get_item
Add category and tags to default widget link to object
2013-07-19 18:39:13 +08:00
Spen b37643147f mail_cron add send_mail_now and mail cron log fix 2013-07-19 17:18:48 +08:00
Spen ec57cbff1c ntue mail cron & log filter fix 2013-07-19 17:18:34 +08:00
Spen 7d6df11873 email send cron & send logs for any apps 2013-07-19 17:01:54 +08:00
Matt K. Fu 8043573370 fix delay impressionist for tags and pages 2013-07-19 17:00:38 +08:00
chris f025c98ffa Fix sorted_tags_for_cloud: it's now using the cloud_view_count 2013-07-19 01:52:36 +08:00
chris 3a91c92bf7 Fix visitor count. Mapping the session and making sure they were unique using rails was way slower than doing it with a mongoid query 2013-07-19 01:20:51 +08:00
harrybomrah b1d8a87256 frontend gallery fix 2013-07-18 21:22:23 +08:00
chris c7ac4e2485 Set tinymce-rails version to 3.5.8.3 2013-07-18 20:53:05 +08:00
chris 3467868607 Fix missing tagged_ids in some taggable objects and add a rake task for it 2013-07-18 14:05:21 +08:00
Matt K. Fu ceac2b842c fix impression page counter 2013-07-18 12:04:37 +08:00
chris c763817ebf Fix web link front end index and widget index 2013-07-17 17:54:34 +08:00
chris 3c3bba514a Fix get_item and more link in front end 2013-07-17 11:36:20 +08:00
Spen 837dc3ea7b announcement init default_widget add a style & field 2013-07-17 11:31:38 +08:00
Matt K. Fu ea5d89e0e1 make announcement widget amount start from 1 2013-07-16 18:19:20 +08:00
Matt K. Fu aea15fa622 add class to default widget if row data is hot or top 2013-07-16 17:41:22 +08:00
Matthew K. Fu JuYuan c1316f72a0 remove new design button 2013-07-15 17:10:30 +08:00
Matthew K. Fu JuYuan d996b91b54 preview by default widget 2013-07-15 17:09:48 +08:00
142 changed files with 3042 additions and 264 deletions

No files matched your search

+1 -1
View File
@@ -48,7 +48,7 @@ gem 'sinatra'
gem 'sprockets'
gem 'social-share-button'
gem 'tinymce-rails', "~> 3.5.8"
gem 'tinymce-rails', '3.5.8.3'
gem 'therubyracer' if RUBY_PLATFORM.downcase.include?("linux")
gem 'libv8', '~> 3.11.8' if RUBY_PLATFORM.downcase.include?("linux")
gem 'mongoid-encryptor', :require => 'mongoid/encryptor'
+12 -8
View File
@@ -12,22 +12,22 @@ class DefaultWidgetController< OrbitWidgetController
def query_for_default_widget
@ori_class_name = @default_widget["query"].split('.')[0]
@ori_class_name = @default_widget["query"].split('.')[0]
@ori_query = @default_widget["query"]
result = nil
result_objects = nil
if !params["tag_id"].blank?
if params["category_id"].blank? #has tag no cate
result = @ori_class_name.constantize.where(:tagged_ids.in => params["tag_id"])
result = eval("#{@ori_query}.where(:tagged_ids.in => params['tag_id'])")
else #has tag and cate
result = eval("#{@ori_class_name}.where(:#{get_category_field_name}.in=>params['category_id'], :tagged_ids.in => params['tag_id'])")
result = eval("#{@ori_query}.where(:#{get_category_field_name}.in=>params['category_id'], :tagged_ids.in => params['tag_id'])")
end
elsif params["category_id"].blank? #no tag no cate
result = eval(@default_widget["query"])
result = eval(@ori_query)
else #no tag has cate
result = eval("#{@ori_class_name}.where(:#{get_category_field_name}.in=>params['category_id'])")
result = eval("#{@ori_query}.where(:#{get_category_field_name}.in=>params['category_id'])")
end
result.available_for_lang(I18n.locale).can_display.desc(:is_top, :postdate)
result.available_for_lang(I18n.locale).can_display
end
def search_result
@@ -40,9 +40,13 @@ class DefaultWidgetController< OrbitWidgetController
def default_widget
@search = params["search_query"].blank? ? false : true
if !params[:id].blank?
if !params[:id].blank? and !params["clicked_field_name"].blank?
clicked_field_name = params["clicked_field_name"].to_sym
redirect_to eval("#{@page_part.module_app.widget_fields_link_method[clicked_field_name][:method]}('#{params[:id]}', {inner: #{params[:inner] || true}})")
elsif !params[:id].blank? and params["preview"]
clicked_field_name = :title
@preview_pages = @page_part.module_app.widget_fields_link_method.find_all{|t| t[1].has_key?(:preview)}.collect{|t| t[0]}
redirect_to eval("#{@page_part.module_app.widget_fields_link_method[clicked_field_name][:method]}('#{params[:id]}', {preview: true,inner: #{params[:inner] || true},clicked_field_name: '#{@preview_pages.first.to_s}'})")
else
@tag_class = nil
@default_widget = @page_part.module_app.get_default_widget
@@ -7,4 +7,10 @@ class OrbitFrontendComponentController< ApplicationController
@app_title = request.fullpath.split('/')[2]
end
def delay_impressionist(item)
user_id = current_user.nil? ? nil : current_user.id
Resque.enqueue(DelayedImpressionist,:request=>DelayImpressionistRequest.new(request),:obj=>item,:class=>item.class.to_s,:controller_name=>controller_name,:action_name=>action_name,:user=>user_id)
end
end
+34 -30
View File
@@ -44,29 +44,13 @@ class PagesController < ApplicationController
# render :file => "#{Rails.root}/public/404.html", :status => :not_found
#end
end
def convert_array_param(key,array)
array.collect{|t| "#{key}[]=#{t}"}.join("&")
end
def index_from_link
url = "/#{@item.path}"
options = ''
options << "#{options.blank? ? '?' : '&'}page_main=#{params[:page_main]}" unless params[:page_main].blank?
if params[:category_id].is_a? Array
options << "#{options.blank? ? '?' : '&'}#{convert_array_param('category_id',params[:category_id])}" unless params[:category_id].blank?
elsif params[:category_id].is_a? String
options << "#{options.blank? ? '?' : '&'}category_id=#{params[:category_id]}" unless params[:category_id].blank?
end
if params[:tag_id].is_a? Array
options << "#{options.blank? ? '?' : '&'}#{convert_array_param('tag_id',params[:tag_id])}" unless params[:tag_id].blank?
elsif params[:category_id].is_a? String
options << "#{options.blank? ? '?' : '&'}tag_id=#{params[:tag_id]}" unless params[:tag_id].blank?
end
options << "#{options.blank? ? '?' : '&'}#{convert_array_param('category_id', params[:category_id])}" unless params[:category_id].blank?
options << "#{options.blank? ? '?' : '&'}#{convert_array_param('tag_id', params[:tag_id])}" unless params[:tag_id].blank?
options << "#{options.blank? ? '?' : '&'}search_query=#{params[:search_query]}" unless params[:search_query].blank?
options << "#{options.blank? ? '?' : '&'}name=#{params[:name]}" unless params[:name].blank?
uri = URI::escape(url + options)
@@ -78,8 +62,8 @@ class PagesController < ApplicationController
url = "/#{@item.path}"
options = ''
options << "#{options.blank? ? '?' : '&'}id=#{params[:id]}" unless params[:id].blank?
options << "#{options.blank? ? '?' : '&'}category_id=#{params[:category_id]}" unless params[:category_id].blank?
options << "#{options.blank? ? '?' : '&'}tag_id=#{params[:tag_id]}" unless params[:tag_id].blank?
options << "#{options.blank? ? '?' : '&'}#{convert_array_param('category_id', params[:category_id])}" unless params[:category_id].blank?
options << "#{options.blank? ? '?' : '&'}#{convert_array_param('tag_id', params[:tag_id])}" unless params[:tag_id].blank?
options << "#{options.blank? ? '?' : '&'}preview=#{params[:preview]}" unless params[:preview].blank?
options << "#{options.blank? ? '?' : '&'}controller_action=#{params[:controller_action]}" unless params[:controller_action].blank?
options << "#{options.blank? ? '?' : '&'}clicked_field_name=#{params[:clicked_field_name]}" unless params[:clicked_field_name].blank?
@@ -98,23 +82,43 @@ class PagesController < ApplicationController
elsif params[:same_page_id]
@item = Item.find(params[:same_page_id])
else
category_ids = params[:category_id].is_a?(Array) ? params[:category_id] : [params[:category_id]]
tag_ids = params[:tag_id].is_a?(Array) ? params[:tag_id] : [params[:tag_id]]
category_ids = Array(params[:category_id]) unless params[:category_id].nil?
tag_ids = Array(params[:tag_id]) unless params[:tag_id].nil?
module_app = ModuleApp.first(:conditions => {:key => params[:app_name]})
default_query = { is_published: true, module_app_id: module_app.id, :app_frontend_url.in => [params[:app_action], 'default_widget'] }
specific_categories = { :category => category_ids }
in_categories = { :category.in => category_ids }
nil_categories = { :category.in => [nil, []] }
specific_tags = { :tag => tag_ids }
in_tags = { :tag.in => tag_ids }
nil_tags = { :tag.in => [nil, []] }
if !category_ids.blank? && !tag_ids.blank?
@item = Item.first(:conditions => {:module_app_id => module_app.id, :app_frontend_url => params[:app_action], :category.in => category_ids, :tag.in => tag_ids})
@item = Item.first(:conditions => {:module_app_id => module_app.id, :app_frontend_url => params[:app_action], :category.in => category_ids, :tag.in => [nil, []]}) unless @item
@item = Item.where(default_query.merge(specific_categories).merge(specific_tags)).first
@item = Item.where(default_query.merge(specific_categories).merge(in_tags)).first unless @item
@item = Item.where(default_query.merge(specific_categories).merge(nil_tags)).first unless @item
@item = Item.where(default_query.merge(specific_tags).merge(in_categories)).first unless @item
@item = Item.where(default_query.merge(specific_tags).merge(nil_categories)).first unless @item
@item = Item.where(default_query.merge(in_categories).merge(in_tags)).first unless @item
@item = Item.where(default_query.merge(in_categories).merge(nil_tags)).first unless @item
@item = Item.where(default_query.merge(in_tags).merge(nil_categories)).first unless @item
elsif !category_ids.blank?
@item = Item.where(module_app_id: module_app.id, app_frontend_url: params[:app_action], :category.in => category_ids).any_in(tag: [nil, []]).first
@item = Item.where(default_query.merge(specific_categories).merge(nil_tags)).first
@item = Item.where(default_query.merge(specific_categories)).first unless @item
@item = Item.where(default_query.merge(in_categories).merge(nil_tags)).first unless @item
@item = Item.where(default_query.merge(in_categories)).first unless @item
elsif !tag_ids.blank?
@item = Item.where(module_app_id: module_app.id, app_frontend_url: params[:app_action], :tag.in => tag_ids).any_in(category: [nil, []]).first
@item = Item.where(default_query.merge(specific_tags).merge(nil_categories)).first
@item = Item.where(default_query.merge(specific_tags)).first unless @item
@item = Item.where(default_query.merge(in_tags).merge(nil_categories)).first unless @item
@item = Item.where(default_query.merge(in_tags)).first unless @item
end
@item = Item.find(params[:orig_page]) unless @item || params[:orig_page].blank?
@item = Item.where(module_app_id: module_app.id, app_frontend_url: params[:app_action]).all_of("tag" => {"$in" => [nil, []]},"category" => { "$in" => [nil, []]}).first unless @item
@item = Item.where(module_app_id: module_app.id, app_frontend_url: 'default_widget').first unless @item
@item = Item.where(module_app_id: module_app.id, app_frontend_url: params[:app_action]).first unless @item
@item = Item.where(default_query.merge(nil_categories).merge(nil_tags)).first unless @item
@item = Item.where(default_query).first unless @item
end
raise PageError,'Missing Frontend Page' if @item.nil?
raise PageError, 'Missing Frontend Page' if @item.nil?
end
def save_from_no_lang_for_page
+26 -18
View File
@@ -1,5 +1,5 @@
module ApplicationHelper
include OrbitApp::Module::VisitorCounter
FLASH_NOTICE_KEYS = [:error, :notice, :warning]
@@ -7,8 +7,10 @@ module ApplicationHelper
request.referer.include?('?') ? [request.referer,param_hash.to_param].join('&') : [request.referer,param_hash.to_param].join('?')
end
def delayed_impressionist(object)
# Resque.enqueue_at(1.minute.from_now,DelayedImpressionist,object)
def delayed_impressionist(item)
user_id = current_user.nil? ? nil : current_user.id
request = DelayImpressionistRequest.new(request)
Resque.enqueue(DelayedImpressionist,:request=>request,:obj=>item,:class=>item.class.to_s,:controller_name=>controller_name,:action_name=>action_name,:user=>user_id)
end
def check_user_role_enable(attribute_fields)
@@ -242,25 +244,27 @@ module ApplicationHelper
"#{t(:view_count)}: #{object.view_count}"
end
def display_visitors(options={})
Impression.where(options).and(:referrer.ne => nil).distinct(:session_hash).count
end
# def display_visitors(options={})
# # Impression.where(options).and(:referrer.ne => nil).distinct(:session_hash).count
# impressions = Impression.where(options).and(:referrer.ne => nil)
# impressions.map{|i| i[:session_hash]}.uniq.count
# end
def display_visitors_today
display_visitors(created_at: {'$gte' => Date.today.beginning_of_day, '$lte' => Date.today.end_of_day})
end
# def display_visitors_today
# display_visitors(created_at: {'$gte' => Date.today.beginning_of_day, '$lte' => Date.today.end_of_day})
# end
def display_visitors_this_week
display_visitors(created_at: {'$gte' => Date.today.beginning_of_week, '$lte' => Date.today.end_of_week})
end
# def display_visitors_this_week
# display_visitors(created_at: {'$gte' => Date.today.beginning_of_week, '$lte' => Date.today.end_of_week})
# end
def display_visitors_this_month
display_visitors(created_at: {'$gte' => Date.today.beginning_of_month, '$lte' => Date.today.end_of_month})
end
# def display_visitors_this_month
# display_visitors(created_at: {'$gte' => Date.today.beginning_of_month, '$lte' => Date.today.end_of_month})
# end
def display_visitors_this_year
display_visitors(created_at: {'$gte' => Date.today.beginning_of_year, '$lte' => Date.today.end_of_year})
end
# def display_visitors_this_year
# display_visitors(created_at: {'$gte' => Date.today.beginning_of_year, '$lte' => Date.today.end_of_year})
# end
def display_date_time(object)
object.strftime("%Y-%m-%d %H:%M")
@@ -311,4 +315,8 @@ module ApplicationHelper
link_to title, params.merge({direction: direction, sort: column, sort_options: column}), {:class => "#{css_class} sortable", :remote => options[:remote]}
end
def convert_array_param(key, array)
Array(array).collect{|t| "#{key}[]=#{t}"}.join("&")
end
end
+16
View File
@@ -3,6 +3,13 @@ module DefaultWidgetHelper
I18n.t("#{@page_part.module_app.key}.default_widget.#{field}")
end
def get_top_hot_class(row_data)
class_attr = []
class_attr << 'data_is_hot' if( row_data.is_hot? rescue false )
class_attr << 'data_is_top' if( row_data.is_top? rescue false)
return class_attr.join(" ")
end
def link_to_field(row_data,field, switch, options=nil)
method_ary = @page_part.module_app.widget_fields_link_method
field = field.to_sym
@@ -77,4 +84,13 @@ module DefaultWidgetHelper
content_tag(:span,get_display(row_data,field_setting),:class=>field_setting[:class])
end
end
def get_row_category(row_data)
row_data.send("#{row_data.class.to_s.underscore}_category_id") rescue nil
end
def get_row_tags(row_data)
row_data.tagged_ids rescue nil
end
end
+10 -25
View File
@@ -1,36 +1,21 @@
class DashboardCounter < Resque::Plugins::RestrictionJob
extend OrbitApp::Module::VisitorCounterEval
@queue = :high
def self.perform(*args)
site = Site.first
obj = new(*args)
site.dashboard_counter[:visitors_this_week] = obj.display_visitors_this_week
site.dashboard_counter[:visitors_this_month] = obj.display_visitors_this_month
site.dashboard_counter[:visitors_this_year] = obj.display_visitors_this_year
site.visitor_counters[:total] = display_visitors
site.visitor_counters[:today] = display_visitors_today
site.visitor_counters[:this_week] = display_visitors_this_week
site.visitor_counters[:this_month] = display_visitors_this_month
site.visitor_counters[:this_year] = display_visitors_this_year
site.save
OrbitLogger.info "DashboardCounter done #{site.dashboard_counter.to_s}"
end
OrbitLogger.info "DashboardCounter done #{site.visitor_counters.to_s}"
def display_visitors(options={})
impressions = Impression.where(options).and(:referrer.ne => nil)
impressions.map{|i| i[:session_hash]}.uniq.count
end
def display_visitors_today
display_visitors(created_at: {'$gte' => Date.today.beginning_of_day, '$lte' => Date.today.end_of_day})
end
def display_visitors_this_week
display_visitors(created_at: {'$gte' => Date.today.beginning_of_week, '$lte' => Date.today.end_of_week})
end
def display_visitors_this_month
display_visitors(created_at: {'$gte' => Date.today.beginning_of_month, '$lte' => Date.today.end_of_month})
end
def display_visitors_this_year
display_visitors(created_at: {'$gte' => Date.today.beginning_of_year, '$lte' => Date.today.end_of_year})
#Notice this is mainly used at user dashbroad. however the code there is currentlly using realtime evaluation.
#and the site model will need a field call dashboard_counter to complete this job.
end
end
+44 -6
View File
@@ -1,7 +1,45 @@
class DelayedImpressionist
@queue = :low
def self.perform(object)
impressionist(object)
true
end
class DelayedImpressionist
def self.before_filter(*args)
return
end
include ImpressionistController::InstanceMethods
@queue = :low
def initialize(request,controller_name,action_name,user,obj)
@controller_name = controller_name
@action_name = action_name
@user = User.find user unless user.nil?
@request = request
end
def self.perform(*args)
arg = args[0]
@request= DelayImpressionistRequest.new
@request.restore(arg["request"])
request = @request
obj = eval("#{arg["class"]}.find '#{arg['obj']['_id']}'")
# imp = new(@request,arg["controller_name"],arg["action_name"],arg["user"],obj)
new_impression = obj.impressions.build(:user_id=>arg["user"],:controller_name=>arg["controller_name"],:action_name=>arg["action_name"],:ip_address=>@request.remote_ip,:referrer=>@request.referer)
new_impression.save
obj.update_attribute(:view_count,obj.impression_count)
end
private
def user
@user
end
def action_name
@action_name
end
def controller_name
@controller_name
end
def request
@request
end
end
+1 -1
View File
@@ -3,7 +3,7 @@ class UpdateTagCloud
def self.perform()
Tag.all.each do |tag|
tag.update_attribute(:cloud_view_count, tag.impressionist_count(:created_at.gte => 14.days.ago, :created_at.lte => Time.now))
tag.update_attribute(:cloud_view_count, tag.get_impressionist)
end
OrbitLogger.info "UpdateTagCloud Done"
end
+1 -1
View File
@@ -62,7 +62,7 @@ class MailCronMailer < ActionMailer::Base
@mail_cron_log = {
:mail_subject => @data.mail_subject,
:mail_to => group_mail,
:mail_user => @user.user_id,
:mail_user => @user.name,
:mailer_count => group_mail.split(",").size,
:mail_from_app => @data.mail_from_app
}
+38
View File
@@ -29,4 +29,42 @@ class MailCron
end
end
end
def self.send_mail_now(mail_cron_id)
mail_data = MailCron.find(mail_cron_id)
if !mail_data.blank?
@mail_j = 0
@read_mails = Array.new
@mails = mail_data.mail_to.split(",")
@mails.each do |send_mail|
@read_mails << send_mail
@mail_j += 1
if 0 == @mail_j % 30
MailCronMailer.cron_mail( mail_data.id, @read_mails.join(',') ).deliver
@read_mails = Array.new
sleep 10
end
end
if !@read_mails.join(',').blank?
MailCronMailer.cron_mail( mail_data.id, @read_mails.join(',') ).deliver
@read_mails = Array.new
sleep 10
end
end
end
end
+1 -1
View File
@@ -140,7 +140,7 @@ class ModuleApp
def sorted_tags_for_cloud
temp_tags = {}
self.tags.each{ |tag|
temp_tags.merge!({tag => Tag.get_impressionist(tag)})
temp_tags.merge!({tag => tag.cloud_view_count})
}
if !temp_tags.blank?
sorted_tags = temp_tags.sort{|a,b| a[1]<=>b[1]}.reverse
+1 -1
View File
@@ -3,7 +3,7 @@ class Page < Item
include Impressionist::Impressionable
include ParserFrontEnd
is_impressionable :counter_cache => { :column_name => :view_count }
is_impressionable #:counter_cache => { :column_name => :view_count }
field :content, localize: true
field :app_frontend_url
+1
View File
@@ -18,6 +18,7 @@ class Site
field :title_always_on, :type => Boolean, :default => false
field :dashbroad_allow_visitor, :type => Boolean, :default => false
field :mail_settings, :type => Hash
field :visitor_counters,:type=> Hash,:default=>{:total=>0,:today=>0,:this_week=>0,:this_month=>0,:this_year=>0}
field :disk_space, :type => String
field :system_package_info, :type => Hash,:default=>{}
+1 -25
View File
@@ -8,7 +8,7 @@ class Tag
include Mongoid::Timestamps
include Impressionist::Impressionable
is_impressionable :counter_cache => { :column_name => :view_count }
is_impressionable #:counter_cache => { :column_name => :view_count }
field :name, localize: true
field :view_count, :type => Integer, :default => 0
@@ -17,30 +17,6 @@ class Tag
belongs_to :module_tag, polymorphic: true
has_many :taggings, dependent: :destroy
#field :cloud_amper,:type: Integer,:default=> 0
# def self.sorted_for_cloud
# tags = {}
# self.all.each{ |tag|
# tags.merge!({tag => self.get_impressionist(tag)})
# }
# if !tags.blank?
# sorted_tags = tags.sort{|a,b| a[1]<=>b[1]}.reverse
# sorted_tags[0][1] = :hot1
# offset = (sorted_tags.size - 1) / 3
# i = 1
# class_i = 2
# sorted_tags[1..-1].collect!{ |x|
# x[1] = "hot#{class_i}"
# i == offset ? i = 1 : i += 1 if class_i < 4
# class_i += 1 if i == offset && class_i < 4
# }
# sorted_tags
# else
# []
# end
# end
protected
def self.get_impressionist(item_tag = self)
+1 -1
View File
@@ -3,7 +3,7 @@ class User
include Mongoid::Document
include Mongoid::Timestamps
devise :database_authenticatable, :recoverable, :rememberable, :trackable, :registerable, :validatable #, :timeoutable
devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable #, :timeoutable
mount_uploader :avatar, AvatarUploader
-1
View File
@@ -8,6 +8,5 @@
</table>
<div class="form-actions form-fixed pagination-right">
<%= link_to content_tag(:i, nil, :class => 'icon-plus icon-white') + t(:add), new_admin_design_path, :class => 'btn btn-primary pull-right' %>
<%= link_to content_tag(:i, nil, :class => 'icon-plus icon-white') + t(:upload), upload_package_admin_designs_path, :class => 'btn btn-primary pull-right' %>
</div>
+16 -13
View File
@@ -1,19 +1,22 @@
<%= content_tag :div,:class=>@tag_class do%>
<%= content_tag :div, class: @tag_class do %>
<div class="default_widget_type_A">
<table class="default_widget_tb" border="0" cellpadding="0" cellspacing="0" >
<thead>
<tr>
<% @frontend_field_names.each_with_index do |field,index|%>
<%= content_tag(:th,content_tag(:span,get_field_header(field),:class=>@frontend_classes[index]))unless field.blank?%>
<% end %>
</tr>
</thead>
<% @data.each do |row_data| %>
<thead>
<tr>
<% @frontend_field_names.each_with_index do |field,index|%>
<%= content_tag(:td,content_tag(:span,link_to_field(row_data,field, @frontend_sat_to_links[index], {orig_page: @page_id.to_s}),:class=>@frontend_classes[index]))unless field.blank?%>
<% @frontend_field_names.each_with_index do |field, index| %>
<%= content_tag(:th, content_tag(:span, get_field_header(field), class: @frontend_classes[index])) unless field.blank? %>
<% end %>
</tr>
<% end %>
</thead>
<tbody>
<% @data.each do |row_data| %>
<tr class="<%= get_top_hot_class(row_data) %>">
<% @frontend_field_names.each_with_index do |field, index|%>
<%= content_tag(:td, content_tag(:span, link_to_field(row_data, field, @frontend_sat_to_links[index], {orig_page: @page_id.to_s, category_id: get_row_category(row_data), tag_id: get_row_tags(row_data)}), class: @frontend_classes[index])) unless field.blank? %>
<% end %>
</tr>
<% end %>
</tbody>
</table>
<% end %>
</div>
<% end %>
+5 -5
View File
@@ -1,13 +1,13 @@
<%= content_tag :div,:class=>@tag_class do%>
<%= content_tag :div, class: @tag_class do %>
<ul class="default_widget_list">
<% @data.each do |row_data| %>
<%= content_tag(:li) do %>
<%= content_tag(:li, class: get_top_hot_class(row_data)) do %>
<div class="img app-pic">
<%= image_tag row_data.send(@widget_image_field)%>
<%= image_tag row_data.send(@widget_image_field) %>
</div>
<div class="wrap">
<% @frontend_field_names.each_with_index do |field,index|%>
<%= content_tag(:span,link_to_field(row_data,field, @frontend_sat_to_links[index], {orig_page: @page_id.to_s}),:class=>@frontend_classes[index]) unless field.blank?%>
<% @frontend_field_names.each_with_index do |field, index| %>
<%= content_tag(:span, link_to_field(row_data,field, @frontend_sat_to_links[index], {orig_page: @page_id.to_s, category_id: get_row_category(row_data), tag_id: get_row_tags(row_data)}), class: @frontend_classes[index]) unless field.blank? %>
<% end %>
</div>
<% end %>
+5 -5
View File
@@ -1,12 +1,12 @@
<%= content_tag :div,:class=>@tag_class do%>
<%= content_tag :div, class: @tag_class do %>
<div class="img app-pic">
<%= image_tag @data.first.send(@widget_image_field)%>
<%= image_tag @data.first.send(@widget_image_field) %>
</div>
<ul class="default_widget_list">
<% @data.each do |row_data| %>
<%= content_tag(:li) do %>
<% @frontend_field_names.each_with_index do |field,index|%>
<%= content_tag(:span, link_to_field(row_data,field, @frontend_sat_to_links[index], {orig_page: @page_id.to_s}),:class=>@frontend_classes[index]) unless field.blank?%>
<%= content_tag(:li, class: get_top_hot_class(row_data)) do %>
<% @frontend_field_names.each_with_index do |field, index|%>
<%= content_tag(:span, link_to_field(row_data, field, @frontend_sat_to_links[index], {orig_page: @page_id.to_s, category_id: get_row_category(row_data), tag_id: get_row_tags(row_data)}), class: @frontend_classes[index]) unless field.blank? %>
<% end %>
<% end %>
<% end %>
+7 -1
View File
@@ -1,3 +1,9 @@
dashboard_counter_cache:
cron: 0 * * * * *
class: DashboardCounter
args:
description: DashboardCounterCache
update_tag_cloud:
cron: 0 0 [0,12] * * *
class: UpdateTagCloud
@@ -14,4 +20,4 @@ email_cron:
cron: 0 0 [10,16,22] * * *
class: EmailCron
args:
description: EmailCron
description: EmailCron
+18
View File
@@ -0,0 +1,18 @@
class DelayImpressionistRequest
attr_accessor :session_options,:remote_ip,:referer,:user_agent
def initialize(request=nil)
if request
self.session_options=request.session_options
self.remote_ip=request.remote_ip
self.referer=request.referer
self.user_agent=request.user_agent
end
end
def restore(args)
args.each do |key,value|
self.send("#{key}=", value)
end
end
end
@@ -6,15 +6,14 @@ module DefaultWidgetTagHelper
@request = req
params.delete :inner
@params = params
params_str ="?"
params_str = "?"
params.each do |index,param|
if param.is_a?(Array) and !param.blank?
params_str << "&" unless params_str.eql?("?")
params_str << param.collect{|t| "#{index}[]=#{t}"}.join("&")
params.delete index
end
end
end
params_str = params_str + (params_str.eql?("?") ? params.to_param : "&#{params.to_param}" )
content_tag :div,:class=> 'more' do
link_to I18n.t(@more_link[:label_i18n]),[eval("#{@more_link[:path_method]}"),params_str].join()
+28
View File
@@ -0,0 +1,28 @@
module OrbitApp
module Module
module VisitorCounter
Version = "0.1"
def display_visitors(options={})
Site.first.visitor_counters["total"]
end
def display_visitors_today
Site.first.visitor_counters["today"]
end
def display_visitors_this_week
Site.first.visitor_counters["this_week"]
end
def display_visitors_this_month
Site.first.visitor_counters["this_month"]
end
def display_visitors_this_year
Site.first.visitor_counters["this_year"]
end
end # of VisitorCounter
end # of Module
end # of OrbitApp
@@ -0,0 +1,27 @@
module OrbitApp
module Module
module VisitorCounterEval
Version = "0.1"
def display_visitors(options={})
impressions = Impression.where(options).and(:referrer.ne => nil).distinct(:session_hash).count
end
def display_visitors_today
display_visitors(created_at: {'$gte' => Date.today.beginning_of_day, '$lte' => Date.today.end_of_day})
end
def display_visitors_this_week
display_visitors(created_at: {'$gte' => Date.today.beginning_of_week, '$lte' => Date.today.end_of_week})
end
def display_visitors_this_month
display_visitors(created_at: {'$gte' => Date.today.beginning_of_month, '$lte' => Date.today.end_of_month})
end
def display_visitors_this_year
display_visitors(created_at: {'$gte' => Date.today.beginning_of_year, '$lte' => Date.today.end_of_year})
end
end # end of VisitorCounterEval
end # of Module
end # of OrbitApp
+1 -3
View File
@@ -43,6 +43,7 @@ module OrbitTag
def tags=(tag_ids)
ids = [tag_ids].flatten
tag_ids.delete('')
self.tagged_ids = tag_ids
ids = self.taggings.blank? ? [] : self.taggings.map{|t| t.tag.id}
tag_ids.each do |tag_id|
unless ids.include? tag_id
@@ -58,9 +59,6 @@ module OrbitTag
def tag_ids=(ids)
self.tags = ids
ids = [ids].flatten
ids.delete('')
self.tagged_ids = ids
end
private
+16
View File
@@ -310,4 +310,20 @@ namespace :migrate do
Rake::Task["web_link_url:web_link_url_i18n"].execute
end
task :fix_tagged_ids => :environment do
Tag.all.each do |tag|
tag.taggings.each do |tagging|
tagged_ids = tagging.taggable.tagged_ids
unless tagged_ids.include?(tag.id.to_s)
tagged_ids << tag.id.to_s
tagging.taggable.update_attribute(:tagged_ids, tagged_ids)
end
end
end
end
task :clear_news_tags => :environment do
`mongo #{Mongoid.config.database.name} --eval "db.tags.remove({_type: {$ne: 'Tag'}})"`
end
end
@@ -7,6 +7,7 @@ class Panel::Announcement::BackEnd::ApprovalsController < OrbitBackendControlle
def preview_and_approve
email_group_data
@bulletin = Bulletin.find params[:bulletin_id]
end
@@ -112,7 +113,8 @@ class Panel::Announcement::BackEnd::ApprovalsController < OrbitBackendControlle
:mail_subject => "#{t("announcement.mail_subject",:site_title => @site.title)}:#{bulletin.title}",
:mail_to => @group_mail.join(','),
:mail_content => @mail_content ,
:mail_sentdate => bulletin.email_sentdate,
# :mail_sentdate => bulletin.email_sentdate,
:mail_sentdate => DateTime.now,
:create_user_id => bulletin.create_user_id,
:update_user_id => bulletin.create_user_id
}
@@ -121,6 +123,8 @@ class Panel::Announcement::BackEnd::ApprovalsController < OrbitBackendControlle
@mail_cron.save
MailCron.send_mail_now(@mail_cron.id)
end
end
@@ -153,12 +153,12 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController
respond_to do |format|
if @bulletin.save
if @bulletin.email_sent == true && @bulletin.is_checked == true && !@bulletin.is_rejected
send_email_data(@bulletin)
# if @bulletin.email_sent == true && @bulletin.is_checked == true && !@bulletin.is_rejected
# send_email_data(@bulletin)
@bulletin.email_sent = false
@bulletin.save
end
# @bulletin.email_sent = false
# @bulletin.save
# end
format.html { redirect_to(panel_announcement_back_end_bulletins_url, :notice => t('announcement.create_bulletin_success')) }
format.xml { render :xml => @bulletin, :status => :created, :location => @bulletin }
@@ -241,12 +241,12 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController
@bulletin.de_pending!
end
if @bulletin.email_sent == true && @bulletin.is_checked == true && !@bulletin.is_rejected
send_email_data(@bulletin)
# if @bulletin.email_sent == true && @bulletin.is_checked == true && !@bulletin.is_rejected
# send_email_data(@bulletin)
@bulletin.email_sent = false
@bulletin.save
end
# @bulletin.email_sent = false
# @bulletin.save
# end
# if (params[:bulletin][:is_checked] == "false")
# @bulletin.is_rejected = true
@@ -356,7 +356,8 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController
:mail_subject => "#{t("announcement.mail_subject",:site_title => @site.title)}:#{bulletin.title}",
:mail_to => @group_mail.join(','),
:mail_content => @mail_content ,
:mail_sentdate => bulletin.email_sentdate,
# :mail_sentdate => bulletin.email_sentdate,
:mail_sentdate => DateTime.now,
:create_user_id => bulletin.create_user_id,
:update_user_id => bulletin.create_user_id
}
@@ -365,6 +366,8 @@ class Panel::Announcement::BackEnd::BulletinsController < OrbitBackendController
@mail_cron.save
MailCron.send_mail_now(@mail_cron.id)
end
end
@@ -26,6 +26,7 @@ class Panel::Announcement::FrontEnd::BulletinsController < OrbitWidgetController
end
def index
@item = Page.find(params[:page_id]) rescue nil
if @item
if @item.frontend_data_count
@@ -60,7 +61,11 @@ class Panel::Announcement::FrontEnd::BulletinsController < OrbitWidgetController
else
@bulletins = Bulletin.all.available_for_lang(I18n.locale).can_display.any_of( {deadline: nil,:postdate.lte => date_now} , {:deadline.gte => date_now,:postdate.lte => date_now} ).desc( :is_top, :postdate).page( params[:page_main]).per(@page_num)
end
delayed_impressionist(@tag) if @tag
if params["tag_id"]
params["tag_id"].each do |tag_id|
delayed_impressionist(Tag.find tag_id) rescue nil
end
end
end
end
+27 -1
View File
@@ -14,7 +14,7 @@ class Bulletin
include OrbitTag::Taggable
taggable
is_impressionable :counter_cache => { :column_name => :view_count }
is_impressionable #:counter_cache => { :column_name => :view_count }
field :title, localize: true
field :subtitle, localize: true
@@ -221,6 +221,32 @@ class Bulletin
preview_object
end
def get_email_group_data(email_group_data)
group_mail = Array.new
self.email_group.each do |egroup|
if email_group_data.include?(egroup) and (egroup == '0' or egroup == '1' or egroup == '2' or egroup == '3')
group_mail << "#{email_group_data[egroup]["email"]}(#{email_group_data[egroup]["name"]})"
elsif email_group_data.include?(egroup) and egroup == '4'
self.other_mailaddress.split(",").each do |otmail|
group_mail << "#{otmail}(#{email_group_data[egroup]["name"]})"
end
end
end
group_mail.join("<br />").html_safe
end
protected
@@ -14,6 +14,12 @@
<%# preview_block_ad_images_helper(bulletin).each do |ad_image| -%>
<%#= image_tag ad_image.file,:alt => (ad_image.title[locale] || " "),:time_to_next => bulletin.transition_msec,:link_open=> ad_image.link_open, :link_url =>((ad_image.out_link || bulletin.context || " ")) %>
<%# end -%>
<% if !@bulletin.email_group.blank? %>
<%= label_tag 'group_mail' %>
<%= @bulletin.get_email_group_data(@email_group_data) %>
<% end %>
</p>
</div>
<div class="modal-footer">
@@ -278,7 +278,7 @@
<div id="content-box">
<hr />
<%= f.datetime_picker :email_sentdate, :picker_type => 'separated', :label => t("announcement.email_sentdate") %>
<%#= f.datetime_picker :email_sentdate, :picker_type => 'separated', :label => t("announcement.email_sentdate") %>
<br />
@@ -16,6 +16,7 @@ en:
bulletin_category_with_title: Bulletin Category with Title
postdate: Post Date
title: Title
subtitle: SubTitle
editing_announcement: Edit Announcement
editing_announcement_category: Edit Category
error:
@@ -16,6 +16,7 @@ zh_tw:
bulletin_category_with_title: 公告類別及標題
postdate: 張貼日期
title: 標題
subtitle: 副標題
editing_announcement: 編輯類別
editing_announcement_category: 編輯類別
error:
+4 -3
View File
@@ -23,18 +23,19 @@ module Announcement
end
category ["BulletinCategory"]
data_count 3..10
data_count 1..10
taggable
widgets do
default_widget do
query 'Bulletin.any_of( {deadline: nil,:postdate.lte => Time.now} , {:deadline.gte => Time.now,:postdate.lte => Time.now} )'
enable ["typeA","typeC"]
enable ["typeA","typeB_style3","typeC"]
image :image
field :postdate
link_field :title,{:method => 'panel_announcement_front_end_bulletin_path',:args=>:self}
link_field :title,{:method => 'panel_announcement_front_end_bulletin_path',:args=>:self,:preview=>true}
link_field :bulletin_category_with_title,{:method => 'panel_announcement_front_end_bulletins_path',:args=>{:category_id => [:bulletin_category,:id]}}
field :subtitle
link_to_more 'panel_announcement_front_end_bulletins_path',:title_i18n=> 'more_plus'
end
@@ -0,0 +1,7 @@
.bundle/
log/*.log
pkg/
test/dummy/db/*.sqlite3
test/dummy/log/*.log
test/dummy/tmp/
test/dummy/.sass-cache
+17
View File
@@ -0,0 +1,17 @@
source "http://rubygems.org"
# Declare your gem's dependencies in er_email.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'
+20
View File
@@ -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.
+3
View File
@@ -0,0 +1,3 @@
= ErEmail
This project rocks and uses MIT-LICENSE.
+40
View File
@@ -0,0 +1,40 @@
#!/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 = 'ErEmail'
rdoc.options << '--line-numbers'
rdoc.rdoc_files.include('README.rdoc')
rdoc.rdoc_files.include('lib/**/*.rb')
end
APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
load 'rails/tasks/engine.rake'
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
Whitespace-only changes.
Whitespace-only changes.
Whitespace-only changes.
Whitespace-only changes.
@@ -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
@@ -0,0 +1,145 @@
class Panel::ErEmail::BackEnd::ApprovalsController < OrbitBackendController
before_filter :authenticate_user!
before_filter :is_admin?
include AdminHelper
# layout 'admin'
def preview_and_approve
email_group_data
@email_er = EmailEr.find params[:email_er_id]
end
def approve
notice = ""
@email_er = EmailEr.find params[:email_er_id]
@email_er.proc_check(params[:email_er][:is_checked],params[:email_er][:not_checked_reason])
@email_er.de_pending
if @email_er.save
if @email_er.is_checked == true and !@email_er.is_rejected
send_email_data(@email_er)
end
notice = t('er_email.approve_email_er_success')
else
notice = t('er_email.approve_email_er_fail')
end
redirect_to(panel_er_email_back_end_email_ers_url,:notice => notice)
end
def setting
@sys_users = User.all(conditions: {admin: false}).includes(:avatar).not_guest_user
@email_er_categorys = EmailErCategory.all
@options_from_collection_for_select_email_er_categorys = @email_er_categorys.collect{|bc| [bc.title,bc.id] }
if params.has_key? :category
@email_er_category = EmailErCategory.find params[:category][:id]
else
@email_er_category = @email_er_categorys.first
end
preload_object_auth = @email_er_category.get_object_auth_by_title('fact_check')
@users_array = preload_object_auth.privilege_users rescue []
respond_to do |format|
format.html
format.js
end
end
def update_setting
object_auth = update_setting_by_params
if object_auth.save!
flash[:notice] = t('update.success_')
else
flash[:notice] = t('update.fail')
end
end
def user_list
@email_er_category = EmailErCategory.find params[:category][:id]
end
protected
def update_setting_by_params
category = EmailErCategory.find params[:category][:id]
privilege_users = params[:users].collect{|key,value| User.find key } rescue []
object_auth_ary = category.object_auths.where(title: 'fact_check') || (category.object_auths.create :title=> 'fact_check')
object_auth = object_auth_ary.first
object_auth.privilege_users = privilege_users
object_auth
end
def send_email_data(email_er)
@user = User.find(email_er.create_user_id)
email_group_data
@group_mail = Array.new
email_er.email_group.each do |egroup|
if @email_group_data.include?(egroup) and (egroup == '0' or egroup == '1' or egroup == '2' or egroup == '3')
@group_mail << @email_group_data[egroup]["email"]
elsif @email_group_data.include?(egroup) and egroup == '4'
@group_mail << email_er.other_mailaddress
end
end
if !@group_mail.join.blank?
@mail_content = {
"text" => email_er.mail_content
}
@mail_cron = {
:mail_from_app => 'er_email',
:mail_from => @user.email,
:mail_reply_to => @user.email,
:mail_subject => email_er.mail_subject,
:mail_to => @group_mail.join(','),
:mail_content => @mail_content ,
# :mail_sentdate => email_er.mail_sentdate,
:mail_sentdate => DateTime.now,
:create_user_id => email_er.create_user_id,
:update_user_id => email_er.create_user_id
}
@mail_cron = MailCron.new(@mail_cron)
email_er.email_er_files.each do | mrfile |
@mcfile = @mail_cron.mail_cron_files.build
tmp_file = File.new(mrfile.file_identifier, 'w+')
tmp_file.write(Mongo::GridFileSystem.new(Mongoid.database).open(mrfile.file.url.gsub("/gridfs/", ""), 'r').read.force_encoding("UTF-8"))
@mcfile.file = tmp_file
@mcfile.title = mrfile.title
# delete file
FileUtils.rm_f(tmp_file)
end
@mail_cron.save
MailCron.send_mail_now(@mail_cron.id)
end
end
def email_group_data
@email_group_data = EmailEr.email_group_data
end
end
@@ -0,0 +1,128 @@
class Panel::ErEmail::BackEnd::EmailErCategorysController < OrbitBackendController
include OrbitControllerLib::DivisionForDisable
before_filter :for_app_manager,:except => [:index,:get_categorys_json]
before_filter :force_order_for_visitor,:only=>[:index,:get_categorys_json]
before_filter :force_order_for_user,:except => [:index,:get_categorys_json]
before_filter :for_app_sub_manager,:except => [:index,:get_categorys_json]
def index
@email_er_categorys = get_categories_for_index("EmailErCategory")
@email_er_category = EmailErCategory.new(:display => 'List')
@url = panel_er_email_back_end_email_er_categorys_path
respond_to do |format|
format.html # index.html.erb
format.js
end
end
def get_categorys_json
categorys = EmailErCategory.all
data = Array.new
categorys.each do |c|
data << {
category: c.title,
link: "#{url_for( :action => "index",
:controller => "panel/er_email/back_end/email_ers",
:format => :rss,
:only_path => false,
:inner=>true,
:category_id => c )}"
}
end
render :json => JSON.pretty_generate(data)
end
# GET /email_ers/1
# GET /email_ers/1.xml
def show
@email_er_category = EmailErCategory.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.js
end
end
# GET /email_ers/new
# GET /email_ers/new.xml
def new
@email_er_category = EmailErCategory.new(:display => 'List')
respond_to do |format|
format.html # new.html.erb
format.js
end
end
# GET /email_ers/1/edit
def edit
@email_er_category = EmailErCategory.find(params[:id])
@url = panel_er_email_back_end_email_er_category_path(@email_er_category)
respond_to do |format|
format.html
format.js
end
end
# POST /email_ers
# POST /email_ers.xml
def create
@email_er_category = EmailErCategory.new(params[:email_er_category])
respond_to do |format|
if @email_er_category.save
format.html { redirect_to(panel_er_email_back_end_email_er_categorys_url, :notice => t('email_er_category.create_email_er_category_success')) }
format.js
else
format.html { render :action => "new" }
format.js { render action: "new" }
end
end
end
# PUT /email_ers/1
# PUT /email_ers/1.xml
def update
@email_er_category = EmailErCategory.find(params[:id])
@url = panel_er_email_back_end_email_er_category_path(@email_er_category)
respond_to do |format|
if @email_er_category.update_attributes(params[:email_er_category])
format.html { redirect_to(panel_er_email_back_end_email_er_categorys_url, :notice => t('email_er_category.update_email_er_category_success')) }
# format.xml { head :ok }
format.js
else
format.html { render :action => "edit" }
format.js { render :action => "edit" }
end
end
end
# DELETE /email_ers/1
# DELETE /email_ers/1.xml
def destroy
@email_er_category = EmailErCategory.find(params[:id])
@email_er_category.disable = @email_er_category.disable ? false : true
if @email_er_category.save!
respond_to do |format|
flash[:notice] = t("update.success_")
# flash[:error] += @email_er_category.disable ? t(:enable) : t(disable)
format.html { redirect_to(panel_er_email_back_end_email_er_categorys_url) }
# format.xml { head :ok }
format.js
end
else
flash[:error] = t("update.fail")
format.html { render :action => "index" }
end
end
end
@@ -0,0 +1,318 @@
class Panel::ErEmail::BackEnd::EmailErsController < OrbitBackendController
# before_filter :for_app_manager,:except => [:index,:show]
include OrbitControllerLib::DivisionForDisable
before_filter :force_order_for_user
before_filter :only => [ :new,:edit,:update,:create] do |controller|
controller.get_categorys('EmailErCategory')
end
def preview
email_er = EmailEr.new params
@preview_obj = email_er.to_preview
@preview_obj.save
render '/shared/preview/preview.html.erb',:layout=>false
end
def index
get_categorys("EmailErCategory",params[:email_er_category_id])
email_group_data
@filter = params[:filter]
new_filter = params[:new_filter]
if @filter && params[:clear]
@filter.delete(params[:type])
elsif @filter && new_filter
if @filter.has_key?(new_filter[:type]) && @filter[new_filter[:type]].include?(new_filter[:id].to_s)
@filter[new_filter[:type]].delete(new_filter[:id].to_s)
elsif @filter.has_key?(new_filter[:type])
@filter[new_filter[:type]] << new_filter[:id].to_s
else
@filter.merge!({new_filter[:type] => [new_filter[:id].to_s]})
end
elsif new_filter
@filter = {new_filter[:type] => [new_filter[:id].to_s]}
end
@email_er_categories = get_categories_for_index("EmailErCategory")
@email_er_category_ids = @email_er_categories.collect{|t| t.id.to_s} + [nil]
@email_ers = (params[:sort] || @filter) ? get_sorted_and_filtered("email_er",:email_er_category_id.in => @email_er_category_ids) : get_viewable("email_er",:email_er_category_id.in => @email_er_category_ids)
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @email_ers }
format.js
end
end
# GET /email_ers/1
# GET /email_ers/1.xml
def show
email_group_data
@item = Page.find(params[:page_id]) rescue nil
if params[:preview] == "true"
preview_content
else
@email_er = EmailEr.all.can_display.where(_id: params[:id]).first
if @email_er and !@email_er.disable? and !@email_er.is_rejected
if @email_er.enabled_for_lang(I18n.locale.to_s)
delayed_impressionist(@email_er)
# get_categorys
else
render :text => "<div class='alert alert-error'>#{t('sys.can_not_display_due_to_no_context')}</div>".html_safe
end
else
render :nothing => true, :status => 403
end
end
end
def preview_content
@email_er = EmailEr.find params[:id] rescue nil
@email_er = Preview.find(params[:id]).get_virtual_object if @email_er.nil?
# get_categorys
end
# GET /email_ers/new
# GET /email_ers/new.xml
def new
email_group_data
@email_er = EmailEr.new(:mail_sentdate => DateTime.now)
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @email_er }
end
end
# GET /email_ers/1/edit
def edit
email_group_data
@email_er = EmailEr.find(params[:id])
end
# POST /email_ers
# POST /email_ers.xml
def create
email_group_data
@email_er = EmailEr.new(params[:email_er])
@email_er.create_user_id = current_user.id
@email_er.update_user_id = current_user.id
if(is_manager? || is_admin?)
@email_er.is_checked = true
@email_er.is_rejected = false
@email_er.de_pending
end
respond_to do |format|
if @email_er.save
# if @email_er.is_checked == true and !@email_er.is_rejected
# send_email_data(@email_er)
# end
format.html { redirect_to(panel_er_email_back_end_email_ers_url) }
format.xml { render :xml => @email_er, :status => :created, :location => @email_er }
# format.js
format.js {
@info = {"success"=>"true","redirect_url"=>panel_er_email_back_end_email_ers_url}
flash[:notice] = t('er_email.create_er_email_success')
render "/shared/preview/after_create.js.erb"
}
else
format.html { render :action => "new" }
format.xml { render :xml => @email_er.errors, :status => :unprocessable_entity }
format.js {
@info = {"success"=>"false","redirect_url"=>new_panel_er_email_back_end_email_er_url(:email_er => @email_er)}
session[:in_validate_object] = @email_er
render "/shared/preview/after_create.js.erb"
}
end
end
end
# PUT /email_ers/1
# PUT /email_ers/1.xml
def update
email_group_data
@email_er = EmailEr.find(params[:id])
@email_er.update_user_id = current_user.id
respond_to do |format|
if @email_er.update_attributes(params[:email_er])
if(is_manager? || is_admin?)
@email_er.is_checked = true
@email_er.is_rejected = false
@email_er.de_pending!
end
if @email_er.is_checked == true and !@email_er.is_rejected
send_email_data(@email_er)
end
format.html { redirect_to(panel_er_email_back_end_email_ers_url(:page => params[:page])) }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @email_er.errors, :status => :unprocessable_entity }
end
end
end
# DELETE /email_ers/1
# DELETE /email_ers/1.xml
def destroy
@email_er = EmailEr.find(params[:id])
@email_er.destroy
respond_to do |format|
format.html { redirect_to(panel_er_email_back_end_email_ers_url) }
# format.xml { head :ok }
format.js
end
end
def delete
if params[:ids]
# email_ers = EmailEr.any_in(:_id => params[:ids]).destroy_all
end
redirect_to panel_er_email_back_end_email_ers_url(:direction => params[:direction], :sort => params[:sort], :sort_options => params[:sort_options])
end
def email_resend
if params[:id]
@email_er = EmailEr.find(params[:id])
@email_er.is_checked = false
@email_er.is_pending = true
@email_er.save
end
redirect_to panel_er_email_back_end_email_ers_url(:direction => params[:direction], :sort => params[:sort], :sort_options => params[:sort_options])
end
def test_send_email
if params[:id]
@email_er = EmailEr.find(params[:id])
if (@email_er.create_user_id == current_or_guest_user.id) || is_manager?
if current_or_guest_user.admin? || (!@email_er.is_rejected? && !@email_er.is_checked?)
if @email_er.is_pending
send_email_data( @email_er , true )
end
end
end
end
redirect_to panel_er_email_back_end_email_ers_url(:direction => params[:direction], :sort => params[:sort], :sort_options => params[:sort_options])
end
protected
def send_email_data(email_er , test_send = false)
@user = User.find(email_er.create_user_id)
if !test_send
email_group_data
@group_mail = Array.new
email_er.email_group.each do |egroup|
if @email_group_data.include?(egroup) and (egroup == '0' or egroup == '1' or egroup == '2' or egroup == '3')
@group_mail << @email_group_data[egroup]["email"]
elsif @email_group_data.include?(egroup) and egroup == '4'
@group_mail << email_er.other_mailaddress
end
end
else
# @group_mail = ["spen@rulingcom.com"]
@group_mail = [@user.email]
end
if !@group_mail.join.blank?
@mail_content = {
"text" => email_er.mail_content
}
@mail_cron = {
:mail_from_app => 'er_email',
:mail_from => @user.email,
:mail_reply_to => @user.email,
:mail_subject => email_er.mail_subject,
:mail_to => @group_mail.join(','),
:mail_content => @mail_content ,
# :mail_sentdate => email_er.mail_sentdate,
:mail_sentdate => DateTime.now,
:create_user_id => email_er.create_user_id,
:update_user_id => email_er.create_user_id
}
@mail_cron = MailCron.new(@mail_cron)
email_er.email_er_files.each do | mrfile |
@mcfile = @mail_cron.mail_cron_files.build
tmp_file = File.new(mrfile.file_identifier, 'w+')
tmp_file.write(Mongo::GridFileSystem.new(Mongoid.database).open(mrfile.file.url.gsub("/gridfs/", ""), 'r').read.force_encoding("UTF-8"))
@mcfile.file = tmp_file
@mcfile.title = mrfile.title
# delete file
FileUtils.rm_f(tmp_file)
end
@mail_cron.save
MailCron.send_mail_now(@mail_cron.id)
end
end
def email_group_data
@email_group_data = EmailEr.email_group_data
end
end
Whitespace-only changes.
@@ -0,0 +1,16 @@
module Panel::ErEmail::BackEnd::EmailErCategorysHelper
include ActionView::Helpers::UrlHelper
def show_anc_cate_permission_link(email_er_category)
type = 'submit'
oa = email_er_category.get_object_auth_by_title(type)
if oa.nil?
email_er_category.object_auths.new(title: type ).save
oa = email_er_category.get_object_auth_by_title(type)
end
# link_to t(:category_auth), edit_admin_object_auth_path(oa)
link_to t(:category_auth),admin_object_auth_ob_auth_path(oa)
end
end
@@ -0,0 +1,58 @@
module Panel::ErEmail::BackEnd::EmailErsHelper
def show_reject_reason(email_er)
by_email_er = email_er.is_rejected
by_user = (((email_er.create_user_id == current_user.id) rescue nil) or is_manager? or is_admin?)
by_email_er && by_user
end
def show_form_status_field(email_er)
#by_email_er = (!email_er.is_expired? and email_er.is_pending?)
by_user = ((email_er.email_er_category.authed_users('fact_check').include?(current_user) rescue nil) or is_manager? or is_admin?)
by_user
end
def show_approval_link(email_er)
by_email_er = (email_er.is_pending?)
by_user = ((email_er.email_er_category.authed_users('fact_check').include?(current_user) rescue nil) or is_manager? or is_admin?)
by_email_er and by_user
end
def show_delete_link(email_er)
if !current_user.nil?
by_email_er = (email_er.create_user_id == current_user.id )
by_user = (is_manager? or is_admin?)
by_email_er or by_user
else
false
end
end
def show_email_er_title_at_index (email_er)
if email_er.is_checked?
link_to email_er.title, panel_er_email_front_end_email_er_path(email_er, :category_id => email_er.email_er_category.id) rescue ''
else
email_er.title
end
end
def file_picture_preview_setting(file_path)
ext = File.extname(file_path)[1..-1].downcase
unless file_path.nil?
case ext
when "jpg","jpeg","png","gif"
{"data-content" => "#{image_tag file_path}" }
when "pdf", "zip", "rar"
{"data-content" => "#{image_tag("http://#{request.host_with_port}/assets/ft-icons/#{ext}/#{ext}-64_32.png")}"}
when "doc", "docx"
{"data-content" => "#{image_tag("http://#{request.host_with_port}/assets/ft-icons/docx_mac/docx_mac-64_32.png")}"}
when "xls", "xlsx"
{"data-content" => "#{image_tag("http://#{request.host_with_port}/assets/ft-icons/xlsx_mac/xlsx_mac-64_32.png")}"}
when "ppt", "pptx"
{"data-content" => "#{image_tag("http://#{request.host_with_port}/assets/ft-icons/pptx_mac/pptx_mac-64_32.png")}"}
else
{"data-content" => t("sys.not_previewable") }
end
end
end
end
Whitespace-only changes.
Whitespace-only changes.
+123
View File
@@ -0,0 +1,123 @@
# encoding: utf-8
class EmailEr
include Mongoid::Document
include Mongoid::Timestamps
include Mongoid::MultiParameterAttributes
include OrbitCoreLib::Preview
BelongsToCategory = :email_er_category
include OrbitCoreLib::BelongsToCategoryMayDisable
PAYMENT_TYPES = @site_valid_locales
field :mail_subject
field :mail_sentdate , :type => DateTime
field :mail_content
field :create_user_id
field :update_user_id
field :is_checked, :type => Boolean, :default => false
field :is_pending, :type => Boolean, :default => true
field :is_rejected, :type => Boolean, :default => false
field :not_checked_reason
field :email_group, :type => Array
field :other_mailaddress
scope :can_display,where(is_hidden: false)
has_many :email_er_files, :autosave => true, :dependent => :destroy
accepts_nested_attributes_for :email_er_files, :allow_destroy => true
validates :mail_subject,presence:{message:'blank is not allowed'}
validates :other_mailaddress,
:length => {:maximum => 1000, :message => I18n.t("er_email.other_mailaddress_note_limit")}
def proc_check(check,not_pass_info = "")
self.is_checked = true
if check =="true"
self.is_rejected = false
elsif check == "false"
self.is_rejected = true
self.not_checked_reason = not_pass_info
end
end
def de_pending
self.is_pending = false
end
def de_pending!
de_pending
self.save!
end
def is_checked?
!self.is_pending && self.is_checked && (self.is_rejected == false)
end
def is_pending?
self.is_pending
end
def is_rejected?
!self.is_pending && self.is_rejected && (self.is_rejected == true)
end
def get_email_group_data(email_group_data)
group_mail = Array.new
self.email_group.each do |egroup|
if email_group_data.include?(egroup) and (egroup == '0' or egroup == '1' or egroup == '2' or egroup == '3')
group_mail << "#{email_group_data[egroup]["email"]}(#{email_group_data[egroup]["name"]})"
elsif email_group_data.include?(egroup) and egroup == '4'
self.other_mailaddress.split(",").each do |otmail|
group_mail << "#{otmail}(#{email_group_data[egroup]["name"]})"
end
end
end
group_mail.join("<br />").html_safe
end
def to_preview
preview_object = Preview.new(:expired_at=>DateTime.now+30.minutes,:preview_at_link=>"panel_er_email_back_end_email_er_path",:object_class_type=>"EmailEr")
self.email_er["email_er_files_attributes"].each_with_index do |atr,idx|
preview_object.preview_files.build(:file=>self.email_er["email_er_files_attributes"][idx.to_s],:field_name_for_rebuild=>'email_er_files',:file_in_array=>true)
end unless self.email_er["email_er_files_attributes"].nil?
preview_object.object = self.email_er.except("email_er_files_attributes")
preview_object
end
protected
def self.email_group_data
@email_group_data = {
'0'=> {"name"=>I18n.t('er_email.email_group_data_0'), "email"=>"alluser@tea.ntue.edu.tw"},
'1'=> {"name"=>I18n.t('er_email.email_group_data_1'), "email"=>"allstu@tea.ntue.edu.tw"},
'2'=> {"name"=>I18n.t('er_email.email_group_data_2'), "email"=>"allgrad@tea.ntue.edu.tw"},
'3'=> {"name"=>I18n.t('er_email.email_group_data_3'), "email"=>"allad@tea.ntue.edu.tw"},
'4'=> {"name"=>I18n.t('er_email.email_group_data_4')}
}
end
end
@@ -0,0 +1,47 @@
# encoding: utf-8
class EmailErCategory
include Mongoid::Document
include Mongoid::Timestamps
include OrbitCoreLib::ObjectAuthable
include OrbitCoreLib::ObjectDisable
include Sunspot::Mongo
# include Mongoid::MultiParameterAttributes
APP_NAME = 'ErEmail'
ObjectAuthTitlesOptions = %W{submit_new fact_check}
AfterObjectAuthUrl = '/panel/er_email/back_end/email_er_categorys'
field :disable, type: Boolean, :default => false
field :display
field :key
field :title, localize: true
has_many :email_ers
validates :title, :at_least_one => true
searchable do
text :titles do
title_translations.to_a.collect{|t| t[1]}
end
boolean :frontend_search do
!disable
end
text :files do
email_ers.can_display.collect{|t| t.title_translations.to_a.collect{|t| t[1]}}
end
end
def pp_object
title
end
def self.from_id(id)
EmailErCategory.find(id) rescue nil
end
end
@@ -0,0 +1,23 @@
class EmailErFile
include Mongoid::Document
include Mongoid::Timestamps
mount_uploader :file, AssetUploader
field :should_destroy, :type => Boolean
field :title
belongs_to :email_er
validate :file_size
private
def file_size
if file.file.size > 1.megabytes
errors.add( :file, I18n.t("er_email.email_file_limit"))
end
end
end
Whitespace-only changes.
@@ -0,0 +1,68 @@
<% if email_er -%>
<div class="modal hide fade in banner-preview" id="email_er-<%=email_er.id%>">
<div class="modal-header">
<a class="close" data-dismiss="modal">×</a>
<h3><%= t(:preview) %></h3>
</div>
<div class="modal-body">
<p class="email_er_slideshow">
<iframe src=<%= panel_er_email_back_end_email_er_path(email_er, :category_id => email_er.email_er_category.id ,:preview=>true) %> style="width:1024px;height:300px" >
</iframe>
<% if !@email_er.email_group.blank? %>
<%= label_tag 'group_mail' %>
<%= @email_er.get_email_group_data(@email_group_data) %>
<% end %>
</p>
</div>
<div class="modal-footer">
<%= form_for email_er, :url => panel_er_email_back_end_email_er_approve_path(email_er),:method => :post, :html => {:class => 'clear'} do |f| %>
<%= f.label :approval_stat, t('approval.stat') %>
<%= content_tag :label,:class => "radio inline" do -%>
<%= f.radio_button :is_checked, true , {:class => 'privacy'} %>
<%= t('approval.pass') %>
<% end -%>
<%= content_tag :label,:class => "radio inline" do -%>
<%= f.radio_button :is_checked, false, (!@email_er.is_checked ? {:checked => true, :class => 'privacy'} : {})%>
<%= t('approval.not_pass') %>
<% end -%>
<%= label :is_checked_false, t('approval.not_pass_reason') %>
<%= f.text_field :not_checked_reason %>
<%= f.submit t(:submit_approval),:class=>"btn"%>
<% end %>
<a href="#" class="btn" data-dismiss="modal"><%= t(:close) %></a>
</div>
<div>
<script type="text/javascript" src="/static/kernel.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$(".modal").on("hidden", function () {
$("#show_preview").remove();
});
$("iframe").load(function(){
// Get the body element
var frameBody = $("iframe").contents().find("body");
// Get all links inside the BODY tag
$('a', frameBody).click(function(e){
//Disable all default actions
e.preventDefault();
});
$('input', frameBody).attr("disabled", true);
});
});
</script>
</div>
</div>
<% end -%>
@@ -0,0 +1,44 @@
<% if email_er_category -%>
<div class="modal hide fade in" id="email_er_category-<%=email_er_category.id%>">
<div class="modal-header">
<a class="close" data-dismiss="modal">×</a>
<h3><%= t("approval.user_list") %></h3>
</div>
<div class="modal-body">
<div class="clear">
<% email_er_category.get_object_auth_by_title('fact_check').auth_users.each do |user| %>
<div class="checkbox clear checked">
<div class='member-avatar'>
<% if user.avatar? %>
<%= image_tag(user.avatar.thumb.url,:class => "member-img") %>
<% else %>
<%= image_tag "person.png",:class => "member-img" %>
<% end %>
</div>
<%= label_tag "lab-user-#{user.id}", (user.name rescue ''),:class=>"member-name",:id=>nil -%>
</div>
<% end -%>
<divl>
</div>
<div class="modal-footer">
<a href="#" class="btn" data-dismiss="modal"><%= t(:close) %></a>
</div>
<div>
<script type="text/javascript" src="/static/kernel.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$("#email_er_category-<%=email_er_category.id%>").on("show", function () {
});
$(".modal").on("hidden", function () {
$("#show_preview").remove();
});
});
</script>
</div>
</div>
<% end -%>
@@ -0,0 +1,5 @@
$('#show_preview').html("<%= escape_javascript(render(:partial => 'modal_approve',:locals => {:email_er => @email_er})) %>");
var start_modal_with_id = "email_er-<%=@email_er.id%>";
$("#"+start_modal_with_id).css("width","1050px");
$("#"+start_modal_with_id).css("height","768px");
$("#"+start_modal_with_id).css("margin","-270px 0 0 -550px");
@@ -0,0 +1,53 @@
<% content_for :page_specific_css do %>
<%= stylesheet_link_tag "inc/permission-checkbox" %>
<% end %>
<% content_for :page_specific_javascript do %>
<%= javascript_include_tag "inc/permission-checkbox" %>
<%= javascript_include_tag "inc/search" %>
<%= javascript_include_tag "inc/modal-preview" %>
<% end %>
<%= form_tag('', :remote => true,:class => "prevent_enter_submit_form") %>
<div class="subnav clear">
<ul class="nav nav-pills filter pull-left">
<li class="accordion-group">
<div class="form-search" style="margin: 5px 10px;">
<%= label_tag :category, t(:category) %>
<%= select "category",'id',@options_from_collection_for_select_email_er_categorys %>
<%= search_field_tag 'user_filter' %>
</div>
</li>
</ul>
<%= link_to t("approval.user_list"), panel_er_email_back_end_approval_user_list_path , :class=>'preview_trigger btn btn-success pull-right'%>
</div>
<%#= label_tag :role, t(:roles) %>
<div class="clear">
<%= content_tag :div do -%>
<% form_tag panel_er_email_back_end_approval_setting_path do %>
<%= render :partial => "layouts/users_checkbox_ary" %>
<div class="form-actions form-fixed pagination-right">
<%= submit_tag t(:update_), :class => 'btn btn-primary' %>
</div>
<% end -%>
<% end -%>
</div>
<script type="text/javascript" charset="utf-8">
var availableTags = [];
$(document).ready(function() {
$(".prevent_enter_submit_form").bind("keypress", function(e) {
if (e.keyCode == 13) {
return false;
}
});
$('#category_id').change(function() {
$.ajax({
type: 'GET',
dataType: "script",
url:$(this).parents("from").attr("href"),
data:$(this).parents("form").serialize()
});
});
});
</script>
@@ -0,0 +1,2 @@
$("#users_checkbox_ary").replaceWith('<%= escape_javascript(render :partial=> "layouts/users_checkbox_ary" )%>');
permissionCheckbox();
@@ -0,0 +1 @@
alert( "<% flash.each do |key, msg| %><%= msg %><% end%>");
@@ -0,0 +1,2 @@
$('#show_preview').html("<%= escape_javascript(render(:partial => 'modal_list',:locals => {:email_er_category => @email_er_category})) %>");
var start_modal_with_id = "email_er_category-<%=@email_er_category.id%>"
@@ -0,0 +1,19 @@
<tr id="<%= dom_id email_er_category %>" class="with_action">
<td>
<%= email_er_category.key %>
<div class="quick-edit">
<ul class="nav nav-pills hide">
<li><%= link_to t(:edit), edit_panel_er_email_back_end_email_er_category_path(email_er_category), :remote => true %></li>
<li><%= link_to show_toggle_archive_btn(email_er_category) , panel_er_email_back_end_email_er_category_path(email_er_category), :confirm => t(:sure?), :method => :delete, :remote => true,:class=> "archive_toggle" %></li>
<%if is_manager? || is_admin? %>
<li><%= show_anc_cate_permission_link(email_er_category) %></li>
<% end %>
</ul>
</div>
</td>
<% @site_valid_locales.each do |locale| %>
<td><%= email_er_category.title_translations[locale] rescue nil %></td>
<% end %>
</tr>
@@ -0,0 +1,30 @@
<% # encoding: utf-8 %>
<%= form_for(@email_er_category, :remote => true, :url => @url) do |f| %>
<h2><%= (@email_er_category.new_record? ? 'Add' : 'Edit') %></h2>
<div id="widget-title">
<%= f.label :key %>
<%= f.text_field :key %>
</div>
<div id="widget-title">
<%= f.fields_for :title_translations do |f| %>
<% @site_valid_locales.each do |locale| %>
<div class="control-group">
<%= label_tag "name-#{locale}", "Name-#{I18nVariable.from_locale(locale)}", :class => 'control-label' %>
<div class="controls">
<%= f.text_field locale, :class =>' input-xxlarge', :value => (@email_er_category.title_translations[locale] rescue nil) %>
</div>
</div>
<% end %>
<% end %>
</div>
<div class="form-actions">
<%= f.submit 'Submit/送出', :class=>'btn btn-primary' %>
</div>
<% end %>
@@ -0,0 +1,2 @@
$('<%= j render :partial => 'email_er_category', :collection => [@email_er_category] %>').appendTo('#email_er_categorys').hide().fadeIn();
$("#new_email_er_category")[0].reset();
@@ -0,0 +1 @@
$("#<%= dom_id @email_er_category %>").find(".archive_toggle").text("<%= show_toggle_archive_btn(@email_er_category) %> ");
@@ -0,0 +1 @@
$("#form > form").replaceWith("<%= j render "form" %>");
@@ -0,0 +1,23 @@
<%= flash_messages %>
<table id="email_er_categorys" class="table main-list">
<thead>
<tr>
<th class="span1-2"><%= t('email_er_category.key') %></th>
<% @site_valid_locales.each do |locale| %>
<th class="span1-2"><%= I18nVariable.first(:conditions => {:key => locale})[I18n.locale] %></th>
<% end %>
</tr>
</thead>
<tbody>
<%= render :partial => 'email_er_category', :collection => @email_er_categorys %>
</tbody>
</table>
<div id="form"><%= render :partial => "form" %></div>
@@ -0,0 +1 @@
$("#form > form").replaceWith("<%= j render "form" %>");
@@ -0,0 +1,4 @@
$("#<%= dom_id @email_er_category %>").replaceWith("<%= j render :partial => 'email_er_category', :collection => [@email_er_category] %>");
<% @email_er_category = EmailErCategory.new(:display => 'List') # reset for new form %>
$(".edit_email_er_category").replaceWith("<%= j render "form" %>")
$(".new_email_er_category")[0].reset();
@@ -0,0 +1,3 @@
<div class="filter-clear">
<%= link_to content_tag(:i, nil, :class => 'icons-cycle') + t(:clear), panel_archive_back_end_archive_files_path(:filter => @filter, :sort => params[:sort], :direction => params[:direction], :clear => true, :type => type), :class => "btn btn-small js_history" %>
</div>
@@ -0,0 +1,61 @@
<tr id="<%= dom_id email_er %>" class="with_action">
<td>
<% if (email_er.create_user_id == current_or_guest_user.id) || is_manager? %>
<%= check_box_tag 'to_delete[]', email_er.id, false, :class => "checkbox_in_list" %>
<% end -%>
</td>
<td>
<div class="label-group">
<div class="label-td">
<% if email_er.is_pending? %>
<span class="label"><%= t(:pending) %></span>
<% end %>
<% if email_er.is_checked? %>
<span class="label"><%= t(:passed) %></span>
<% end %>
<% if email_er.is_rejected? %>
<span class="label"><%= t(:rejected) %></span>
<% end %>
</div>
</div>
</td>
<td>
<%= email_er.email_er_category.title %>
</td>
<td class="span1">
<%= email_er.mail_subject %>
<div class="quick-edit">
<ul class="nav nav-pills hide">
<%#if at_least_module_manager %>
<% if (email_er.create_user_id == current_or_guest_user.id) || is_manager? %>
<% if current_or_guest_user.admin? || (!email_er.is_rejected? && !email_er.is_checked?) %>
<li><%= link_to t(:edit), edit_panel_er_email_back_end_email_er_path(email_er, :page => params[:page], :filter => @filter) %></li>
<% if email_er.is_pending %>
<li><%= link_to t('er_email.test_send_email'), test_send_email_panel_er_email_back_end_email_ers_path(:id=>email_er.id), :confirm => t('sure?'), :controller => "email_er", :action => "test_send_email" %></li>
<% end %>
<% end %>
<li><%= link_to t(:delete_), panel_er_email_back_end_email_er_path(email_er), :confirm => t('sure?'), :method => :delete, :remote => true %></li>
<% if email_er.is_checked and !email_er.is_rejected %>
<li><%= link_to t('er_email.email_resend'), email_resend_panel_er_email_back_end_email_ers_path(:id=>email_er.id), :confirm => t('sure?'), :controller => "email_er", :action => "email_resend" %></li>
<% end %>
<% end -%>
<% if show_approval_link(email_er) %>
<li><%= link_to t(:approval_), panel_er_email_back_end_email_er_approval_preview_path(email_er),:class => 'preview_trigger' %></li><%#= #TODO add ancher so user can quick access into that part %>
<% end %>
<% if show_reject_reason(email_er)%>
<li><%= link_to t('rejected_reason')+truncate(email_er.not_checked_reason, :length => 10),'#',:rel=>"tooltip" ,'data-original-title'=> (wrap_string_with(email_er.not_checked_reason, :line_width => 24)),:class=>'reject_info' %></li>
<% end %>
</ul>
</div>
</td>
<td class="span2">
<%= email_er.get_email_group_data(@email_group_data) %>
</td>
</tr>
@@ -0,0 +1,11 @@
<div id="filter" class="subnav">
<div class="filters">
<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,115 @@
<% # encoding: utf-8 %>
<% content_for :page_specific_javascript do -%>
<%= javascript_include_tag "inc/modal-preview" %>
<% end -%>
<%= f.error_messages %>
<!--Post Start-->
<div id="post-body">
<div id="post-body-content" class="clear">
<%= f.label :category,t(:category)%>
<%= f.select :email_er_category_id, @email_er_categorys.collect{|t| [ t.title, t.id ]}, {}, :class => "input-medium" %>
<%= f.label :mail_subject ,t("er_email.mail_subject")%>
<%= f.text_field :mail_subject %>
<%= f.label :email_group ,t("er_email.email_group")%>
<div class="form-inline">
<ul class="nav nav-pills">
<% @email_group_data.collect do |k,v| %>
<li class="pull-left">
<%= check_box_tag 'email_er[email_group][]', k, (@email_er.email_group.nil? ? false : @email_er.email_group.include?(k)), :id => "field-#{k}" %>
<label for="field-<%= k %>"><%= v["name"] %></label>
<%= hidden_field_tag 'email_er[email_group][]', '' %>
</li>
<% end %>
</ul>
</div>
<%= f.label :other_mailaddress ,"#{t("er_email.other_mailaddress")}(#{t("er_email.other_mailaddress_note")})(#{t("er_email.other_mailaddress_note_limit")})"%>
<%= f.text_area :other_mailaddress, :class=>"span12", :rows=>"5" %>
<br />
<div class="editor">
<%= f.label :mail_content ,t("er_email.mail_content")%>
<%= f.text_area :mail_content, :style=>"width:100%", :class => 'tinymce_textarea' %>
</div>
</div>
<div>
<div id='plugin_files' class="plugin_files_block">
<table class="table table-condensed">
<thead>
<tr>
<th>File</th>
<th>File Name</th>
<th class="span1"></th>
</tr>
</thead>
<tfoot>
<tr>
<td style="text-align:center" colspan="3">
<div id='add_plugin_file' class="info_input plugin_files_block">
<%= hidden_field_tag 'plugin_file_field_count', @email_er.email_er_files.count %>
<a class="add"><span class="btn btn-primary btn-small"><i class="icon-plus icon-white"></i> ADD/新增</span></a>
<p><%= t("sys.limit_of_upload_file_size",:best_size => '10MB') %></p>
<p><%= t("sys.preview_only_for_img") %></p>
</div>
</td>
</tr>
</tfoot>
<tbody>
<% @email_er.email_er_files.each_with_index do |email_er_file, i| %>
<%= f.fields_for :email_er_files, email_er_file do |f| %>
<%= render :partial => 'form_file', :object => email_er_file, :locals => {:f => f, :i => i} %>
<% end %>
<% end %>
</tbody>
</table>
</div>
</div>
<!--Post End-->
</div>
<div class="form-actions">
<%= button_tag t("preview"), :id=>"button_for_preview", :name=>"commit",:class=>'btn post_preview two_btn',:type=>:button,:url=>preview_panel_er_email_back_end_email_ers_path %>
<%= f.submit t('submit'), :class=>'btn btn-primary' %>
<%= link_to t('cancel'), get_go_back, :class=>"btn" %>
</div>
<% content_for :page_specific_javascript do %>
<%= javascript_include_tag "archive_plugin_form" %>
<%= javascript_include_tag "inc/jquery.imagesloaded.js" %>
<script>
$(document).ready(function() {
$('#add_plugin_file a.add').live('click', function(){
var new_id = $(this).prev().attr('value');
var old_id = new RegExp("new_add_plugin_files", "g");
$(this).prev().attr('value', parseInt(new_id) + 1);
$(this).parents('table').append(("<%= escape_javascript(add_attribute 'form_file', f, :email_er_files) %>").replace(old_id, new_id));
});
$('.for_preview').popover({ html : true });
});
</script>
<% end %>
@@ -0,0 +1,37 @@
<% # encoding: utf-8 %>
<%= f.error_messages %>
<tr id="<%= "plugin_file_#{form_file.id}" if !form_file.new_record? %>" class='list_item'>
<td>
<div class="control-group">
<div class="controls">
<%= f.file_field :file %>
<%= form_file.file.file ? ( link_to t(:view), form_file.file.url, {:class => 'btn', :target => '_blank', :title => t(:view)} ) : '' %>
</div>
</div>
</td>
<td>
<div class="tab-content">
<%= f.text_field :title %>
</div>
</td>
<td>
<span class="action">
<% if form_file.new_record? %>
<a class="delete"><i class="icon-remove"></i></a>
<% else %>
<%= f.hidden_field :id %>
<a class="remove_existing_record"><i class="icon-remove"></i></a>
<%= f.hidden_field :_destroy, :value => nil, :class => 'should_destroy' %>
<% end %>
</span>
</td>
</tr>
@@ -0,0 +1,5 @@
<%= render_sort_bar(true, delete_panel_er_email_back_end_email_ers_path(:direction => params[:direction], :sort => params[:sort], :sort_options => params[:sort_options]),
['status', ['is_pending', 'is_checked', 'is_rejected'], 'span1', :status],
['category', 'email_er_category', 'span1', :category],
['subject', 'mail_subject','span2', 'er_email.mail_subject'] ,
['email_group', 'email_group','span2', 'er_email.email_group']).html_safe %>
@@ -0,0 +1 @@
$("#<%= dom_id @email_er %>").remove();
@@ -0,0 +1,6 @@
<div id="poststuff">
<%= form_for @email_er, :url => panel_er_email_back_end_email_er_path(@email_er), :html => {:class=>"clear nccu_ajax_form"} do |f| %>
<%= render :partial => 'form', :locals => {:f => f} %>
<% end %>
</div>
@@ -0,0 +1,28 @@
<%= render 'filter' %>
<table class="table main-list">
<thead>
<tr>
<th class="span1"></th>
<th class="span1"></th>
<th class="span1"></th>
<th class="span2"></th>
<th class="span2"></th>
</tr>
</thead>
<tbody id="tbody_email_ers">
<%= render :partial => 'email_er', :collection => @email_ers %>
</tbody>
</table>
<div class="form-actions form-fixed pagination-right">
<%= link_to content_tag(:i, nil, :class => 'icon-plus icon-white') + t(:add), new_panel_er_email_back_end_email_er_path, :class => 'btn btn-primary pull-right' if (is_manager? rescue nil) %>
<div id="email_er_pagination" class="paginationFixed">
<%= paginate @email_ers, :params => {:direction => params[:direction], :sort => params[:sort], :filter => @filter, :new_filter => nil} %>
</div>
</div>
<% content_for :page_specific_javascript do %>
<%= javascript_include_tag "/static/jquery.cycle.all.latest.js" %>
<%= javascript_include_tag "inc/modal-preview" %>
<% end %>
@@ -0,0 +1,4 @@
$("#delete_all").attr("action", "<%= delete_panel_er_email_back_end_email_ers_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_email_ers").html("<%= j render :partial => 'email_er', :collection => @email_ers %>");
$("#email_er_pagination").html("<%= j paginate @email_ers, :params => {:direction => params[:direction], :sort => params[:sort], :filter => @filter, :new_filter => nil} %>");
@@ -0,0 +1,6 @@
<div id="poststuff">
<%= form_for @email_er, :url => panel_er_email_back_end_email_ers_path, :html => {:class=>"nccu_ajax_form"} do |f| %>
<%= render :partial => 'form', :locals => {:f => f} %>
<% end %>
</div>
@@ -0,0 +1,2 @@
$('#show_preview').html("<%= escape_javascript(render(:partial => 'modal_preview',:locals => {:email_er => @email_er})) %>");
var start_modal_with_id = "email_er-<%=@email_er.id%>"
@@ -0,0 +1 @@
<%= @email_er.mail_content.html_safe %>
@@ -0,0 +1,25 @@
<%= content_tag :div ,:id => "users_checkbox_ary",:class => 'clear' do -%>
<% sys_users = User.all.not_guest_user -%>
<% sys_users.each do |user| -%>
<div class="checkblock">
<% user.sub_roles.each do |sr| %>
<div class="for_unit" style="display:none;"> <%= sr.key %></div>
<% end %>
<%= content_tag :div,:data=>{'original-title'=>t('er_email.email_er.fact_check_setting_window_title'),:content => "#{user.sub_roles.collect{|sr| sr.key}.join(',')}"},:class=>"checkbox clear" do %>
<div class="check-icon">
</div>
<div class='member-avatar'>
<% if user.avatar? %>
<%= image_tag(user.avatar.thumb.url,:class => "member-img") %>
<% else %>
<%= image_tag "person.png",:class => "member-img" %>
<% end %>
</div>
<%= label_tag "lab-user-#{user.id}", (user.name rescue ''),:class=>"member-name",:id=>nil -%>
<%= check_box_tag "[users][#{user.id}]", 'true',users.include?(user),:class => "check" -%>
<%end -%>
</div>
<% end -%>
<% end -%>
+27
View File
@@ -0,0 +1,27 @@
en:
er_email:
er_email: Email_ER
Group: Group
Title: Title
Content: Content
Files: Files
approval_setting: Approval Setting
approve_email_er_fail: Approval Fail
approve_email_er_success: Approve Successfully
create_email_er_success: Create Successfully
email_resend: Resend
test_send_email: Test Send Email
mail_subject: Mail Subject
mail_content: Mail Content
mail_sentdate: Email Time
email_group: Email Group
email_group_data_0: All Faculty
email_group_data_1: Undergraduates
email_group_data_2: Postgraduates
email_group_data_3: Continuing Ed. Postgraduates
email_group_data_4: Other
other_mailaddress: Other Email
other_mailaddress_note: Divide different email accounts with ","
other_mailaddress_note_limit: maximum 1000 characters
email_file_limit: File upload size is limited to 1MB
@@ -0,0 +1,27 @@
zh_tw:
er_email:
er_email: 寄信群組
Group: 群組
Title: 主旨
Content: 內文
Files: 檔案
approval_setting: 審核設定
approve_email_er_fail: 審核失敗
approve_email_er_success: 審核成功
create_email_er_success: 建立資料成功
email_resend: 重新寄送
test_send_email: 測試寄信
mail_subject: 主旨
mail_content: 信件內容
mail_sentdate: 寄送時間
email_group: 寄送群組
other_mailaddress: 其他Mail
other_mailaddress_note: 輸入多組mail時,請用","逗號隔開
other_mailaddress_note_limit: 限制1000字元以內
email_group_data_0: 全校教職員
email_group_data_1: 大學部學生
email_group_data_2: 日間部研究生
email_group_data_3: 進修部研究生
email_group_data_4: 其他
email_file_limit: 檔案上傳容量限制為10MB
+36
View File
@@ -0,0 +1,36 @@
Rails.application.routes.draw do
namespace :panel do
namespace :er_email do
namespace :back_end do
match 'public' => "er_emails#public",:as => :public
match 'approval_setting' => "approvals#setting" ,:as => :approval_setting,:via => :get
match 'approval_setting' => "approvals#update_setting" ,:as => :approval_setting,:via => :post
match 'approval_setting' => "approvals#user_list" ,:as => :approval_user_list,:via => :put
resources :email_ers do
match "approve/:email_er_id" => "approvals#preview_and_approve",:as => :approval_preview,:via => :put
match "approve/:email_er_id" => "approvals#approve",:as => :approve,:via => :post
collection do
post "preview"
put "preview"
get 'delete'
get 'email_resend'
get 'test_send_email'
end
end
resources :email_er_categorys do
collection do
get 'get_categorys_json'
end
# if want to use json
# please uncommand below line
# match "get_email_ers_json/" => "email_er_categorys#get_email_ers_json", :as => :get_email_ers_json
end
end
end
end
end
+23
View File
@@ -0,0 +1,23 @@
$:.push File.expand_path("../lib", __FILE__)
# Maintain your gem's version:
require "er_email/version"
# Describe your gem and declare its dependencies:
Gem::Specification.new do |s|
s.name = "er_email"
s.version = ErEmail::VERSION
s.authors = ["TODO: Your name"]
s.email = ["TODO: Your email"]
s.homepage = "TODO"
s.summary = "TODO: Summary of ErEmail."
s.description = "TODO: Description of ErEmail."
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_dependency "jquery-rails"
s.add_development_dependency "sqlite3"
end
+55
View File
@@ -0,0 +1,55 @@
module ErEmail
OrbitApp.registration "ErEmail",:type=> 'ModuleApp' do
module_label 'er_email.er_email'
base_url File.expand_path File.dirname(__FILE__)
# personal_plugin :enable => true,:path=>"panel/er_email/plugin/profile",:i18n=>'er_email.er_email'
version "0.1"
organization "Rulingcom"
author "RD dep"
intro "I am intro"
update_info 'some update_info'
side_bar do
head_label_i18n 'er_email.er_email',:icon_class=>"icons-paperplane"
available_for [:admin,:guest,:manager,:sub_manager]
active_for_controllers ({:private=>['email_er_categorys','email_ers', 'approvals']})
active_for_object_auth ['EmailErCategory']
head_link_path "panel_er_email_back_end_email_ers_path"
context_link 'all',
:link_path=>"panel_er_email_back_end_email_ers_path" ,
:priority=>1,
:active_for_action=>{:email_ers=>:index},
:available_for => [:all]
context_link 'add',
:link_path=>"new_panel_er_email_back_end_email_er_path" ,
:priority=>2,
:active_for_action=>{:email_ers=>:new},
:available_for => [:sub_manager]
context_link 'categories',
:link_path=>"panel_er_email_back_end_email_er_categorys_path" ,
:priority=>3,
:active_for_action=>{:email_er_categorys=>:index},
:available_for => [:manager]
context_link 'er_email.approval_setting',
:link_path=>"panel_er_email_back_end_approval_setting_path" ,
:priority=>5,
:active_for_action=>{:approvals=>:setting},
:active_for_object_auth => 'EmailErCategory',
:available_for => [:manager]
context_link 'module_authorization',
:link_path=>"admin_module_app_manager_auth_proc_path(ModuleApp.first(conditions: {title: 'ErEmail'}))",
:priority=>6,
:active_for_app_auth => 'ErEmail'
end
end
end
+4
View File
@@ -0,0 +1,4 @@
require "er_email/engine"
module ErEmail
end
@@ -0,0 +1,4 @@
module ErEmail
class Engine < ::Rails::Engine
end
end
@@ -0,0 +1,3 @@
module ErEmail
VERSION = "0.0.1"
end
@@ -0,0 +1,4 @@
# desc "Explaining what the task does"
# task :er_email do
# # Task goes here
# end
+8
View File
@@ -0,0 +1,8 @@
#!/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.
ENGINE_ROOT = File.expand_path('../..', __FILE__)
ENGINE_PATH = File.expand_path('../../lib/er_email/engine', __FILE__)
require 'rails/all'
require 'rails/engine/commands'
+261
View File
@@ -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.
+7
View File
@@ -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
@@ -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 .
Loaded 100 of 142 files, more files were not shown because too many files have changed in this diff. Show more