diff --git a/app/controllers/queries_controller.rb b/app/controllers/queries_controller.rb index 0ec305e4b..241b5176c 100644 --- a/app/controllers/queries_controller.rb +++ b/app/controllers/queries_controller.rb @@ -17,11 +17,13 @@ class QueriesController < ApplicationController menu_item :issues - before_filter :find_query, :except => [:new, :index] - before_filter :find_optional_project, :only => :new + before_filter :find_query, :except => [:new, :create, :index] + before_filter :find_optional_project, :only => [:new, :create] accept_api_auth :index + include QueriesHelper + def index case params[:format] when 'xml', 'json' @@ -41,44 +43,52 @@ class QueriesController < ApplicationController end def new - @query = Query.new(params[:query]) - @query.project = params[:query_is_for_all] ? nil : @project + @query = Query.new @query.user = User.current + @query.project = @project @query.is_public = false unless User.current.allowed_to?(:manage_public_queries, @project) || User.current.admin? + build_query_from_params + end - @query.add_filters(params[:fields] || params[:f], params[:operators] || params[:op], params[:values] || params[:v]) if params[:fields] || params[:f] - @query.group_by ||= params[:group_by] - @query.column_names = params[:c] if params[:c] + verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed } + def create + @query = Query.new(params[:query]) + @query.user = User.current + @query.project = params[:query_is_for_all] ? nil : @project + @query.is_public = false unless User.current.allowed_to?(:manage_public_queries, @project) || User.current.admin? + build_query_from_params @query.column_names = nil if params[:default_columns] - if request.post? && params[:confirm] && @query.save + if @query.save flash[:notice] = l(:notice_successful_create) redirect_to :controller => 'issues', :action => 'index', :project_id => @project, :query_id => @query - return + else + render :action => 'new', :layout => !request.xhr? end - render :layout => false if request.xhr? end def edit - if request.post? - @query.filters = {} - @query.add_filters(params[:fields] || params[:f], params[:operators] || params[:op], params[:values] || params[:v]) if params[:fields] || params[:f] - @query.attributes = params[:query] - @query.project = nil if params[:query_is_for_all] - @query.is_public = false unless User.current.allowed_to?(:manage_public_queries, @project) || User.current.admin? - @query.group_by ||= params[:group_by] - @query.column_names = params[:c] if params[:c] - @query.column_names = nil if params[:default_columns] + end - if @query.save - flash[:notice] = l(:notice_successful_update) - redirect_to :controller => 'issues', :action => 'index', :project_id => @project, :query_id => @query - end + verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed } + def update + @query.attributes = params[:query] + @query.project = nil if params[:query_is_for_all] + @query.is_public = false unless User.current.allowed_to?(:manage_public_queries, @project) || User.current.admin? + build_query_from_params + @query.column_names = nil if params[:default_columns] + + if @query.save + flash[:notice] = l(:notice_successful_update) + redirect_to :controller => 'issues', :action => 'index', :project_id => @project, :query_id => @query + else + render :action => 'edit' end end + verify :method => :delete, :only => :destroy, :render => {:nothing => true, :status => :method_not_allowed } def destroy - @query.destroy if request.post? + @query.destroy redirect_to :controller => 'issues', :action => 'index', :project_id => @project, :set_filter => 1 end diff --git a/app/helpers/queries_helper.rb b/app/helpers/queries_helper.rb index 2ce6a96d8..0e82eb631 100644 --- a/app/helpers/queries_helper.rb +++ b/app/helpers/queries_helper.rb @@ -71,30 +71,31 @@ module QueriesHelper cond << " OR project_id = #{@project.id}" if @project @query = Query.find(params[:query_id], :conditions => cond) raise ::Unauthorized unless @query.visible? - @query.project = @project session[:query] = {:id => @query.id, :project_id => @query.project_id} sort_clear + elsif api_request? || params[:set_filter] || session[:query].nil? || session[:query][:project_id] != (@project ? @project.id : nil) + # Give it a name, required to be valid + @query = Query.new(:name => "_") + @query.project = @project + build_query_from_params + session[:query] = {:project_id => @query.project_id, :filters => @query.filters, :group_by => @query.group_by, :column_names => @query.column_names} else - if api_request? || params[:set_filter] || session[:query].nil? || session[:query][:project_id] != (@project ? @project.id : nil) - # Give it a name, required to be valid - @query = Query.new(:name => "_") - @query.project = @project - if params[:fields] || params[:f] - @query.filters = {} - @query.add_filters(params[:fields] || params[:f], params[:operators] || params[:op], params[:values] || params[:v]) - else - @query.available_filters.keys.each do |field| - @query.add_short_filter(field, params[field]) if params[field] - end - end - @query.group_by = params[:group_by] - @query.column_names = params[:c] || (params[:query] && params[:query][:column_names]) - session[:query] = {:project_id => @query.project_id, :filters => @query.filters, :group_by => @query.group_by, :column_names => @query.column_names} - else - @query = Query.find_by_id(session[:query][:id]) if session[:query][:id] - @query ||= Query.new(:name => "_", :project => @project, :filters => session[:query][:filters], :group_by => session[:query][:group_by], :column_names => session[:query][:column_names]) - @query.project = @project - end + # retrieve from session + @query = Query.find_by_id(session[:query][:id]) if session[:query][:id] + @query ||= Query.new(:name => "_", :project_id => session[:project_id] || @project, :filters => session[:query][:filters], :group_by => session[:query][:group_by], :column_names => session[:query][:column_names]) end end + + def build_query_from_params + if params[:fields] || params[:f] + @query.filters = {} + @query.add_filters(params[:fields] || params[:f], params[:operators] || params[:op], params[:values] || params[:v]) + else + @query.available_filters.keys.each do |field| + @query.add_short_filter(field, params[field]) if params[field] + end + end + @query.group_by = params[:group_by] || (params[:query] && params[:query][:group_by]) + @query.column_names = params[:c] || (params[:query] && params[:query][:column_names]) + end end diff --git a/app/views/issues/index.html.erb b/app/views/issues/index.html.erb index 4c2caa7ff..beff2fef6 100644 --- a/app/views/issues/index.html.erb +++ b/app/views/issues/index.html.erb @@ -1,7 +1,7 @@