diff --git a/app/assets/javascripts/manage/lib/setupDataTables.js b/app/assets/javascripts/manage/lib/setupDataTables.js
index 2b04d7975..ad23dfdf8 100644
--- a/app/assets/javascripts/manage/lib/setupDataTables.js
+++ b/app/assets/javascripts/manage/lib/setupDataTables.js
@@ -17,10 +17,13 @@ var setupDataTables = function () {
});
$('.datatable.users').DataTable({
- order: [5, 'desc'],
+ order: [8, 'desc'],
columns: [
{ orderable: true, data: 'id', visible: false },
- { orderable: true, data: 'email' },
+ { orderable: false, data: 'link' },
+ { orderable: true, data: 'first_name' },
+ { orderable: true, data: 'last_name' },
+ { orderable: true, data: 'email', visible: false },
{ orderable: true, data: 'role' },
{ orderable: false, data: 'questionnaire'},
{ orderable: true, data: 'active' },
@@ -34,15 +37,18 @@ var setupDataTables = function () {
});
$('.datatable.admins').DataTable({
- order: [1, 'asc'],
+ order: [2, 'asc'],
columns: [
{ orderable: true, data: 'id', visible: false },
- { orderable: true, data: 'email' },
+ { orderable: false, data: 'link' },
+ { orderable: true, data: 'first_name' },
+ { orderable: true, data: 'last_name' },
+ { orderable: true, data: 'email', visible: false },
{ orderable: true, data: 'role' },
{ orderable: true, data: 'active' },
{ orderable: true, data: 'receive_weekly_report' },
- { orderable: true, data: 'created_at' },
- { orderable: true, data: 'current_sign_in_at' },
+ { orderable: true, data: 'created_at', visible: false },
+ { orderable: true, data: 'current_sign_in_at', visible: false },
{ orderable: true, data: 'last_sign_in_at', visible: false },
{ orderable: true, data: 'current_sign_in_ip', visible: false },
{ orderable: true, data: 'last_sign_in_ip', visible: false },
@@ -75,8 +81,72 @@ var setupDataTables = function () {
],
});
- $('.datatable.stats').DataTable({
- processing: false,
- serverSide: false,
+ // MARK: Datatables for the stats
+
+ $('.datatable.stats-dietary').DataTable({
+ order: [1, 'asc'],
+ columns: [
+ { orderable: true, data: 'id', visible: false },
+ { orderable: true, data: 'first_name' },
+ { orderable: true, data: 'last_name' },
+ { orderable: true, data: 'email' },
+ { orderable: true, data: 'phone', visible: false },
+ { orderable: false, data: 'questionnaire' },
+ { orderable: true, data: 'checked_in_at', visible: false },
+ { orderable: true, data: 'dietary_restrictions' },
+ { orderable: true, data: 'special_needs' }
+ ]
+ });
+
+ $('.datatable.stats-notschooltravel').DataTable({
+ order: [1, 'asc'],
+ columns: [
+ { orderable: true, data: 'id', visible: false },
+ { orderable: true, data: 'first_name' },
+ { orderable: true, data: 'last_name' },
+ { orderable: true, data: 'email' },
+ { orderable: true, data: 'phone', visible: false },
+ { orderable: false, data: 'questionnaire' },
+ { orderable: true, data: 'travel_location' },
+ { orderable: true, data: 'acc_status' }
+ ]
});
+
+ $('.datatable.stats-attendeeinfo').DataTable({
+ columns: [
+ { orderable: true, data: 'id', visible: false },
+ { orderable: true, data: 'first_name' },
+ { orderable: true, data: 'last_name' },
+ { orderable: true, data: 'email' },
+ { orderable: true, data: 'school_name' },
+ { orderable: true, data: 'vcs_url' },
+ { orderable: true, data: 'portfolio_url' }
+ ]
+ });
+
+ $('.datatable.stats-mlhinfo-applied').DataTable({
+ order: [1, 'asc'],
+ columns: [
+ { orderable: true, data: 'id', visible: false },
+ { orderable: true, data: 'first_name' },
+ { orderable: true, data: 'last_name' },
+ { orderable: true, data: 'email' },
+ { orderable: true, data: 'phone', visible: false },
+ { orderable: true, data: 'school_name' }
+ ]
+ });
+
+ $('.datatable.stats-mlhinfo-checkedin').DataTable({
+ order: [1, 'asc'],
+ columns: [
+ { orderable: true, data: 'id', visible: false },
+ { orderable: true, data: 'first_name' },
+ { orderable: true, data: 'last_name' },
+ { orderable: true, data: 'email' },
+ { orderable: true, data: 'phone' },
+ { orderable: true, data: 'school_name' }
+ ]
+ });
+
+
};
diff --git a/app/controllers/manage/bus_lists_controller.rb b/app/controllers/manage/bus_lists_controller.rb
index a6cb83807..5307fea5a 100644
--- a/app/controllers/manage/bus_lists_controller.rb
+++ b/app/controllers/manage/bus_lists_controller.rb
@@ -44,10 +44,10 @@ def toggle_bus_captain
is_bus_captain = params[:bus_captain] == "1"
@questionnaire.update_attribute(:is_bus_captain, is_bus_captain)
if @questionnaire.reload.is_bus_captain
- flash[:notice] = "#{@questionnaire.full_name} has been promoted to a bus captain."
+ flash[:notice] = "#{@questionnaire.user.full_name} has been promoted to a bus captain."
Message.queue_for_trigger("bus_list.new_captain_confirmation", @questionnaire.user.id)
else
- flash[:notice] = "#{@questionnaire.full_name} has been removed as a bus captain."
+ flash[:notice] = "#{@questionnaire.user.full_name} has been removed as a bus captain."
end
redirect_to [:manage, @bus_list]
end
diff --git a/app/controllers/manage/questionnaires_controller.rb b/app/controllers/manage/questionnaires_controller.rb
index 3e31de6a7..0aa9577e1 100644
--- a/app/controllers/manage/questionnaires_controller.rb
+++ b/app/controllers/manage/questionnaires_controller.rb
@@ -51,6 +51,12 @@ def create
def update
update_params = questionnaire_params
email = update_params.delete(:email)
+ # Take our nested user object out as a whole
+ user_params = params[:questionnaire][:user]
+ if user_params
+ @questionnaire.user.update_attributes(first_name: user_params[:first_name])
+ @questionnaire.user.update_attributes(last_name: user_params[:last_name])
+ end
@questionnaire.user.update_attributes(email: email) if email.present?
update_params = convert_school_name_to_id(update_params)
update_params = convert_boarded_bus_param(update_params, @questionnaire)
@@ -76,11 +82,11 @@ def check_in
end
@questionnaire.update_attribute(:checked_in_at, Time.now)
@questionnaire.update_attribute(:checked_in_by_id, current_user.id)
- flash[:notice] = "Checked in #{@questionnaire.full_name}."
+ flash[:notice] = "Checked in #{@questionnaire.user.full_name}."
elsif params[:check_in] == "false"
@questionnaire.update_attribute(:checked_in_at, nil)
@questionnaire.update_attribute(:checked_in_by_id, current_user.id)
- flash[:notice] = "#{@questionnaire.full_name} no longer checked in."
+ flash[:notice] = "#{@questionnaire.user.full_name} no longer checked in."
else
flash[:alert] = "No check-in action provided!"
redirect_to show_redirect_path
@@ -147,8 +153,10 @@ def message_events
private
def questionnaire_params
+ # Note that this ONLY considers parameters for the questionnaire, not the user.
+ # TODO: Refactor "email" out to user as first_name and last_name were
params.require(:questionnaire).permit(
- :email, :experience, :first_name, :last_name, :gender,
+ :email, :experience, :gender,
:date_of_birth, :interest, :school_id, :school_name, :major, :level_of_study,
:shirt_size, :dietary_restrictions, :special_needs, :international,
:portfolio_url, :vcs_url, :agreement_accepted, :bus_captain_interest,
diff --git a/app/controllers/manage/stats_controller.rb b/app/controllers/manage/stats_controller.rb
index c4958d6cf..459285f71 100644
--- a/app/controllers/manage/stats_controller.rb
+++ b/app/controllers/manage/stats_controller.rb
@@ -1,137 +1,25 @@
class Manage::StatsController < Manage::ApplicationController
- def index
- end
- def dietary_special_needs
- data = Rails.cache.fetch(cache_key_for_questionnaires("dietary_special_needs")) do
- select_attributes = [
- :first_name,
- :last_name,
- :phone,
- :checked_in_at,
- :dietary_restrictions,
- :special_needs,
- :user_id
- ]
- json_attributes = [
- :first_name,
- :last_name,
- :email,
- :phone,
- :checked_in_at,
- :dietary_restrictions,
- :special_needs
- ]
- data = Questionnaire.where("dietary_restrictions != '' AND acc_status = 'rsvp_confirmed' OR special_needs != '' AND acc_status = 'rsvp_confirmed'").select(select_attributes)
- to_json_array(data, json_attributes)
- end
- render json: { data: data }
- end
+ respond_to :html, :json
- def sponsor_info
- data = Rails.cache.fetch(cache_key_for_questionnaires("sponsor_info")) do
- select_attributes = [
- :id,
- :first_name,
- :last_name,
- :vcs_url,
- :portfolio_url,
- :user_id,
- :school_id
- ]
- json_attributes = [
- :first_name,
- :last_name,
- :email,
- :school_name,
- :vcs_url,
- :portfolio_url
- ]
- data = Questionnaire.where("can_share_info = '1' AND checked_in_at != 0").joins(:resume_attachment).select(select_attributes)
- json = to_json_array(data, json_attributes)
- json.map.with_index { |item, index| item.insert(6, data[index].resume.attached? ? url_for(data[index].resume) : '') }
- end
- render json: { data: data }
+ def dietary_restrictions_special_needs_datatable
+ render json: DietarySpecialNeedsDatatable.new(params, view_context: view_context)
end
- def alt_travel
- data = Rails.cache.fetch(cache_key_for_questionnaires("alt_travel")) do
- select_attributes = [
- :id,
- :first_name,
- :last_name,
- :travel_location,
- :acc_status,
- :user_id,
- :school_id
- ]
- json_attributes = [
- :id,
- :first_name,
- :last_name,
- :email,
- :travel_location,
- :acc_status
- ]
- data = Questionnaire.where("travel_not_from_school = '1'").select(select_attributes)
- json = to_json_array(data, json_attributes)
- json.each do |e|
- e[0] = view_context.link_to("View »".html_safe, manage_questionnaire_path(e[0]))
- end
- end
- render json: { data: data }
+ def alt_travel_datatable
+ render json: AltTravelDatatable.new(params, view_context: view_context)
end
- def mlh_info_applied
- data = Rails.cache.fetch(cache_key_for_questionnaires("mlh_info_applied")) do
- select_attributes = [
- :first_name,
- :last_name,
- :user_id,
- :school_id
- ]
- json_attributes = [
- :first_name,
- :last_name,
- :email,
- :school_name
- ]
- data = Questionnaire.joins(:school).select(select_attributes)
- to_json_array(data, json_attributes)
- end
- render json: { data: data }
+ def attendee_sponsor_info_datatable
+ render json: AttendeeSponsorInfoDatatable.new(params, view_context: view_context)
end
- def mlh_info_checked_in
- data = Rails.cache.fetch(cache_key_for_questionnaires("mlh_info_checked_in")) do
- select_attributes = [
- :first_name,
- :last_name,
- :user_id,
- :school_id
- ]
- json_attributes = [
- :first_name,
- :last_name,
- :email,
- :school_name
- ]
- data = Questionnaire.joins(:school).select(select_attributes).where('checked_in_at > 0')
- to_json_array(data, json_attributes)
- end
- render json: { data: data }
+ def mlh_applied_datatable
+ render json: MLHAppliedDatatable.new(params, view_context: view_context)
end
-
- private
-
- def to_json_array(data, attributes)
- data.map { |e| attributes.map { |a| e.send(a) } }
+ def mlh_checked_in_datatable
+ render json: MLHCheckedInDatatable.new(params, view_context: view_context)
end
- def cache_key_for_questionnaires(id)
- count = Questionnaire.count
- max_updated_at = Questionnaire.maximum(:updated_at).try(:utc).try(:to_s, :number)
- "stats/all-#{count}-#{max_updated_at}-#{id}"
- end
end
diff --git a/app/controllers/manage/users_controller.rb b/app/controllers/manage/users_controller.rb
index c00222e0e..e64fad0e0 100644
--- a/app/controllers/manage/users_controller.rb
+++ b/app/controllers/manage/users_controller.rb
@@ -38,7 +38,7 @@ def destroy
def user_params
params.require(:user).permit(
- :email, :password, :password_confirmation, :remember_me, :role, :is_active, :receive_weekly_report
+ :first_name, :last_name, :email, :password, :password_confirmation, :remember_me, :role, :is_active, :receive_weekly_report
)
end
diff --git a/app/controllers/questionnaires_controller.rb b/app/controllers/questionnaires_controller.rb
index e04bfb962..633547842 100644
--- a/app/controllers/questionnaires_controller.rb
+++ b/app/controllers/questionnaires_controller.rb
@@ -26,15 +26,14 @@ def new
@questionnaire = Questionnaire.new
if session["devise.provider_data"] && session["devise.provider_data"]["info"]
+ info = session["devise.provider_data"]["info"]
@skip_my_mlh_fields = true
@questionnaire.tap do |q|
- q.first_name = session["devise.provider_data"]["info"]["first_name"]
- q.last_name = session["devise.provider_data"]["info"]["last_name"]
- q.phone = session["devise.provider_data"]["info"]["phone_number"]
- q.level_of_study = session["devise.provider_data"]["info"]["level_of_study"]
- q.major = session["devise.provider_data"]["info"]["major"]
- q.date_of_birth = session["devise.provider_data"]["info"]["date_of_birth"]
- q.gender = session["devise.provider_data"]["info"]["gender"]
+ q.phone = info["phone_number"]
+ q.level_of_study = info["level_of_study"]
+ q.major = info["major"]
+ q.date_of_birth = info["date_of_birth"]
+ q.gender = info["gender"]
school = School.where(name: session["devise.provider_data"]["info"]["school"]["name"]).first_or_create do |s|
s.name = session["devise.provider_data"]["info"]["school"]["name"]
@@ -116,7 +115,7 @@ def schools
def questionnaire_params
params.require(:questionnaire).permit(
- :email, :experience, :first_name, :last_name, :gender,
+ :email, :experience, :gender,
:date_of_birth, :interest, :school_id, :school_name, :major, :level_of_study,
:shirt_size, :dietary_restrictions, :special_needs, :international,
:portfolio_url, :vcs_url, :agreement_accepted, :bus_captain_interest,
diff --git a/app/controllers/users/registrations_controller.rb b/app/controllers/users/registrations_controller.rb
index 011211046..a19263901 100644
--- a/app/controllers/users/registrations_controller.rb
+++ b/app/controllers/users/registrations_controller.rb
@@ -1,6 +1,6 @@
class Users::RegistrationsController < Devise::RegistrationsController
- # before_action :configure_sign_up_params, only: [:create]
- # before_action :configure_account_update_params, only: [:update]
+ before_action :configure_sign_up_params, only: [:create]
+ before_action :configure_account_update_params, only: [:update]
# GET /resource/sign_up
def new
@@ -28,6 +28,17 @@ def destroy
super
end
+ # Permit adding custom parameters for sign up
+ # (Devise gives us email and password by default, but we want some more.)
+ def configure_sign_up_params
+ devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name])
+ end
+
+ # Permit updating custom parameters for sign up
+ def configure_account_update_params
+ devise_parameter_sanitizer.permit(:account_update, keys: [:first_name, :last_name])
+ end
+
# GET /resource/cancel
# Forces the session data which is usually expired after sign
# in to be expired now. This is useful if the user wants to
@@ -39,16 +50,6 @@ def destroy
# protected
- # You can put the params you want to permit in the empty array.
- # def configure_sign_up_params
- # devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute])
- # end
-
- # You can put the params you want to permit in the empty array.
- # def configure_account_update_params
- # devise_parameter_sanitizer.permit(:account_update, keys: [:attribute])
- # end
-
# The path used after sign up.
# def after_sign_up_path_for(resource)
# super(resource)
diff --git a/app/datatables/admin_datatable.rb b/app/datatables/admin_datatable.rb
index 16612e8be..d34cb8a61 100644
--- a/app/datatables/admin_datatable.rb
+++ b/app/datatables/admin_datatable.rb
@@ -4,6 +4,8 @@ class AdminDatatable < ApplicationDatatable
def view_columns
@view_columns ||= {
id: { source: "User.id" },
+ first_name: { source: "User.first_name" },
+ last_name: { source: "User.last_name" },
email: { source: "User.email" },
role: { source: "User.role", searchable: false },
active: { source: "User.is_active", searchable: false },
@@ -23,7 +25,10 @@ def data
records.map do |record|
{
id: record.id,
- email: link_to(bold(record.email), manage_user_path(record)),
+ link: link_to(''.html_safe, manage_user_path(record)),
+ first_name: record.first_name,
+ last_name: record.last_name,
+ email: record.email,
role: record.role.titleize,
active: record.is_active ? 'Active'.html_safe : 'Inactive'.html_safe,
receive_weekly_report: yes_no_display(record.receive_weekly_report),
diff --git a/app/datatables/alt_travel_datatable.rb b/app/datatables/alt_travel_datatable.rb
new file mode 100644
index 000000000..1879b80ee
--- /dev/null
+++ b/app/datatables/alt_travel_datatable.rb
@@ -0,0 +1,45 @@
+class AltTravelDatatable < ApplicationDatatable
+ def_delegators :@view, :link_to, :manage_stats_path, :manage_questionnaire_path, :bold, :display_datetime
+
+ def view_columns
+ @view_columns ||= {
+ id: { source: "Questionnaire.id" },
+ first_name: { source: "User.first_name" },
+ last_name: { source: "User.last_name" },
+ email: { source: "User.email" },
+ phone: { source: "Questionnaire.phone" },
+ travel_location: { source: "Questionnaire.travel_location" },
+ acc_status: { source: "Questionnaire.acc_status" }
+ }
+ end
+
+ private
+
+ def data
+ records.map do |record|
+ {
+ id: record.id,
+ first_name: record.user.first_name,
+ last_name: record.user.last_name,
+ email: record.user.email,
+ phone: record.phone,
+ questionnaire: link_to(bold("View »".html_safe), manage_questionnaire_path(record.id)),
+ travel_location: record.travel_location,
+ acc_status: record.acc_status
+ }
+ end
+ end
+
+ def get_raw_records
+ restrictions = "travel_not_from_school = '1'"
+
+ q_attributes = [
+ :id,
+ :phone,
+ :travel_location,
+ :acc_status
+ ]
+
+ Questionnaire.includes(:user).references(:user).where(restrictions).select(q_attributes)
+ end
+end
diff --git a/app/datatables/attendee_sponsor_info_datatable.rb b/app/datatables/attendee_sponsor_info_datatable.rb
new file mode 100644
index 000000000..d22e062ce
--- /dev/null
+++ b/app/datatables/attendee_sponsor_info_datatable.rb
@@ -0,0 +1,44 @@
+class AttendeeSponsorInfoDatatable < ApplicationDatatable
+ def_delegators :@view, :link_to, :manage_stats_path, :manage_questionnaire_path, :bold, :display_datetime
+
+ def view_columns
+ @view_columns ||= {
+ id: { source: "Questionnaire.id" },
+ first_name: { source: "User.first_name" },
+ last_name: { source: "User.last_name" },
+ email: { source: "User.email" },
+ school_name: { source: "School.name" },
+ vcs_url: { source: "Questionnaire.vcs_url" },
+ portfolio_url: { source: "Questionnaire.portfolio_url" }
+ }
+ end
+
+ private
+
+ def data
+ records.map do |record|
+ {
+ id: record.id,
+ first_name: record.user.first_name,
+ last_name: record.user.last_name,
+ email: record.user.email,
+ school_name: record.school_name,
+ vcs_url: record.vcs_url,
+ portfolio_url: record.portfolio_url
+ }
+ end
+ end
+
+ def get_raw_records
+ # Condition: only retrieve users that have agreed to share data and are at the event
+ restrictions = "can_share_info = '1' AND checked_in_at != 0"
+
+ q_attributes = [
+ :id,
+ :vcs_url,
+ :portfolio_url
+ ]
+
+ Questionnaire.includes(:user).references(:user).where(restrictions).select(q_attributes)
+ end
+end
diff --git a/app/datatables/checkin_datatable.rb b/app/datatables/checkin_datatable.rb
index 0b2344382..f3443fe8e 100644
--- a/app/datatables/checkin_datatable.rb
+++ b/app/datatables/checkin_datatable.rb
@@ -3,8 +3,8 @@ class CheckinDatatable < ApplicationDatatable
def view_columns
@view_columns ||= {
- first_name: { source: "Questionnaire.first_name" },
- last_name: { source: "Questionnaire.last_name" },
+ first_name: { source: "User.first_name" },
+ last_name: { source: "User.last_name" },
checked_in: { source: "Questionnaire.checked_in_at", searchable: false },
}
end
@@ -13,7 +13,7 @@ def view_columns
def about(record)
output = ""
- output += [record.first_name, record.last_name].join(" ") + " "
+ output += [record.user.first_name, record.user.last_name].join(" ") + " "
output += 'Minor' if record.minor?
output += "
" + record.school.name + ""
output.html_safe
@@ -22,8 +22,8 @@ def about(record)
def data
records.map do |record|
{
- first_name: record.first_name,
- last_name: record.last_name,
+ first_name: record.user.first_name,
+ last_name: record.user.last_name,
about: about(record),
checked_in: yes_no_display(record.checked_in?),
actions: "View".html_safe,
diff --git a/app/datatables/dietary_special_needs_datatable.rb b/app/datatables/dietary_special_needs_datatable.rb
new file mode 100644
index 000000000..b9f174a66
--- /dev/null
+++ b/app/datatables/dietary_special_needs_datatable.rb
@@ -0,0 +1,50 @@
+class DietarySpecialNeedsDatatable < ApplicationDatatable
+ def_delegators :@view, :link_to, :manage_stats_path, :manage_questionnaire_path, :bold, :display_datetime
+
+ def view_columns
+ @view_columns ||= {
+ id: { source: "Questionnaire.id" },
+ first_name: { source: "User.first_name" },
+ last_name: { source: "User.last_name" },
+ email: { source: "User.email" },
+ phone: { source: "Questionnaire.phone" },
+ checked_in_at: { source: "Questionnaire.checked_in_at", searchable: false },
+ dietary_restrictions: { source: "Questionnaire.dietary_restrictions" },
+ special_needs: { source: "Questionnaire.special_needs" }
+ }
+ end
+
+ private
+
+ def data
+ records.map do |record|
+ {
+ id: record.id,
+ first_name: record.user.first_name,
+ last_name: record.user.last_name,
+ email: record.user.email,
+ phone: record.phone,
+ questionnaire: link_to(bold("View »".html_safe), manage_questionnaire_path(record.id)),
+ checked_in_at: record.checked_in_at,
+ dietary_restrictions: record.dietary_restrictions,
+ special_needs: record.special_needs
+ }
+ end
+ end
+
+ def get_raw_records
+ # Condition: only retrieve users that have dietary restrictions or special dietary needs
+ restrictions = "acc_status = 'rsvp_confirmed' AND "\
+ "dietary_restrictions != '' OR special_needs != ''"
+
+ q_attributes = [
+ :id,
+ :phone,
+ :checked_in_at,
+ :dietary_restrictions,
+ :special_needs
+ ]
+
+ Questionnaire.includes(:user).references(:user).where(restrictions).select(q_attributes)
+ end
+end
diff --git a/app/datatables/mlh_applied_datatable.rb b/app/datatables/mlh_applied_datatable.rb
new file mode 100644
index 000000000..7da2d25c4
--- /dev/null
+++ b/app/datatables/mlh_applied_datatable.rb
@@ -0,0 +1,38 @@
+class MLHAppliedDatatable < ApplicationDatatable
+ def_delegators :@view, :link_to, :manage_stats_path, :bold, :display_datetime
+
+ def view_columns
+ @view_columns ||= {
+ id: { source: "Questionnaire.id" },
+ first_name: { source: "User.first_name" },
+ last_name: { source: "User.last_name" },
+ email: { source: "User.email" },
+ phone: { source: "Questionnaire.phone" },
+ school_name: { source: "School.name" }
+ }
+ end
+
+ private
+
+ def data
+ records.map do |record|
+ {
+ id: record.id,
+ first_name: record.user.first_name,
+ last_name: record.user.last_name,
+ email: record.user.email,
+ phone: record.phone,
+ school_name: record.school_name
+ }
+ end
+ end
+
+ def get_raw_records
+ q_attributes = [
+ :id,
+ :phone
+ ]
+
+ Questionnaire.includes(:user).references(:user).select(q_attributes)
+ end
+end
diff --git a/app/datatables/mlh_checked_in_datatable.rb b/app/datatables/mlh_checked_in_datatable.rb
new file mode 100644
index 000000000..7524b2c01
--- /dev/null
+++ b/app/datatables/mlh_checked_in_datatable.rb
@@ -0,0 +1,40 @@
+class MLHCheckedInDatatable < ApplicationDatatable
+ def_delegators :@view, :link_to, :manage_stats_path, :bold, :display_datetime
+
+ def view_columns
+ @view_columns ||= {
+ id: { source: "Questionnaire.id" },
+ first_name: { source: "User.first_name" },
+ last_name: { source: "User.last_name" },
+ email: { source: "User.email" },
+ phone: { source: "Questionnaire.phone" },
+ school_name: { source: "School.name" }
+ }
+ end
+
+ private
+
+ def data
+ records.map do |record|
+ {
+ id: record.id,
+ first_name: record.user.first_name,
+ last_name: record.user.last_name,
+ email: record.user.email,
+ phone: record.phone,
+ school_name: record.school_name
+ }
+ end
+ end
+
+ def get_raw_records
+ restrictions = "checked_in_at > 0"
+
+ q_attributes = [
+ :id,
+ :phone
+ ]
+
+ Questionnaire.includes(:user).references(:user).where(restrictions).select(q_attributes)
+ end
+end
diff --git a/app/datatables/questionnaire_datatable.rb b/app/datatables/questionnaire_datatable.rb
index a9abbf6ec..48f04cc8e 100644
--- a/app/datatables/questionnaire_datatable.rb
+++ b/app/datatables/questionnaire_datatable.rb
@@ -4,8 +4,8 @@ class QuestionnaireDatatable < ApplicationDatatable
def view_columns
@view_columns ||= {
id: { source: "Questionnaire.id", cond: :eq },
- first_name: { source: "Questionnaire.first_name" },
- last_name: { source: "Questionnaire.last_name" },
+ first_name: { source: "User.first_name" },
+ last_name: { source: "User.last_name" },
email: { source: "User.email" },
phone: { source: "Questionnaire.phone" },
gender: { source: "Questionnaire.gender" },
@@ -40,7 +40,7 @@ def bus_captain(record)
if record.is_bus_captain?
link_to("Remove", toggle_bus_captain_manage_bus_list_path(record.bus_list_id, questionnaire_id: record.id, bus_captain: "0"), method: "post", class: "text-danger")
else
- link_to("Promote", toggle_bus_captain_manage_bus_list_path(record.bus_list_id, questionnaire_id: record.id, bus_captain: "1"), method: "post", data: { confirm: "Are you sure you want to make #{record.full_name} a bus captain? They will receive a confirmation email." })
+ link_to("Promote", toggle_bus_captain_manage_bus_list_path(record.bus_list_id, questionnaire_id: record.id, bus_captain: "1"), method: "post", data: { confirm: "Are you sure you want to make #{record.user.full_name} a bus captain? They will receive a confirmation email." })
end
end
@@ -51,8 +51,8 @@ def data
link: link_to(''.html_safe, manage_questionnaire_path(record)),
note: note(record),
id: record.id,
- first_name: bold(record.first_name),
- last_name: bold(record.last_name),
+ first_name: bold(record.user.first_name),
+ last_name: bold(record.user.last_name),
email: record.email,
phone: record.phone,
gender: record.gender,
diff --git a/app/datatables/user_datatable.rb b/app/datatables/user_datatable.rb
index e287155d7..b442700dd 100644
--- a/app/datatables/user_datatable.rb
+++ b/app/datatables/user_datatable.rb
@@ -4,6 +4,8 @@ class UserDatatable < ApplicationDatatable
def view_columns
@view_columns ||= {
id: { source: "User.id" },
+ first_name: { source: "User.first_name" },
+ last_name: { source: "User.last_name" },
email: { source: "User.email" },
role: { source: "User.role", searchable: false },
active: { source: "User.is_active", searchable: false },
@@ -22,6 +24,9 @@ def data
records.map do |record|
{
id: record.id,
+ link: link_to(''.html_safe, manage_user_path(record)),
+ first_name: record.first_name,
+ last_name: record.last_name,
email: link_to(bold(record.email), manage_user_path(record)),
role: record.role.titleize,
questionnaire: record.questionnaire.present? ? link_to(bold("View »".html_safe), manage_questionnaire_path(record.questionnaire.id)) : 'None',
diff --git a/app/models/bus_list.rb b/app/models/bus_list.rb
index c5d8c6036..72c0e549b 100644
--- a/app/models/bus_list.rb
+++ b/app/models/bus_list.rb
@@ -13,7 +13,7 @@ def full?
end
def passengers
- questionnaires.where("acc_status = 'rsvp_confirmed'").order("last_name ASC")
+ questionnaires.where("acc_status = 'rsvp_confirmed'")
end
def schools
diff --git a/app/models/questionnaire.rb b/app/models/questionnaire.rb
index 0f692613a..f1f48387b 100644
--- a/app/models/questionnaire.rb
+++ b/app/models/questionnaire.rb
@@ -19,7 +19,7 @@ class Questionnaire < ApplicationRecord
validates_uniqueness_of :user_id
- validates_presence_of :first_name, :last_name, :phone, :date_of_birth, :school_id, :experience, :shirt_size, :interest
+ validates_presence_of :phone, :date_of_birth, :school_id, :experience, :shirt_size, :interest
validates_presence_of :gender, :major, :level_of_study, :graduation_year, :race_ethnicity
validates_presence_of :agreement_accepted, message: "Please read & accept"
validates_presence_of :code_of_conduct_accepted, message: "Please read & accept"
@@ -145,10 +145,6 @@ def school_name
school.name if school_id
end
- def full_name
- "#{first_name} #{last_name}"
- end
-
def full_location
"#{school.city}, #{school.state}"
end
diff --git a/app/models/user.rb b/app/models/user.rb
index 939537de6..3b5de0bd2 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -1,5 +1,7 @@
class User < ApplicationRecord
- audited only: [:email, :role, :is_active, :receive_weekly_report]
+ audited only: [:first_name, :last_name, :email, :role, :is_active, :receive_weekly_report]
+
+ strip_attributes
devise :database_authenticatable, :registerable, :timeoutable,
:recoverable, :rememberable, :trackable, :validatable,
@@ -13,12 +15,15 @@ class User < ApplicationRecord
foreign_key: :resource_owner_id,
dependent: :delete_all # or :destroy if you need callbacks
+ accepts_nested_attributes_for :questionnaire
+
validates_uniqueness_of :email
+ validates_presence_of :first_name, :last_name
after_create :queue_reminder_email
+ after_initialize :set_default_role, if: :new_record?
enum role: { user: 0, event_tracking: 1, admin_limited_access: 2, admin: 3 }
- after_initialize :set_default_role, if: :new_record?
def set_default_role
self.role ||= :user
@@ -47,19 +52,8 @@ def safe_receive_weekly_report
receive_weekly_report
end
- def first_name
- return "" if questionnaire.blank?
- questionnaire.first_name
- end
-
- def last_name
- return "" if questionnaire.blank?
- questionnaire.last_name
- end
-
def full_name
- return email if questionnaire.blank?
- questionnaire.full_name
+ "#{first_name} #{last_name}"
end
def self.from_omniauth(auth)
@@ -67,8 +61,10 @@ def self.from_omniauth(auth)
matching_email = where(email: auth.info.email)
current_user = matching_provider.or(matching_email).first_or_create do |user|
user.uid = auth.uid
- user.provider = auth.provider
+ user.first_name = auth.info.first_name
+ user.last_name = auth.info.last_name
user.email = auth.info.email
+ user.provider = auth.provider
user.password = Devise.friendly_token[0, 20]
end
# Autofill MyMLH provider if provider info is missing
diff --git a/app/views/application/_bus_list_info.html.haml b/app/views/application/_bus_list_info.html.haml
index 930f35eb5..82d7ecbc0 100644
--- a/app/views/application/_bus_list_info.html.haml
+++ b/app/views/application/_bus_list_info.html.haml
@@ -5,7 +5,7 @@
%em TBD
- bus_list.captains.each do |p|
%p
- %strong= p.full_name
+ %strong= p.user.full_name
%br
%em= p.school.name
%br
diff --git a/app/views/application/_questionnaire_summary.html.haml b/app/views/application/_questionnaire_summary.html.haml
index 5ebb7a008..8a6f22959 100644
--- a/app/views/application/_questionnaire_summary.html.haml
+++ b/app/views/application/_questionnaire_summary.html.haml
@@ -32,10 +32,10 @@
%legend Provided by MyMLH
%p
%b First name:
- = @questionnaire.first_name
+ = @questionnaire.user.first_name
%p
%b Last name:
- = @questionnaire.last_name
+ = @questionnaire.user.last_name
%p
%b Email:
= @questionnaire.email
diff --git a/app/views/bus_lists/show.html.haml b/app/views/bus_lists/show.html.haml
index 3b7b6785c..6f7a6ed59 100644
--- a/app/views/bus_lists/show.html.haml
+++ b/app/views/bus_lists/show.html.haml
@@ -43,8 +43,8 @@
%tr
%td
%input{type: 'checkbox', checked: p.boarded_bus?, data: { "boarded-bus": true, action: boarded_bus_bus_list_path, id: p.id } }
- %td= p.first_name
- %td= p.last_name
+ %td= p.user.first_name
+ %td= p.user.last_name
%td= p.email
%td= phone_link_to p.phone
%td= p.school.name
diff --git a/app/views/devise/registrations/_form.html.haml b/app/views/devise/registrations/_form.html.haml
index 6ea83cf76..43e466fc7 100644
--- a/app/views/devise/registrations/_form.html.haml
+++ b/app/views/devise/registrations/_form.html.haml
@@ -6,7 +6,9 @@
%p
%em or continue manually:
.form-inputs
- = f.input :email, required: true, autofocus: true
+ = f.input :first_name, required: true, autofocus: true
+ = f.input :last_name, required: true
+ = f.input :email, required: true
= f.input :password, required: true
= f.input :password_confirmation, required: true, label:"Confirm"
.form-actions.right
diff --git a/app/views/manage/admins/_form.html.haml b/app/views/manage/admins/_form.html.haml
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/views/manage/admins/index.html.haml b/app/views/manage/admins/index.html.haml
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/views/manage/application/_model_history.html.haml b/app/views/manage/application/_model_history.html.haml
index 2377bc78b..405d1e1ef 100644
--- a/app/views/manage/application/_model_history.html.haml
+++ b/app/views/manage/application/_model_history.html.haml
@@ -15,7 +15,7 @@
- next if ignore_fields.include? field
%p.mb-1
= t("simple_form.labels.#{audit.auditable.class.name.downcase}.#{field}")
- - if audit.auditable.class.columns_hash[field].type == :text
+ - if audit.auditable.class.columns_hash[field].nil? || audit.auditable.class.columns_hash[field].type == :text
changed
- else
changed to
diff --git a/app/views/manage/bus_lists/show.html.haml b/app/views/manage/bus_lists/show.html.haml
index 7534a3ad1..d13c65b9c 100644
--- a/app/views/manage/bus_lists/show.html.haml
+++ b/app/views/manage/bus_lists/show.html.haml
@@ -65,8 +65,8 @@
- @bus_list.passengers.select { |q| q.bus_captain_interest }.each do |p|
%tr
%td= link_to ''.html_safe, manage_questionnaire_path(p)
- %td= p.first_name
- %td= p.last_name
+ %td= p.user.first_name
+ %td= p.user.last_name
%td= p.email
%td= phone_link_to p.phone
%td= link_to p.school.name, manage_school_path(p.school)
diff --git a/app/views/manage/checkins/show.html.haml b/app/views/manage/checkins/show.html.haml
index c7e1b0484..a0ea0182e 100644
--- a/app/views/manage/checkins/show.html.haml
+++ b/app/views/manage/checkins/show.html.haml
@@ -1,7 +1,7 @@
.d-flex.justify-content-between.flex-wrap.flex-md-nowrap.align-items-center.pt-3.pb-2.mb-3.border-bottom
.d-flex.align-items-center.flex-wrap
%h1.h2.mr-3
- = title @questionnaire.full_name
+ = title @questionnaire.user.full_name
%div
%span.mr-1
= render 'manage/questionnaires/acc_status_badge'
@@ -19,7 +19,7 @@
.card-body
.row
%dt.col-md-4 Name
- %dd.col-md-8= @questionnaire.full_name
+ %dd.col-md-8= @questionnaire.user.full_name
%dt.col-md-4 School
%dd.col-md-8
- school = @questionnaire.school
diff --git a/app/views/manage/questionnaires/_form.html.haml b/app/views/manage/questionnaires/_form.html.haml
index 91fff3521..189d88215 100644
--- a/app/views/manage/questionnaires/_form.html.haml
+++ b/app/views/manage/questionnaires/_form.html.haml
@@ -12,8 +12,9 @@
- if @questionnaire&.user&.provider == 'mlh'
%h6.card-subtitle.mb-2
%span.badge.badge-info Provided by My MLH
- = f.input :first_name, input_html: { "data-validate" => "presence" }, label: "First Name", autofocus: true
- = f.input :last_name, input_html: { "data-validate" => "presence" }, label: "Last Name"
+ = f.simple_fields_for :user, @questionnaire.user do |u|
+ = u.input :first_name, input_html: { "data-validate" => "presence" }, label: "First Name", autofocus: true
+ = u.input :last_name, input_html: { "data-validate" => "presence" }, label: "Last Name"
= f.input :email, input_html: { "data-validate" => "presence email", value: @questionnaire.user.try(:email) }, required: true, hint: 'Can be an existing user (without a questionnaire) or a new user. If this is a new user, they will receive a randomly-generated password that they must request a password reset for.'
= f.input :phone, input_html: { "data-validate" => "presence" }
= f.input :date_of_birth, start_year: Date.today.year - 18, end_year: Date.today.year - 90, order: [:month, :day, :year], input_html: { "data-validate" => "presence" }
diff --git a/app/views/manage/questionnaires/_overview.html.haml b/app/views/manage/questionnaires/_overview.html.haml
index 09e21b4ad..5e410bbf4 100644
--- a/app/views/manage/questionnaires/_overview.html.haml
+++ b/app/views/manage/questionnaires/_overview.html.haml
@@ -9,9 +9,9 @@
.card-body
.row
%dt.col-md-4 First name
- %dd.col-md-8= @questionnaire.first_name
+ %dd.col-md-8= @questionnaire.user.first_name
%dt.col-md-4 Last name
- %dd.col-md-8= @questionnaire.last_name
+ %dd.col-md-8= @questionnaire.user.last_name
%dt.col-md-4 Email
%dd.col-md-8= @questionnaire.email
%dt.col-md-4 Phone
diff --git a/app/views/manage/questionnaires/edit.html.haml b/app/views/manage/questionnaires/edit.html.haml
index 49851931b..fb3f0973e 100644
--- a/app/views/manage/questionnaires/edit.html.haml
+++ b/app/views/manage/questionnaires/edit.html.haml
@@ -1,6 +1,6 @@
-= render "layouts/manage/page_title", title: "Edit Questionnaire", subtitle: @questionnaire.full_name do
+= render "layouts/manage/page_title", title: "Edit Questionnaire", subtitle: @questionnaire.user.full_name do
.btn-group
= link_to 'Cancel', manage_questionnaire_path(@questionnaire), class: 'btn btn-sm btn-outline-secondary'
- = link_to 'Delete', manage_questionnaire_path(@questionnaire), method: :delete, data: { confirm: "Are you sure? The questionnaire and account for \"#{@questionnaire.full_name}\" will be permanently erased. This action is irreversible." }, class: 'btn btn-sm btn-outline-secondary'
+ = link_to 'Delete', manage_questionnaire_path(@questionnaire), method: :delete, data: { confirm: "Are you sure? The questionnaire and account for \"#{@questionnaire.user.full_name}\" will be permanently erased. This action is irreversible." }, class: 'btn btn-sm btn-outline-secondary'
= render 'form'
diff --git a/app/views/manage/questionnaires/show.html.haml b/app/views/manage/questionnaires/show.html.haml
index 429872c48..54d910fa9 100644
--- a/app/views/manage/questionnaires/show.html.haml
+++ b/app/views/manage/questionnaires/show.html.haml
@@ -1,7 +1,7 @@
.d-flex.justify-content-between.flex-wrap.flex-md-nowrap.align-items-center.pt-3.pb-2.mb-3.border-bottom
.d-flex.align-items-center.flex-wrap
%h1.h2.mr-3
- = title @questionnaire.full_name
+ = title @questionnaire.user.full_name
%div
%span.mr-1
= render 'acc_status_badge'
@@ -16,7 +16,7 @@
%button.btn.btn-sm.btn-outline-secondary.dropdown-toggle#title-actions{"aria-expanded" => "false", "aria-haspopup" => "true", "data-toggle" => "dropdown", type: "button"}
.fa.fa-cog
.dropdown-menu.dropdown-menu-right{"aria-labelledby" => "title-actions"}
- = link_to 'Convert to Admin', convert_to_admin_manage_questionnaire_path(@questionnaire), method: :patch, data: { confirm: "Are you sure? The questionnaire for \"#{@questionnaire.full_name}\" will be permanently erased, and \"#{@questionnaire.email}\" will become an admin. This action is irreversible." }, class: 'dropdown-item'
+ = link_to 'Convert to Admin', convert_to_admin_manage_questionnaire_path(@questionnaire), method: :patch, data: { confirm: "Are you sure? The questionnaire for \"#{@questionnaire.user.full_name}\" will be permanently erased, and \"#{@questionnaire.email}\" will become an admin. This action is irreversible." }, class: 'dropdown-item'
= render 'overview'
diff --git a/app/views/manage/stats/index.html.haml b/app/views/manage/stats/index.html.haml
index 9e5f22cd2..88c0f9491 100644
--- a/app/views/manage/stats/index.html.haml
+++ b/app/views/manage/stats/index.html.haml
@@ -2,14 +2,16 @@
.row
.col
- %h5.dashboard-container-title Dietary Restrictions & Special Needs
- %table.stats.datatable.table.table-striped.table-hover{ "data-source" => dietary_special_needs_manage_stats_path(format: :json) }
+ %h5.dashboard-container-title Dietary Restrictions or Special Needs
+ %table.datatable.stats-dietary.table.table-striped.table-hover{ "data-source" => dietary_restrictions_special_needs_datatable_manage_stats_path(format: :json) }
%thead
%tr
- %th First name
- %th Last name
+ %th ID
+ %th First Name
+ %th Last Name
%th Email
%th Phone
+ %th Questionnaire
%th Checked In
%th Dietary Restrictions
%th Special Needs
@@ -18,53 +20,59 @@
.row
.col
%h5.dashboard-container-title Attendees Not Traveling From Their School
- %table.stats.datatable.table.table-striped.table-hover{ "data-source" => alt_travel_manage_stats_path(format: :json) }
+ %table.datatable.stats-notschooltravel.table.table-striped.table-hover{ "data-source" => alt_travel_datatable_manage_stats_path(format: :json) }
%thead
%tr
- %th Link
- %th First name
- %th Last name
+ %th ID
+ %th First Name
+ %th Last Name
%th Email
+ %th Phone
+ %th Questionnaire
%th Traveling From
- %th Acc Status
+ %th Questionnaire Status
%tbody
.row
.col
%h5.dashboard-container-title Attendee Info for Sponsors
- %table.stats.datatable.table.table-striped.table-hover{ "data-source" => sponsor_info_manage_stats_path(format: :json) }
+ %table.datatable.stats-attendeeinfo.table.table-striped.table-hover{ "data-source" => attendee_sponsor_info_datatable_manage_stats_path(format: :json) }
%thead
%tr
+ %th ID
%th First name
%th Last name
%th Email
%th School
%th Open Source Link
%th Portfolio Link
- %th Resume Link
%tbody
.row
.col
%h5.dashboard-container-title MLH Info (applied)
- %table.stats.datatable.table.table-striped.table-hover{ "data-source" => mlh_info_applied_manage_stats_path(format: :json) }
+ %table.datatable.stats-mlhinfo-applied.table.table-striped.table-hover{ "data-source" => mlh_applied_datatable_manage_stats_path(format: :json) }
%thead
%tr
+ %th ID
%th First name
%th Last name
%th Email
+ %th Phone
%th School Name
%tbody
.row
.col
%h5.dashboard-container-title MLH Info (checked in)
- %table.stats.datatable.table.table-striped.table-hover{ "data-source" => mlh_info_checked_in_manage_stats_path(format: :json) }
+ %table.datatable.stats-mlhinfo-checkedin.table.table-striped.table-hover{ "data-source" => mlh_checked_in_datatable_manage_stats_path(format: :json) }
%thead
%tr
+ %th ID
%th First name
%th Last name
%th Email
+ %th Phone
%th School Name
%tbody
diff --git a/app/views/manage/users/index.html.haml b/app/views/manage/users/index.html.haml
index f9b63be42..6a0a96855 100644
--- a/app/views/manage/users/index.html.haml
+++ b/app/views/manage/users/index.html.haml
@@ -8,6 +8,9 @@
%thead
%tr
%th= t(:id, scope: 'pages.manage.users.table')
+ %th
+ %th= t(:first_name, scope: 'pages.manage.users.table')
+ %th= t(:last_name, scope: 'pages.manage.users.table')
%th= t(:email, scope: 'pages.manage.users.table')
%th= t(:role, scope: 'pages.manage.users.table')
%th= t(:questionnaire, scope: 'pages.manage.users.table')
@@ -28,6 +31,9 @@
%thead
%tr
%th= t(:id, scope: 'pages.manage.users.table')
+ %th
+ %th= t(:first_name, scope: 'pages.manage.users.table')
+ %th= t(:last_name, scope: 'pages.manage.users.table')
%th= t(:email, scope: 'pages.manage.users.table')
%th= t(:role, scope: 'pages.manage.users.table')
%th= t(:login_access, scope: 'pages.manage.users.table')
diff --git a/app/views/questionnaires/_form.html.haml b/app/views/questionnaires/_form.html.haml
index 789caca6a..4e8c45f8c 100644
--- a/app/views/questionnaires/_form.html.haml
+++ b/app/views/questionnaires/_form.html.haml
@@ -10,8 +10,6 @@
= markdown(HackathonConfig['disclaimer_message'])
.form-inputs
- = f.input :first_name, input_html: { "data-validate" => "presence" }, autofocus: true, wrapper_html: { class: 'input--half' }
- = f.input :last_name, input_html: { "data-validate" => "presence" }, wrapper_html: { class: 'input--half' }
= f.input :phone, label: "Phone number", input_html: { "data-validate" => "presence" }
= f.input :date_of_birth, start_year: Date.today.year - 5, end_year: Date.today.year - 90, order: [:month, :day, :year], input_html: { "data-validate" => "presence" }
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 060806f62..59579fef2 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -91,8 +91,6 @@ en:
Contact [travel@example.com](mailto:travel@example.com)
questionnaire:
- first_name: Joe
- last_name: Smith
email: joe@example.com
phone: (123) 456-7890
school_id: My University
@@ -104,6 +102,8 @@ en:
portfolio_url: https://mywebsite.com
vcs_url: https://github.com/coderit
user:
+ first_name: Joe
+ last_name: Smith
email: joe@example.com
labels:
school:
diff --git a/config/routes.rb b/config/routes.rb
index eb90c161d..00540ce88 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -90,11 +90,11 @@
patch :perform_merge, on: :member
end
resources :stats do
- post :dietary_special_needs, on: :collection
- post :sponsor_info, on: :collection
- post :alt_travel, on: :collection
- post :mlh_info_applied, on: :collection
- post :mlh_info_checked_in, on: :collection
+ post :dietary_restrictions_special_needs_datatable, on: :collection
+ post :alt_travel_datatable, on: :collection
+ post :attendee_sponsor_info_datatable, on: :collection
+ post :mlh_applied_datatable, on: :collection
+ post :mlh_checked_in_datatable, on: :collection
end
resources :configs do
patch :update_only_css_variables, on: :member
diff --git a/db/migrate/20200525234832_move_user_info_from_questionnaire_to_user_model.rb b/db/migrate/20200525234832_move_user_info_from_questionnaire_to_user_model.rb
new file mode 100644
index 000000000..7079ad37b
--- /dev/null
+++ b/db/migrate/20200525234832_move_user_info_from_questionnaire_to_user_model.rb
@@ -0,0 +1,61 @@
+class MoveUserInfoFromQuestionnaireToUserModel < ActiveRecord::Migration[5.2]
+
+ # See the "Hackathon Manager 2.0 Migration Guide"
+ # for a more general description of what this migration does.
+
+ # Effectively, we move the `first_name` and `last_name` columns
+ # from the questionnares table to the users table (and model, for both).
+
+ def up
+
+ # Add the first/last name columns to the users table
+ add_column :users, :first_name, :string
+ add_column :users, :last_name, :string
+
+ # Copy the data
+ execute "UPDATE users u, questionnaires q SET u.first_name = q.first_name WHERE u.id = q.user_id"
+ execute "UPDATE users u, questionnaires q SET u.last_name = q.last_name WHERE u.id = q.user_id"
+
+ # If either first or last name is null,
+ # use the first part of their email as their first and last name.
+ # It is not currently possible to set only one and not the other,
+ # but we are "handling" that case nevertheless.
+ #
+ # This is needed because first and last names are REQUIRED to be non-nil.
+ User.where("first_name IS NULL AND last_name IS NULL").each do |u|
+ email_head = u.email.partition('@').first
+ u.first_name = email_head
+ u.last_name = email_head
+ u.save()
+ end
+
+ # Remove the first/last name columns from the questionnaires table
+ remove_column :questionnaires, :first_name, :string
+ remove_column :questionnaires, :last_name, :string
+ end
+
+ def down
+
+ # Add the first/last name columns back to the questionnaires table
+ add_column :questionnaires, :first_name, :string
+ add_column :questionnaires, :last_name, :string
+
+ # Copy the data
+ execute "UPDATE questionnaires q, users u SET q.first_name = u.first_name WHERE q.user_id = u.id"
+ execute "UPDATE questionnaires q, users u SET q.last_name = u.last_name WHERE q.user_id = u.id"
+
+ # For all users, undo the email assignment scheme we did before,
+ # and set both their first/last name to nil.
+ User.all.each do |u|
+ email_head = u.email.partition('@').first
+ if u.first_name == email_head and u.last_name == email_head
+ u.first_name = nil
+ u.last_name = nil
+ end
+ end
+
+ # Finally, remove the first/last name columns from the users table.
+ remove_column :users, :first_name, :string
+ remove_column :users, :last_name, :string
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 42ae1fab4..7041720db 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 2020_02_05_160318) do
+ActiveRecord::Schema.define(version: 2020_05_30_172450) do
create_table "active_storage_attachments", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
t.string "name", null: false
@@ -193,8 +193,6 @@
end
create_table "questionnaires", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
- t.string "first_name"
- t.string "last_name"
t.date "date_of_birth"
t.string "experience"
t.string "school_id"
@@ -300,6 +298,8 @@
t.integer "role", default: 0
t.boolean "is_active", default: true
t.boolean "receive_weekly_report", default: false
+ t.string "first_name"
+ t.string "last_name"
t.index ["email"], name: "index_users_on_email", unique: true
t.index ["provider"], name: "index_users_on_provider"
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
diff --git a/test/controllers/manage/questionnaires_controller_test.rb b/test/controllers/manage/questionnaires_controller_test.rb
index 8499dc1f0..62dd49f72 100644
--- a/test/controllers/manage/questionnaires_controller_test.rb
+++ b/test/controllers/manage/questionnaires_controller_test.rb
@@ -45,13 +45,13 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase
end
should "not allow access to manage_questionnaires#create" do
- post :create, params: { questionnaire: { first_name: "New" } }
+ post :create, params: { questionnaire: { major: "Computer Science" } }
assert_response :redirect
assert_redirected_to new_user_session_path
end
should "not allow access to manage_questionnaires#update" do
- patch :update, params: { id: @questionnaire, questionnaire: { first_name: "New" } }
+ patch :update, params: { id: @questionnaire, questionnaire: { major: "Human Centered Computing" } }
assert_response :redirect
assert_redirected_to new_user_session_path
end
@@ -124,13 +124,13 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase
end
should "not allow access to manage_questionnaires#create" do
- post :create, params: { questionnaire: { first_name: "New" } }
+ post :create, params: { questionnaire: { major: "Best Major" } }
assert_response :redirect
assert_redirected_to root_path
end
should "not allow access to manage_questionnaires#update" do
- patch :update, params: { id: @questionnaire, questionnaire: { first_name: "New" } }
+ patch :update, params: { id: @questionnaire, questionnaire: { major: "Best Major" } }
assert_response :redirect
assert_redirected_to root_path
end
@@ -200,13 +200,13 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase
end
should "not allow access to manage_questionnaires#create" do
- post :create, params: { questionnaire: { first_name: "New" } }
+ post :create, params: { questionnaire: { major: "Best Major" } }
assert_response :redirect
assert_redirected_to manage_questionnaires_path
end
should "not allow access to manage_questionnaires#update" do
- patch :update, params: { id: @questionnaire, questionnaire: { first_name: "New" } }
+ patch :update, params: { id: @questionnaire, questionnaire: { major: "Best Major" } }
assert_response :redirect
assert_redirected_to manage_questionnaires_path
end
@@ -267,50 +267,51 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase
assert_response :success
end
- should "create questionnaire and user" do
- assert_difference("User.count", 1) do
- assert_difference("Questionnaire.count", 1) do
- post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, first_name: @questionnaire.first_name, last_name: @questionnaire.last_name, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_id: @questionnaire.school_id, email: "test@example.com", agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", gender: @questionnaire.gender, major: @questionnaire.major, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } }
- end
- end
-
- assert_equal "test@example.com", assigns(:questionnaire).email
- assert_redirected_to manage_questionnaire_path(assigns(:questionnaire))
- end
-
should "not create a duplicate questionnaire for a user" do
user = create(:user, email: "existing@example.com")
create(:questionnaire, user_id: user.id)
assert_difference("User.count", 0) do
assert_difference("Questionnaire.count", 0) do
- post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, first_name: @questionnaire.first_name, last_name: @questionnaire.last_name, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_id: @questionnaire.school_id, email: "existing@example.com", agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", gender: @questionnaire.gender, major: @questionnaire.major, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } }
+ post :create, params: {
+ questionnaire: {
+ experience: @questionnaire.experience,
+ interest: @questionnaire.interest,
+ first_name: @questionnaire.user.first_name,
+ last_name: @questionnaire.user.last_name,
+ phone: @questionnaire.phone,
+ level_of_study: @questionnaire.level_of_study,
+ date_of_birth: @questionnaire.date_of_birth,
+ shirt_size: @questionnaire.shirt_size,
+ school_id: @questionnaire.school_id,
+ email: "existing@example.com",
+ agreement_accepted: "1",
+ code_of_conduct_accepted: "1",
+ data_sharing_accepted: "1",
+ gender: @questionnaire.gender,
+ major: @questionnaire.major,
+ why_attend: @questionnaire.why_attend,
+ graduation_year: @questionnaire.graduation_year,
+ race_ethnicity: @questionnaire.race_ethnicity
+ }
+ }
end
end
assert_response :success
end
- should "create a questionnaire with existing user" do
- create(:user, email: "existing@example.com")
- assert_difference("User.count", 0) do
- assert_difference("Questionnaire.count", 1) do
- post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, first_name: @questionnaire.first_name, last_name: @questionnaire.last_name, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_id: @questionnaire.school_id, email: "existing@example.com", agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", gender: @questionnaire.gender, major: @questionnaire.major, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } }
- end
- end
- assert_equal "existing@example.com", assigns(:questionnaire).email
- assert_redirected_to manage_questionnaire_path(assigns(:questionnaire))
- end
-
- should "create school if doesn't exist in questionnaire" do
- assert_difference("Questionnaire.count", 1) do
- assert_difference("School.count", 1) do
- post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, first_name: @questionnaire.first_name, last_name: @questionnaire.last_name, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_name: "My New School", email: "taken@example.com", agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", gender: @questionnaire.gender, major: @questionnaire.major, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } }
- end
- end
- assert_equal "My New School", assigns(:questionnaire).school.name
- end
-
- should "update questionnaire" do
- patch :update, params: { id: @questionnaire, questionnaire: { first_name: "New" } }
+ # This and email are seaparte as they are still implemented separately.
+ should "update questionnaire's user's first and last name" do
+ patch :update, params: {
+ id: @questionnaire,
+ questionnaire: {
+ user: {
+ "first_name": "firstnametest",
+ "last_name": "lastnametest"
+ }
+ }
+ }
+ assert_equal "firstnametest", assigns(:questionnaire).user.first_name
+ assert_equal "lastnametest", assigns(:questionnaire).user.last_name
assert_redirected_to manage_questionnaire_path(assigns(:questionnaire))
end
@@ -349,7 +350,16 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase
@questionnaire.update_attribute(:agreement_accepted, false)
@questionnaire.update_attribute(:can_share_info, false)
@questionnaire.update_attribute(:phone, "")
- patch :check_in, params: { id: @questionnaire, check_in: "true", questionnaire: { agreement_accepted: 1, can_share_info: 1, phone: "(123) 333-3333", email: "new_email@example.com" } }
+ patch :check_in, params: {
+ id: @questionnaire,
+ check_in: "true",
+ questionnaire: {
+ agreement_accepted: 1,
+ can_share_info: 1,
+ phone: "(123) 333-3333",
+ email: "new_email@example.com"
+ }
+ }
@questionnaire.reload
assert 1.minute.ago < @questionnaire.checked_in_at
assert_equal @user.id, @questionnaire.checked_in_by_id
@@ -369,7 +379,16 @@ class Manage::QuestionnairesControllerTest < ActionController::TestCase
@questionnaire.user.update_attribute(:email, "old_email@example.com")
@questionnaire.update_attribute(:checked_in_at, nil)
@questionnaire.update_attribute(:checked_in_by_id, nil)
- patch :check_in, params: { id: @questionnaire, check_in: "", questionnaire: { agreement_accepted: 1, can_share_info: 1, phone: "(123) 333-3333", email: "new_email@example.com" } }
+ patch :check_in, params: {
+ id: @questionnaire,
+ check_in: "",
+ questionnaire: {
+ agreement_accepted: 1,
+ can_share_info: 1,
+ phone: "(123) 333-3333",
+ email: "new_email@example.com"
+ }
+ }
@questionnaire.reload
assert_nil @questionnaire.checked_in_at
assert_nil @questionnaire.checked_in_by_id
diff --git a/test/controllers/manage/stats_controller_test.rb b/test/controllers/manage/stats_controller_test.rb
index 791e2cf73..9e4e66f65 100644
--- a/test/controllers/manage/stats_controller_test.rb
+++ b/test/controllers/manage/stats_controller_test.rb
@@ -67,6 +67,6 @@ class Manage::StatsControllerTest < ActionController::TestCase
private
def paths
- [:dietary_special_needs, :sponsor_info, :alt_travel, :mlh_info_applied, :mlh_info_checked_in]
+ [:dietary_restrictions_special_needs_datatable, :attendee_sponsor_info_datatable, :alt_travel_datatable, :mlh_applied_datatable, :mlh_checked_in_datatable]
end
end
diff --git a/test/controllers/questionnaires_controller_test.rb b/test/controllers/questionnaires_controller_test.rb
index 0ad2c8276..faf0279a0 100644
--- a/test/controllers/questionnaires_controller_test.rb
+++ b/test/controllers/questionnaires_controller_test.rb
@@ -36,7 +36,7 @@ class QuestionnairesControllerTest < ActionController::TestCase
context "while authenticated without a completed questionnaire" do
setup do
@request.env["devise.mapping"] = Devise.mappings[:admin]
- @user = create(:user, email: "newabc@example.com")
+ @user = create(:user)
sign_in @user
end
@@ -47,7 +47,7 @@ class QuestionnairesControllerTest < ActionController::TestCase
should "create questionnaire" do
assert_difference('Questionnaire.count', 1) do
- post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, first_name: @questionnaire.first_name, last_name: @questionnaire.last_name, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_id: @school.id, agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } }
+ post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_id: @school.id, agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } }
end
assert_redirected_to questionnaires_path
@@ -60,8 +60,8 @@ class QuestionnairesControllerTest < ActionController::TestCase
should "not allow multiple questionnaires" do
assert_difference('Questionnaire.count', 1) do
- post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, first_name: @questionnaire.first_name, last_name: @questionnaire.last_name, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_id: @school.id, agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } }
- post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, first_name: @questionnaire.first_name, last_name: @questionnaire.last_name, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_id: @school.id, agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } }
+ post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_id: @school.id, agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } }
+ post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_id: @school.id, agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } }
end
assert_redirected_to questionnaires_path
@@ -71,7 +71,7 @@ class QuestionnairesControllerTest < ActionController::TestCase
should "not allow creation" do
@questionnaire.delete
assert_difference('Questionnaire.count', 0) do
- post :create, params: { questionnaire: { first_name: "My first name" } }
+ post :create, params: { questionnaire: { major: "a great major" } }
end
end
end
@@ -79,13 +79,13 @@ class QuestionnairesControllerTest < ActionController::TestCase
context "#school_name" do
context "on create" do
should "save existing school name" do
- post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, first_name: @questionnaire.first_name, last_name: @questionnaire.last_name, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_name: @school.name, agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } }
+ post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_name: @school.name, agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } }
assert_redirected_to questionnaires_path
assert_equal 1, School.all.count
end
should "create a new school when unknown" do
- post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, first_name: @questionnaire.first_name, last_name: @questionnaire.last_name, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_name: "New School", agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } }
+ post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_name: "New School", agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } }
assert_redirected_to questionnaires_path
assert_equal 2, School.all.count
end
@@ -94,7 +94,7 @@ class QuestionnairesControllerTest < ActionController::TestCase
message = create(:message, type: 'automated', trigger: "questionnaire.pending")
assert_difference 'enqueued_jobs.size', 1 do
assert_difference 'Questionnaire.count', 1 do
- post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, first_name: @questionnaire.first_name, last_name: @questionnaire.last_name, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_name: @school.name, agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } }
+ post :create, params: { questionnaire: { experience: @questionnaire.experience, interest: @questionnaire.interest, phone: @questionnaire.phone, level_of_study: @questionnaire.level_of_study, date_of_birth: @questionnaire.date_of_birth, shirt_size: @questionnaire.shirt_size, school_name: @school.name, agreement_accepted: "1", code_of_conduct_accepted: "1", data_sharing_accepted: "1", major: @questionnaire.major, gender: @questionnaire.gender, why_attend: @questionnaire.why_attend, graduation_year: @questionnaire.graduation_year, race_ethnicity: @questionnaire.race_ethnicity } }
end
end
questionnaire = Questionnaire.last
@@ -152,7 +152,7 @@ class QuestionnairesControllerTest < ActionController::TestCase
end
should "update questionnaire" do
- patch :update, params: { questionnaire: { first_name: "Foo" } }
+ patch :update, params: { questionnaire: { major: "Computer Science" } }
assert_redirected_to questionnaires_path
end
@@ -166,9 +166,9 @@ class QuestionnairesControllerTest < ActionController::TestCase
context "with invalid questionnaire params" do
should "not allow updates" do
- saved_first_name = @questionnaire.first_name
- patch :update, params: { questionnaire: { first_name: "" } }
- assert_equal saved_first_name, @questionnaire.reload.first_name
+ saved_major = @questionnaire.major
+ patch :update, params: { questionnaire: { major: "" } }
+ assert_equal saved_major, @questionnaire.reload.major
end
end
diff --git a/test/controllers/rsvps_controller_test.rb b/test/controllers/rsvps_controller_test.rb
index d1f95fc68..77a15dbe7 100644
--- a/test/controllers/rsvps_controller_test.rb
+++ b/test/controllers/rsvps_controller_test.rb
@@ -230,7 +230,7 @@ class RsvpsControllerTest < ActionController::TestCase
should "not allow updates to invalid questionnaire via rsvp page" do
@questionnaire.update_attribute(:phone, "1111111111")
- @questionnaire.update_attribute(:first_name, "")
+ @questionnaire.update_attribute(:agreement_accepted, false)
patch :update, params: { questionnaire: { phone: "1234567890" } }
assert_not_nil flash[:alert]
assert_equal "1111111111", @questionnaire.reload.phone
diff --git a/test/factories/questionnaire.rb b/test/factories/questionnaire.rb
index 1498ca792..f732b8992 100644
--- a/test/factories/questionnaire.rb
+++ b/test/factories/questionnaire.rb
@@ -1,7 +1,5 @@
FactoryBot.define do
factory :questionnaire do
- first_name { "John" }
- last_name { "Doe" }
phone { "(123) 456-7890" }
international { false }
date_of_birth { Date.today - 20.years }
diff --git a/test/factories/users.rb b/test/factories/users.rb
index 6188b9991..f4b7bedf1 100644
--- a/test/factories/users.rb
+++ b/test/factories/users.rb
@@ -1,5 +1,7 @@
FactoryBot.define do
factory :user do
+ first_name { "John" }
+ last_name { "Doe" }
sequence :email do |n|
"foo#{n}@example.com"
end
diff --git a/test/helpers/audit_helper_test.rb b/test/helpers/audit_helper_test.rb
index 26c780b0f..7b1d22ff4 100644
--- a/test/helpers/audit_helper_test.rb
+++ b/test/helpers/audit_helper_test.rb
@@ -17,8 +17,8 @@ class AuditHelperTest < ActiveSupport::TestCase
should "model values for related fields" do
bus_list = create(:bus_list, name: "Foo bus list")
assert_equal "Foo bus list", display_audit_value(bus_list.id, "bus_list_id")
- user = create(:user, email: "abc@example.com")
- assert_equal "abc@example.com", display_audit_value(user.id, "checked_in_by_id")
+ user = create(:user, first_name: "Tom", last_name: "Nook")
+ assert_equal "Tom Nook", display_audit_value(user.id, "checked_in_by_id")
end
should "use human description for arrays" do
diff --git a/test/models/message_test.rb b/test/models/message_test.rb
index 9cf56e30c..5476f3ed4 100644
--- a/test/models/message_test.rb
+++ b/test/models/message_test.rb
@@ -40,9 +40,9 @@ class MessageTest < ActiveSupport::TestCase
end
should "parse template variables with real values" do
- questionnaire = create(:questionnaire, first_name: 'Richard')
+ user = create(:user, first_name: 'Richard')
message = build(:message, body: "Hello, {{first_name}}!")
- assert_equal "Hello, Richard!", message.parsed_body(user_id: questionnaire.user_id)
+ assert_equal "Hello, Richard!", message.parsed_body(user_id: user.id)
end
should "ignore unknown variables" do
diff --git a/test/models/questionnaire_test.rb b/test/models/questionnaire_test.rb
index ca753943d..d61fcfd47 100644
--- a/test/models/questionnaire_test.rb
+++ b/test/models/questionnaire_test.rb
@@ -9,8 +9,6 @@ class QuestionnaireTest < ActiveSupport::TestCase
should validate_uniqueness_of :user_id
- should strip_attribute :first_name
- should strip_attribute :last_name
should strip_attribute :acc_status
should strip_attribute :major
should strip_attribute :gender
@@ -19,8 +17,6 @@ class QuestionnaireTest < ActiveSupport::TestCase
should strip_attribute :travel_location
should strip_attribute :why_attend
- should validate_presence_of :first_name
- should validate_presence_of :last_name
should validate_presence_of :date_of_birth
should validate_presence_of :experience
should validate_presence_of :interest
@@ -163,13 +159,6 @@ class QuestionnaireTest < ActiveSupport::TestCase
end
end
- context "#full_name" do
- should "concatenate first and last name" do
- questionnaire = create(:questionnaire, first_name: "Foo", last_name: "Bar")
- assert_equal "Foo Bar", questionnaire.full_name
- end
- end
-
context "#full_location" do
should "concatenate city and state with a comma" do
school = create(:school, city: "Foo", state: "AZ")
@@ -477,7 +466,7 @@ class QuestionnaireTest < ActiveSupport::TestCase
questionnaire = create(:questionnaire, acc_status: 'accepted')
create(:message, trigger: "questionnaire.accepted")
assert_difference "enqueued_jobs.size", 0 do
- questionnaire.update_attribute(:first_name, "foo bar baz")
+ questionnaire.update_attribute(:interest, "code")
end
end
diff --git a/test/models/user_test.rb b/test/models/user_test.rb
index 610a162d1..86e264e0c 100644
--- a/test/models/user_test.rb
+++ b/test/models/user_test.rb
@@ -3,10 +3,14 @@
class UserTest < ActiveSupport::TestCase
include ActiveJob::TestHelper
+ should strip_attribute :first_name
+ should strip_attribute :last_name
should strip_attribute :email
should validate_uniqueness_of :email
+ should validate_presence_of :first_name
+ should validate_presence_of :last_name
should validate_presence_of :email
should validate_presence_of :password
@@ -18,39 +22,10 @@ class UserTest < ActiveSupport::TestCase
should allow_value("test@example.com").for(:email)
should_not allow_value("abcd").for(:email)
- context "first_name" do
- should "return first name when questionnaire exists" do
- questionnaire = create(:questionnaire, first_name: "Alpha")
- assert_equal "Alpha", questionnaire.user.first_name
- end
-
- should "return blank when no questionnaire exists" do
- user = create(:user)
- assert_equal "", user.first_name
- end
- end
-
- context "last_name" do
- should "return last name when questionnaire exists" do
- questionnaire = create(:questionnaire, last_name: "Beta")
- assert_equal "Beta", questionnaire.user.last_name
- end
-
- should "return blank when no questionnaire exists" do
- user = create(:user)
- assert_equal "", user.last_name
- end
- end
-
context "full_name" do
- should "return full name when questionnaire exists" do
- questionnaire = create(:questionnaire, first_name: "Alpha", last_name: "Beta")
- assert_equal "Alpha Beta", questionnaire.user.full_name
- end
-
- should "return email when no questionnaire exists" do
- user = create(:user, email: "foo@example.com")
- assert_equal "foo@example.com", user.full_name
+ should "concatenate first and last name" do
+ user = create(:user)
+ assert_equal "John Doe", user.full_name
end
end