Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 8 additions & 12 deletions app/controllers/participants_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ class ParticipantsController < ApplicationController
respond_to :html
load_resource except: :confirm_email
before_action :verify_owner, :only => [:edit, :update]
before_action :coc_agreement_param_as_timestamp, only: [:create, :update]

def index
respond_to do |format|
Expand Down Expand Up @@ -40,7 +41,6 @@ def update
end

if @participant.update(new_params)
create_code_of_conduct_agreement_if_not_exists!
flash[:notice] = "Profile updated successfully."
redirect_to participant_path(@participant)
else
Expand All @@ -52,7 +52,6 @@ def update
def create
@participant.attributes = participant_params.except(:code_of_conduct_agreement)
if @participant.save
create_code_of_conduct_agreement_if_not_exists!
@participant.deliver_email_confirmation_instructions!
flash[:notice] = "Thanks for registering an account. Please check your email to confirm your account."
redirect_to root_path
Expand All @@ -62,15 +61,6 @@ def create
end
end

def create_code_of_conduct_agreement_if_not_exists!
if participant_params[:code_of_conduct_agreement] == '1' && @participant.signed_code_of_conduct_for_current_event? == false
CodeOfConductAgreement.create!({
participant_id: @participant.id,
event_id: Event.current_event.id,
})
end
end

def send_confirmation_email
@participant.deliver_email_confirmation_instructions!
flash[:notice] = "Confirmation instructions sent! Please check your email."
Expand All @@ -95,11 +85,17 @@ def participant_params
:name, :email, :password,
:bio,
:code_of_conduct_agreement,
:contact_details
:contact_details, :coc_agreed_at
)
end

def verify_owner
redirect_to participant_path(@participant) if @participant != current_participant
end

def coc_agreement_param_as_timestamp
if params[:participant][:code_of_conduct_agreement] == '1'
params[:participant][:coc_agreed_at] = Time.current
end
end
end
8 changes: 2 additions & 6 deletions app/controllers/sessions_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -78,11 +78,8 @@ def create
end

def create_code_of_conduct_agreement_if_not_exists!
if session_params[:code_of_conduct_agreement] == '1' && @session.participant.signed_code_of_conduct_for_current_event? == false
CodeOfConductAgreement.create!({
participant_id: @session.participant.id,
event_id: Event.current_event.id,
})
if session_params[:code_of_conduct_agreement] == '1' && !@session.participant.signed_code_of_conduct_for_current_event?
current_participant.update!(coc_agreed_at: Time.current)
end
end

Expand Down Expand Up @@ -139,5 +136,4 @@ def sessions_for_event(event)
.order('created_at desc')
.distinct
end

end
4 changes: 0 additions & 4 deletions app/models/code_of_conduct_agreement.rb

This file was deleted.

1 change: 0 additions & 1 deletion app/models/event.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ class NotEnoughRoomsError < StandardError; end
has_many :categories, through: :event_categories

has_many :presenter_timeslot_restrictions, :through => :timeslots
has_many :code_of_conduct_agreements, dependent: :destroy

# Careful! Large joins here; use with caution:
has_many :attendances, through: :sessions
Expand Down
8 changes: 1 addition & 7 deletions app/models/participant.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ class Participant < ActiveRecord::Base
has_many :presentations
has_many :sessions_presenting, :through => :presentations, :source => :session
has_many :presenter_timeslot_restrictions, dependent: :destroy
has_many :code_of_conduct_agreements, dependent: :destroy

validates :name, presence: true
validates :email, presence: true
Expand Down Expand Up @@ -82,12 +81,7 @@ def deliver_password_reset_instructions!
end

def signed_code_of_conduct_for_current_event?
return false unless Event.current_event

CodeOfConductAgreement.where({
participant_id: id,
event_id: Event.current_event.id,
}).exists?
coc_agreed_at.present?
end

def attending_session?(session)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class AddCocAgreedAtToParticipants < ActiveRecord::Migration[7.2]
def change
add_column :participants, :coc_agreed_at, :datetime
end
end
16 changes: 16 additions & 0 deletions db/migrate/20260521194947_drop_code_of_conduct_agreements.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
class DropCodeOfConductAgreements < ActiveRecord::Migration[7.2]
def up
drop_table :code_of_conduct_agreements
end

def down
create_table :code_of_conduct_agreements do |t|
t.bigint :participant_id, null: false
t.bigint :event_id, null: false
t.timestamps precision: nil, null: false
end

add_index :code_of_conduct_agreements, :event_id
add_index :code_of_conduct_agreements, :participant_id
end
end
12 changes: 2 additions & 10 deletions db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema[7.2].define(version: 2026_03_22_192507) do
ActiveRecord::Schema[7.2].define(version: 2026_05_21_194947) do
create_schema "heroku_ext"

# These are extensions that must be enabled in order to support this database
Expand Down Expand Up @@ -55,15 +55,6 @@
t.index ["category_id", "session_id"], name: "index_categorizations_on_category_id_and_session_id", unique: true
end

