forked from saurabh/orbit4-5
Excel Import Members
This commit is contained in:
parent
947da85563
commit
b33c2d5b38
5
Gemfile
5
Gemfile
|
@ -46,6 +46,11 @@ gem 'zhconv'
|
|||
gem 'execjs'
|
||||
gem 'therubyracer'
|
||||
|
||||
#excel
|
||||
gem 'axlsx_rails'
|
||||
gem 'spreadsheet'
|
||||
gem 'rubyXL'
|
||||
|
||||
#form helpers
|
||||
gem 'dynamic_form'
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
<%= content_tag :li, link_to((content_tag(:span, t(:add_member))), new_admin_member_path), :class => active_for_action('members', 'new') if (current_user.is_admin? rescue nil) %>
|
||||
<%= content_tag :li, link_to((content_tag(:span, t(:member_role))),admin_roles_path ), :class => active_for_action('roles', 'index') if (current_user.is_admin? rescue nil) %>
|
||||
<%= content_tag :li, link_to((content_tag(:span, t(:member_info))), admin_member_infos_path), :class => active_for_action('member_infos', 'index') if (current_user.is_admin? rescue nil) %>
|
||||
<%= content_tag :li, link_to((content_tag(:span, t("site.import_member_data.import_members"))), admin_members_import_members_path), :class => active_for_action('import_members', 'index') if (current_user.is_admin? rescue nil) %>
|
||||
<%= content_tag :li, link_to((content_tag(:span, t(:unapproved_members) + " (" + User.unapproved.count.to_s + ")")), admin_members_unapproved_members_path), :class => active_for_action('members', 'unapproved_members') if (current_user.is_admin? rescue nil) %>
|
||||
<% end -%>
|
||||
</div>
|
||||
|
|
|
@ -0,0 +1,160 @@
|
|||
# encoding: utf-8
|
||||
|
||||
wb = xlsx_package.workbook
|
||||
wb.add_worksheet(name: "Member") do |sheet|
|
||||
|
||||
row = [ "user_id", "password" ]
|
||||
row2 = ["#{t("users.user_id")}(#{t("users.user_id_note")})", "#{t("users.new_password")}(#{t("users.new_password_note")})"]
|
||||
row3 = ["text", "text"]
|
||||
|
||||
@site_in_use_locales.each_with_index do |locale, i|
|
||||
row << "first_name(#{locale})"
|
||||
row2 << "#{t("users.first_name")}(#{I18n.t(locale)})"
|
||||
row3 << "text"
|
||||
end
|
||||
|
||||
@site_in_use_locales.each_with_index do |locale, i|
|
||||
row << "last_name(#{locale})"
|
||||
row2 << "#{t("users.last_name")}(#{I18n.t(locale)})"
|
||||
row3 << "text"
|
||||
end
|
||||
|
||||
row << "email"
|
||||
row2 << "#{t('users.email')}"
|
||||
row3 << "text"
|
||||
|
||||
row << "sid"
|
||||
row2 << "#{t('users.sid')}"
|
||||
row3 << "text"
|
||||
|
||||
row << "office_tel"
|
||||
row2 << "#{t('users.office_tel')}"
|
||||
row3 << "text"
|
||||
|
||||
row << "sex"
|
||||
row2 << "#{t('users.sex')}(male, female, unknown)"
|
||||
row3 << "radio"
|
||||
|
||||
row << "birthday"
|
||||
row2 << "#{t('users.birthday')}(yyyy/MM/dd)"
|
||||
row3 << "date"
|
||||
|
||||
@site_in_use_locales.each_with_index do |locale, i|
|
||||
row << "address(#{locale})"
|
||||
row2 << "#{t("users.address")}(#{I18n.t(locale)})"
|
||||
row3 << "text_area"
|
||||
end
|
||||
|
||||
@site_in_use_locales.each_with_index do |locale, i|
|
||||
row << "autobiography(#{locale})"
|
||||
row2 << "#{t("users.autobiography")}(#{I18n.t(locale)})"
|
||||
row3 << "text_area"
|
||||
end
|
||||
|
||||
@field_type = {'text_field' => 'typeA', 'select' => 'typeB', 'date' => 'typeC', 'text_area' => 'typeD', 'radio_button' => 'typeE', 'checkbox' => 'typeE', 'address' => ''}
|
||||
|
||||
@date_type = {'format1' => 'yyyy/MM/dd hh:mm', 'format2' => 'yyyy/MM/dd', 'format3' => 'yyyy/MM', 'format4' => 'yyyy'}
|
||||
|
||||
|
||||
@infos = MemberInfo.all
|
||||
@infos.each do |info|
|
||||
|
||||
info.member_profile_fields.each do |member_profile_field|
|
||||
if member_profile_field.markup == 'text_field' or member_profile_field.markup == 'text_area'
|
||||
if member_profile_field[@field_type[member_profile_field.markup]]['cross_lang'] == 'true'
|
||||
row << "#{info.key}-#{member_profile_field.key}"
|
||||
row2 << "#{info.title}-#{member_profile_field.title}"
|
||||
row3 << member_profile_field.markup
|
||||
else
|
||||
@site_in_use_locales.each_with_index do |locale, i|
|
||||
row << "#{info.key}-#{member_profile_field.key}(#{locale})"
|
||||
row2 << "#{info.title}-#{member_profile_field.title}(#{I18n.t(locale)})"
|
||||
row3 << member_profile_field.markup
|
||||
end
|
||||
end
|
||||
elsif member_profile_field.markup == 'date'
|
||||
row << "#{info.key}-#{member_profile_field.key}"
|
||||
row2 << "#{info.title}-#{member_profile_field.title}(#{@date_type[member_profile_field['typeC']['format']]})"
|
||||
row3 << member_profile_field.markup
|
||||
elsif member_profile_field.markup == 'select' or member_profile_field.markup == 'radio_button' or member_profile_field.markup == 'checkbox'
|
||||
@option_list = member_profile_field[@field_type[member_profile_field.markup]]['option_list']
|
||||
if !@option_list.blank?
|
||||
@opdata = @option_list.collect{|p| "#{p[0]}=>#{p[1][I18n.locale.to_s]}"}
|
||||
end
|
||||
row << "#{info.key}-#{member_profile_field.key}"
|
||||
row2 << "#{info.title}-#{member_profile_field.title}(#{@opdata.join(',')})"
|
||||
elsif member_profile_field.markup == 'address'
|
||||
@site_in_use_locales.each_with_index do |locale, i|
|
||||
row << "#{info.key}-#{member_profile_field.key}(#{locale})"
|
||||
row2 << "#{info.title}-#{member_profile_field.title}(#{I18n.t(locale)})"
|
||||
row3 << member_profile_field.markup
|
||||
end
|
||||
else
|
||||
row << "#{info.key}-#{member_profile_field.key}"
|
||||
row2 << "#{info.title}-#{member_profile_field.title}"
|
||||
row3 << member_profile_field.markup
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@roles = Role.any_in(:key => @member_roles)
|
||||
@roles.each do |role|
|
||||
|
||||
role_statuses = RoleStatus.where(role_id: role.id, :disable=> false).asc(:_id)
|
||||
if !role_statuses.blank?
|
||||
@statusdata = role_statuses.collect{|a,i| "#{a.key}=>#{a.title}"}
|
||||
|
||||
row << "#{role.key}-status"
|
||||
row2 << "#{role.title}-#{t(:status)}(#{@statusdata.join(',')})"
|
||||
row3 << "checkbox"
|
||||
end
|
||||
|
||||
role.attribute_fields.asc(:created_at).each do |attribute_field|
|
||||
|
||||
if attribute_field.markup == 'text_field' or attribute_field.markup == 'text_area'
|
||||
if attribute_field[@field_type[attribute_field.markup]]['cross_lang'] == 'true'
|
||||
row << "#{role.key}-#{attribute_field.key}"
|
||||
row2 << "#{role.title}-#{attribute_field.title}"
|
||||
row3 << attribute_field.markup
|
||||
else
|
||||
@site_in_use_locales.each_with_index do |locale, i|
|
||||
row << "#{role.key}-#{attribute_field.key}(#{locale})"
|
||||
row2 << "#{role.title}-#{attribute_field.title}(#{I18n.t(locale)})"
|
||||
row3 << attribute_field.markup
|
||||
end
|
||||
end
|
||||
elsif attribute_field.markup == 'date'
|
||||
row << "#{role.key}-#{attribute_field.key}"
|
||||
row2 << "#{role.title}-#{attribute_field.title}(#{@date_type[attribute_field['typeC']['format']]})"
|
||||
row3 << attribute_field.markup
|
||||
elsif attribute_field.markup == 'select' or attribute_field.markup == 'radio_button' or attribute_field.markup == 'checkbox'
|
||||
@option_list = attribute_field[@field_type[attribute_field.markup]]['option_list']
|
||||
if !@option_list.blank?
|
||||
@opdata = @option_list.collect{|p| "#{p[0]}=>#{p[1][I18n.locale.to_s]}"}
|
||||
end
|
||||
row << "#{role.key}-#{attribute_field.key}"
|
||||
row2 << "#{role.title}-#{attribute_field.title}(#{@opdata.join(',')})"
|
||||
row3 << attribute_field.markup
|
||||
elsif attribute_field.markup == 'address'
|
||||
@site_in_use_locales.each_with_index do |locale, i|
|
||||
row << "#{role.key}-#{attribute_field.key}(#{locale})"
|
||||
row2 << "#{role.title}-#{attribute_field.title}(#{I18n.t(locale)})"
|
||||
row3 << attribute_field.markup
|
||||
end
|
||||
else
|
||||
row << "#{role.key}-#{attribute_field.key}"
|
||||
row2 << "#{role.title}-#{attribute_field.title}"
|
||||
row3 << attribute_field.markup
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
sheet.add_row row
|
||||
sheet.add_row row3
|
||||
sheet.add_row row2
|
||||
|
||||
end
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
|
||||
<h2><%= t('site.import_member_data.import_error')%></h2>
|
||||
|
||||
<ul>
|
||||
<% @error_msg.each do |a| %>
|
||||
|
||||
<li><%= a %></li>
|
||||
|
||||
<% end %>
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
<%= link_to t('back'), admin_members_import_members_path, :class => 'btn' %>
|
|
@ -0,0 +1,45 @@
|
|||
<% content_for :page_specific_css do -%>
|
||||
<%= stylesheet_link_tag "lib/main-forms.css" %>
|
||||
<% end -%>
|
||||
|
||||
<%= form_tag download_export_admin_members_path(format: "xlsx"), :multipart => true , :class=>"form-horizontal main-forms", :id=>"user-forms" do %>
|
||||
|
||||
<fieldset>
|
||||
<div id="basic-area" class="input-area">
|
||||
<div class="attributes">
|
||||
<div class="attributes-header clearfix">
|
||||
<h4><%= t("site.import_member_data.download_doc") %></h4>
|
||||
</div>
|
||||
<label><%= t(:role) %></label>
|
||||
<% Role.where(:disabled => false).each_with_index do |role, i| %>
|
||||
<label func="input_unit" class="checkbox inline">
|
||||
<input type="checkbox" value="true" name="member_role[<%= role.key %>]" id="member_role_<%= role.key %>"> <%= role.title %>
|
||||
</label>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-actions">
|
||||
<%= submit_tag t(:download) , :class=>"btn btn-default" %>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<% end -%>
|
||||
|
||||
<%= form_tag admin_members_import_members_path, :multipart => true , :class=>"form-horizontal main-forms", :id=>"user-forms" do %>
|
||||
|
||||
<fieldset>
|
||||
<div id="basic-area" class="input-area">
|
||||
<div class="attributes">
|
||||
<div class="attributes-header clearfix">
|
||||
<h4><%= t("site.import_member_data.import_member_data") %></h4>
|
||||
</div>
|
||||
<%= file_field_tag :file %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-actions">
|
||||
<%= submit_tag t('site.import') , :class=>"btn btn-default" %>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<% end -%>
|
||||
|
|
@ -74,6 +74,162 @@ if Workgroup.count == 0
|
|||
end
|
||||
end
|
||||
|
||||
if Role.count==0
|
||||
|
||||
#teacher
|
||||
role = Role.new
|
||||
role.key = 'teacher'
|
||||
role.title_translations = {:en=>'Teacher', :zh_tw=>'老師'}
|
||||
role.save
|
||||
|
||||
role_status = RoleStatus.new
|
||||
role_status.key = 'Full-Time'
|
||||
role_status.role_id = role.id
|
||||
role_status.title_translations = {:en=>'Full-Time', :zh_tw=>'專任'}
|
||||
role_status.save
|
||||
|
||||
role_status = RoleStatus.new
|
||||
role_status.key = 'Adjunct'
|
||||
role_status.role_id = role.id
|
||||
role_status.title_translations = {:en=>'Adjunct', :zh_tw=>'兼任'}
|
||||
role_status.save
|
||||
|
||||
role_status = RoleStatus.new
|
||||
role_status.key = 'appointment'
|
||||
role_status.role_id = role.id
|
||||
role_status.title_translations = {:en=>'appointment', :zh_tw=>'合聘'}
|
||||
role_status.save
|
||||
|
||||
attribute_field = AttributeField.new
|
||||
attribute_field.key = 'Job_Title'
|
||||
attribute_field.role_id = role.id
|
||||
attribute_field.title_translations = {:en=>'Job Title', :zh_tw=>'職稱'}
|
||||
attribute_field.markup = 'select'
|
||||
attribute_field.option_list = {
|
||||
"0" => { "zh_tw" => "教授兼系主任",
|
||||
"en" => "Professor and Chairman" },
|
||||
"1" => { "zh_tw" => "教授",
|
||||
"en" => "Professor" },
|
||||
"2" => { "zh_tw" => "副教授",
|
||||
"en" => "Associate Professor" },
|
||||
"3" => { "zh_tw" => "助理教授",
|
||||
"en" => "Assistant Professor" },
|
||||
"4" => { "zh_tw" => "講師",
|
||||
"en" => "Lecturer" }
|
||||
}
|
||||
|
||||
attribute_field.typeB = {
|
||||
"initial" => { "zh_tw" => "",
|
||||
"en" => "" },
|
||||
"option_list" => {
|
||||
"0" => { "zh_tw" => "教授兼系主任",
|
||||
"en" => "Professor and Chairman" },
|
||||
"1" => { "zh_tw" => "教授",
|
||||
"en" => "Professor" },
|
||||
"2" => { "zh_tw" => "副教授",
|
||||
"en" => "Associate Professor" },
|
||||
"3" => { "zh_tw" => "助理教授",
|
||||
"en" => "Assistant Professor" },
|
||||
"4" => { "zh_tw" => "講師",
|
||||
"en" => "Lecturer" }
|
||||
} }
|
||||
|
||||
attribute_field.save
|
||||
|
||||
attribute_field = AttributeField.new
|
||||
attribute_field.key = 'Research_Expertise'
|
||||
attribute_field.role_id = role.id
|
||||
attribute_field.title_translations = {:en=>'Research Expertise', :zh_tw=>'研究專長'}
|
||||
attribute_field.markup = 'text_area'
|
||||
attribute_field.save
|
||||
|
||||
attribute_field = AttributeField.new
|
||||
attribute_field.key = 'Teaching_Field'
|
||||
attribute_field.role_id = role.id
|
||||
attribute_field.title_translations = {:en=>'Teaching Field', :zh_tw=>'授課領域'}
|
||||
attribute_field.markup = 'text_area'
|
||||
attribute_field.save
|
||||
|
||||
#satff
|
||||
role = Role.new
|
||||
role.key = 'staff'
|
||||
role.title_translations = {:en=>'Staff', :zh_tw=>'行政人員'}
|
||||
role.save
|
||||
|
||||
role_status = RoleStatus.new
|
||||
role_status.key = 'Full-Time'
|
||||
role_status.role_id = role.id
|
||||
role_status.title_translations = {:en=>'Full-Time', :zh_tw=>'全職'}
|
||||
role_status.save
|
||||
|
||||
role_status = RoleStatus.new
|
||||
role_status.key = 'Part-time'
|
||||
role_status.role_id = role.id
|
||||
role_status.title_translations = {:en=>'Part-time', :zh_tw=>'兼職'}
|
||||
role_status.save
|
||||
|
||||
role_status = RoleStatus.new
|
||||
role_status.key = 'Contracted'
|
||||
role_status.role_id = role.id
|
||||
role_status.title_translations = {:en=>'Contracted', :zh_tw=>'約聘'}
|
||||
role_status.save
|
||||
|
||||
attribute_field = AttributeField.new
|
||||
attribute_field.key = 'Job_Title'
|
||||
attribute_field.role_id = role.id
|
||||
attribute_field.title_translations = {:en=>'Job Title', :zh_tw=>'職稱'}
|
||||
attribute_field.markup = 'select'
|
||||
attribute_field.option_list = {
|
||||
"0" => { "zh_tw" => "組長",
|
||||
"en" => "Group Leader" },
|
||||
"1" => { "zh_tw" => "編審",
|
||||
"en" => "Editor" },
|
||||
"2" => { "zh_tw" => "技士",
|
||||
"en" => "Technician" },
|
||||
"3" => { "zh_tw" => "幹事",
|
||||
"en" => "Assistant" },
|
||||
"4" => { "zh_tw" => "組員",
|
||||
"en" => "Clerk" } ,
|
||||
"5" => { "zh_tw" => "工讀",
|
||||
"en" => "Work-study" }
|
||||
}
|
||||
|
||||
attribute_field.typeB = {
|
||||
"initial" => { "zh_tw" => "",
|
||||
"en" => "" },
|
||||
"option_list" => {
|
||||
"0" => { "zh_tw" => "組長",
|
||||
"en" => "Group Leader" },
|
||||
"1" => { "zh_tw" => "編審",
|
||||
"en" => "Editor" },
|
||||
"2" => { "zh_tw" => "技士",
|
||||
"en" => "Technician" },
|
||||
"3" => { "zh_tw" => "幹事",
|
||||
"en" => "Assistant" },
|
||||
"4" => { "zh_tw" => "組員",
|
||||
"en" => "Clerk" } ,
|
||||
"5" => { "zh_tw" => "工讀",
|
||||
"en" => "Work-study" }
|
||||
} }
|
||||
|
||||
attribute_field.save
|
||||
|
||||
attribute_field = AttributeField.new
|
||||
attribute_field.key = 'Duties'
|
||||
attribute_field.role_id = role.id
|
||||
attribute_field.title_translations = {:en=>'Duties', :zh_tw=>'承辦業務'}
|
||||
attribute_field.markup = 'text_area'
|
||||
attribute_field.save
|
||||
|
||||
attribute_field = AttributeField.new
|
||||
attribute_field.key = 'Deputy'
|
||||
attribute_field.role_id = role.id
|
||||
attribute_field.title_translations = {:en=>'Deputy', :zh_tw=>'代理人'}
|
||||
attribute_field.markup = 'text_area'
|
||||
attribute_field.save
|
||||
|
||||
end
|
||||
|
||||
if User.count==0
|
||||
group = Workgroup.where(:key=>'admin').first
|
||||
profile = MemberProfile.new
|
||||
|
@ -86,7 +242,8 @@ if User.count==0
|
|||
user.workgroup = group
|
||||
user.member_profile = profile
|
||||
user.user_name = "rulingcom"
|
||||
user.password = "bjo4xjp6"
|
||||
user.password = "Ab-5508881"
|
||||
user.email = "orbit@rulingcom.com"
|
||||
user.approved = true
|
||||
user.save
|
||||
end
|
|
@ -488,7 +488,16 @@ en:
|
|||
frontend_open: Frontend Open
|
||||
disable_personal_desktop: Disable Personal Desktop
|
||||
header: Site header
|
||||
import: Import
|
||||
import_rss2: Import RSS2
|
||||
import_member_data:
|
||||
import_error: Import Error
|
||||
import_members: Import Members
|
||||
import_member_data: Import Member Data
|
||||
download_doc: Download Importation Format
|
||||
import_error_id: "%{field} The Account field is already there"
|
||||
import_error_type: "%{field} Field format incompatible"
|
||||
import_error_date: "%{field} Date field format incompatible"
|
||||
info: Site information
|
||||
keywords: Site keywords
|
||||
keywords_help: Keyword Guide
|
||||
|
|
|
@ -495,7 +495,16 @@ zh_tw:
|
|||
footer: 網站頁尾
|
||||
footer_help: 網站頁尾說明
|
||||
header: 網站頁首
|
||||
import: 匯入
|
||||
import_rss2: 匯入RSS2
|
||||
import_member_data:
|
||||
import_error: 匯入錯誤
|
||||
import_members: 批次匯入會員
|
||||
import_member_data: 匯入會員資料
|
||||
download_doc: 下載匯入格式
|
||||
import_error_id: "%{field}欄位帳號已存在。"
|
||||
import_error_type: "%{field}欄位格式不符。"
|
||||
import_error_date: "%{field}欄位日期格式不符。"
|
||||
info: 網站資訊
|
||||
keywords: 搜尋關鍵字
|
||||
keywords_help: 關鍵字說明
|
||||
|
|
|
@ -90,7 +90,8 @@ Orbit::Application.routes.draw do
|
|||
end
|
||||
|
||||
get "members/get_role_fields/:id" => "members#get_role_fields", :as => :get_role_fields
|
||||
get "members/unapproved_members" => "members#unapproved_members"
|
||||
get "members/import_members" => "members#import_members"
|
||||
get "members/unapproved_members" => "members#unapproved_members"
|
||||
|
||||
resources :members do
|
||||
collection do
|
||||
|
@ -98,6 +99,8 @@ Orbit::Application.routes.draw do
|
|||
get 'edit_order_list'
|
||||
post 'update_order_card'
|
||||
post 'update_order_list'
|
||||
post 'import_members'
|
||||
post 'download_export'
|
||||
end
|
||||
match "setting_account" => "members#setting_account" ,:as => :setting_account, via: [:get, :post]
|
||||
match "edit_passwd" => "members#edit_passwd" ,:as => :edit_passwd, via: [:get, :post]
|
||||
|
|
Loading…
Reference in New Issue