From 2dff9a32e886220fe63152e905c0d7a32968f695 Mon Sep 17 00:00:00 2001 From: jessib Date: Mon, 5 Nov 2012 16:01:40 -0800 Subject: Working on functionality for replying to and closing tickets. --- help/app/controllers/tickets_controller.rb | 23 ++++++++++++++++------- help/app/models/ticket.rb | 13 +++++++------ help/app/views/tickets/show.html.haml | 6 ++++-- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/help/app/controllers/tickets_controller.rb b/help/app/controllers/tickets_controller.rb index a9e0bd4..4f5c427 100644 --- a/help/app/controllers/tickets_controller.rb +++ b/help/app/controllers/tickets_controller.rb @@ -3,6 +3,12 @@ class TicketsController < ApplicationController respond_to :html #, :json #has_scope :open, :type => boolean + def initialize + @post_reply_str = 'Post reply' #t :post_reply + # @close_str = 'Close ticket' #t :close_ticket + @reply_close_str = 'Reply and close' #t :reply_and_close + end + def new @ticket = Ticket.new @ticket.comments.build @@ -34,6 +40,7 @@ class TicketsController < ApplicationController def show @ticket = Ticket.find(params[:id]) ticket_access_denied? + redirect_to root_url, :alert => "No such ticket" if !@ticket # @ticket.comments.build # build ticket comments? end @@ -43,14 +50,14 @@ class TicketsController < ApplicationController @ticket = Ticket.find(params[:id]) if !ticket_access_denied? #can update w/out logging in if the ticket was created unauthenticated - #below is excessively complicated. issue is that we don't need a new comment if we have changed anything else (currently, is_open is the only other thing to change.) However, if we don't change anything else, then we want to try to add a new comment (and possibly fail.) Likely this should all be redone. - @ticket.is_open = params[:ticket][:is_open] - if !params[:ticket][:comments_attributes].values.first[:body].blank? or !@ticket.changed? - @ticket.attributes = params[:ticket] - end - # what if there is an update and no new comment? Confirm that there is a new comment to update posted_by. will @tickets.comments_changed? work? + params[:ticket][:comments_attributes] = nil if params[:ticket][:comments_attributes].values.first[:body].blank? #unset comments hash if no new comment was typed + @ticket.attributes = params[:ticket] #this will call comments_attributes= + + @ticket.is_open = false if params[:commit] == @reply_close_str #this overrides is_open selection + + # what if there is an update and no new comment? Confirm that there is a new comment to update posted_by: @ticket.comments.last.posted_by = (current_user ? current_user.id : nil) if @ticket.comments_changed? #protecting posted_by isn't working, so this should protect it. - if @ticket.save + if @ticket.changed? and @ticket.save flash[:notice] = 'Ticket was successfully updated.' respond_with @ticket else @@ -77,6 +84,7 @@ class TicketsController < ApplicationController @tickets = Ticket.all end elsif logged_in? + #TODO---if, when logged in, user accessed unauthenticated ticket, then seems okay to list it in their list of tickets. Thus, include all tickets that the user has posted to, not just those that they created. if params[:status] == 'open' @tickets = Ticket.by_is_open_and_created_by.key([true, current_user.id]).all elsif params[:status] == 'closed' @@ -86,6 +94,7 @@ class TicketsController < ApplicationController end else access_denied + return end respond_with(@tickets) diff --git a/help/app/models/ticket.rb b/help/app/models/ticket.rb index eaad574..cb8e397 100644 --- a/help/app/models/ticket.rb +++ b/help/app/models/ticket.rb @@ -83,12 +83,13 @@ class Ticket < CouchRest::Model::Base end def comments_attributes=(attributes) - comment = TicketComment.new(attributes.values.first) #TicketComment.new(attributes) - #comment.posted_by = User.current.id if User.current #we want to avoid User.current, and current_user won't work here. instead will set in tickets_controller - # what about: comment.posted_by = self.updated_by (will need to add ticket.updated_by) - comment.posted_at = Time.now - comments << comment - + if attributes # could be empty as we will empty if nothing was typed in + comment = TicketComment.new(attributes.values.first) #TicketComment.new(attributes) + #comment.posted_by = User.current.id if User.current #we want to avoid User.current, and current_user won't work here. instead will set in tickets_controller + # what about: comment.posted_by = self.updated_by (will need to add ticket.updated_by) + comment.posted_at = Time.now + comments << comment + end end =begin diff --git a/help/app/views/tickets/show.html.haml b/help/app/views/tickets/show.html.haml index 92b8d03..132d50f 100644 --- a/help/app/views/tickets/show.html.haml +++ b/help/app/views/tickets/show.html.haml @@ -21,6 +21,8 @@ = #render :partial => 'new_comment' = f.label :is_open = f.select :is_open, [true, false] - = f.button :submit + = f.button :submit, @post_reply_str + = f.button :submit, @reply_close_str = # TODO want to have button to close - = link_to t(:cancel), tickets_path, :class => :btn \ No newline at end of file + = # TODO if admin, have button to delete + = link_to t(:cancel), tickets_path, :class => :btn -- cgit v1.2.3