diff options
-rw-r--r-- | app/controllers/admin_controller.rb | 14 | ||||
-rw-r--r-- | app/helpers/admin_helper.rb | 2 | ||||
-rw-r--r-- | app/models/project.rb | 9 | ||||
-rw-r--r-- | test/functional/admin_controller_test.rb | 9 |
4 files changed, 25 insertions, 9 deletions
diff --git a/app/controllers/admin_controller.rb b/app/controllers/admin_controller.rb index 128459e43..d32bdef91 100644 --- a/app/controllers/admin_controller.rb +++ b/app/controllers/admin_controller.rb @@ -26,14 +26,12 @@ class AdminController < ApplicationController end def projects - @status = params[:status] ? params[:status].to_i : 1 - c = ARCondition.new(@status == 0 ? "status <> 0" : ["status = ?", @status]) - unless params[:name].blank? - name = "%#{params[:name].strip.downcase}%" - c << ["LOWER(identifier) LIKE ? OR LOWER(name) LIKE ?", name, name] - end - @projects = Project.find :all, :order => 'lft', - :conditions => c.conditions + @status = params[:status] || 1 + + scope = Project.status(@status) + scope = scope.like(params[:name]) if params[:name].present? + + @projects = scope.all(:order => 'lft') render :action => "projects", :layout => false if request.xhr? end diff --git a/app/helpers/admin_helper.rb b/app/helpers/admin_helper.rb index b78de27dc..c7358f67a 100644 --- a/app/helpers/admin_helper.rb +++ b/app/helpers/admin_helper.rb @@ -18,6 +18,6 @@ module AdminHelper def project_status_options_for_select(selected) options_for_select([[l(:label_all), ''], - [l(:status_active), 1]], selected) + [l(:status_active), '1']], selected.to_s) end end diff --git a/app/models/project.rb b/app/models/project.rb index e636c33de..831bdf07f 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -83,8 +83,17 @@ class Project < ActiveRecord::Base named_scope :has_module, lambda { |mod| { :conditions => ["#{Project.table_name}.id IN (SELECT em.project_id FROM #{EnabledModule.table_name} em WHERE em.name=?)", mod.to_s] } } named_scope :active, { :conditions => "#{Project.table_name}.status = #{STATUS_ACTIVE}"} + named_scope :status, lambda {|arg| arg.blank? ? {} : {:conditions => {:status => arg.to_i}} } named_scope :all_public, { :conditions => { :is_public => true } } named_scope :visible, lambda {|*args| {:conditions => Project.visible_condition(args.shift || User.current, *args) }} + named_scope :like, lambda {|arg| + if arg.blank? + {} + else + pattern = "%#{arg.to_s.strip.downcase}%" + {:conditions => ["LOWER(identifier) LIKE :p OR LOWER(name) LIKE :p", {:p => pattern}]} + end + } def initialize(attributes = nil) super diff --git a/test/functional/admin_controller_test.rb b/test/functional/admin_controller_test.rb index 01a487798..774c5a12f 100644 --- a/test/functional/admin_controller_test.rb +++ b/test/functional/admin_controller_test.rb @@ -54,6 +54,15 @@ class AdminControllerTest < ActionController::TestCase assert_nil assigns(:projects).detect {|u| !u.active?} end + def test_projects_with_status_filter + get :projects, :status => 1 + assert_response :success + assert_template 'projects' + assert_not_nil assigns(:projects) + # active projects only + assert_nil assigns(:projects).detect {|u| !u.active?} + end + def test_projects_with_name_filter get :projects, :name => 'store', :status => '' assert_response :success |