Skip to content

Commit

Permalink
merged main into homeschool feature
Browse files Browse the repository at this point in the history
  • Loading branch information
ArushC committed Apr 23, 2024
2 parents 9016d22 + a1fda8e commit 79ac3f3
Show file tree
Hide file tree
Showing 32 changed files with 1,398 additions and 45 deletions.
3 changes: 3 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -96,4 +96,7 @@ group :test do
# Accessibility Testing
gem "axe-core-rspec"
gem "axe-core-cucumber"

# Test suite speedup
gem "rails-controller-testing"
end
7 changes: 6 additions & 1 deletion Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,10 @@ GEM
bundler (>= 1.15.0)
railties (= 6.1.7.7)
sprockets-rails (>= 2.0.0)
rails-controller-testing (1.0.5)
actionpack (>= 5.0.1.rc1)
actionview (>= 5.0.1.rc1)
activesupport (>= 5.0.1.rc1)
rails-dom-testing (2.2.0)
activesupport (>= 5.0.0)
minitest
Expand Down Expand Up @@ -595,7 +599,8 @@ DEPENDENCIES
pronto-rubocop
puma (~> 5)
rack-mini-profiler (~> 2.0)
rails (= 6.1.7.7)
rails (= 6.1.7.6)
rails-controller-testing
rspec-rails
rubocop
rubocop-faker
Expand Down
46 changes: 46 additions & 0 deletions app/controllers/email_addresses_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# frozen_string_literal: true

class EmailAddressesController < ApplicationController
before_action :require_login
before_action :require_admin
before_action :set_teacher

def edit
end

def update
if update_personal_emails
redirect_to teacher_path(@teacher), notice: "Personal email addresses updated successfully."
else
flash.now[:alert] = "An error occurred: " + (@error_messages || "Unknown error")
render :edit
end
end

private
def set_teacher
@teacher = Teacher.find(params[:teacher_id])
end

def update_personal_emails
EmailAddress.transaction do
params[:teacher][:email_addresses_attributes].each do |_, email_attr|
if email_attr[:id].present?
email = EmailAddress.find(email_attr[:id])
if email_attr[:_destroy] == "1"
email.destroy!
else
email.update!(email: email_attr[:email])
end
else
@teacher.email_addresses.create!(email: email_attr[:email]) unless email_attr[:email].blank?
end
end
end
true
rescue ActiveRecord::RecordInvalid => e
@error_messages = e.record&.errors&.full_messages&.join(", ")
@error_messages ||= "A validation error occurred, but no specific error details are available."
false
end
end
72 changes: 72 additions & 0 deletions app/controllers/pd_registrations_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# frozen_string_literal: true

class PdRegistrationsController < ApplicationController
before_action :require_login
before_action :require_admin
before_action :set_pd_registration, only: [:show, :edit, :update, :destroy]
before_action :set_professional_development, only: [:new, :create, :edit, :update, :destroy]

def index
end

def show
end

def new
@pd_registration = PdRegistration.new
end

def edit
end

def create
@pd_registration = PdRegistration.new(pd_registration_params.merge(
professional_development_id: @professional_development.id))

if @pd_registration.save
redirect_to professional_development_path(@professional_development),
notice: "Registration for professional development was successfully created."
else
flash.now[:alert] = @pd_registration.errors.full_messages.to_sentence
render "professional_developments/show"
end
end

def update
if @pd_registration.update(pd_registration_params)
redirect_to professional_development_path(@professional_development),
notice: "Registration was successfully updated."
else
flash.now[:alert] = @pd_registration.errors.full_messages.to_sentence
render "professional_developments/show"
end
end

def destroy
if @pd_registration.destroy
redirect_to professional_development_path(@professional_development),
notice: "Registration was successfully cancelled."
else
flash.now[:alert] = @pd_registration.errors.full_messages.to_sentence
render "professional_developments/show"
end
end

private
def set_pd_registration
@pd_registration = PdRegistration.find(params[:id])
rescue ActiveRecord::RecordNotFound
redirect_to professional_development_path, alert: "Registration not found."
end

def set_professional_development
@professional_development = ProfessionalDevelopment.find_by(id: params[:professional_development_id])
unless @professional_development
redirect_to professional_developments_path, alert: "Professional Development not found."
end
end

def pd_registration_params
params.require(:pd_registration).permit(:teacher_id, :attended, :role, :professional_development_id)
end
end
61 changes: 61 additions & 0 deletions app/controllers/professional_developments_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# frozen_string_literal: true

class ProfessionalDevelopmentsController < ApplicationController
before_action :set_professional_development, only: [:show, :edit, :update, :destroy]
before_action :require_login
before_action :require_admin

def index
@professional_developments = ProfessionalDevelopment.all
end

def show
end

def new
@professional_development = ProfessionalDevelopment.new
end

def edit
end

def create
@professional_development = ProfessionalDevelopment.new(professional_development_params)

if @professional_development.save
redirect_to @professional_development, notice: "Professional development created successfully."
else
flash.now[:alert] = @professional_development.errors.full_messages.to_sentence
render :new
end
end

def update
if @professional_development.update(professional_development_params)
redirect_to @professional_development, notice: "Professional development updated successfully."
else
flash.now[:alert] = @professional_development.errors.full_messages.to_sentence
render :edit
end
end

def destroy
if @professional_development.destroy
redirect_to professional_developments_url, notice: "Professional development deleted successfully."
else
redirect_to professional_developments_url, alert: "Failed to delete professional development."
end
end

