Add must_verify_email feature.
This commit is contained in:
parent
6f96111d98
commit
591a7ff11f
|
@ -198,6 +198,7 @@ class Admin::AsksController < OrbitAdminController
|
|||
.any_in(:situation => filter2("situation"))
|
||||
end
|
||||
@askquestions = @askquestions.where(:category_id=>category_id) if category_id
|
||||
@askquestions = @askquestions.where(:is_hidden.ne=> true)
|
||||
# 分頁
|
||||
@askquestions = search_data(@askquestions,[:title]).page(params[:page]).per(10)
|
||||
if request.xhr?
|
||||
|
|
|
@ -6,7 +6,7 @@ class AsksController < ApplicationController
|
|||
helper ActionView::Helpers::UrlHelper
|
||||
include ActionController::RequestForgeryProtection
|
||||
include RuCaptcha::ViewHelpers
|
||||
FrontendMethods = ["thank", "sorry"]
|
||||
FrontendMethods = ["thank", "sorry", "see_email"]
|
||||
def widget
|
||||
subpart = OrbitHelper.get_current_widget
|
||||
case subpart.widget_type
|
||||
|
@ -46,7 +46,7 @@ class AsksController < ApplicationController
|
|||
request = OrbitHelper.request
|
||||
csrf_value = OrbitHelper.request.session[:_csrf_token] || SecureRandom.base64(32)
|
||||
token_tag = hidden_field_tag('authenticity_token',csrf_value)
|
||||
switch_form = cal_switch_form(ask_settings,categories,token_tag,referer_url)
|
||||
switch_form = cal_switch_form(ask_settings,categories,token_tag,referer_url, OrbitHelper.params[:id])
|
||||
email_regex = @default_ask_setting.get_email_regex(true)
|
||||
{
|
||||
'fields' => all_fields,
|
||||
|
@ -120,7 +120,7 @@ class AsksController < ApplicationController
|
|||
when 'sorry'
|
||||
render :sorry and return {}
|
||||
end
|
||||
referer_url = OrbitHelper.request.fullpath
|
||||
referer_url = OrbitHelper.request.path
|
||||
if @params['item'].to_s.empty?
|
||||
get_layout_type
|
||||
else
|
||||
|
@ -156,7 +156,7 @@ class AsksController < ApplicationController
|
|||
end
|
||||
csrf_value = OrbitHelper.request.session[:_csrf_token] || SecureRandom.base64(32)
|
||||
token_tag = hidden_field_tag('authenticity_token',csrf_value)
|
||||
switch_form = cal_switch_form(ask_settings,categories,token_tag,referer_url)
|
||||
switch_form = cal_switch_form(ask_settings,categories,token_tag,referer_url, params[:id])
|
||||
tags = module_app.tags
|
||||
ask_question = AskQuestion.new(id: nil)
|
||||
email_regex = @default_ask_setting.get_email_regex(true)
|
||||
|
@ -194,8 +194,16 @@ class AsksController < ApplicationController
|
|||
if !params[:referer_url].blank? && !params[:referer_url].to_s.start_with?("/")
|
||||
render :file => "#{Rails.root}/app/views/errors/403.html", :layout => false, :status => 403 and return
|
||||
end
|
||||
@ask_question = AskQuestion.new(:ip=>request.remote_ip)
|
||||
temp_params = create_params
|
||||
if temp_params[:id].present?
|
||||
@ask_question = AskQuestion.where(id: temp_params[:id]).first
|
||||
if @ask_question.nil?
|
||||
render_404 and return
|
||||
end
|
||||
else
|
||||
@ask_question = AskQuestion.new(:ip=>request.remote_ip)
|
||||
end
|
||||
new_record = @ask_question.new_record?
|
||||
all_to_save = []
|
||||
ask_setting = AskCategorySetting.enabled.where(category_id: params['ask_question']['category_id']).first
|
||||
override_sort_number = nil
|
||||
|
@ -208,7 +216,17 @@ class AsksController < ApplicationController
|
|||
ask_setting = AskSetting.create() if ask_setting.nil?
|
||||
end
|
||||
@ask_setting = ask_setting
|
||||
@must_verify_email = ask_setting.must_verify_email && new_record
|
||||
if @must_verify_email
|
||||
only_email = true
|
||||
@ask_question.is_hidden = true
|
||||
else
|
||||
only_email = false
|
||||
check_fields = ask_setting.default_setting.select{|k,v| v}.keys & ask_setting.default_setting_required.select{|k,v| v}.keys - AskSetting::No_required
|
||||
unless new_record
|
||||
@ask_question.is_hidden = false
|
||||
check_fields.delete('mail')
|
||||
end
|
||||
flag = true
|
||||
check_fields.each do |f|
|
||||
next if f == 'ask_category_id' || f == 'recaptcha'
|
||||
|
@ -217,6 +235,7 @@ class AsksController < ApplicationController
|
|||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
custom_values = temp_params[:custom_values]
|
||||
custom_values = {} if custom_values.nil?
|
||||
if flag
|
||||
|
@ -247,10 +266,11 @@ class AsksController < ApplicationController
|
|||
end
|
||||
end
|
||||
end
|
||||
if !flag
|
||||
if !flag && !only_email
|
||||
redirect_to "#{params[:referer_url]}?method=sorry" and return
|
||||
end
|
||||
email_regex = ask_setting.get_email_regex
|
||||
unless only_email
|
||||
ask_setting.custom_fields.select{|k,v| v['type']=='file' || v['type']=='image'}.each do |k,v|
|
||||
file = custom_values[k]
|
||||
if !file.blank?
|
||||
|
@ -261,8 +281,9 @@ class AsksController < ApplicationController
|
|||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
flag = !ask_setting.default_setting['recaptcha'] || gotcha_valid?
|
||||
if flag
|
||||
if flag && !only_email
|
||||
all_to_save.each do |to_save|
|
||||
flag = flag && to_save[1].save
|
||||
custom_values[to_save[0]] = [custom_values[to_save[0]].original_filename ,to_save[1].file.url]
|
||||
|
@ -277,13 +298,24 @@ class AsksController < ApplicationController
|
|||
})
|
||||
end
|
||||
@ask_question.update_attributes(temp_params)
|
||||
if ask_setting.validate_enable && AskSafeEmail.where(:email=> @ask_question.mail).count == 0
|
||||
build_verification_email(@ask_question)
|
||||
if @must_verify_email
|
||||
referer_url = "#{params[:referer_url]}?id=#{@ask_question.id}"
|
||||
else
|
||||
referer_url = nil
|
||||
end
|
||||
if (ask_setting.validate_enable || @must_verify_email) && AskSafeEmail.where(:email=> @ask_question.mail).count == 0
|
||||
build_verification_email(@ask_question, referer_url)
|
||||
elsif @must_verify_email
|
||||
redirect_to referer_url and return
|
||||
else
|
||||
@ask_question.update(:situation => AskTicketStatus::DefaultKeys[1])
|
||||
build_email(@ask_question)
|
||||
end
|
||||
if @must_verify_email
|
||||
redirect_to "#{params[:referer_url]}?method=see_email"
|
||||
else
|
||||
redirect_to "#{params[:referer_url]}?method=thank"
|
||||
end
|
||||
else
|
||||
redirect_to "#{params[:referer_url]}?method=sorry"
|
||||
end
|
||||
|
@ -300,6 +332,9 @@ class AsksController < ApplicationController
|
|||
{}
|
||||
end
|
||||
|
||||
def see_email
|
||||
end
|
||||
|
||||
def render_404
|
||||
render :file => "#{Rails.root}/app/views/errors/404", :layout => false, :status => :not_found, :formats => [:html]
|
||||
end
|
||||
|
@ -318,7 +353,7 @@ class AsksController < ApplicationController
|
|||
end
|
||||
end
|
||||
|
||||
def build_verification_email(email_er)
|
||||
def build_verification_email(email_er, referer_url)
|
||||
email = Email.new
|
||||
email.save
|
||||
email_er.email_id = email.id
|
||||
|
@ -336,6 +371,12 @@ class AsksController < ApplicationController
|
|||
end
|
||||
verify_url = "#{host_url}/#{I18n.locale}/xhr/asks/verify_email/#{email_er.id}"
|
||||
verify_link = "<a title=\"#{t('ask.verify_link')}\" href=\"#{verify_url}\" target=\"_blank\">#{verify_url}</a>"
|
||||
if referer_url
|
||||
referer_url = host_url + referer_url
|
||||
referer_link = "<a title=\"#{I18n.t('ask.go_to_form')}\" href=\"#{referer_url}\" target=\"_blank\">#{referer_url}</a>"
|
||||
else
|
||||
referer_link = nil
|
||||
end
|
||||
mail_subject = mail_from+": #{t('ask.email_verification_notification')}"
|
||||
email_er.email.update_attributes(
|
||||
:mail_lang=> site.default_locale,
|
||||
|
@ -348,7 +389,8 @@ class AsksController < ApplicationController
|
|||
:template_data=>{
|
||||
"validation_email_content" => @ask_setting.validation_email_content,
|
||||
"verify_link" => verify_link,
|
||||
"site_host" => host_url,
|
||||
"referer_link" => referer_link,
|
||||
"site_host" => host_url
|
||||
},
|
||||
:mail_reply_to => (manager_emails.empty? ? nil : manager_emails)
|
||||
)
|
||||
|
@ -454,6 +496,28 @@ class AsksController < ApplicationController
|
|||
all_fields = []
|
||||
set_input_name_for_ask("ask_question")
|
||||
has_ask_category_id = false
|
||||
if ask_setting.must_verify_email && @ask_question.nil?
|
||||
field = "mail"
|
||||
field_name = "ask_question[#{field}]"
|
||||
id = field_name
|
||||
required = true
|
||||
placeholder = @default_ask_setting.prompt_word(field)
|
||||
f1 = {'style_html'=>''}
|
||||
f1['content'] = text_field_tag(field_name,nil,data: (required ? {"fv-validation" => "required;check_email;", "fv-messages" => "必填欄位;Email不正確;"} : {}),required: required,placeholder: placeholder)
|
||||
f1['field'] = field
|
||||
f1['label'] = ask_label(id, @default_ask_setting.field_name("#{field}"),required.to_s)
|
||||
all_fields << f1
|
||||
|
||||
field = "recaptcha"
|
||||
id = "ask_rucaptcha"
|
||||
f1 = {'style_html'=>''}
|
||||
f1['content'] = "#{gotcha_error(:espeak=>true)}#{gotcha(id: id)}"
|
||||
f1['field'] = field
|
||||
f1['label'] = ask_label(id, @default_ask_setting.field_name("#{field}"),required.to_s)
|
||||
all_fields << f1
|
||||
|
||||
all_fields << {'field'=>'must_verify_email','style_html'=>'display: block; text-align: center;','label'=>'','content'=> I18n.t('ask.must_verify_email')}
|
||||
else
|
||||
disp_fields_infos.each do |field, info|
|
||||
if field.start_with?("default@")
|
||||
k = is_cat_record ? field : field[8..-1]
|
||||
|
@ -511,7 +575,11 @@ class AsksController < ApplicationController
|
|||
#{radio_button_tag(field_name,'female', false, {required: required})}#{I18n.t('users.female')}
|
||||
</label>"
|
||||
when 'mail'
|
||||
if @ask_question
|
||||
f1['content'] = @ask_question.mail
|
||||
else
|
||||
f1['content'] = text_field_tag(field_name,nil,data: (required ? {"fv-validation" => "required;check_email;", "fv-messages" => "必填欄位;Email不正確;"} : {}),required: required,placeholder: placeholder)
|
||||
end
|
||||
when 'phone'
|
||||
f1['content'] = text_field_tag(field_name,nil,placeholder: placeholder,required: required)
|
||||
when 'appointment'
|
||||
|
@ -540,6 +608,10 @@ class AsksController < ApplicationController
|
|||
end
|
||||
end
|
||||
end
|
||||
if @ask_question
|
||||
all_fields << {'field'=>'ask_question_id','style_html'=>'display: none;','label'=>'','content'=>hidden_field_tag('ask_question[id]', @ask_question.id)}
|
||||
end
|
||||
end
|
||||
unless has_ask_category_id
|
||||
all_fields << {'field'=>'ask_category_id','style_html'=>'display: none;','label'=>'','content'=>hidden_field_tag('ask_question[category_id]', category_id)}
|
||||
end
|
||||
|
@ -623,9 +695,24 @@ class AsksController < ApplicationController
|
|||
})
|
||||
</script>"
|
||||
end
|
||||
def cal_switch_form(ask_settings,categories,token_tag,referer_url)
|
||||
def cal_switch_form(ask_settings,categories,token_tag,referer_url, ask_question_id)
|
||||
switch_form = ''
|
||||
default_idx = 0
|
||||
if ask_question_id.present?
|
||||
@ask_question = AskQuestion.where(:id=> ask_question_id).first
|
||||
if @ask_question && !(@ask_question.is_hidden)
|
||||
@ask_question = nil
|
||||
end
|
||||
if @ask_question
|
||||
AskSafeEmail.create(:email=> @ask_question.mail) if AskSafeEmail.where(:email=> @ask_question.mail).count == 0
|
||||
ask_settings = AskCategorySetting.enabled.where(:category_id=> @ask_question.category_id).to_a
|
||||
if ask_settings.blank?
|
||||
ask_settings = [AskSetting.first]
|
||||
end
|
||||
end
|
||||
else
|
||||
@ask_question = nil
|
||||
end
|
||||
if categories.count != 0
|
||||
default_idx = ask_settings[1..-1].to_a.map{|a| a.category_id.to_s}.index(categories[0].id.to_s)
|
||||
default_idx = default_idx.nil? ? 0 : default_idx + 1
|
||||
|
|
|
@ -146,6 +146,7 @@ class AskCategorySetting
|
|||
field :email_regex_enable, type: Boolean, default: false
|
||||
field :email_regex, type: String, default: '\A[^@\s]+@([^@.\s]+\.)+[^@.\s]+\z'
|
||||
field :validate_enable, type: Boolean, default: false
|
||||
field :must_verify_email, type: Boolean, default: false
|
||||
field :validation_email_content, type: String, localize: true
|
||||
|
||||
field :tmp_sort_number, type: Hash, default: {} # For Frontend
|
||||
|
|
|
@ -27,11 +27,14 @@ class AskQuestion
|
|||
field :custom_values, type: Hash, default: {}
|
||||
field :agree_show, type: Boolean, default: false
|
||||
field :agree_usage, type: Boolean, default: false
|
||||
field :is_hidden, type: Boolean
|
||||
|
||||
field :review_time, type: DateTime
|
||||
belongs_to :reviewer, class_name: "MemberProfile", foreign_key: :reviewer_id
|
||||
has_many :ask_status_histories
|
||||
|
||||
index({situation: 1, identity: 1, is_hidden: -1}, { unique: false, background: true })
|
||||
|
||||
attr_accessor :release_comment, :release_file, :user
|
||||
|
||||
before_create do
|
||||
|
|
|
@ -94,6 +94,7 @@ class AskSetting
|
|||
field :email_regex_enable, type: Boolean, default: false
|
||||
field :email_regex, type: String, default: '\A[^@\s]+@([^@.\s]+\.)+[^@.\s]+\z'
|
||||
field :validate_enable, type: Boolean, default: false
|
||||
field :must_verify_email, type: Boolean, default: false
|
||||
field :validation_email_content, type: String, localize: true
|
||||
|
||||
field :tmp_sort_number, type: Hash, default: {}
|
||||
|
|
|
@ -180,7 +180,8 @@
|
|||
<label for="ask_email_regex"><%= t("ask.validation_email_content") %>:</label>
|
||||
</div>
|
||||
<div class="controls">
|
||||
<label id="<%= "#{f.object_name}_validate_enable" %>"><%= f.check_box :validate_enable %><%= t('ask.enable') %></label>
|
||||
<label class="pull-left" id="<%= "#{f.object_name}_validate_enable" %>"><%= f.check_box :validate_enable %><%= t('ask.enable') %></label>
|
||||
<label id="<%= "#{f.object_name}_must_verify_email" %>"><%= f.check_box :must_verify_email %><%= t('ask.must_verify_email') %></label>
|
||||
<div style="clear: both;"></div>
|
||||
<%= multiple_lang_tag_for_ask(
|
||||
nil,
|
||||
|
@ -220,7 +221,8 @@
|
|||
<label for="ask_email_regex"><%= t("ask.validation_email_content") %>:</label>
|
||||
</div>
|
||||
<div class="controls">
|
||||
<label id="<%= "#{f.object_name}_validate_enable" %>"><%= f.check_box :validate_enable %><%= t('ask.enable') %></label>
|
||||
<label class="pull-left" id="<%= "#{f.object_name}_validate_enable" %>"><%= f.check_box :validate_enable %><%= t('ask.enable') %></label>
|
||||
<label id="<%= "#{f.object_name}_must_verify_email" %>"><%= f.check_box :must_verify_email %><%= t('ask.must_verify_email') %></label>
|
||||
<%= multiple_lang_tag_for_ask(
|
||||
nil,
|
||||
'text_area',
|
||||
|
|
|
@ -8,8 +8,13 @@
|
|||
<%= @data['validation_email_content'].to_s.gsub(/[(\n)(\r)]/, "\n" => "<br/>", "\r" => "" ).html_safe %>
|
||||
</p>
|
||||
<br />
|
||||
<% if @data['referer_link'] %>
|
||||
<%= @data['referer_link'].html_safe %>
|
||||
<br />
|
||||
<% else %>
|
||||
<%= @data['verify_link'].html_safe %>
|
||||
<br />
|
||||
<% end %>
|
||||
<p><%= t('ask.email_automation_hint') %></p>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,9 @@
|
|||
<link href="/assets/ask/ask.css" media="screen" rel="stylesheet">
|
||||
<div class="form-horizontal">
|
||||
<h2>
|
||||
<%= t('ask.see_email') %>
|
||||
<div class="form-actions">
|
||||
<a class="btn" href="<%= OrbitHelper.request.path_info %>"><%=t('ask.go_back')%></a>
|
||||
</div>
|
||||
</h2>
|
||||
</div>
|
|
@ -137,6 +137,9 @@ en:
|
|||
remark: Remark
|
||||
attachment: Attachment
|
||||
updated_at: Updated at
|
||||
must_verify_email: The form can only be filled in after email verification.
|
||||
go_to_form: Go to Form
|
||||
see_email: "Please check your email, so you can fill out the form."
|
||||
|
||||
mongoid:
|
||||
attributes:
|
||||
|
|
|
@ -147,6 +147,9 @@ zh_tw:
|
|||
remark: 備註
|
||||
attachment: 附件
|
||||
updated_at: 更新時間
|
||||
must_verify_email: Email驗證後才可開始填寫
|
||||
go_to_form: 前往表單
|
||||
see_email: "請確認email驗證信,以開始填寫表單。"
|
||||
|
||||
mongoid:
|
||||
attributes:
|
||||
|
|
Loading…
Reference in New Issue