create_table "code_of_conduct_agreements", force: :cascade do |t|
t.bigint "participant_id", null: false
t.bigint "event_id", null: false
t.datetime "created_at", precision: nil, null: false
t.datetime "updated_at", precision: nil, null: false
t.index ["event_id"], name: "index_code_of_conduct_agreements_on_event_id"
t.index ["participant_id"], name: "index_code_of_conduct_agreements_on_participant_id"
end

create_table "event_categories", force: :cascade do |t|
t.bigint "event_id", null: false
t.bigint "category_id", null: false
Expand Down Expand Up @@ -114,6 +105,7 @@
t.datetime "email_confirmed_at", precision: nil
t.integer "presentations_count", default: 0
t.integer "attendances_count", default: 0
t.datetime "coc_agreed_at"
t.index ["email"], name: "index_participants_on_email", unique: true
t.index ["perishable_token"], name: "index_participants_on_perishable_token"
end
Expand Down
1 change: 1 addition & 0 deletions lib/tasks/app.rake
Original file line number Diff line number Diff line change
Expand Up @@ -517,6 +517,7 @@ namespace :app do
participant.email = FFaker::Internet.safe_email
participant.password = 'password'
participant.bio = FFaker::Lorem.paragraph if [true, false].sample
participant.coc_agreed_at = Time.current
participant.save!
progress.increment
end
Expand Down
16 changes: 16 additions & 0 deletions lib/tasks/backfill.rake
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
namespace :backfill do

desc 'backfill coc_agreed_at for participants who have already accepted'
task coc_agreed_at: :environment do
ActiveRecord::Base.connection.execute(<<~SQL)
UPDATE participants
SET coc_agreed_at = coc.created_at
FROM (
SELECT DISTINCT ON (participant_id) participant_id, created_at
FROM code_of_conduct_agreements
) AS coc
WHERE participants.id = coc.participant_id
AND participants.coc_agreed_at IS NULL
SQL
end
end
27 changes: 27 additions & 0 deletions spec/controllers/participants_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,25 @@
expect(response).to render_template(:new)
expect(flash[:error]).to eq "There was a problem creating your account."
end

it "does not set coc_agreed_at on the participant when the user has not signed the code of conduct" do
post :create, params: { participant: { name: 'Alan Turing',
email: 'tapewriter@example.org',
password: 'infinite-memory',
code_of_conduct_agreement: '0'
}
}
expect(Participant.find_by(email: 'tapewriter@example.org').coc_agreed_at).to be_nil
end
it "sets coc_agreed_at on the participant when the user has signed the code of conduct" do
post :create, params: { participant: { name: 'Alan Turing',
email: 'tapewriter@example.org',
password: 'infinite-memory',
code_of_conduct_agreement: '1'
}
}
expect(Participant.find_by(email: 'tapewriter@example.org').coc_agreed_at).not_to be_nil
end
end

describe "#show" do
Expand Down Expand Up @@ -137,6 +156,14 @@
expect(response).to redirect_to participant_path(joe)
expect(joe.reload.name).to eq 'schmoe, joe'
end
it "does not set coc_agreed_at on the participant when the user has not signed the code of conduct" do
put :update, params: { id: joe, participant: { name: 'Alan Turing', code_of_conduct_agreement: '0' } }
expect(joe.reload.coc_agreed_at).to be_nil
end
it "sets coc_agreed_at on the participant when the user has signed the code of conduct" do
put :update, params: { id: joe, participant: { code_of_conduct_agreement: '1' } }
expect(joe.reload.coc_agreed_at).not_to be_nil
end

describe "more attributes are not required" do
it "should be successful" do
Expand Down
10 changes: 2 additions & 8 deletions spec/controllers/presentations_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,7 @@

context "when the user is found by id" do
it "should be successful when the user has signed the code of conduct" do
CodeOfConductAgreement.create!({
participant_id: participant.id,
event_id: Event.current_event.id,
})
participant.update!(coc_agreed_at: Time.current)

expect {
post :create, params: { session_id: session, id: participant.id }
Expand All @@ -41,10 +38,7 @@

context "when the user is found by name" do
it "should be successful when the user has signed the code of conduct" do
CodeOfConductAgreement.create!({
participant_id: participant.id,
event_id: Event.current_event.id,
})
participant.update!(coc_agreed_at: Time.current)

expect {
post :create, params: { session_id: session, name: participant.name }
Expand Down
23 changes: 23 additions & 0 deletions spec/controllers/sessions_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,29 @@
expect(assigns[:session].category_ids).to include category.id
expect(flash[:notice]).to eq "Thanks for adding your session."
end
it "should sign code of conduct if param is present" do
expect {
post :create, params: { session: { title: "new title",
description: "new description",
category_ids: [category.id],
level_id: "2",
code_of_conduct_agreement: "1",
}
}
}.to change { Session.count }.by(1)
expect(user.reload.coc_agreed_at).not_to be_nil
end
it "should not sign code of conduct if param is not present" do
expect {
post :create, params: { session: { title: "new title",
description: "new description",
category_ids: [category.id],
level_id: "2",
}
}
}.to change { Session.count }.by(1)
expect(user.reload.coc_agreed_at).to be_nil
end
end

context "with invalid values" do
Expand Down