[#74] Merge branch 'master' into 65-build_repo
Conflicts: app/controllers/build_lists_controller.rb app/controllers/projects_controller.rb db/schema.rb
This commit is contained in:
commit
e588482f32
|
@ -3,46 +3,33 @@ class BuildListsController < ApplicationController
|
|||
|
||||
before_filter :authenticate_user!, :except => CALLBACK_ACTIONS
|
||||
before_filter :authenticate_build_service!, :only => CALLBACK_ACTIONS
|
||||
before_filter :find_project, :only => [:index, :filter, :show, :publish, :new, :create]
|
||||
before_filter :find_arches, :only => [:index, :filter, :all]
|
||||
before_filter :find_project_versions, :only => [:index, :filter]
|
||||
before_filter :find_project, :only => [:filter, :show, :publish, :new, :create]
|
||||
before_filter :find_arches, :only => [:index]
|
||||
before_filter :find_build_list_by_bs, :only => [:status_build, :pre_build, :post_build]
|
||||
|
||||
# load_and_authorize_resource :project, :except => CALLBACK_ACTIONS
|
||||
# load_and_authorize_resource :build_list, :through => :project, :shallow => true, :except => CALLBACK_ACTIONS
|
||||
load_and_authorize_resource :except => CALLBACK_ACTIONS
|
||||
load_and_authorize_resource :project, :only => :index
|
||||
load_and_authorize_resource :through => :project, :only => :index, :shallow => true
|
||||
load_and_authorize_resource :except => CALLBACK_ACTIONS.concat([:index])
|
||||
|
||||
def all
|
||||
if params[:filter]
|
||||
@filter = BuildList::Filter.new(nil, params[:filter])
|
||||
@build_lists = @filter.find.paginate :page => params[:page]
|
||||
def index
|
||||
filter_params = params[:filter] || {}
|
||||
if params[:project_id]
|
||||
find_project
|
||||
find_project_versions
|
||||
@action_url = project_build_lists_path(@project)
|
||||
else
|
||||
@filter = BuildList::Filter.new(nil)
|
||||
@build_lists = BuildList.recent.paginate :page => params[:page]
|
||||
@project = nil
|
||||
@action_url = build_lists_path
|
||||
end
|
||||
@action_url = all_build_lists_path
|
||||
|
||||
@filter = BuildList::Filter.new(@project, filter_params)
|
||||
@build_lists = @filter.find.accessible_by(current_ability).recent.paginate :page => params[:page]
|
||||
|
||||
@build_server_status = begin
|
||||
BuildServer.get_status
|
||||
rescue Exception # Timeout::Error
|
||||
{}
|
||||
end
|
||||
|
||||
render :action => 'index'
|
||||
end
|
||||
|
||||
def index
|
||||
@build_lists = @project.build_lists.recent.paginate :page => params[:page]
|
||||
@filter = BuildList::Filter.new(@project)
|
||||
@action_url = project_build_lists_path(@project)
|
||||
end
|
||||
|
||||
def filter
|
||||
@filter = BuildList::Filter.new(@project, params[:filter])
|
||||
@build_lists = @filter.find.paginate :page => params[:page]
|
||||
@action_url = project_build_lists_path(@project)
|
||||
|
||||
render :action => "index"
|
||||
end
|
||||
|
||||
def show
|
||||
|
|
|
@ -10,7 +10,7 @@ class PlatformsController < ApplicationController
|
|||
def build_all
|
||||
@platform.repositories.each do |repository|
|
||||
repository.projects.each do |project|
|
||||
project.delay.build_for(@platform)
|
||||
project.delay.build_for(@platform, current_user)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -45,9 +45,13 @@ class Ability
|
|||
can :publish, BuildList do |build_list|
|
||||
build_list.can_published? && build_list.project.relations.exists?(:object_type => 'User', :object_id => user.id)
|
||||
end
|
||||
can :read, BuildList do |build_list|
|
||||
build_list.project.public? || build_list.project.relations.exists?(:object_type => 'User', :object_id => user.id)
|
||||
can [:index, :read], BuildList, ["build_lists.project_id IN (SELECT id FROM projects WHERE visibility = ?)", 'open'] do |build_list|
|
||||
build_list.project.public?
|
||||
end
|
||||
can [:index, :read], BuildList, build_lists_in_relations_with(:object_type => 'User', :object_id => user.id) do |build_list|
|
||||
build_list.project.relations.exists?(:object_type => 'User', :object_id => user.id)
|
||||
end
|
||||
|
||||
can [:read, :create], PrivateUser, :platform => {:owner_type => 'User', :owner_id => user.id}
|
||||
|
||||
# If rule has multiple conditions CanCan joins them by 'AND' sql operator
|
||||
|
@ -104,8 +108,8 @@ class Ability
|
|||
can :publish, BuildList do |build_list|
|
||||
build_list.can_published? && build_list.project.relations.exists?(:object_type => 'Group', :object_id => user.group_ids)
|
||||
end
|
||||
can :read, BuildList do |build_list|
|
||||
build_list.project.public? || build_list.project.relations.exists?(:object_type => 'Group', :object_id => user.group_ids)
|
||||
can [:index, :read], BuildList, build_lists_in_relations_with(:object_type => 'Group', :object_id => user.group_ids) do |build_list|
|
||||
build_list.project.relations.exists?(:object_type => 'Group', :object_id => user.group_ids)
|
||||
end
|
||||
|
||||
can :manage_collaborators, Project, projects_in_relations_with(:role => 'admin', :object_type => 'Group', :object_id => user.group_ids) do |project|
|
||||
|
@ -162,6 +166,16 @@ class Ability
|
|||
end
|
||||
end
|
||||
|
||||
def build_lists_in_relations_with(opts)
|
||||
query = "build_lists.project_id IN (SELECT target_id FROM relations WHERE relations.target_type = 'Project'"
|
||||
opts.each do |key, value|
|
||||
query = query + " AND relations.#{ key } #{ value.class == Array ? 'IN (?)' : '= ?' } "
|
||||
end
|
||||
query = query + ")"
|
||||
|
||||
return opts.values.unshift query
|
||||
end
|
||||
|
||||
## Sub query for project relations
|
||||
#def projects_in_relations_with(opts={})
|
||||
# ["projects.id IN (SELECT target_id FROM relations WHERE relations.object_id #{ opts[:object_id].class == Array ? 'IN (?)' : '= ?' } AND relations.object_type = '#{ opts[:object_type] }' AND relations.target_type = 'Platform') AND relations.role", opts[:object_id]]
|
||||
|
|
|
@ -3,6 +3,7 @@ class BuildList < ActiveRecord::Base
|
|||
belongs_to :arch
|
||||
belongs_to :pl, :class_name => 'Platform'
|
||||
belongs_to :bpl, :class_name => 'Platform'
|
||||
belongs_to :user
|
||||
has_many :items, :class_name => "BuildList::Item", :dependent => :destroy
|
||||
|
||||
validates :project_id, :project_version, :arch, :include_repos, :presence => true
|
||||
|
|
|
@ -48,7 +48,7 @@ class Project < ActiveRecord::Base
|
|||
end
|
||||
end
|
||||
|
||||
def build_for(platform)
|
||||
def build_for(platform, user)
|
||||
build_lists.create do |bl|
|
||||
bl.pl = platform
|
||||
bl.bpl = platform
|
||||
|
@ -56,6 +56,7 @@ class Project < ActiveRecord::Base
|
|||
bl.arch = Arch.find_by_name('i586')
|
||||
bl.project_version = "latest_#{platform.name}"
|
||||
bl.build_requires = false # already set as db default
|
||||
bl.user = user
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -38,6 +38,9 @@ class User < ActiveRecord::Base
|
|||
self.id.blank? # persisted?
|
||||
end
|
||||
|
||||
def fullname
|
||||
return "#{uname} (#{name})"
|
||||
end
|
||||
class << self
|
||||
def find_for_database_authentication(warden_conditions)
|
||||
conditions = warden_conditions.dup
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
%th= t("activerecord.attributes.build_list.project_version")
|
||||
%th= t("activerecord.attributes.build_list.project")
|
||||
%th= t("activerecord.attributes.build_list.arch")
|
||||
%th= t("activerecord.attributes.build_list.user")
|
||||
%th= t("activerecord.attributes.build_list.is_circle")
|
||||
- if controller.action_name = 'all'
|
||||
%th= t("layout.build_lists.cancel_button_header")
|
||||
|
@ -17,9 +18,10 @@
|
|||
%td= link_to build_list.project_version, "#"
|
||||
%td= link_to build_list.project.name, project_path(build_list.project)
|
||||
%td= build_list.arch.name
|
||||
%td= build_list.user.fullname
|
||||
%td= t("layout.#{build_list.is_circle?}_")
|
||||
- if controller.action_name = 'all'
|
||||
%td= link_to t("layout.build_lists.cancel_button"), build_list_cancel_path(build_list) if build_list.can_cancel?
|
||||
%td.last= build_list.notified_at
|
||||
|
||||
= will_paginate build_lists
|
||||
= will_paginate build_lists
|
||||
|
|
|
@ -47,4 +47,4 @@
|
|||
.group.navform.wat-cf
|
||||
%button.button{ :type => "submit" }
|
||||
= image_tag("web-app-theme/icons/tick.png", :alt => "Save")
|
||||
= t("layout.search")
|
||||
= t("layout.search")
|
||||
|
|
|
@ -69,6 +69,11 @@
|
|||
= t("activerecord.attributes.build_list.arch")
|
||||
\:
|
||||
= @build_list.arch.name
|
||||
%p
|
||||
%b
|
||||
= t("activerecord.attributes.build_list.user")
|
||||
\:
|
||||
= @build_list.user.fullname
|
||||
%p
|
||||
%b
|
||||
= t("activerecord.attributes.build_list.notified_at")
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
%a{:href => event_logs_path}= t("layout.menu.event_logs")
|
||||
-if can? :index, BuildList
|
||||
%li{:class => controller.controller_path == 'build_lists' ? 'active' : '' }
|
||||
%a{:href => all_build_lists_path}= t("layout.menu.build_lists")
|
||||
%a{:href => build_lists_path}= t("layout.menu.build_lists")
|
||||
-if can? :platforms, Category
|
||||
%li{:class => controller.controller_path == 'categories' ? 'active' : '' }
|
||||
%a{:href => catalogs_path}= t("layout.menu.categories")
|
||||
|
|
|
@ -599,6 +599,7 @@ ru:
|
|||
update_type: Критичность обновления
|
||||
build_requires: Пересборка с зависимостями
|
||||
project_version: Версия
|
||||
user: Пользователь
|
||||
|
||||
build_list/item:
|
||||
name: Название
|
||||
|
|
|
@ -24,8 +24,25 @@ Rosa::Application.routes.draw do
|
|||
|
||||
match '/private/:platform_name/*file_path' => 'privates#show'
|
||||
|
||||
match 'build_lists/' => 'build_lists#all', :as => :all_build_lists
|
||||
match 'build_lists/:id/cancel/' => 'build_lists#cancel', :as => :build_list_cancel
|
||||
# match 'build_lists/' => 'build_lists#index', :as => :all_build_lists
|
||||
# match 'build_lists/:id/cancel/' => 'build_lists#cancel', :as => :build_list_cancel
|
||||
# match 'build_lists/status_build', :to => "build_lists#status_build"
|
||||
# match 'build_lists/post_build', :to => "build_lists#post_build"
|
||||
# match 'build_lists/pre_build', :to => "build_lists#pre_build"
|
||||
# match 'build_lists/circle_build', :to => "build_lists#circle_build"
|
||||
# match 'build_lists/new_bbdt', :to => "build_lists#new_bbdt"
|
||||
|
||||
|
||||
resources :build_lists, :only => [:index, :cancel, :status_build, :post_build, :pre_build, :circle_build, :new_bbdt] do
|
||||
member do
|
||||
get :cancel
|
||||
get :status_build
|
||||
get :post_build
|
||||
get :pre_build
|
||||
get :circle_build
|
||||
get :new_bbdt
|
||||
end
|
||||
end
|
||||
|
||||
resources :auto_build_lists, :only => [:index, :create, :destroy]
|
||||
|
||||
|
@ -131,12 +148,6 @@ Rosa::Application.routes.draw do
|
|||
|
||||
match '/catalogs', :to => 'categories#platforms', :as => :catalogs
|
||||
|
||||
match 'build_lists/status_build', :to => "build_lists#status_build"
|
||||
match 'build_lists/post_build', :to => "build_lists#post_build"
|
||||
match 'build_lists/pre_build', :to => "build_lists#pre_build"
|
||||
match 'build_lists/circle_build', :to => "build_lists#circle_build"
|
||||
match 'build_lists/new_bbdt', :to => "build_lists#new_bbdt"
|
||||
|
||||
match 'product_status', :to => 'product_build_lists#status_build'
|
||||
|
||||
# Tree
|
||||
|
|
|
@ -7,6 +7,11 @@ describe BuildListsController do
|
|||
get :show, @show_params
|
||||
response.should be_success
|
||||
end
|
||||
|
||||
it 'should be able to perform index action in project scope' do
|
||||
get :index, :project_id => @project.id
|
||||
response.should be_success
|
||||
end
|
||||
end
|
||||
|
||||
shared_examples_for 'not show build list' do
|
||||
|
@ -14,12 +19,17 @@ describe BuildListsController do
|
|||
get :show, @show_params
|
||||
response.should redirect_to(forbidden_url)
|
||||
end
|
||||
|
||||
it 'should not be able to perform index action in project scope' do
|
||||
get :index, :project_id => @project.id
|
||||
response.should redirect_to(forbidden_url)
|
||||
end
|
||||
end
|
||||
|
||||
context 'crud' do
|
||||
context 'for guest' do
|
||||
it 'should not be able to perform all action' do
|
||||
get :all
|
||||
it 'should not be able to perform index action' do
|
||||
get :index
|
||||
response.should redirect_to(new_user_session_path)
|
||||
end
|
||||
end
|
||||
|
@ -37,11 +47,31 @@ describe BuildListsController do
|
|||
@user = Factory(:user)
|
||||
set_session_for(@user)
|
||||
@show_params = {:project_id => @project.id, :id => @build_list.id}
|
||||
|
||||
end
|
||||
|
||||
it 'should not be able to perform all action' do
|
||||
get :all
|
||||
response.should redirect_to(forbidden_url)
|
||||
context 'for all build lists' do
|
||||
before(:each) do
|
||||
@build_list1 = Factory(:build_list_core)
|
||||
@build_list2 = Factory(:build_list_core, :project => Factory(:project, :visibility => 'hidden'))
|
||||
@build_list3 = Factory(:build_list_core, :project => Factory(:project, :owner => @user, :visibility => 'hidden'))
|
||||
b = Factory(:build_list_core, :project => Factory(:project, :visibility => 'hidden'))
|
||||
b.project.relations.create :role => 'reader', :object_id => @user.id, :object_type => 'User'
|
||||
@build_list4 = b
|
||||
end
|
||||
|
||||
it 'should be able to perform index action' do
|
||||
get :index
|
||||
response.should be_success
|
||||
end
|
||||
|
||||
it 'should show only accessible build_lists' do
|
||||
get :index
|
||||
assigns(:build_lists).should include(@build_list1)
|
||||
assigns(:build_lists).should_not include(@build_list2)
|
||||
assigns(:build_lists).should include(@build_list3)
|
||||
assigns(:build_lists).should include(@build_list4)
|
||||
end
|
||||
end
|
||||
|
||||
context 'for open project' do
|
||||
|
@ -52,7 +82,7 @@ describe BuildListsController do
|
|||
it_should_behave_like 'show build list'
|
||||
end
|
||||
|
||||
context 'if user is project owner' do
|
||||
context 'if user is project member' do
|
||||
before(:each) {set_session_for(@member_user)}
|
||||
it_should_behave_like 'show build list'
|
||||
end
|
||||
|
@ -71,7 +101,89 @@ describe BuildListsController do
|
|||
it_should_behave_like 'show build list'
|
||||
end
|
||||
|
||||
context 'if user is project owner' do
|
||||
context 'if user is project member' do
|
||||
before(:each) {set_session_for(@member_user)}
|
||||
it_should_behave_like 'show build list'
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
context 'for group' do
|
||||
before(:each) do
|
||||
stub_rsync_methods
|
||||
@owner_group = Factory(:group)
|
||||
@owner_user = Factory(:user)
|
||||
@owner_group.objects.create :role => 'reader', :object_id => @owner_user.id, :object_type => 'User'
|
||||
@member_group = Factory(:group)
|
||||
@member_user = Factory(:user)
|
||||
@member_group.objects.create :role => 'reader', :object_id => @member_user.id, :object_type => 'User'
|
||||
|
||||
@group = Factory(:group)
|
||||
@user = Factory(:user)
|
||||
@group.objects.create :role => 'reader', :object_id => @user.id, :object_type => 'User'
|
||||
|
||||
@project = Factory(:project, :owner => @owner_group)
|
||||
@project.relations.create :role => 'reader', :object_id => @member_group.id, :object_type => 'Group'
|
||||
|
||||
@build_list = Factory(:build_list_core, :project => @project)
|
||||
|
||||
set_session_for(@user)
|
||||
@show_params = {:project_id => @project.id, :id => @build_list.id}
|
||||
end
|
||||
|
||||
context 'for all build lists' do
|
||||
before(:each) do
|
||||
@build_list1 = Factory(:build_list_core)
|
||||
@build_list2 = Factory(:build_list_core, :project => Factory(:project, :visibility => 'hidden'))
|
||||
@build_list3 = Factory(:build_list_core, :project => Factory(:project, :owner => @group, :visibility => 'hidden'))
|
||||
b = Factory(:build_list_core, :project => Factory(:project, :visibility => 'hidden'))
|
||||
b.project.relations.create :role => 'reader', :object_id => @group.id, :object_type => 'Group'
|
||||
@build_list4 = b
|
||||
end
|
||||
|
||||
it 'should be able to perform index action' do
|
||||
get :index
|
||||
response.should be_success
|
||||
end
|
||||
|
||||
it 'should show only accessible build_lists' do
|
||||
get :index
|
||||
assigns(:build_lists).should include(@build_list1)
|
||||
assigns(:build_lists).should_not include(@build_list2)
|
||||
assigns(:build_lists).should include(@build_list3)
|
||||
assigns(:build_lists).should include(@build_list4)
|
||||
end
|
||||
end
|
||||
|
||||
context 'for open project' do
|
||||
it_should_behave_like 'show build list'
|
||||
|
||||
context 'if user is group owner' do
|
||||
before(:each) {set_session_for(@owner_user)}
|
||||
it_should_behave_like 'show build list'
|
||||
end
|
||||
|
||||
context 'if user is group member' do
|
||||
before(:each) {set_session_for(@member_user)}
|
||||
it_should_behave_like 'show build list'
|
||||
end
|
||||
end
|
||||
|
||||
context 'for hidden project' do
|
||||
before(:each) do
|
||||
@project.visibility = 'hidden'
|
||||
@project.save
|
||||
end
|
||||
|
||||
it_should_behave_like 'not show build list'
|
||||
|
||||
context 'if user is group owner' do
|
||||
before(:each) {set_session_for(@owner_user)}
|
||||
it_should_behave_like 'show build list'
|
||||
end
|
||||
|
||||
context 'if user is group member' do
|
||||
before(:each) {set_session_for(@member_user)}
|
||||
it_should_behave_like 'show build list'
|
||||
end
|
||||
|
@ -82,13 +194,13 @@ describe BuildListsController do
|
|||
context 'for admin' do
|
||||
before(:each) { set_session_for Factory(:admin) }
|
||||
|
||||
it "should be able to perform all action without exception" do
|
||||
it "should be able to perform index 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 :index
|
||||
assigns[:build_server_status].should == {}
|
||||
response.should be_success
|
||||
end
|
||||
|
@ -100,46 +212,39 @@ describe BuildListsController do
|
|||
before(:each) do
|
||||
stub_rsync_methods
|
||||
set_session_for Factory(:admin)
|
||||
end
|
||||
|
||||
let(:build_list1) { Factory(:build_list_core) }
|
||||
let(:build_list2) { Factory(:build_list_core) }
|
||||
let(:build_list3) { Factory(:build_list_core) }
|
||||
let(:build_list4) do
|
||||
b = Factory(:build_list_core)
|
||||
b.created_at = b.created_at - 1.day
|
||||
b.project = build_list3.project
|
||||
b.pl = build_list3.pl
|
||||
b.arch = build_list3.arch
|
||||
b.save
|
||||
b
|
||||
|
||||
@build_list1 = Factory(:build_list_core)
|
||||
@build_list2 = Factory(:build_list_core)
|
||||
@build_list3 = Factory(:build_list_core)
|
||||
@build_list4 = Factory(:build_list_core, :created_at => (Time.now - 1.day),
|
||||
:project => @build_list3.project, :pl => @build_list3.pl,
|
||||
:arch => @build_list3.arch)
|
||||
end
|
||||
before(:each) { set_session_for Factory(:admin); stub_rsync_methods; }
|
||||
|
||||
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)
|
||||
get :index, :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)
|
||||
get :index, :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
|
||||
|
||||
it 'should filter by project_name and start_date' do
|
||||
get :all, :filter => {:project_name => build_list3.project.name,
|
||||
"created_at_start(1i)"=>build_list3.created_at.year.to_s,
|
||||
"created_at_start(2i)"=>build_list3.created_at.month.to_s,
|
||||
"created_at_start(3i)"=>build_list3.created_at.day.to_s}
|
||||
assigns[:build_lists].should_not include(build_list1)
|
||||
assigns[:build_lists].should_not include(build_list2)
|
||||
assigns[:build_lists].should include(build_list3)
|
||||
assigns[:build_lists].should_not include(build_list4)
|
||||
get :index, :filter => {:project_name => @build_list3.project.name,
|
||||
"created_at_start(1i)" => @build_list3.created_at.year.to_s,
|
||||
"created_at_start(2i)" => @build_list3.created_at.month.to_s,
|
||||
"created_at_start(3i)" => @build_list3.created_at.day.to_s}
|
||||
assigns[:build_lists].should_not include(@build_list1)
|
||||
assigns[:build_lists].should_not include(@build_list2)
|
||||
assigns[:build_lists].should include(@build_list3)
|
||||
assigns[:build_lists].should_not include(@build_list4)
|
||||
# response.should be_success
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue