Add registration_limit to conference model. Added the input for registration limit in the edit conference form. In the controller, if the limit has exceeded redirect to root_path with an alert. fix #761
This commit is contained in:
parent
2034c0f965
commit
28fbc518f3
12 changed files with 124 additions and 16 deletions
|
|
@ -211,7 +211,7 @@ module Admin
|
||||||
:vpositions_attributes, :use_volunteers, :color,
|
:vpositions_attributes, :use_volunteers, :color,
|
||||||
:sponsorship_levels_attributes, :sponsors_attributes,
|
:sponsorship_levels_attributes, :sponsors_attributes,
|
||||||
:photos_attributes, :targets, :targets_attributes,
|
:photos_attributes, :targets, :targets_attributes,
|
||||||
:campaigns, :campaigns_attributes)
|
:campaigns, :campaigns_attributes, :registration_limit)
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_users(role_name)
|
def get_users(role_name)
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,11 @@ class ConferenceRegistrationsController < ApplicationController
|
||||||
redirect_to edit_conference_conference_registrations_path(@conference.short_title)
|
redirect_to edit_conference_conference_registrations_path(@conference.short_title)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if @conference.registration_limit_exceeded?
|
||||||
|
redirect_to root_path, alert: "Sorry, registration limit exceeded for #{@conference.title}"
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
@registration = Registration.new
|
@registration = Registration.new
|
||||||
|
|
||||||
# @user variable needs to be set so that _sign_up_form_embedded works properly
|
# @user variable needs to be set so that _sign_up_form_embedded works properly
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,7 @@ class Conference < ActiveRecord::Base
|
||||||
|
|
||||||
validates_uniqueness_of :short_title
|
validates_uniqueness_of :short_title
|
||||||
validates_format_of :short_title, with: /\A[a-zA-Z0-9_-]*\z/
|
validates_format_of :short_title, with: /\A[a-zA-Z0-9_-]*\z/
|
||||||
|
validates :registration_limit, numericality: { only_integer: true, greater_than_or_equal_to: 0 }
|
||||||
|
|
||||||
# This validation is needed since a conference with a start date greater than the end date is not possible
|
# This validation is needed since a conference with a start date greater than the end date is not possible
|
||||||
validate :valid_date_range?
|
validate :valid_date_range?
|
||||||
|
|
@ -536,6 +537,10 @@ class Conference < ActiveRecord::Base
|
||||||
email_settings.conference_registration_dates_updated_body
|
email_settings.conference_registration_dates_updated_body
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def registration_limit_exceeded?
|
||||||
|
registration_limit > 0 && registrations.count >= registration_limit
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
after_create do
|
after_create do
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ class Registration < ActiveRecord::Base
|
||||||
validates :user, presence: true
|
validates :user, presence: true
|
||||||
|
|
||||||
validates_uniqueness_of :user_id, scope: :conference_id, message: 'already Registered!'
|
validates_uniqueness_of :user_id, scope: :conference_id, message: 'already Registered!'
|
||||||
|
validate :registration_limit_not_exceed, on: :create
|
||||||
|
|
||||||
after_create :set_week, :subscribe_to_conference, :send_registration_mail
|
after_create :set_week, :subscribe_to_conference, :send_registration_mail
|
||||||
|
|
||||||
|
|
@ -49,4 +50,10 @@ class Registration < ActiveRecord::Base
|
||||||
self.week = created_at.strftime('%W')
|
self.week = created_at.strftime('%W')
|
||||||
save!
|
save!
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def registration_limit_not_exceed
|
||||||
|
if self.conference.registration_limit>0 && self.conference.registrations(:reload).count >= self.conference.registration_limit
|
||||||
|
errors.add(:base, 'Registration limit exceeded')
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -18,5 +18,6 @@
|
||||||
= f.input :timezone, :as => :time_zone, :hint => "The conference time zone"
|
= f.input :timezone, :as => :time_zone, :hint => "The conference time zone"
|
||||||
= f.input :start_date, :as => :string, :input_html => { :id => "conference-start-datepicker", :readonly => "readonly" }
|
= f.input :start_date, :as => :string, :input_html => { :id => "conference-start-datepicker", :readonly => "readonly" }
|
||||||
= f.input :end_date, :as => :string, :input_html => { :id => "conference-end-datepicker", :readonly => "readonly" }
|
= f.input :end_date, :as => :string, :input_html => { :id => "conference-end-datepicker", :readonly => "readonly" }
|
||||||
|
= f.inputs name: "Registrations" do
|
||||||
|
= f.input :registration_limit, as: :number, in: 0..9999, hint: "Limit the number of registrations to the conference (0 no limit)"
|
||||||
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
|
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,9 @@
|
||||||
- if conference.user_registered?(current_user)
|
- if conference.user_registered?(current_user)
|
||||||
= link_to "My Registration", conference_conference_registrations_path(conference.short_title), :class =>"btn btn-default"
|
= link_to "My Registration", conference_conference_registrations_path(conference.short_title), :class =>"btn btn-default"
|
||||||
- else
|
- else
|
||||||
= link_to "Register", new_conference_conference_registrations_path(conference.short_title), :class =>"btn btn-default"
|
= link_to "Register", new_conference_conference_registrations_path(conference.short_title), class: "btn btn-default", disabled: conference.registration_limit_exceeded?
|
||||||
|
- if conference.registration_limit_exceeded?
|
||||||
|
Sorry, no places left
|
||||||
- if !current_user.nil? && current_user.proposal_count(conference) > 0
|
- if !current_user.nil? && current_user.proposal_count(conference) > 0
|
||||||
= link_to "My Proposals", conference_program_proposal_index_path(conference.short_title), :class =>"btn btn-default"
|
= link_to "My Proposals", conference_program_proposal_index_path(conference.short_title), :class =>"btn btn-default"
|
||||||
- elsif conference.program.cfp_open?
|
- elsif conference.program.cfp_open?
|
||||||
|
|
|
||||||
|
|
@ -6,19 +6,25 @@
|
||||||
.row
|
.row
|
||||||
.col-md-12.text-center
|
.col-md-12.text-center
|
||||||
%h1 Registration
|
%h1 Registration
|
||||||
- if @conference.tickets.empty?
|
|
||||||
%p.lead
|
- if @conference.registration_limit_exceeded?
|
||||||
Going to
|
|
||||||
= @conference.short_title
|
|
||||||
is free of charge.
|
|
||||||
%p
|
%p
|
||||||
We only ask you to register yourself until
|
Sorry, the conference registration limit has exceeded
|
||||||
= @conference.registration_period.end_date.strftime('%A, %B %-d. %Y')
|
|
||||||
so we can plan for the right amount of people.
|
|
||||||
- else
|
- else
|
||||||
%p
|
- if @conference.tickets.empty?
|
||||||
The registration period ends on
|
%p.lead
|
||||||
= @conference.registration_period.end_date.strftime('%A, %B %-d. %Y')
|
Going to
|
||||||
%p.cta-button
|
= @conference.short_title
|
||||||
|
is free of charge.
|
||||||
|
%p
|
||||||
|
We only ask you to register yourself until
|
||||||
|
= @conference.registration_period.end_date.strftime('%A, %B %-d. %Y')
|
||||||
|
so we can plan for the right amount of people.
|
||||||
|
%p.cta-button
|
||||||
|
- else
|
||||||
|
%p
|
||||||
|
The registration period ends on
|
||||||
|
= @conference.registration_period.end_date.strftime('%A, %B %-d. %Y')
|
||||||
|
%p.cta-button
|
||||||
= link_to(new_conference_conference_registrations_path(@conference.short_title), class: 'btn btn-lg btn-success') do
|
= link_to(new_conference_conference_registrations_path(@conference.short_title), class: 'btn btn-lg btn-success') do
|
||||||
Register Now
|
Register Now
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
class AddRegistrationLimitToConferences < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_column :conferences, :registration_limit, :integer, default: 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -11,7 +11,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(version: 20151031092713) do
|
ActiveRecord::Schema.define(version: 20160201221411) do
|
||||||
|
|
||||||
create_table "ahoy_events", force: true do |t|
|
create_table "ahoy_events", force: true do |t|
|
||||||
t.uuid "visit_id"
|
t.uuid "visit_id"
|
||||||
|
|
@ -102,6 +102,7 @@ ActiveRecord::Schema.define(version: 20151031092713) do
|
||||||
t.string "color"
|
t.string "color"
|
||||||
t.text "events_per_week"
|
t.text "events_per_week"
|
||||||
t.text "description"
|
t.text "description"
|
||||||
|
t.integer "registration_limit", default: 0
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "conferences_questions", id: false, force: true do |t|
|
create_table "conferences_questions", id: false, force: true do |t|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ FactoryGirl.define do
|
||||||
timezone 'Amsterdam'
|
timezone 'Amsterdam'
|
||||||
start_date { Date.today }
|
start_date { Date.today }
|
||||||
end_date { 6.days.from_now }
|
end_date { 6.days.from_now }
|
||||||
|
registration_limit 0
|
||||||
|
|
||||||
factory :full_conference do
|
factory :full_conference do
|
||||||
splashpage
|
splashpage
|
||||||
|
|
|
||||||
|
|
@ -1479,6 +1479,48 @@ describe Conference do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe 'registration_limit_exceeded?' do
|
||||||
|
context 'limit less than 0' do
|
||||||
|
before do
|
||||||
|
subject.registration_limit = -1
|
||||||
|
end
|
||||||
|
it '#registration_limit_exceeded? is false' do
|
||||||
|
expect(subject.registration_limit_exceeded?).to be false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'limit is 0' do
|
||||||
|
before do
|
||||||
|
subject.registration_limit = 0
|
||||||
|
end
|
||||||
|
it '#registration_limit_exceeded? is false' do
|
||||||
|
expect(subject.registration_limit_exceeded?).to be false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'limit is 1' do
|
||||||
|
before do
|
||||||
|
subject.registration_limit = 1
|
||||||
|
end
|
||||||
|
context 'there are no registration' do
|
||||||
|
it '#registration_limit_exceeded? is false' do
|
||||||
|
expect(subject.registration_limit_exceeded?).to be false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'there are 1 registration' do
|
||||||
|
before do
|
||||||
|
registration1 = create(:registration)
|
||||||
|
subject.registrations << registration1
|
||||||
|
end
|
||||||
|
|
||||||
|
it '#registration_limit_exceeded? is true' do
|
||||||
|
expect(subject.registration_limit_exceeded?).to be true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe 'validations' do
|
describe 'validations' do
|
||||||
|
|
||||||
it 'has a valid factory' do
|
it 'has a valid factory' do
|
||||||
|
|
@ -1513,6 +1555,14 @@ describe Conference do
|
||||||
should_not allow_value('&%§!?äÄüÜ/()').for(:short_title)
|
should_not allow_value('&%§!?äÄüÜ/()').for(:short_title)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'is not valid with a registration limit as float' do
|
||||||
|
should_not allow_value(0.5).for(:registration_limit)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'is not valid with a negative registration limit' do
|
||||||
|
should_not allow_value(-1).for(:registration_limit)
|
||||||
|
end
|
||||||
|
|
||||||
describe 'valid_date_range?' do
|
describe 'valid_date_range?' do
|
||||||
|
|
||||||
it 'is not valid if start date is greater than end date' do
|
it 'is not valid if start date is greater than end date' do
|
||||||
|
|
|
||||||
25
spec/models/registration_spec.rb
Normal file
25
spec/models/registration_spec.rb
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
#!/bin/env ruby
|
||||||
|
# encoding: utf-8
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe 'Registration' do
|
||||||
|
describe 'validations' do
|
||||||
|
it 'has a valid factory' do
|
||||||
|
expect(build(:registration)).to be_valid
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'registration_limit_not_exceed' do
|
||||||
|
it 'is not valid when limit exceeded' do
|
||||||
|
conference = build(:conference)
|
||||||
|
conference.registration_limit = 1
|
||||||
|
registration1 = build(:registration, conference: conference)
|
||||||
|
registration1.save
|
||||||
|
registration2 = build(:registration, conference: conference)
|
||||||
|
registration2.save
|
||||||
|
expect(conference.registrations.size).to be 1
|
||||||
|
expect(registration2.valid?).to be false
|
||||||
|
expect(registration2.errors.full_messages).to eq(['Registration limit exceeded'])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
Add table
Add a link
Reference in a new issue