Merge pull request #5 from warpc/build_lists_filter

New build lists filter (search by name and bs_id)
This commit is contained in:
Vladimir Sharshov 2011-12-08 14:17:03 -08:00
commit 5e3711505c
8 changed files with 104 additions and 71 deletions

View File

@ -76,6 +76,7 @@ class BuildList < ActiveRecord::Base
where(["notified_at <= ?", end_date]) where(["notified_at <= ?", end_date])
end end
} }
scope :scoped_to_project_name, lambda {|project_name| joins(:project).where('projects.name LIKE ?', "%#{project_name}%")}
serialize :additional_repos serialize :additional_repos

View File

@ -1,32 +1,30 @@
class BuildList::Filter class BuildList::Filter
def initialize(project, options = {}) def initialize(project, options = {})
@project = project @project = project
set_options(options) set_options(options)
end end
def find def find
if @project.nil? build_lists = @project ? @project.build_lists : BuildList.scoped
build_lists = BuildList.recent
if @options[:bs_id]
build_lists = build_lists.where(:bs_id => @options[:bs_id])
else else
build_lists = @project.build_lists.recent build_lists = build_lists.for_status(@options[:status]) if @options[:status]
build_lists = build_lists.scoped_to_arch(@options[:arch_id]) if @options[:arch_id]
build_lists = build_lists.scoped_to_project_version(@options[:project_version]) if @options[:project_version]
build_lists = build_lists.scoped_to_is_circle(@options[:is_circle]) if @options[:is_circle].present?
build_lists = build_lists.scoped_to_project_name(@options[:project_name]) if @options[:project_name]
if @options[:created_at_start] || @options[:created_at_end]
build_lists = build_lists.for_creation_date_period(@options[:created_at_start], @options[:created_at_end])
end
if @options[:notified_at_start] || @options[:notified_at_end]
build_lists = build_lists.for_notified_date_period(@options[:notified_at_start], @options[:notified_at_end])
end
end end
build_lists = build_lists.for_status(@options[:status]) if @options[:status] build_lists.recent
build_lists = build_lists.scoped_to_arch(@options[:arch_id]) if @options[:arch_id]
build_lists = build_lists.scoped_to_project_version(@options[:project_version]) if @options[:project_version]
build_lists = build_lists.scoped_to_is_circle(@options[:is_circle]) if @options[:is_circle].present?
if @options[:created_at_start] || @options[:created_at_end]
build_lists = build_lists.for_creation_date_period(@options[:created_at_start], @options[:created_at_end])
end
if @options[:notified_at_start] || @options[:notified_at_end]
build_lists = build_lists.for_notified_date_period(@options[:notified_at_start], @options[:notified_at_end])
end
build_lists
end end
def respond_to?(name) def respond_to?(name)
@ -39,36 +37,40 @@ class BuildList::Filter
end end
private private
def set_options(options)
@options = HashWithIndifferentAccess.new(options.reverse_merge({
:status => nil,
:created_at_start => nil,
:created_at_end => nil,
:notified_at_start => nil,
:notified_at_end => nil,
:arch_id => nil,
:is_circle => nil,
:project_version => nil
}))
@options[:status] = @options[:status].present? ? @options[:status].to_i : nil def set_options(options)
@options[:created_at_start] = build_date_from_params(:created_at_start, @options) @options = HashWithIndifferentAccess.new(options.reverse_merge({
@options[:created_at_end] = build_date_from_params(:created_at_end, @options) :status => nil,
@options[:notified_at_start] = build_date_from_params(:notified_at_start, @options) :created_at_start => nil,
@options[:notified_at_end] = build_date_from_params(:notified_at_end, @options) :created_at_end => nil,
@options[:project_version] = @options[:project_version].present? ? @options[:project_version] : nil :notified_at_start => nil,
@options[:arch_id] = @options[:arch_id].present? ? @options[:arch_id].to_i : nil :notified_at_end => nil,
@options[:is_circle] = @options[:is_circle].present? ? @options[:is_circle] == "1" : nil :arch_id => nil,
:is_circle => nil,
:project_version => nil,
:bs_id => nil,
:project_name => nil
}))
@options[:status] = @options[:status].present? ? @options[:status].to_i : nil
@options[:created_at_start] = build_date_from_params(:created_at_start, @options)
@options[:created_at_end] = build_date_from_params(:created_at_end, @options)
@options[:notified_at_start] = build_date_from_params(:notified_at_start, @options)
@options[:notified_at_end] = build_date_from_params(:notified_at_end, @options)
@options[:project_version] = @options[:project_version].presence
@options[:arch_id] = @options[:arch_id].present? ? @options[:arch_id].to_i : nil
@options[:is_circle] = @options[:is_circle].present? ? @options[:is_circle] == "1" : nil
@options[:bs_id] = @options[:bs_id].presence
@options[:project_name] = @options[:project_name].presence
end
def build_date_from_params(field_name, params)
if params["#{field_name}(1i)"].present? || params["#{field_name}(2i)"].present? || params["#{field_name}(3i)"].present?
Date.civil((params["#{field_name}(1i)"].presence || Date.today.year).to_i,
(params["#{field_name}(2i)"].presence || Date.today.mohth).to_i,
(params["#{field_name}(3i)"].presence || Date.today.day).to_i)
else
nil
end end
end
def build_date_from_params(field_name, params)
if params["#{field_name}(1i)"].present? || params["#{field_name}(2i)"].present? || params["#{field_name}(3i)"].present?
Date.civil((params["#{field_name}(1i)"].presence || Date.today.year).to_i,
(params["#{field_name}(2i)"].presence || Date.today.mohth).to_i,
(params["#{field_name}(3i)"].presence || Date.today.day).to_i)
else
nil
end
end
end end

