Define the track's finite state machine
This commit is contained in:
parent
33aee342b4
commit
d616c66745
4 changed files with 72 additions and 8 deletions
|
|
@ -565,6 +565,7 @@ Style/PercentLiteralDelimiters:
|
||||||
- 'app/models/subscription.rb'
|
- 'app/models/subscription.rb'
|
||||||
- 'app/uploaders/picture_uploader.rb'
|
- 'app/uploaders/picture_uploader.rb'
|
||||||
- 'spec/models/program_spec.rb'
|
- 'spec/models/program_spec.rb'
|
||||||
|
- 'app/models/track.rb'
|
||||||
|
|
||||||
# Offense count: 2
|
# Offense count: 2
|
||||||
# Configuration parameters: NamePrefix, NamePrefixBlacklist, NameWhitelist.
|
# Configuration parameters: NamePrefix, NamePrefixBlacklist, NameWhitelist.
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
class Track < ActiveRecord::Base
|
class Track < ActiveRecord::Base
|
||||||
|
include ActiveRecord::Transitions
|
||||||
include RevisionCount
|
include RevisionCount
|
||||||
|
|
||||||
resourcify :roles, dependent: :delete_all
|
resourcify :roles, dependent: :delete_all
|
||||||
|
|
@ -18,12 +19,49 @@ class Track < ActiveRecord::Base
|
||||||
uniqueness: {
|
uniqueness: {
|
||||||
scope: :program
|
scope: :program
|
||||||
}
|
}
|
||||||
validates :state, presence: true, if: :self_organized?
|
validates :state,
|
||||||
|
presence: true,
|
||||||
|
inclusion: { in: %w(new to_accept accepted confirmed to_reject rejected canceled withdrawn) },
|
||||||
|
if: :self_organized?
|
||||||
validates :cfp_active, inclusion: { in: [true, false] }, if: :self_organized?
|
validates :cfp_active, inclusion: { in: [true, false] }, if: :self_organized?
|
||||||
|
|
||||||
before_validation :capitalize_color
|
before_validation :capitalize_color
|
||||||
|
|
||||||
after_create :create_organizer_role, if: :self_organized?
|
state_machine initial: :pending do
|
||||||
|
state :new
|
||||||
|
state :to_accept
|
||||||
|
state :accepted
|
||||||
|
state :confirmed
|
||||||
|
state :to_reject
|
||||||
|
state :rejected
|
||||||
|
state :canceled
|
||||||
|
state :withdrawn
|
||||||
|
|
||||||
|
event :restart do
|
||||||
|
transitions to: :new, from: [:rejected, :withdrawn, :canceled]
|
||||||
|
end
|
||||||
|
event :readiness_to_accept do
|
||||||
|
transitions to: :to_accept, from: [:new]
|
||||||
|
end
|
||||||
|
event :accept do
|
||||||
|
transitions to: :accepted, from: [:new, :to_accept], on_transition: :create_organizer_role
|
||||||
|
end
|
||||||
|
event :confirm do
|
||||||
|
transitions to: :confirmed, from: [:accepted], on_transition: :assign_role_to_submitter
|
||||||
|
end
|
||||||
|
event :readiness_to_reject do
|
||||||
|
transitions to: :to_reject, from: [:new]
|
||||||
|
end
|
||||||
|
event :reject do
|
||||||
|
transitions to: :rejected, from: [:new, :to_reject]
|
||||||
|
end
|
||||||
|
event :cancel do
|
||||||
|
transitions to: :canceled, from: [:to_accept, :to_reject, :accepted, :confirmed], on_transition: :revoke_role_and_cleanup
|
||||||
|
end
|
||||||
|
event :withdraw do
|
||||||
|
transitions to: :withdrawn, from: [:new, :to_accept, :to_reject, :accepted, :confirmed], on_transition: :revoke_role_and_cleanup
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def conference
|
def conference
|
||||||
program.conference
|
program.conference
|
||||||
|
|
@ -43,6 +81,30 @@ class Track < ActiveRecord::Base
|
||||||
short_name
|
short_name
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def transition_possible?(transition)
|
||||||
|
self.class.state_machine.events_for(current_state).include?(transition)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Gives the role of the track_organizer to the submitter
|
||||||
|
def assign_role_to_submitter
|
||||||
|
submitter.add_role 'track_organizer', self
|
||||||
|
end
|
||||||
|
|
||||||
|
# Revokes the track organizer role and removes the track from events that have it set
|
||||||
|
def revoke_role_and_cleanup
|
||||||
|
role = Role.find_by(name: 'track_organizer', resource: self)
|
||||||
|
|
||||||
|
if role
|
||||||
|
role.users.each do |user|
|
||||||
|
user.remove_role 'track_organizer', self
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
events.each do |event|
|
||||||
|
event.track = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def generate_guid
|
def generate_guid
|
||||||
|
|
|
||||||
|
|
@ -5,10 +5,10 @@ feature 'Has correct abilities' do
|
||||||
let(:organization) { create(:organization) }
|
let(:organization) { create(:organization) }
|
||||||
let(:conference) { create(:full_conference, organization: organization) }
|
let(:conference) { create(:full_conference, organization: organization) }
|
||||||
let(:self_organized_track) { create(:track, :self_organized, program: conference.program) }
|
let(:self_organized_track) { create(:track, :self_organized, program: conference.program) }
|
||||||
let(:role_track_organizer) { Role.find_by(name: 'track_organizer', resource: self_organized_track) }
|
let(:role_track_organizer) { Role.where(name: 'track_organizer', resource: self_organized_track).first_or_create }
|
||||||
let(:user_track_organizer) { create(:user, role_ids: [role_track_organizer.id]) }
|
let(:user_track_organizer) { create(:user, role_ids: [role_track_organizer.id]) }
|
||||||
|
|
||||||
context 'when user is info desk' do
|
context 'when user is track organizer' do
|
||||||
before do
|
before do
|
||||||
sign_in user_track_organizer
|
sign_in user_track_organizer
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -79,7 +79,7 @@ describe 'User with admin role' do
|
||||||
context 'accesses track organizers' do
|
context 'accesses track organizers' do
|
||||||
before :each do
|
before :each do
|
||||||
other_self_organized_track = create(:track, :self_organized)
|
other_self_organized_track = create(:track, :self_organized)
|
||||||
@other_track_organizer_role = Role.find_by(name: 'track_organizer', resource: other_self_organized_track)
|
@other_track_organizer_role = Role.where(name: 'track_organizer', resource: other_self_organized_track).first_or_create
|
||||||
end
|
end
|
||||||
|
|
||||||
it{ should_not be_able_to(:toggle_user, @other_track_organizer_role) }
|
it{ should_not be_able_to(:toggle_user, @other_track_organizer_role) }
|
||||||
|
|
@ -105,7 +105,7 @@ describe 'User with admin role' do
|
||||||
|
|
||||||
context 'accesses track organizers' do
|
context 'accesses track organizers' do
|
||||||
before :each do
|
before :each do
|
||||||
@track_organizer_role = Role.find_by(name: 'track_organizer', resource: my_self_organized_track)
|
@track_organizer_role = Role.where(name: 'track_organizer', resource: my_self_organized_track).first_or_create
|
||||||
end
|
end
|
||||||
|
|
||||||
if role_name == 'track_organizer'
|
if role_name == 'track_organizer'
|
||||||
|
|
@ -223,7 +223,7 @@ describe 'User with admin role' do
|
||||||
|
|
||||||
context 'can manage track organizers' do
|
context 'can manage track organizers' do
|
||||||
before :each do
|
before :each do
|
||||||
@track_organizer_role = Role.find_by(name: 'track_organizer', resource: my_self_organized_track)
|
@track_organizer_role = Role.where(name: 'track_organizer', resource: my_self_organized_track).first_or_create
|
||||||
end
|
end
|
||||||
|
|
||||||
it{ should be_able_to(:toggle_user, @track_organizer_role) }
|
it{ should be_able_to(:toggle_user, @track_organizer_role) }
|
||||||
|
|
@ -441,7 +441,8 @@ describe 'User with admin role' do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when user has the role track_organizer' do
|
context 'when user has the role track_organizer' do
|
||||||
let(:role) { Role.find_by(name: 'track_organizer', resource: my_self_organized_track) }
|
|
||||||
|
let(:role) { Role.where(name: 'track_organizer', resource: my_self_organized_track).first_or_create }
|
||||||
let(:user) { create(:user, role_ids: [role.id]) }
|
let(:user) { create(:user, role_ids: [role.id]) }
|
||||||
let(:new_track) { build(:track, program: my_conference.program) }
|
let(:new_track) { build(:track, program: my_conference.program) }
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue