| Class | SessionController |
| In: |
app/controllers/session_controller.rb
|
| Parent: | ApplicationController |
The session controller allows management of ClinicalSession records.
It also contains the methods for making and cancelling a Booking for each ClinicalSession.
Reschedule and recurring sessions are managed through the session controller.
Handles the auto complete action on the make_booking view
# File app/controllers/session_controller.rb, line 242
242: def auto_complete_for_client_full_name
243: conditions = "last_name = ''"
244: client_name = params[:client][:full_name].split(',')
245: client_name.each do |name|
246: conditions << "OR last_name LIKE '%#{name.strip}%' OR first_name LIKE '%#{name.strip}%'"
247: end
248:
249: @client_matches = Client.find(:all,
250: :conditions => conditions)
251:
252: @client_matches.each do |client|
253: client[:full_name] = client.full_name + " (#{client.record_number})"
254: end
255:
256: render :inline => "<%= auto_complete_result @client_matches, 'full_name' %>"
257: end
Create a Booking for the selected ClinicalSession
Sends form data to make_booking method
# File app/controllers/session_controller.rb, line 144
144: def book
145: unless params[:client]
146: begin
147: @clinical_session = ClinicalSession.find(params[:id])
148:
149: @clients = Client.find(:all, :order => "last_name")
150: @time_format = "%B %d (%a) at %I:%M%p"
151: rescue
152: flash[:notice] = "Unable to Book: Session not found!"
153: redirect_to :action => :list
154: end
155: else
156: @clinical_session = ClinicalSession.find(params[:id])
157: @client = Client.find(params[:client])
158: if @client.is_booked?(@clinical_session.start, @clinical_session.finish)
159: flash[:notice] = "Unable to Book: Client is already booked at this time"
160: redirect_to :back
161: else
162: redirect_to :action => :make_booking,
163: :clinical_session_id => params[:id],
164: :client_id => params[:client]
165: end
166: end
167: end
Delete the Booking record for the selected ClinicalSession
Redirect to previous visited page or the calendar
# File app/controllers/session_controller.rb, line 172
172: def cancel_booking
173: begin
174: @booking = Booking.find(@params["id"])
175: clinical_session = @booking.clinical_session
176: @booking.destroy
177: flash[:notice] = 'Booking cancelled.'
178: rescue
179: flash[:notice] = "Unable to Cancel Booking: Booking not found!"
180: end
181:
182: if request.env['HTTP_REFERER']
183: redirect_to :back
184: else
185: redirect_to :controller => 'calendar', :action => 'week'
186: end
187: end
Gets posted ClinicalSession from the new method
Returns to new form with error messages if unable to create.
Redirect to previous or calendar (CalendarController) displaying new session if successful.
# File app/controllers/session_controller.rb, line 67
67: def create
68: if params[:cancel]
69: if !params[:referer] || params[:referer].match(/new/) || params[:referer].match(/create/)
70: redirect_to :controller => 'calendar', :action => 'week'
71: else
72: redirect_to params[:referer]
73: end
74: else
75: @clinical_session = ClinicalSession.new(params[:clinical_session])
76: if @clinical_session.save
77: if params[:recurrence]
78: recur_until = "#{params[:recurrence]['until(1i)']}-#{params[:recurrence]['until(2i)']}-#{params[:recurrence]['until(3i)']}"
79: @clinical_session.recurrence = {:frequency => params[:recurrence][:frequency],
80: :until => recur_until}
81: end
82: flash[:notice] = 'Session succesfully created.'
83: redirect_to :controller => 'calendar', :action => 'week', :clinical_session => @clinical_session.id
84: else
85: @clinicians = Clinician.find(:all)
86: render :action => :new
87: end
88: end
89: end
This AJAX function is a little slow as it potentially makes a lot of database requests.
# File app/controllers/session_controller.rb, line 353
353: def date_picker
354: @date = params[:date].to_time
355: old_date = params[:old_date].to_time
356:
357: @clinician = Clinician.find(params[:id])
358:
359: unless @date == old_date
360: # Search for clashes
361: sessions = @clinician.sessions_for(old_date)
362: @clash = sessions.detect { |cs|
363: @clinician.session_during(@date.change(:hour => cs.start.hour, :min => cs.start.min),
364: @date.change(:hour => cs.finish.hour, :min => cs.finish.min))
365: }
366:
367: @client_clash = sessions.detect { |cs|
368: cs.bookings.detect {|booking| booking.client.is_booked?(@date.change(:hour => cs.start.hour, :min => cs.start.min),
369: @date.change(:hour => cs.finish.hour, :min => cs.finish.min))}
370: }
371: end
372:
373: @display = {:date => @date, :clinician => @clinician, :old_date => old_date.strftime("%Y-%m-%d")}
374:
375: end
Deletes a clinical_session record (and any associated Booking)
Redirect to previous visited page or the calendar
# File app/controllers/session_controller.rb, line 262
262: def destroy
263: begin
264: @clinical_session = ClinicalSession.find(params[:id])
265:
266: @clinical_session.destroy
267: flash[:notice] = 'Session succesfully deleted.'
268: rescue
269: flash[:notice] = "Unable to Delete Session not found!"
270: end
271:
272: # Return to previous page UNLESS previous page
273: # was specifically showing this session (which no
274: # longer exists
275: if request.env['HTTP_REFERER'].match(/session\/[a-zA-Z]*\/[0-9]*$/) || request.env['HTTP_REFERER'].match(/clinical_session/)
276: redirect_to :controller => 'calendar', :action => 'week'
277: else
278: redirect_to :back
279: end
280: end
Edit an exisiting ClinicalSession
Sends form to the update method
# File app/controllers/session_controller.rb, line 31
31: def edit
32: begin
33: @clinical_session = ClinicalSession.find(@params["id"])
34: @clinicians = Clinician.find(:all)
35: @session_types = SessionType.find(:all)
36: rescue
37: flash[:notice] = "Session not found!"
38: redirect_to :action => :list
39: end
40: end
The default action of the SessionController is the week view
# File app/controllers/session_controller.rb, line 13
13: def index
14: if clinicians.find(:first)
15: redirect_to :action => list
16: else
17: redirect_to :controller => 'clinician', :action => 'new'
18: end
19: end
Display all ClinicalSession records.
Also displays links to book and cancel_booking methods.
# File app/controllers/session_controller.rb, line 24
24: def list
25: @cs_pages, @clinical_sessions = paginate(:clinical_sessions, :order => 'start', :per_page => 25 )
26: end
Receives new Booking information
Determines the client by record number. This may be in the form:
"Client Name (record_number)"
or
"record_number"
Redirect to previous visited page or the calendar displaying this session.
# File app/controllers/session_controller.rb, line 198
198: def make_booking
199: if params[:cancel]
200: if !params[:referer] || params[:referer].match(/book/) || params[:referer].match(/make_booking/)
201: redirect_to :controller => 'calendar', :action => 'week', :clinical_session => params[:booking][:clinical_session_id]
202: else
203: redirect_to params[:referer]
204: end
205: else
206: begin
207: unless params[:client_id]
208: @booking = Booking.new(params[:booking])
209: full_name = params[:client][:full_name] if params[:client]
210:
211: @booking.client = Client.find_by_full_name(full_name)
212: else
213: @booking = Booking.new(:clinical_session_id => params[:clinical_session_id],
214: :client => Client.find(params[:client_id]))
215: end
216:
217: if @booking.save
218: flash[:notice] = 'Booking was successfully made.'
219: if !params[:referer] || params[:referer].match(/book/) ||
220: params[:referer].match(/week/) || params[:referer].match(/clinical_session/)
221:
222: redirect_to :controller => 'calendar',
223: :action => 'week',
224: :clinical_session => @booking.clinical_session
225: else
226: redirect_to params[:referer]
227: end
228: else
229: @clinical_session = ClinicalSession.find(params['id'])
230: @clients = Client.find(:all, :order => "last_name")
231: @time_format = "%B %d (%a) at %I:%M%p"
232: render :action => 'book'
233: end
234: rescue
235: flash[:notice] = "Unable to Book: Session not found!"
236: redirect_to :action => :list
237: end
238: end
239: end
Receive form from reschedule action
# File app/controllers/session_controller.rb, line 317
317: def make_schedule_changes
318: if params[:cancel]
319: if !params[:referer] || params[:referer].match(/reschedule/)
320: redirect_to :controller => 'calendar', :action => 'week', :date => params[:date], :clinician => params[:id]
321: else
322: redirect_to params[:referer]
323: end
324: else
325: begin
326: clinician = Clinician.find(params[:id])
327: @clinical_sessions = clinician.sessions_for(params[:date].to_time)
328:
329: # Diff number of days
330: orig_date = params[:date].to_time
331: new_date = params['new-date'].to_time
332: @advance = (new_date - orig_date) / 86400
333:
334: @clinical_sessions.each do |cs|
335: cs.reschedule(@advance)
336: end
337:
338: flash[:notice] = 'Sessions successfully updated.'
339:
340: redirect_to :controller => 'calendar',
341: :action => 'week',
342: :date => params['new-date'], :clinician => params[:id]
343: rescue
344: flash[:notice] = "Unable to Update: Session conflict or error!"
345: redirect_to :action => :list
346: end
347: end
348: end
Create a new ClinicalSession
Sends form to the create method
# File app/controllers/session_controller.rb, line 45
45: def new
46: @clinicians = Clinician.find(:all)
47: @clinical_session = ClinicalSession.new()
48: @session_types = SessionType.find(:all)
49: @clinical_session.clinician = Clinician.find(params[:clinician]) if params[:clinician]
50: if params[:start]
51: @clinical_session.start = params[:start].to_time
52: else
53: @clinical_session.start = Time.now
54: end
55:
56: @clinical_session.clinician = Clinician.find(:first) unless params[:clinician]
57: default_length = @clinical_session.clinician.discipline.session_types.first.default_length
58: @clinical_session.set_finish(default_length)
59: end
Reschedule or completely cancel an entire day
Requires date and clinician id
Posts to make_schedule_changes
# File app/controllers/session_controller.rb, line 300
300: def reschedule
301: begin
302: @date = params[:date].to_time
303: @clinician = Clinician.find(params[:id])
304:
305: @clinical_sessions = @clinician.sessions_for(@date)
306: unless @clinical_sessions.length > 0
307: flash[:notice] = "There are no sessions to reschedule on this day"
308: redirect_to :back
309: end
310: rescue
311: flash[:notice] = "There was an error rescheduling!"
312: redirect_to :back
313: end
314: end
Returns the default length for the supplied SessionType id.
# File app/controllers/session_controller.rb, line 379
379: def set_default_length
380: session_type = SessionType.find(params[:id])
381: @default_length = session_type.default_length
382: end
Display extended details about session.
This may be of more use in the future if sessions are expanded to allow session types or groups.
# File app/controllers/session_controller.rb, line 286
286: def show
287: begin
288: @clinical_session = ClinicalSession.find(params[:id])
289: rescue
290: flash[:notice] = "Session not found!"
291: redirect_to :action => :list
292: end
293: end
Gets posted ClinicalSession from the edit method
Returns to the edit form with error messages if unable to update
Redirect to previous or calendar (CalendarController) displaying updated session if successful.
# File app/controllers/session_controller.rb, line 97
97: def update
98: if params[:cancel]
99: if !params[:referer] || params[:referer].match(/edit/) || params[:referer].match(/update/)
100: redirect_to :controller => 'calendar', :action => 'week', :clinical_session => params[:id]
101: else
102: redirect_to params[:referer]
103: end
104: else
105: begin
106: @clinical_session = ClinicalSession.find(params[:id])
107: sessions = @clinical_session.recurrence if params[:recursive]
108: original_start = @clinical_session.start
109:
110: if @clinical_session.update_attributes(params[:clinical_session])
111: if params[:recursive]
112: @clinical_session = ClinicalSession.find(params[:id])
113: sessions.each do |cs|
114: cs.copy_from(cs.start + (@clinical_session.start - original_start), @clinical_session)
115: cs.save
116: end
117:
118: flash[:notice] = "#{sessions.length+1} sessions successfully updated."
119: else
120: flash[:notice] = 'Session successfully updated.'
121: end
122:
123: if !params[:referer] || params[:referer].match(/edit/)
124: redirect_to :controller => 'calendar', :action => 'week', :clinical_session => params[:id]
125: else
126: redirect_to params[:referer]
127: end
128:
129: else # Errors Updating
130: @clinicians = Clinician.find(:all)
131: render :action => :edit
132: end
133:
134: rescue
135: flash[:notice] = "Unable to Update: Session not found!"
136: redirect_to :action => :list
137: end
138: end
139: end