private
def set_professional_development
@professional_development = ProfessionalDevelopment.find(params[:id])
rescue ActiveRecord::RecordNotFound
redirect_to professional_developments_url, alert: "Professional development not found."
end

def professional_development_params
params.require(:professional_development).permit(:name, :city, :state, :country, :start_date, :end_date,
:grade_level)
end
end
18 changes: 0 additions & 18 deletions app/controllers/teachers_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -107,14 +107,10 @@ def update
ordered_schools

primary_email = params.dig(:email, :primary)
personal_emails = params[:email]&.select { |key, value| key.start_with?("personal_") }&.values

# Now, `params[:teacher]` does not contain primary_email or any personal_emailX fields
@teacher.assign_attributes(teacher_params)

update_primary_email(primary_email)
update_personal_emails(personal_emails)

if teacher_params[:school_id].present?
@teacher.school = @school
else
Expand Down Expand Up @@ -339,18 +335,4 @@ def update_primary_email(primary_email)

primary_email_record.save if primary_email_record.changed?
end

def update_personal_emails(personal_emails)
return unless personal_emails.present?
personal_emails = personal_emails.reject(&:empty?)
return if personal_emails.empty?

current_emails = @teacher.email_addresses.pluck(:email)

new_emails = personal_emails - current_emails

new_emails.each do |email|
@teacher.email_addresses.build(email:, primary: false)
end
end
end
3 changes: 2 additions & 1 deletion app/helpers/application_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ def admin_nav_links
"Dashboard": dashboard_path,
"Schools": schools_path,
"Teachers": teachers_path,
"Email Templates": email_templates_path
"Email Templates": email_templates_path,
"PD": professional_developments_path,
}
end

Expand Down
40 changes: 40 additions & 0 deletions app/models/pd_registration.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# frozen_string_literal: true

# == Schema Information
#
# Table name: pd_registrations
#
# id :bigint not null, primary key
# attended :boolean default(FALSE)
# role :string not null
# created_at :datetime not null
# updated_at :datetime not null
# professional_development_id :integer not null
# teacher_id :integer not null
#
# Indexes
#
# index_pd_reg_on_teacher_id_and_pd_id (teacher_id,professional_development_id) UNIQUE
#
# Foreign Keys
#
# fk_rails_... (professional_development_id => professional_developments.id)
# fk_rails_... (teacher_id => teachers.id)
#
class PdRegistration < ApplicationRecord
belongs_to :teacher
belongs_to :professional_development

validates :teacher_id, uniqueness: { scope: :professional_development_id, message: "already has a registration for this PD" }
validates :role, inclusion: { in: %w[leader attendee], message: "%{value} is not a valid role" }
validates :attended, inclusion: { in: [true, false] }

def teacher_name
teacher = Teacher.find_by(id: teacher_id)
if teacher.present?
"#{teacher.first_name} #{teacher.last_name}"
else
"Teacher not found"
end
end
end
59 changes: 59 additions & 0 deletions app/models/professional_development.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# frozen_string_literal: true

# == Schema Information
#
# Table name: professional_developments
#
# id :bigint not null, primary key
# city :string not null
# country :string not null
# end_date :date not null
# grade_level :integer not null
# name :string not null
# start_date :date not null
# state :string
# created_at :datetime not null
# updated_at :datetime not null
#
class ProfessionalDevelopment < ApplicationRecord
VALID_STATES = %w[AL AK AS AZ AR CA CO CT DE DC FM FL GA GU HI ID IL IN IA KS KY LA ME MH MD MA MI MN MS MO MT NE NV
NH NJ NM NY NC ND MP OH OK OR PW PA PR RI SC SD TN TX UT VT VI VA WA WV WI WY].freeze

validates :name, :city, :country, :start_date, :end_date, presence: true
validates :state, presence: true, if: -> { country == "US" }
validates :state, inclusion: { in: VALID_STATES, message: "%{value} is not a valid state" },
if: -> { country == "US" }
validate :end_date_after_start_date

enum grade_level: {
elementary: 0,
middle_school: 1,
high_school: 2,
community_college: 3,
university: 4
}

has_many :pd_registrations, dependent: :destroy
has_many :teachers, through: :pd_registrations

def location
"#{city}, #{state}, #{country}"
end

def display_grade_level
return "Unknown" if grade_level_before_type_cast.to_i == -1

grade_level.to_s.titlecase
end

def registration_open
@professional_development.registration_open ? "Yes" : "No"
end

private
def end_date_after_start_date
return if end_date.blank? || start_date.blank?

errors.add(:end_date, "must be after the start date") if end_date < start_date
end
end
4 changes: 3 additions & 1 deletion app/models/teacher.rb
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ class Teacher < ApplicationRecord
validates_inclusion_of :application_status, in: application_statuses.keys

belongs_to :school, counter_cache: true
has_many :professional_development_registrations
has_many :professional_developments, through: :professional_development_registrations

# Non-admin teachers whose application has neither been accepted nor denied
# It might or might not have been reviewed.
Expand Down Expand Up @@ -308,6 +310,6 @@ def personal_emails
def non_primary_emails
# email_addresses.where(primary: false)&.pluck(:email)
# below code is temporary for current PR, to make sure the frontend same as before (only one personal email)
email_addresses.where(primary: false)&.pluck(:email)&.first
email_addresses.where(primary: false)&.pluck(:email)
end
end
Loading

0 comments on commit 79ac3f3

Please sign in to comment.