diff options
Diffstat (limited to 'help/app/controllers')
| -rw-r--r-- | help/app/controllers/tickets_controller.rb | 146 | 
1 files changed, 93 insertions, 53 deletions
| diff --git a/help/app/controllers/tickets_controller.rb b/help/app/controllers/tickets_controller.rb index 6562048..094612c 100644 --- a/help/app/controllers/tickets_controller.rb +++ b/help/app/controllers/tickets_controller.rb @@ -1,12 +1,13 @@  class TicketsController < ApplicationController +  include AutoTicketsPathHelper    respond_to :html, :json    #has_scope :open, :type => boolean -  before_filter :set_strings -    before_filter :authorize, :only => [:index]    before_filter :fetch_ticket, :only => [:show, :update, :destroy] # don't now have an edit method +  before_filter :fetch_user +  before_filter :set_title    def new      @ticket = Ticket.new @@ -20,95 +21,134 @@ class TicketsController < ApplicationController      @ticket.created_by = current_user.id if logged_in?      @ticket.email = current_user.email_address if logged_in? and current_user.email_address -    flash[:notice] = 'Ticket was successfully created.' if @ticket.save +    if @ticket.save +      flash[:notice] = t(:thing_was_successfully_created, :thing => t(:ticket)) +    end      # cannot set this until ticket has been saved, as @ticket.id will not be set -    flash[:notice] += " " + t(:access_ticket_text, :full_url => ticket_url(@ticket.id)) if !logged_in? and flash[:notice] -    respond_with(@ticket) - -  end - -=begin -  def edit -    @ticket.comments.build -    # build ticket comments? +    if !logged_in? and flash[:notice] +      flash[:notice] += " " + t(:access_ticket_text, :full_url => ticket_url(@ticket.id)) +    end +    respond_with(@ticket, :location => auto_ticket_path(@ticket))    end -=end    def show      @comment = TicketComment.new      if !@ticket -      redirect_to tickets_path, :alert => "No such ticket" +      redirect_to auto_tickets_path, :alert => t(:no_such_thing, :thing => t(:ticket))        return      end    end    def update +    if params[:commit] == 'close' +      @ticket.is_open = false +      @ticket.save +      redirect_to_tickets +    elsif params[:commit] == 'open' +      @ticket.is_open = true +      @ticket.save +      redirect_to auto_ticket_path(@ticket) +    else +      @ticket.attributes = cleanup_ticket_params(params[:ticket]) -    if params[:post] #currently changes to title or is_open status -      @ticket.attributes = params[:post] -      # TODO: do we want to keep the history of title changes? one possibility was adding a comment that said something like 'user changed the title from a to b' +      if params[:commit] == 'reply_and_close' +        @ticket.close +      end -    else -      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.close 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. -    end -    if @ticket.changed? and @ticket.save -      flash[:notice] = 'Ticket was successfully updated.' -      if @ticket.is_open || !logged_in? -        respond_with @ticket -      else #for closed tickets with authenticated users, redirect to index. -        redirect_to tickets_path +      if @ticket.comments_changed? +        @ticket.comments.last.posted_by = (current_user ? current_user.id : nil)        end -    else -      #redirect_to [:show, @ticket] # -      flash[:alert] = 'Ticket has not been changed' -      redirect_to @ticket -      #respond_with(@ticket) # why does this go to edit?? redirect??? -    end +      if @ticket.changed? +        if @ticket.save +          flash[:notice] = t(:changes_saved) +          redirect_to_tickets +        else +          respond_with @ticket +        end +      else +        redirect_to auto_ticket_path(@ticket) +      end +    end    end    def index -    @all_tickets = Ticket.for_user(current_user, params, admin?) #for tests, useful to have as separate variable -    @tickets = @all_tickets.page(params[:page]).per(10) +    @all_tickets = Ticket.search(search_options(params)) +    @tickets = @all_tickets.page(params[:page]).per(APP_CONFIG[:pagination_size])    end    def destroy      # should we allow non-admins to delete their own tickets? i don't think necessary.      @ticket.destroy if admin? -    redirect_to tickets_path +    redirect_to auto_tickets_path +  end + +  protected + +  def set_title +    @title = t(:tickets)    end    private -  def ticket_access? -    @ticket and (admin? or !@ticket.created_by or (current_user and current_user.id == @ticket.created_by)) +  # +  # redirects to ticket index, if appropriate. +  # otherwise, just redirects to @ticket +  # +  def redirect_to_tickets +    if logged_in? +      if params[:commit] == t(:reply_and_close) +        redirect_to auto_tickets_path +      else +        redirect_to auto_ticket_path(@ticket) +      end +    else +      # if we are not logged in, there is no index to view +      redirect_to auto_ticket_path(@ticket) +    end    end -  def set_strings -    @post_reply_str = 'Post reply' #t :post_reply -    @reply_close_str = 'Reply and close' #t :reply_and_close +  # +  # unset comments hash if no new comment was typed +  # +  def cleanup_ticket_params(ticket) +    if ticket && ticket[:comments_attributes] +      if ticket[:comments_attributes].values.first[:body].blank? +        ticket[:comments_attributes] = nil +      end +    end +    return ticket +  end + +  def ticket_access? +    @ticket and (admin? or !@ticket.created_by or (current_user and current_user.id == @ticket.created_by))    end    def fetch_ticket      @ticket = Ticket.find(params[:id])      if !@ticket and admin? -      redirect_to tickets_path, :alert => t(:no_such_thing, :thing => 'ticket') +      redirect_to auto_tickets_path, :alert => t(:no_such_thing, :thing => 'ticket')        return      end      access_denied unless ticket_access?    end -  # not using now, as we are using comment_attributes= from the Ticket model -=begin -  def add_comment -    comment = TicketComment.new(params[:comment]) -    comment.posted_by = User.current.id if User.current #could be nil -    comment.posted_at = Time.now # TODO: it seems strange to have this here, and not in model -    @ticket.comments << comment + +  def fetch_user +    if params[:user_id] +      @user = User.find_by_param(params[:user_id]) +    end +  end + +  # +  # clean up params for ticket search +  # +  def search_options(params) +    params.merge( +      :admin_status => params[:user_id] ? 'mine' : 'all', +      :user_id      => @user ? @user.id : current_user.id, +      :is_admin     => admin? +    )    end -=end +  end | 