View File

@ -3,48 +3,48 @@
= form_for :filter, :url => @action_url, :html => { :method => :get, :class => :form } do |f| = form_for :filter, :url => @action_url, :html => { :method => :get, :class => :form } do |f|
.columns.wat-cf .columns.wat-cf
.column.left .column.left
.group .group
= f.label :status, t("activerecord.attributes.build_list.status"), :class => :label = f.label :status, t("activerecord.attributes.build_list.status"), :class => :label
= f.select :status, BuildList::STATUSES.collect{|status| [BuildList.human_status(status), status]}, :include_blank => true, :selected => @filter.status = f.select :status, BuildList::STATUSES.collect{|status| [BuildList.human_status(status), status]}, :include_blank => true, :selected => @filter.status
.group .group
= f.label :arch_id, t("activerecord.attributes.build_list.arch"), :class => :label = f.label :arch_id, t("activerecord.attributes.build_list.arch"), :class => :label
= f.select :arch_id, @arches.collect{|arch| [arch.name, arch.id]}, :include_blank => true, :selected => @filter.arch_id = f.select :arch_id, @arches.collect{|arch| [arch.name, arch.id]}, :include_blank => true, :selected => @filter.arch_id
.column.right .column.right
- if @project_versions - if @project_versions
.group .group
= f.label :project_version, t("activerecord.attributes.build_list.project_version"), :class => :label = f.label :project_version, t("activerecord.attributes.build_list.project_version"), :class => :label
= f.select :project_version, @project_versions, :include_blank => true, :selected => @filter.project_version = f.select :project_version, @project_versions, :include_blank => true, :selected => @filter.project_version
.group .group
= f.label :is_circle, t("activerecord.attributes.build_list.is_circle"), :class => :label = f.label :is_circle, t("activerecord.attributes.build_list.is_circle"), :class => :label
= f.select :is_circle, [[t("layout.yes_"), 1], [t("layout.no_"), 0]], :include_blank => true, :selected => @filter.is_circle.present? ? (@filter.is_circle ? "1" : "0") : nil = f.select :is_circle, [[t("layout.yes_"), 1], [t("layout.no_"), 0]], :include_blank => true, :selected => @filter.is_circle.present? ? (@filter.is_circle ? "1" : "0") : nil
.columns.wat-cf .columns.wat-cf
.column.left .column.left
.group .group
= f.label :status, t("layout.build_lists.created_at_start"), :class => :label = f.label :status, t("layout.build_lists.created_at_start"), :class => :label
= date_select("filter", :created_at_start, :include_blank => true, :selected => @filter.created_at_start) = f.date_select(:created_at_start, :include_blank => true, :selected => @filter.created_at_start)
.group .group
= f.label :status, t("layout.build_lists.notified_at_start"), :class => :label = f.label :status, t("layout.build_lists.notified_at_start"), :class => :label
= date_select("filter", :notified_at_start, :include_blank => true, :selected => @filter.notified_at_start) = f.date_select(:notified_at_start, :include_blank => true, :selected => @filter.notified_at_start)
.column.right .column.right
.group .group
= f.label :status, t("layout.build_lists.created_at_end"), :class => :label = f.label :status, t("layout.build_lists.created_at_end"), :class => :label
= date_select("filter", :created_at_end, :include_blank => true, :selected => @filter.created_at_end) = f.date_select(:created_at_end, :include_blank => true, :selected => @filter.created_at_end)
.group .group
= f.label :status, t("layout.build_lists.notified_at_end"), :class => :label = f.label :status, t("layout.build_lists.notified_at_end"), :class => :label
= date_select("filter", :notified_at_end, :include_blank => true, :selected => @filter.notified_at_end) = f.date_select(:notified_at_end, :include_blank => true, :selected => @filter.notified_at_end)
.grou.navform.wat-cf .columns.wat-cf
.column.left
.group
= f.label :status, t("layout.build_lists.bs_id_search"), :class => :label
= f.text_field :bs_id, :class => :text_field
.column.right
.group
= f.label :status, t("layout.build_lists.project_name"), :class => :label
= f.text_field :project_name, :class => :text_field
.group.navform.wat-cf
%button.button{ :type => "submit" } %button.button{ :type => "submit" }
= image_tag("web-app-theme/icons/tick.png", :alt => "Save") = image_tag("web-app-theme/icons/tick.png", :alt => "Save")
= t("layout.search") = t("layout.search")

View File

@ -35,4 +35,4 @@ Rosa::Application.configure do
config.active_support.deprecation = :stderr config.active_support.deprecation = :stderr
end end
require 'stub_xml_rpc' require 'stub_xml_rpc' # TODO stub XML calls through stubbers

View File

@ -279,6 +279,8 @@ ru:
created_at_end: "Время постановки на сборку по:" created_at_end: "Время постановки на сборку по:"
notified_at_start: "Время последнего обновления от BS с:" notified_at_start: "Время последнего обновления от BS с:"
notified_at_end: "Время последнего обновления от BS по:" notified_at_end: "Время последнего обновления от BS по:"
bs_id_search: 'Поиск по Id'
project_name: 'Название проекта'
bs_id_not_set: Id еще не присвоен bs_id_not_set: Id еще не присвоен
items_header: Элементы сборки items_header: Элементы сборки
no_items_data: Данных нет no_items_data: Данных нет

View File

@ -6,7 +6,6 @@ module XMLRPC
case case
when args.first == 'get_status' when args.first == 'get_status'
{'client_count' => 1, 'count_new_task' => 2, 'count_build_task' => 3} {'client_count' => 1, 'count_new_task' => 2, 'count_build_task' => 3}
# raise Timeout::Error
else; 0 else; 0
end end
end end

View File

@ -2,8 +2,6 @@ require 'spec_helper'
describe BuildListsController do describe BuildListsController do
context 'crud' do context 'crud' do
# let(:build_list) { Factory(:build_list) }
context 'for guest' do context 'for guest' do
it 'should not be able to perform all action' do it 'should not be able to perform all action' do
get :all get :all
@ -24,10 +22,37 @@ describe BuildListsController do
before(:each) { set_session_for Factory(:admin) } before(:each) { set_session_for Factory(:admin) }
it "should be able to perform all action without exception" do it "should be able to perform all action without exception" do
any_instance_of(XMLRPC::Client) do |xml_rpc|
stub(xml_rpc).call do |args|
raise Timeout::Error
end
end
get :all get :all
assigns[:build_server_status].should == {} # TODO stub to isolate assigns[:build_server_status].should == {}
response.should be_success response.should be_success
end end
end
end
context 'filter' do
let(:build_list1) { Factory(:build_list_core) }
let(:build_list2) { Factory(:build_list_core) }
let(:build_list3) { Factory(:build_list_core) }
before(:each) { set_session_for Factory(:admin) }
it 'should filter by bs_id' do
get :all, :filter => {:bs_id => build_list1.bs_id, :project_name => 'fdsfdf', :any_other_field => 'do not matter'}
assigns[:build_lists].should include(build_list1)
assigns[:build_lists].should_not include(build_list2)
assigns[:build_lists].should_not include(build_list3)
end
it 'should filter by project_name' do
# Project.where(:id => build_list2.project.id).update_all(:name => 'project_name')
get :all, :filter => {:project_name => build_list2.project.name}
assigns[:build_lists].should_not include(build_list1)
assigns[:build_lists].should include(build_list2)
assigns[:build_lists].should_not include(build_list3)
end end
end end

View File

@ -6,4 +6,8 @@ Factory.define(:build_list) do |p|
p.project_version "1.0" p.project_version "1.0"
p.build_requires true p.build_requires true
p.update_type 'security' p.update_type 'security'
end end
Factory.define(:build_list_core, :parent => :build_list) do |p|
p.bs_id { Factory.next(:integer) }
end