Merge pull request #359 from warpc/344-fix_products_monitoring
[Refs #344] global products monitoring
This commit is contained in:
commit
e16d825120
|
@ -4,6 +4,7 @@ class ProductBuildListsController < ApplicationController
|
||||||
load_and_authorize_resource :platform, :only => [:create, :destroy]
|
load_and_authorize_resource :platform, :only => [:create, :destroy]
|
||||||
load_and_authorize_resource :product, :through => :platform, :only => [:create, :destroy]
|
load_and_authorize_resource :product, :through => :platform, :only => [:create, :destroy]
|
||||||
load_and_authorize_resource :product_build_list, :through => :product, :only => [:create, :destroy]
|
load_and_authorize_resource :product_build_list, :through => :product, :only => [:create, :destroy]
|
||||||
|
load_and_authorize_resource :only => [:index]
|
||||||
|
|
||||||
before_filter :authenticate_product_builder!, :only => [:status_build]
|
before_filter :authenticate_product_builder!, :only => [:status_build]
|
||||||
before_filter :find_product_build_list, :only => [:status_build]
|
before_filter :find_product_build_list, :only => [:status_build]
|
||||||
|
@ -27,6 +28,26 @@ class ProductBuildListsController < ApplicationController
|
||||||
redirect_to [@platform, @product]
|
redirect_to [@platform, @product]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# def index
|
||||||
|
# @product_build_lists = ProductBuildList.paginate :page => params[:page]
|
||||||
|
# end
|
||||||
|
|
||||||
|
def search
|
||||||
|
new_params = {:filter => {}}
|
||||||
|
params[:filter].each do |k,v|
|
||||||
|
new_params[:filter][k] = v unless v.empty?
|
||||||
|
end
|
||||||
|
#redirect_to @product ? product_build_lists_path(@product, new_params) : product_build_lists_path(new_params)
|
||||||
|
redirect_to product_build_lists_path(new_params)
|
||||||
|
end
|
||||||
|
|
||||||
|
def index
|
||||||
|
#@action_url = @product ? search_product_build_lists_path(@product) : search_build_lists_path
|
||||||
|
@action_url = search_product_build_lists_path
|
||||||
|
@filter = ProductBuildList::Filter.new(@product, current_user, params[:filter] || {})
|
||||||
|
@product_build_lists = @filter.find.recent.paginate :page => params[:page]
|
||||||
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def find_product_build_list
|
def find_product_build_list
|
||||||
|
|
|
@ -4,12 +4,26 @@ class ProductBuildList < ActiveRecord::Base
|
||||||
BUILD_COMPLETED = 0
|
BUILD_COMPLETED = 0
|
||||||
BUILD_FAILED = 1
|
BUILD_FAILED = 1
|
||||||
|
|
||||||
|
STATUSES = [ BUILD_STARTED,
|
||||||
|
BUILD_COMPLETED,
|
||||||
|
BUILD_FAILED
|
||||||
|
]
|
||||||
|
|
||||||
|
HUMAN_STATUSES = { BUILD_STARTED => :build_started,
|
||||||
|
BUILD_COMPLETED => :build_completed,
|
||||||
|
BUILD_FAILED => :build_failed
|
||||||
|
}
|
||||||
|
|
||||||
belongs_to :product
|
belongs_to :product
|
||||||
|
|
||||||
validates :product, :status, :presence => true
|
validates :product, :status, :presence => true
|
||||||
validates :status, :inclusion => { :in => [BUILD_STARTED, BUILD_COMPLETED, BUILD_FAILED] }
|
validates :status, :inclusion => { :in => [BUILD_STARTED, BUILD_COMPLETED, BUILD_FAILED] }
|
||||||
|
|
||||||
scope :default_order, order('notified_at DESC')
|
scope :default_order, order('notified_at DESC')
|
||||||
|
scope :for_status, lambda {|status| where(:status => status) }
|
||||||
|
scope :for_user, lambda { |user| where(:user_id => user.id) }
|
||||||
|
scope :scoped_to_product_name, lambda {|product_name| joins(:product).where('products.name LIKE ?', "%#{product_name}%")}
|
||||||
|
scope :recent, order("#{table_name}.updated_at DESC")
|
||||||
|
|
||||||
attr_accessor :base_url
|
attr_accessor :base_url
|
||||||
|
|
||||||
|
@ -20,14 +34,22 @@ class ProductBuildList < ActiveRecord::Base
|
||||||
"/downloads/#{product.platform.name}/product/#{id}/"
|
"/downloads/#{product.platform.name}/product/#{id}/"
|
||||||
end
|
end
|
||||||
|
|
||||||
def human_status
|
# def human_status
|
||||||
I18n.t("layout.product_build_lists.statuses.#{status}")
|
# I18n.t("layout.product_build_lists.statuses.#{status}")
|
||||||
end
|
# end
|
||||||
|
|
||||||
def event_log_message
|
def event_log_message
|
||||||
{:product => product.name}.inspect
|
{:product => product.name}.inspect
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.human_status(status)
|
||||||
|
I18n.t("layout.product_build_lists.statuses.#{HUMAN_STATUSES[status]}")
|
||||||
|
end
|
||||||
|
|
||||||
|
def human_status
|
||||||
|
self.class.human_status(status)
|
||||||
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def xml_rpc_create
|
def xml_rpc_create
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
# -*- encoding : utf-8 -*-
|
||||||
|
class ProductBuildList::Filter
|
||||||
|
def initialize(product, user, options = {})
|
||||||
|
@product = product
|
||||||
|
@user = user
|
||||||
|
set_options(options)
|
||||||
|
end
|
||||||
|
|
||||||
|
def find
|
||||||
|
product_build_lists = @product ? @product.product_build_lists : ProductBuildList.scoped
|
||||||
|
|
||||||
|
if @options[:id]
|
||||||
|
product_build_lists = product_build_lists.where(:id => @options[:id])
|
||||||
|
else
|
||||||
|
product_build_lists = product_build_lists.accessible_by(::Ability.new(@user), @options[:ownership].to_sym) if @options[:ownership]
|
||||||
|
product_build_lists = product_build_lists.for_status(@options[:status]) if @options[:status]
|
||||||
|
product_build_lists = product_build_lists.scoped_to_product_name(@options[:product_name]) if @options[:product_name]
|
||||||
|
end
|
||||||
|
|
||||||
|
product_build_lists
|
||||||
|
end
|
||||||
|
|
||||||
|
def respond_to?(name)
|
||||||
|
return true if @options.has_key?(name)
|
||||||
|
super
|
||||||
|
end
|
||||||
|
|
||||||
|
def method_missing(name, *args, &block)
|
||||||
|
@options.has_key?(name) ? @options[name] : super
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_options(options)
|
||||||
|
@options = HashWithIndifferentAccess.new(options.reverse_merge({
|
||||||
|
:ownership => nil,
|
||||||
|
:status => nil,
|
||||||
|
:id => nil,
|
||||||
|
:product_name => nil
|
||||||
|
}))
|
||||||
|
|
||||||
|
@options[:ownership] = @options[:ownership].presence || (@product ? 'index' : 'owned')
|
||||||
|
@options[:status] = @options[:status].present? ? @options[:status].to_i : nil
|
||||||
|
@options[:id] = @options[:id].presence
|
||||||
|
@options[:product_name] = @options[:product_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.month).to_i,
|
||||||
|
# (params["#{field_name}(3i)"].presence || Date.today.day).to_i)
|
||||||
|
# else
|
||||||
|
# nil
|
||||||
|
# end
|
||||||
|
#end
|
||||||
|
end
|
|
@ -8,4 +8,4 @@
|
||||||
%nav
|
%nav
|
||||||
%ul
|
%ul
|
||||||
%li= link_to t('layout.projects.list_header'), build_lists_path, :class => (params[:controller] == 'build_lists' ? 'active' : nil)
|
%li= link_to t('layout.projects.list_header'), build_lists_path, :class => (params[:controller] == 'build_lists' ? 'active' : nil)
|
||||||
%li= link_to t('layout.products.list_header'), '#'
|
%li= link_to t('layout.products.list_header'), product_build_lists_path, :class => (params[:controller] == 'product_build_lists' ? 'active' : nil)
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
- content_for :sidebar do
|
||||||
|
= form_for :filter, :url => @action_url, :html => { :method => :post, :class => :form } do |f|
|
||||||
|
.bordered.nopadding
|
||||||
|
%h3= t("layout.product_build_lists.ownership.header")
|
||||||
|
.table
|
||||||
|
.lefter= f.radio_button :ownership, 'owned', :class => 'niceRadio', :id => 'myradio1'
|
||||||
|
.lefter= t("layout.product_build_lists.ownership.owned")
|
||||||
|
.both
|
||||||
|
- unless @product
|
||||||
|
.table
|
||||||
|
.lefter= f.radio_button :ownership, 'related', :class => 'niceRadio', :id => 'myradio2'
|
||||||
|
.lefter= t("layout.product_build_lists.ownership.related")
|
||||||
|
.both
|
||||||
|
.table
|
||||||
|
.lefter= f.radio_button :ownership, 'index', :class => 'niceRadio', :id => 'myradio3'
|
||||||
|
.lefter= t("layout.product_build_lists.ownership.index")
|
||||||
|
.both
|
||||||
|
%br
|
||||||
|
= f.submit t("layout.search.header")
|
||||||
|
.block
|
||||||
|
%h3.small= t("activerecord.attributes.product_build_list.status")
|
||||||
|
.lineForm.aside= f.select :status, ProductBuildList::STATUSES.collect{|status| [ProductBuildList.human_status(status), status]}, {:include_blank => true, :selected => @filter.status}, {:class => 'sel80 aside', :id => 'status', :tabindex => 2}
|
||||||
|
%h3.small= t("layout.product_build_lists.product_name_search")
|
||||||
|
= f.text_field :product_name
|
||||||
|
%h3.small= t("layout.product_build_lists.id_search")
|
||||||
|
= f.text_field :id
|
||||||
|
%br
|
||||||
|
%br
|
||||||
|
= f.submit t("layout.search.header")
|
|
@ -2,5 +2,7 @@
|
||||||
%td= product_build_list.id
|
%td= product_build_list.id
|
||||||
%td= product_build_list.human_status
|
%td= product_build_list.human_status
|
||||||
%td= link_to nil, product_build_list.container_path
|
%td= link_to nil, product_build_list.container_path
|
||||||
|
%td= link_to product_build_list.product.name, platform_product_path(product_build_list.product.platform, product_build_list.product)
|
||||||
|
-#%td= link_to product_build_list.user.try(:fullname), product_build_list.user
|
||||||
%td= link_to image_tag('x.png'), platform_product_product_build_list_path(product_build_list.product.platform, product_build_list.product, product_build_list), :method => :delete, :confirm => t("layout.confirm") if can? :destroy, product_build_list
|
%td= link_to image_tag('x.png'), platform_product_product_build_list_path(product_build_list.product.platform, product_build_list.product, product_build_list), :method => :delete, :confirm => t("layout.confirm") if can? :destroy, product_build_list
|
||||||
%td= l(product_build_list.notified_at, :format => :long)
|
%td= l(product_build_list.notified_at, :format => :long)
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
/ #myTable
|
||||||
|
%table.tablesorter{:cellpadding => "0", :cellspacing => "0"}
|
||||||
|
%thead
|
||||||
|
%tr
|
||||||
|
-#%th.lpadding16= t("activerecord.attributes.product_build_list.bs_id")
|
||||||
|
%th.lpadding16= t("activerecord.attributes.product_build_list.id")
|
||||||
|
%th.lpadding16= t("activerecord.attributes.product_build_list.status")
|
||||||
|
%th.lpadding16= t("activerecord.attributes.product_build_list.container_path")
|
||||||
|
%th.lpadding16= t("activerecord.attributes.product_build_list.product")
|
||||||
|
-#%th.lpadding16= t("activerecord.attributes.product_build_list.user")
|
||||||
|
%th= t("layout.product_build_lists.action")
|
||||||
|
%th.lpadding16= t("activerecord.attributes.product_build_list.notified_at")
|
||||||
|
%tbody= render @product_build_lists
|
||||||
|
.both
|
||||||
|
|
||||||
|
= will_paginate @product_build_lists
|
||||||
|
|
||||||
|
= render 'product_build_lists/filter'
|
||||||
|
= render @product ? 'products/submenu' : 'build_lists/submenu'
|
|
@ -23,6 +23,7 @@
|
||||||
%th= t("activerecord.attributes.product_build_list.id")
|
%th= t("activerecord.attributes.product_build_list.id")
|
||||||
%th= t("activerecord.attributes.product_build_list.status")
|
%th= t("activerecord.attributes.product_build_list.status")
|
||||||
%th= t("activerecord.attributes.product_build_list.container_path")
|
%th= t("activerecord.attributes.product_build_list.container_path")
|
||||||
|
%th= t("layout.product_build_lists.product")
|
||||||
%th= t("layout.product_build_lists.action")
|
%th= t("layout.product_build_lists.action")
|
||||||
%th= t("activerecord.attributes.product_build_list.notified_at")
|
%th= t("activerecord.attributes.product_build_list.notified_at")
|
||||||
%tbody= render @product.product_build_lists.default_order
|
%tbody= render @product.product_build_lists.default_order
|
||||||
|
|
|
@ -120,14 +120,6 @@ en:
|
||||||
branches: Branches
|
branches: Branches
|
||||||
project_versions: Versions
|
project_versions: Versions
|
||||||
|
|
||||||
product_build_lists:
|
|
||||||
delete: Delete
|
|
||||||
action: Action
|
|
||||||
statuses:
|
|
||||||
'0': 'build'
|
|
||||||
'1': 'build error'
|
|
||||||
'2': 'build in progress'
|
|
||||||
|
|
||||||
flash:
|
flash:
|
||||||
settings:
|
settings:
|
||||||
saved: Settings saved success
|
saved: Settings saved success
|
||||||
|
@ -223,13 +215,6 @@ en:
|
||||||
created_at: Created
|
created_at: Created
|
||||||
updated_at: Updated
|
updated_at: Updated
|
||||||
|
|
||||||
product_build_list:
|
|
||||||
id: Id
|
|
||||||
product: Product
|
|
||||||
container_path: Container
|
|
||||||
status: Status
|
|
||||||
notified_at: Notified at
|
|
||||||
|
|
||||||
download:
|
download:
|
||||||
name: Name
|
name: Name
|
||||||
version: Version
|
version: Version
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
en:
|
||||||
|
layout:
|
||||||
|
product_build_lists:
|
||||||
|
delete: Delete
|
||||||
|
action: Action
|
||||||
|
id_search: 'Id search'
|
||||||
|
statuses:
|
||||||
|
'0': 'build'
|
||||||
|
'1': 'build error'
|
||||||
|
'2': 'build in progress'
|
||||||
|
build_failed: Build failed
|
||||||
|
build_started: Build in progress
|
||||||
|
build_completed: Build
|
||||||
|
|
||||||
|
ownership:
|
||||||
|
header: Build list ownership
|
||||||
|
owned: My
|
||||||
|
related: Related
|
||||||
|
index: All
|
||||||
|
|
||||||
|
activerecord:
|
||||||
|
attributes:
|
||||||
|
product_build_list:
|
||||||
|
id: Id
|
||||||
|
product: Product
|
||||||
|
container_path: Container
|
||||||
|
status: Status
|
||||||
|
notified_at: Notified at
|
||||||
|
user: User
|
||||||
|
notified_at: Notified at
|
|
@ -0,0 +1,30 @@
|
||||||
|
ru:
|
||||||
|
layout:
|
||||||
|
product_build_lists:
|
||||||
|
delete: Удалить
|
||||||
|
action: Действие
|
||||||
|
id_search: 'Поиск по Id'
|
||||||
|
statuses:
|
||||||
|
'0': 'собран'
|
||||||
|
'1': 'ошибка сборки'
|
||||||
|
'2': 'собирается'
|
||||||
|
build_failed: Ошибка сборки
|
||||||
|
build_started: Собирается
|
||||||
|
build_completed: Собран
|
||||||
|
|
||||||
|
ownership:
|
||||||
|
header: Принадлежность заданий
|
||||||
|
owned: Мне
|
||||||
|
related: Связанные со мной
|
||||||
|
index: Все
|
||||||
|
|
||||||
|
activerecord:
|
||||||
|
attributes:
|
||||||
|
product_build_list:
|
||||||
|
id: Id
|
||||||
|
product: Продукт
|
||||||
|
container_path: Контейнер
|
||||||
|
status: Статус
|
||||||
|
user: Пользователь
|
||||||
|
notified_at: Информация получена
|
||||||
|
|
|
@ -120,14 +120,6 @@ ru:
|
||||||
branches: Ветки
|
branches: Ветки
|
||||||
project_versions: Версии
|
project_versions: Версии
|
||||||
|
|
||||||
product_build_lists:
|
|
||||||
delete: Удалить
|
|
||||||
action: Действие
|
|
||||||
statuses:
|
|
||||||
'0': 'собран'
|
|
||||||
'1': 'ошибка сборки'
|
|
||||||
'2': 'собирается'
|
|
||||||
|
|
||||||
flash:
|
flash:
|
||||||
settings:
|
settings:
|
||||||
saved: Настройки успешно сохранены
|
saved: Настройки успешно сохранены
|
||||||
|
@ -224,13 +216,6 @@ ru:
|
||||||
created_at: Создан
|
created_at: Создан
|
||||||
updated_at: Обновлен
|
updated_at: Обновлен
|
||||||
|
|
||||||
product_build_list:
|
|
||||||
id: Id
|
|
||||||
product: Продукт
|
|
||||||
container_path: Контейнер
|
|
||||||
status: Статус
|
|
||||||
notified_at: Информация получена
|
|
||||||
|
|
||||||
download:
|
download:
|
||||||
name: Название
|
name: Название
|
||||||
version: Версия
|
version: Версия
|
||||||
|
|
|
@ -58,6 +58,9 @@ Rosa::Application.routes.draw do
|
||||||
end
|
end
|
||||||
collection { post :search }
|
collection { post :search }
|
||||||
end
|
end
|
||||||
|
resources :product_build_lists, :only => [:index] do
|
||||||
|
collection { post :search }
|
||||||
|
end
|
||||||
|
|
||||||
resources :personal_repositories, :only => [:show] do
|
resources :personal_repositories, :only => [:show] do
|
||||||
member do
|
member do
|
||||||
|
|
10
db/schema.rb
10
db/schema.rb
|
@ -1,4 +1,4 @@
|
||||||
# -*- encoding : utf-8 -*-
|
# encoding: UTF-8
|
||||||
# This file is auto-generated from the current state of the database. Instead
|
# This file is auto-generated from the current state of the database. Instead
|
||||||
# of editing this file, please use the migrations feature of Active Record to
|
# of editing this file, please use the migrations feature of Active Record to
|
||||||
# incrementally modify your database, and then regenerate this schema definition.
|
# incrementally modify your database, and then regenerate this schema definition.
|
||||||
|
@ -17,8 +17,8 @@ ActiveRecord::Schema.define(:version => 20120329182602) do
|
||||||
t.integer "user_id", :null => false
|
t.integer "user_id", :null => false
|
||||||
t.string "kind"
|
t.string "kind"
|
||||||
t.text "data"
|
t.text "data"
|
||||||
t.datetime "created_at", :null => false
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at", :null => false
|
t.datetime "updated_at"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "arches", :force => true do |t|
|
create_table "arches", :force => true do |t|
|
||||||
|
@ -351,16 +351,16 @@ ActiveRecord::Schema.define(:version => 20120329182602) do
|
||||||
t.string "name"
|
t.string "name"
|
||||||
t.string "email", :default => "", :null => false
|
t.string "email", :default => "", :null => false
|
||||||
t.string "encrypted_password", :limit => 128, :default => "", :null => false
|
t.string "encrypted_password", :limit => 128, :default => "", :null => false
|
||||||
|
t.string "password_salt", :default => "", :null => false
|
||||||
t.string "reset_password_token"
|
t.string "reset_password_token"
|
||||||
t.datetime "remember_created_at"
|
t.datetime "remember_created_at"
|
||||||
t.datetime "created_at"
|
t.datetime "created_at"
|
||||||
t.datetime "updated_at"
|
t.datetime "updated_at"
|
||||||
t.text "ssh_key"
|
|
||||||
t.string "uname"
|
t.string "uname"
|
||||||
t.string "role"
|
t.string "role"
|
||||||
t.string "language", :default => "en"
|
t.string "language", :default => "en"
|
||||||
t.datetime "reset_password_sent_at"
|
|
||||||
t.integer "own_projects_count", :default => 0, :null => false
|
t.integer "own_projects_count", :default => 0, :null => false
|
||||||
|
t.datetime "reset_password_sent_at"
|
||||||
t.text "professional_experience"
|
t.text "professional_experience"
|
||||||
t.string "site"
|
t.string "site"
|
||||||
t.string "company"
|
t.string "company"
|
||||||
|
|
Loading…
Reference in New Issue