Merge branch '3.2-master' into 265-activity_feed_messages

Conflicts:
	config/locales/menu.en.yml
	config/locales/menu.ru.yml
This commit is contained in:
Alexander Machehin 2012-03-17 01:09:04 +06:00
commit 86871ab32d
71 changed files with 966 additions and 408 deletions

View File

@ -3,6 +3,7 @@
//= require jquery-ui //= require jquery-ui
//= require autocomplete-rails //= require autocomplete-rails
//= require vendor //= require vendor
//= require jquery.dataTables_ext
//= require_tree ./design //= require_tree ./design
//= require_tree ./extra //= require_tree ./extra
//= require_self //= require_self

View File

@ -0,0 +1,139 @@
(function($, window, document, undefined) {
$.extend( $.fn.DataTable.ext.oPagination, {
"will_paginate_like": {
/*
* Function: oPagination.full_numbers.fnInit
* Purpose: Initialise dom elements required for pagination with a list of the pages
* Returns: -
* Inputs: object:oSettings - dataTables settings object
* node:nPaging - the DIV which contains this pagination control
* function:fnCallbackDraw - draw function which must be called on update
*/
"fnInit": function ( oSettings, nPaging, fnCallbackDraw ) {
var oLang = oSettings.oLanguage.oPaginate;
var oClasses = oSettings.oClasses;
var fnClickHandler = function ( e ) {
if ( oSettings.oApi._fnPageChange( oSettings, e.data.action ) )
{
fnCallbackDraw( oSettings );
}
};
$(nPaging).append(
'<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPagePrevious+'">'+oLang.sPrevious+'</a>'+
'<span></span>'+
'<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPageNext+'">'+oLang.sNext+'</a>'
);
var els = $('a', nPaging);
var nPrev = els[0],
nNext = els[1]
oSettings.oApi._fnBindAction( nPrev, {action: "previous"}, fnClickHandler );
oSettings.oApi._fnBindAction( nNext, {action: "next"}, fnClickHandler );
/* ID the first elements only */
if ( !oSettings.aanFeatures.p )
{
nPaging.id = oSettings.sTableId+'_paginate';
nPrev.id =oSettings.sTableId+'_previous';
nNext.id =oSettings.sTableId+'_next';
}
},
/*
* Function: oPagination.full_numbers.fnUpdate
* Purpose: Update the list of page buttons shows
* Returns: -
* Inputs: object:oSettings - dataTables settings object
* function:fnCallbackDraw - draw function to call on page change
*/
"fnUpdate": function ( oSettings, fnCallbackDraw ) {
if ( !oSettings.aanFeatures.p )
{
return;
}
var iPageCount = $.fn.DataTable.ext.oPagination.iFullNumbersShowPages;
var iPageCountHalf = Math.floor(iPageCount / 2);
var iPages = Math.ceil((oSettings.fnRecordsDisplay()) / oSettings._iDisplayLength);
var iCurrentPage = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1;
var sList = "";
var iStartButton, iEndButton, i, iLen;
var oClasses = oSettings.oClasses;
var anButtons, anStatic, nPaginateList;
var an = oSettings.aanFeatures.p;
var fnBind = function (j) {
oSettings.oApi._fnBindAction( this, {"page": j+iStartButton-1}, function(e) {
/* Use the information in the element to jump to the required page */
oSettings.oApi._fnPageChange( oSettings, e.data.page );
fnCallbackDraw( oSettings );
e.preventDefault();
} );
};
/* Pages calculation */
if (iPages < iPageCount)
{
iStartButton = 1;
iEndButton = iPages;
}
else if (iCurrentPage <= iPageCountHalf)
{
iStartButton = 1;
iEndButton = iPageCount;
}
else if (iCurrentPage >= (iPages - iPageCountHalf))
{
iStartButton = iPages - iPageCount + 1;
iEndButton = iPages;
}
else
{
iStartButton = iCurrentPage - Math.ceil(iPageCount / 2) + 1;
iEndButton = iStartButton + iPageCount - 1;
}
/* Build the dynamic list */
for ( i=iStartButton ; i<=iEndButton ; i++ )
{
sList += (iCurrentPage !== i) ?
'<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+'">'+oSettings.fnFormatNumber(i)+'</a>' :
'<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButtonActive+'">'+oSettings.fnFormatNumber(i)+'</a>';
}
/* Loop over each instance of the pager */
for ( i=0, iLen=an.length ; i<iLen ; i++ )
{
if ( an[i].childNodes.length === 0 )
{
continue;
}
/* Build up the dynamic list forst - html and listeners */
$('span:eq(0)', an[i])
.html( sList )
.children('a').each( fnBind );
/* Update the premanent botton's classes */
anButtons = an[i].getElementsByTagName('a');
anStatic = [
anButtons[0], anButtons[anButtons.length-1]
];
$(anStatic).removeClass( oClasses.sPageButton+" "+oClasses.sPageButtonActive+" "+oClasses.sPageButtonStaticDisabled );
$([anStatic[0]]).addClass(
(iCurrentPage==1) ?
oClasses.sPageButtonStaticDisabled :
oClasses.sPageButton
);
$([anStatic[1]]).addClass(
(iPages===0 || iCurrentPage===iPages || oSettings._iDisplayLength===-1) ?
oClasses.sPageButtonStaticDisabled :
oClasses.sPageButton
);
}
}
}
} );
}(jQuery, window, document, undefined));

View File

@ -443,4 +443,137 @@ table.wiki .history .td2 .name span.username {
width: 164px; width: 164px;
} }
table.tablesorter.platforms .th1 {
width: 290px;
}
table.tablesorter.platforms .th2 {
width: 280px;
}
table.tablesorter tr td.buttons {
text-align: center;
}
table.tablesorter tr td.buttons a span.delete {
background: image-url('x.png') no-repeat 0 0 transparent;
width: 12px;
display: inline-block;
}
#fork-and-edit {display:block;} #fork-and-edit {display:block;}
a.button.left_floated {
display: inline-block;
float: left;
margin-right: 5px;
}
div.buttons_block {
margin-top: 20px;
}
table.tablesorter.unbordered {
border: none;
}
table.tablesorter.unbordered tr td {
border: none;
padding: 3px;
}
table.tablesorter.repo-projects th.th1 {
width: 250px;
}
table.tablesorter.repo-projects th.th3 {
width: 60px;
}
table.tablesorter.repo-projects td.td2,
.table-sort-right {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
div.dataTables_filter {
margin-bottom: 15px;
}
div.dataTables_paginate {
float: left;
}
div.dataTables_info {
float: right;
}
div.dataTables_info,
div.dataTables_paginate.paging_will_paginate_like {
margin-top: 15px;
}
div.dataTables_paginate.paging_will_paginate_like a.paginate_button,
div.dataTables_paginate.paging_will_paginate_like a.paginate_active {
background: none repeat scroll 0 0 #EDEDED;
color: #4C90D0 !important;
border: 1px solid #DDDDDD;
border-radius: 1px 1px 1px 1px;
padding: 3px 7px;
margin-right: 3px;
cursor: pointer;
}
div.dataTables_paginate.paging_will_paginate_like a.paginate_button_disabled,
div.dataTables_paginate.paging_will_paginate_like a.paginate_active {
color: #565657 !important;
cursor: default;
}
div.dataTables_paginate.paging_will_paginate_like a.paginate_button_disabled:hover,
div.dataTables_paginate.paging_will_paginate_like a.paginate_active:hover {
text-decoration: none;
}
div.dataTables_paginate.paging_will_paginate_like a.previous {
margin-left: 0px;
margin-right: 4px;
}
div.dataTables_paginate.paging_will_paginate_like a.next {
margin-left: 1px;
margin-right: 0px;
}
div.dataTables_paginate.paging_will_paginate_like a.paginate_active {
background: none repeat scroll 0 0 #D5E7F9;
border: 1px solid #C1DAED;
}
div.dataTables_processing {
z-index: 999;
}
div.rightlist textarea {
resize: none;
}
div#crontab_generator .leftlist,
div#crontab_generator .rightlist {
width: 50%;
}
div#crontab_generator .leftlist select,
div#crontab_generator .rightlist select {
margin-top: 10px;
}
table.dataTable tr.odd td.sorting_1 {
background-color: #F0F0F6;
}
table.dataTable tr.even td.sorting_1 {
background-color: #FFFFFF;
}

View File

@ -440,7 +440,7 @@ article a.button {
background-image: linear-gradient(top, #68a3d8, #125687); background-image: linear-gradient(top, #68a3d8, #125687);
filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#68a3d8', EndColorStr='#125687'); filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#68a3d8', EndColorStr='#125687');
border: 1px solid #5084b4; border: 1px solid #5084b4;
padding: 4px 20px; padding: 4px 20px 6px;
margin: 0; margin: 0;
font-size: 12px; font-size: 12px;
text-decoration: none; text-decoration: none;
@ -509,7 +509,7 @@ article input[type="submit"] {
background-image: linear-gradient(top, #68a3d8, #125687); background-image: linear-gradient(top, #68a3d8, #125687);
filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#68a3d8', EndColorStr='#125687'); filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#68a3d8', EndColorStr='#125687');
border: 1px solid #5084b4; border: 1px solid #5084b4;
padding: 0px 20px 0px; padding: 3px 20px 5px;
margin: 0; margin: 0;
font-size: 12px; font-size: 12px;
text-decoration: none; text-decoration: none;
@ -519,7 +519,6 @@ article input[type="submit"] {
border-radius: 5px; border-radius: 5px;
text-align: center; text-align: center;
height: auto; height: auto;
height: 28px;
width: auto; width: auto;
font-family: Tahoma; font-family: Tahoma;
} }
@ -2212,3 +2211,9 @@ div.width400.rmargin55 {
div.tmargin10 { div.tmargin10 {
margin-top: 10px; margin-top: 10px;
} }
/*My projects*/
article h3 a {
font-size: 14px;
}

View File

@ -14,7 +14,7 @@ class PlatformsController < ApplicationController
end end
def index def index
@platforms = Platform.accessible_by(current_ability).paginate(:page => params[:platform_page]) @platforms = @platforms.paginate(:page => params[:page], :per_page => 20)
end end
def easy_urpmi def easy_urpmi
@ -35,8 +35,8 @@ class PlatformsController < ApplicationController
def show def show
@platform = Platform.find params[:id], :include => :repositories @platform = Platform.find params[:id], :include => :repositories
@repositories = @platform.repositories #@repositories = @platform.repositories
@members = @platform.members.uniq #@members = @platform.members.uniq
end end
def new def new
@ -57,10 +57,10 @@ class PlatformsController < ApplicationController
@platform.owner = @admin_id.blank? ? get_owner : User.find(@admin_id) @platform.owner = @admin_id.blank? ? get_owner : User.find(@admin_id)
if @platform.save if @platform.save
flash[:notice] = I18n.t("flash.platform.saved") flash[:notice] = I18n.t("flash.platform.created")
redirect_to @platform redirect_to @platform
else else
flash[:error] = I18n.t("flash.platform.save_error") flash[:error] = I18n.t("flash.platform.create_error")
render :action => :new render :action => :new
end end
end end
@ -125,7 +125,7 @@ class PlatformsController < ApplicationController
@platform.delay.destroy if @platform @platform.delay.destroy if @platform
flash[:notice] = t("flash.platform.destroyed") flash[:notice] = t("flash.platform.destroyed")
redirect_to root_path redirect_to platforms_path
end end
def forbidden def forbidden

View File

@ -8,6 +8,10 @@ class ProductsController < ApplicationController
load_and_authorize_resource :platform load_and_authorize_resource :platform
load_and_authorize_resource :product, :through => :platform load_and_authorize_resource :product, :through => :platform
def index
@products = @products.paginate(:page => params[:page])
end
def new def new
@product = @platform.products.new @product = @platform.products.new
@product.ks = DEFAULT_KS @product.ks = DEFAULT_KS
@ -31,7 +35,7 @@ class ProductsController < ApplicationController
@product = @platform.products.new params[:product] @product = @platform.products.new params[:product]
if @product.save if @product.save
flash[:notice] = t('flash.product.saved') flash[:notice] = t('flash.product.saved')
redirect_to @platform redirect_to platform_product_path(@platform, @product)
else else
flash[:error] = t('flash.product.save_error') flash[:error] = t('flash.product.save_error')
render :action => :new render :action => :new
@ -54,7 +58,7 @@ class ProductsController < ApplicationController
def destroy def destroy
@product.destroy @product.destroy
flash[:notice] = t("flash.product.destroyed") flash[:notice] = t("flash.product.destroyed")
redirect_to @platform redirect_to platform_products_path(@platform)
end end
protected protected

View File

@ -12,9 +12,9 @@ class RepositoriesController < ApplicationController
def index def index
if params[:platform_id] if params[:platform_id]
@repositories = Platform.find(params[:platform_id]).repositories.paginate(:page => params[:repository_page]) @repositories = Platform.find(params[:platform_id]).repositories.paginate(:page => params[:page])
else else
@repositories = Repository.paginate(:page => params[:repository_page]) @repositories = Repository.paginate(:page => params[:page])
end end
end end
@ -36,7 +36,7 @@ class RepositoriesController < ApplicationController
platform_id = @repository.platform_id platform_id = @repository.platform_id
flash[:notice] = t("flash.repository.destroyed") flash[:notice] = t("flash.repository.destroyed")
redirect_to platform_path(platform_id) redirect_to platform_repositories_path(platform_id)
end end
def create def create
@ -60,13 +60,14 @@ class RepositoriesController < ApplicationController
else else
flash[:error] = t('flash.repository.project_not_added') flash[:error] = t('flash.repository.project_not_added')
end end
redirect_to repository_path(@repository) redirect_to platform_repository_path(@platform, @repository)
else else
render :projects_list render :projects_list
end end
end end
def projects_list def projects_list
owner_subquery = " owner_subquery = "
INNER JOIN ( INNER JOIN (
SELECT id, 'User' AS type, uname SELECT id, 'User' AS type, uname
@ -76,27 +77,31 @@ class RepositoriesController < ApplicationController
FROM groups FROM groups
) AS owner ) AS owner
ON projects.owner_id = owner.id AND projects.owner_type = owner.type" ON projects.owner_id = owner.id AND projects.owner_type = owner.type"
colName = ['owner.uname', 'projects.name'] colName = ['projects.name']
sort_col = params[:iSortCol_0] || 0 sort_col = params[:iSortCol_0] || 0
sort_dir = params[:sSortDir_0]=="asc" ? 'asc' : 'desc' sort_dir = params[:sSortDir_0]=="asc" ? 'asc' : 'desc'
order = "#{colName[sort_col.to_i]} #{sort_dir}" order = "#{colName[sort_col.to_i]} #{sort_dir}"
@projects = Project.joins(owner_subquery).addable_to_repository(@repository.id) if params[:added] == "true"
@projects = @repository.projects
else
@projects = Project.joins(owner_subquery).addable_to_repository(@repository.id)
@projects = @projects.by_visibilities('open') if @repository.platform.platform_type == 'main'
end
@projects = @projects.paginate(:page => (params[:iDisplayStart].to_i/params[:iDisplayLength].to_i).to_i + 1, :per_page => params[:iDisplayLength]) @projects = @projects.paginate(:page => (params[:iDisplayStart].to_i/params[:iDisplayLength].to_i).to_i + 1, :per_page => params[:iDisplayLength])
@projects = @projects.by_visibilities('open') if @repository.platform.platform_type == 'main'
@total_projects = @projects.count @total_projects = @projects.count
@projects = @projects.where(['projects.name LIKE ?', "#{params[:sSearch]}%"]) if params[:sSearch] and !params[:sSearch].empty? @projects = @projects.where(['projects.name ILIKE ?', "#{params[:sSearch]}%"]) if params[:sSearch] and !params[:sSearch].empty?
@total_project = @projects.count @total_project = @projects.count
@projects = @projects.order(order)#.includes(:owner) #WTF???? @projects = @projects.order(order)#.includes(:owner) #WTF????
render :partial => 'proj_ajax', :layout => false render :partial => (params[:added] == "true") ? 'project' : 'proj_ajax', :layout => false
end end
def remove_project def remove_project
@project = Project.find(params[:project_id]) @project = Project.find(params[:project_id])
ProjectToRepository.where(:project_id => @project.id, :repository_id => @repository.id).destroy_all ProjectToRepository.where(:project_id => @project.id, :repository_id => @repository.id).destroy_all
redirect_to repository_path(@repository), :notice => t('flash.repository.project_removed') redirect_to platform_repository_path(@platform, @repository), :notice => t('flash.repository.project_removed')
end end
protected protected

View File

@ -18,6 +18,10 @@ module ApplicationHelper
'right slim' 'right slim'
when params[:controller] == 'build_lists' && ['new', 'create'].include?(params[:action]) when params[:controller] == 'build_lists' && ['new', 'create'].include?(params[:action])
nil nil
when params[:controller] == 'platforms' && params[:action] == 'show'
'right bigpadding'
when params[:controller] == 'platforms' && params[:action] == 'clone'
'right middlepadding'
else else
content_for?(:sidebar) ? 'right' : 'all' content_for?(:sidebar) ? 'right' : 'all'
end end

View File

@ -73,21 +73,26 @@ class Ability
can :read, Platform, :owner_type => 'User', :owner_id => user.id can :read, Platform, :owner_type => 'User', :owner_id => user.id
can :read, Platform, :owner_type => 'Group', :owner_id => user.group_ids can :read, Platform, :owner_type => 'Group', :owner_id => user.group_ids
can(:read, Platform, read_relations_for('platforms')) {|platform| local_reader? platform} can(:read, Platform, read_relations_for('platforms')) {|platform| local_reader? platform}
can([:update, :build_all], Platform) {|platform| local_admin? platform} # can([:update, :build_all], Platform) {|platform| local_admin? platform}
can([:freeze, :unfreeze, :destroy], Platform) {|platform| owner? platform} can([:freeze, :unfreeze, :update], Platform) {|platform| local_admin? platform}
#can([:freeze, :unfreeze, :destroy], Platform) {|platform| owner? platform}
can(:destroy, Platform) {|platform| owner? platform}
can :autocomplete_user_uname, Platform can :autocomplete_user_uname, Platform
can :read, Repository, :platform => {:visibility => 'open'} can [:read, :projects_list], Repository, :platform => {:visibility => 'open'}
can :read, Repository, :platform => {:owner_type => 'User', :owner_id => user.id} can [:read, :projects_list], Repository, :platform => {:owner_type => 'User', :owner_id => user.id}
can :read, Repository, :platform => {:owner_type => 'Group', :owner_id => user.group_ids} can [:read, :projects_list], Repository, :platform => {:owner_type => 'Group', :owner_id => user.group_ids}
can(:read, Repository, read_relations_for('repositories', 'platforms')) {|repository| local_reader? repository.platform} can([:read, :projects_list], Repository, read_relations_for('repositories', 'platforms')) {|repository| local_reader? repository.platform}
can([:create, :update, :projects_list, :add_project, :remove_project], Repository) {|repository| local_admin? repository.platform} can([:create, :update, :projects_list, :add_project, :remove_project], Repository) {|repository| local_admin? repository.platform}
can([:change_visibility, :settings, :destroy], Repository) {|repository| owner? repository.platform} can([:change_visibility, :settings, :destroy], Repository) {|repository| owner? repository.platform}
can :read, Product, :platform => {:platform_type => 'main'}
can :read, Product, :platform => {:owner_type => 'User', :owner_id => user.id} can :read, Product, :platform => {:owner_type => 'User', :owner_id => user.id}
can :read, Product, :platform => {:owner_type => 'Group', :owner_id => user.group_ids} can :read, Product, :platform => {:owner_type => 'Group', :owner_id => user.group_ids}
can(:manage, Product, read_relations_for('products', 'platforms')) {|product| local_admin? product.platform} can(:read, Product, read_relations_for('products', 'platforms')) {|product| product.platform.platform_type == 'main'}
can(:create, ProductBuildList) {|pbl| pbl.product.can_build? and can?(:update, pbl.product)} can([:create, :update, :destroy, :clone], Product) {|product| local_admin? product.platform }
can(:create, ProductBuildList) {|pbl| can?(:update, pbl.product)}
can(:destroy, ProductBuildList) {|pbl| can?(:destroy, pbl.product)} can(:destroy, ProductBuildList) {|pbl| can?(:destroy, pbl.product)}
can [:read, :platforms], Category can [:read, :platforms], Category
@ -111,10 +116,15 @@ class Ability
# Shared cannot rights for all users (registered, admin) # Shared cannot rights for all users (registered, admin)
cannot :destroy, Platform, :platform_type => 'personal' cannot :destroy, Platform, :platform_type => 'personal'
cannot :destroy, Repository, :platform => {:platform_type => 'personal'} cannot [:create, :destroy, :add_project, :remove_project], Repository, :platform => {:platform_type => 'personal'}
cannot :fork, Project, :owner_id => user.id, :owner_type => user.class.to_s cannot :fork, Project, :owner_id => user.id, :owner_type => user.class.to_s
cannot :destroy, Issue cannot :destroy, Issue
# cannot :read, Product, :platform => {:platform_type => 'personal'}
# cannot(:read, Product, read_relations_for('products', 'platforms')) {|product| product.platform.platform_type == 'personal'}
cannot [:create, :update, :destroy, :clone], Product, :platform => {:platform_type => 'personal'}
cannot [:clone, :build_all, :freeze, :unfreeze], Platform, :platform_type => 'personal'
can :create, Subscribe do |subscribe| can :create, Subscribe do |subscribe|
!subscribe.subscribeable.subscribes.exists?(:user_id => user.id) !subscribe.subscribeable.subscribes.exists?(:user_id => user.id)
end end

View File

@ -23,7 +23,7 @@ class ActivityFeedObserver < ActiveRecord::Observer
) )
end end
if record.user_id_was != record.user_id if record.user_id_changed?
UserMailer.delay.issue_assign_notification(record, record.user) if record.user.notifier.issue_assign && record.user.notifier.can_notify UserMailer.delay.issue_assign_notification(record, record.user) if record.user.notifier.issue_assign && record.user.notifier.can_notify
ActivityFeed.create( ActivityFeed.create(
:user => record.user, :user => record.user,
@ -119,7 +119,7 @@ class ActivityFeedObserver < ActiveRecord::Observer
def after_update(record) def after_update(record)
case record.class.to_s case record.class.to_s
when 'Issue' when 'Issue'
if record.user_id_was != record.user_id if record.user_id && record.user_id_changed?
UserMailer.delay.issue_assign_notification(record, record.user) if record.user.notifier.issue_assign && record.user.notifier.can_notify UserMailer.delay.issue_assign_notification(record, record.user) if record.user.notifier.issue_assign && record.user.notifier.can_notify
ActivityFeed.create( ActivityFeed.create(
:user => record.user, :user => record.user,

View File

@ -73,13 +73,14 @@ class Issue < ActiveRecord::Base
def subscribe_users def subscribe_users
recipients = collect_recipient_ids recipients = collect_recipient_ids
recipients.each do |recipient_id| recipients.each do |recipient_id|
ss = self.subscribes.build(:user_id => recipient_id) if User.find(recipient_id).notifier.new_comment && !self.subscribes.exists?(:user_id => recipient_id)
ss.save! ss = self.subscribes.create(:user_id => recipient_id)
end
end end
end end
def subscribe_issue_assigned_user def subscribe_issue_assigned_user
if self.user_id_was != self.user_id if self.user_id && self.user_id_changed?
self.subscribes.where(:user_id => self.user_id_was).first.destroy unless self.user_id_was.blank? self.subscribes.where(:user_id => self.user_id_was).first.destroy unless self.user_id_was.blank?
if self.user.notifier.issue_assign && !self.subscribes.exists?(:user_id => self.user_id) if self.user.notifier.issue_assign && !self.subscribes.exists?(:user_id => self.user_id)
self.subscribes.create(:user_id => self.user_id) self.subscribes.create(:user_id => self.user_id)

View File

@ -23,16 +23,7 @@ class Product < ActiveRecord::Base
@delete_tar = value @delete_tar = value
end end
def can_clone?
is_template
end
def can_build?
!is_template
end
def clone_from!(template) def clone_from!(template)
raise "Only templates can be cloned" unless template.can_clone?
attrs = ATTRS_TO_CLONE.inject({}) {|result, attr| attrs = ATTRS_TO_CLONE.inject({}) {|result, attr|
result[attr] = template.send(attr) result[attr] = template.send(attr)
result result

View File

@ -4,8 +4,6 @@ class Subscribe < ActiveRecord::Base
belongs_to :user belongs_to :user
belongs_to :project belongs_to :project
scope :finder_hack, order('') # FIXME .subscribes - error; .subscribes.finder_hack - success Oo
def commit_subscribe? def commit_subscribe?
subscribeable_type == 'Grit::Commit' subscribeable_type == 'Grit::Commit'
end end

View File

@ -112,6 +112,14 @@ class User < ActiveRecord::Base
email.downcase == commit.committer.email.downcase email.downcase == commit.committer.email.downcase
end end
def owner_of? object
if object.respond_to? :owner
object.owner_id == self.id or self.group_ids.include? object.owner_id
else
false
end
end
private private
def create_settings_notifier def create_settings_notifier

View File

@ -0,0 +1,5 @@
%tr{:id => "row#{platform_build_list_counter}"}
%td= link_to (platform_build_list.bs_id.present? ? platform_build_list.bs_id : t("layout.build_lists.bs_id_not_set")), platform_build_list
%td= platform_build_list.human_status
%td= link_to platform_build_list.project.name, platform_build_list.project
%td= platform_build_list.notified_at

View File

@ -1,5 +1,5 @@
-content_for :sidebar do -content_for :sidebar do
- can_manage = can? :write, @issue.project - can_manage = can?(:update, @issue) && @issue.persisted? || @issue.new_record?
- if @issue.persisted? - if @issue.persisted?
.bordered.nopadding .bordered.nopadding
%h3=t('activerecord.attributes.issue.status') %h3=t('activerecord.attributes.issue.status')
@ -14,6 +14,7 @@
- if @issue.persisted? - if @issue.persisted?
-if can_manage -if can_manage
=form_for :issue, :url => [@project, @issue], :method => :put, :html => { :class => 'edit_executor issue'} do |f| =form_for :issue, :url => [@project, @issue], :method => :put, :html => { :class => 'edit_executor issue'} do |f|
=hidden_field_tag "user-default_executor", nil, :name => 'issue[user_id]'
.current_executor .current_executor
- if @issue.user - if @issue.user
#user-0.people.nopointer #user-0.people.nopointer
@ -21,7 +22,7 @@
.name="#{@issue.user.uname} (#{@issue.user.name})" .name="#{@issue.user.uname} (#{@issue.user.name})"
=hidden_field_tag "user-0", @issue.user.id, :name => 'issue[user_id]' =hidden_field_tag "user-0", @issue.user.id, :name => 'issue[user_id]'
.both .both
- else - elsif @issue.user
.people.nopointer .people.nopointer
.avatar=image_tag avatar_url(@issue.user), :alt => 'avatar' .avatar=image_tag avatar_url(@issue.user), :alt => 'avatar'
.name="#{@issue.user.uname} (#{@issue.user.name})" .name="#{@issue.user.uname} (#{@issue.user.name})"

View File

@ -16,7 +16,7 @@
.fulltext.view.issue_body=@issue.body .fulltext.view.issue_body=@issue.body
.both .both
%br %br
- if can? :write, @issue.project - if can? :update, @issue
=link_to t('layout.edit'), '#', :id => 'edit_issue_content', :class => 'button' =link_to t('layout.edit'), '#', :id => 'edit_issue_content', :class => 'button'
=form_for :issue, :url => [@project, @issue], :method => :put, :html => { :class => 'edit_form issue', :style => 'display:none;' } do |f| =form_for :issue, :url => [@project, @issue], :method => :put, :html => { :class => 'edit_form issue', :style => 'display:none;' } do |f|
.leftlist= t('activerecord.attributes.issue.title') + ':' .leftlist= t('activerecord.attributes.issue.title') + ':'

View File

@ -1,33 +1,34 @@
- unless ['edit', 'update'].include? controller.action_name - unless ['edit', 'update'].include? controller.action_name
.group .leftlist= f.label :name, :class => :label
= f.label :name, :class => :label .rightlist= f.text_field :name, :class => 'text_field'
= f.text_field :name, :class => 'text_field' .both
.group .leftlist= f.label :description, :class => :label
= f.label :description, :class => :label .rightlist= f.text_area :description, :class => 'text_field'
= f.text_field :description, :class => 'text_field' .both
- unless ['edit', 'update'].include? controller.action_name - unless ['edit', 'update'].include? controller.action_name
.group .leftlist= f.label :distrib_type, :class => :label
= f.label :distrib_type, :class => :label .rightlist= f.select :distrib_type, options_for_select(APP_CONFIG['distr_types'])
= f.select :distrib_type, options_for_select(APP_CONFIG['distr_types']) .both
.group .leftlist= f.label :parent, :class => :label
= f.label :parent, :class => :label .rightlist= f.collection_select :parent_platform_id, Platform.all, :id, :description, :include_blank => true
= f.collection_select :parent_platform_id, Platform.all, :id, :description, :include_blank => true .both
.group .leftlist= f.label :released, :class => :label
= f.label :released, :class => :label .rightlist= f.check_box :released, :class => 'check_box'
= f.check_box :released, :class => 'check_box' .both
.group .leftlist= label_tag "", t("layout.platforms.admin_id"), :class => :label
= label_tag "", t("layout.platforms.admin_id"), :class => :label .rightlist= autocomplete_field_tag 'admin_id', @admin_uname, autocomplete_user_uname_platforms_path, :id_element => '#admin_id_field'
= autocomplete_field_tag 'admin_id', @admin_uname, autocomplete_user_uname_platforms_path, :id_element => '#admin_id_field' = hidden_field_tag 'admin_id', @admin_id, :id => 'admin_id_field'
= hidden_field_tag 'admin_id', @admin_id, :id => 'admin_id_field' .both
.group.navform.wat-cf .button_block
%button.button{:type => "submit"} = submit_tag t("layout.save")
= image_tag("choose.png", :alt => t("layout.save")) -#%input.button{:type => "submit", :class => "button"}
= t("layout.save") -#= image_tag("choose.png", :alt => t("layout.save"))
-#= t("layout.clone")
%span.text_button_padding= t("layout.or") %span.text_button_padding= t("layout.or")
= link_to t("layout.cancel"), @platforms_path, :class => "text_button_padding link_button" = link_to t("layout.cancel"), @platform.new_record? ? root_path : platform_path(@platform), :class => "button"

View File

@ -1,4 +1,22 @@
%table.table %table#myTable.tablesorter.platforms{:cellspacing => "0", :cellpadding => "0"}
%thead
%tr
%th.th1= t("activerecord.attributes.platform.name")
%th.th2= t("activerecord.attributes.platform.distrib_type")
%th.th3= t("layout.delete")
%tbody
- @platforms.each do |platform|
%tr{:class => cycle("odd", "even")}
%td
= link_to platform.name, platform_path(platform)
%td
= platform.distrib_type
%td.buttons
- if can? :destroy, platform
= link_to platform_path(platform), :method => :delete, :confirm => t("layout.platforms.confirm_delete") do
%span.delete &nbsp;
-#%table.table
%tr %tr
%th.first= t("activerecord.attributes.platform.name") %th.first= t("activerecord.attributes.platform.name")
%th.first= t("activerecord.attributes.platform.distrib_type") %th.first= t("activerecord.attributes.platform.distrib_type")

View File

@ -1,4 +1,21 @@
.block.notice - act = action_name.to_sym
- contr = controller_name.to_sym
- content_for :sidebar do
%aside
.admin-preferences
%ul
%li{:class => (act == :show && contr == :platforms) ? 'active' : ''}
= link_to t("layout.platforms.about"), platform_path(@platform)
%li{:class => (contr == :repositories) ? 'active' : ''}
= link_to t("layout.repositories.list_header"), platform_repositories_path(@platform)
- if can? :read, @platform.products.build
%li{:class => (contr == :products) ? 'active' : ''}
= link_to t("layout.products.list_header"), platform_products_path(@platform)
-#- if current_user.owner_of? @platform or current_user.admin?
%li{:class => (act == :index && contr == :private_users) ? 'active' : ''}
= link_to t("layout.platforms.private_users"), platform_private_users_path(@platform)
-#.block.notice
%h3= t("layout.groups.members") %h3= t("layout.groups.members")
.content .content
- @platform.members.uniq.each do |member| - @platform.members.uniq.each do |member|

View File

@ -0,0 +1,7 @@
- content_for :submenu do
- act = action_name.to_sym; contr = controller_name.to_sym
.left= @platform.name
%nav
%ul
- if can? :update, @platform
%li= link_to t("platform_menu.settings"), edit_platform_path(@platform), :class => (act == :edit && contr == :platforms) ? 'active' : nil

View File

@ -1,4 +1,23 @@
.block = render :partial => 'submenu'
= render :partial => 'sidebar'
= form_for @cloned, :url => make_clone_platform_path(@platform), :html => { :class => :form } do |f|
.leftlist= f.label :name, :class => :label
.rightlist= f.text_field :name, :class => 'text_field'
.leftlist= f.label :description, :class => :label
.rightlist= f.text_field :description, :class => 'text_field'
.both
.button_block
= submit_tag t("layout.clone")
-#%input.button{:type => "submit", :class => "button"}
-#= image_tag("choose.png", :alt => t("layout.save"))
-#= t("layout.clone")
%span.text_button_padding= t("layout.or")
= link_to t("layout.cancel"), @platforms_path, :class => "button"
-#.block
.secondary-navigation .secondary-navigation
%ul.wat-cf %ul.wat-cf
%li.first= link_to "#{t("layout.platforms.list")}", @platforms_path %li.first= link_to "#{t("layout.platforms.list")}", @platforms_path

View File

@ -1,4 +1,9 @@
.block = render :partial => 'submenu'
= render :partial => 'sidebar'
= form_for @platform, :url => platform_path(@platform), :html => { :class => :form } do |f|
= render :partial => "form", :locals => {:f => f}
-#.block
.secondary-navigation .secondary-navigation
%ul.wat-cf %ul.wat-cf
%li.first= link_to t("layout.platforms.list"), platforms_path %li.first= link_to t("layout.platforms.list"), platforms_path
@ -10,4 +15,4 @@
.inner .inner
= form_for @platform, :url => platform_path(@platform), :html => { :class => :form } do |f| = form_for @platform, :url => platform_path(@platform), :html => { :class => :form } do |f|
= render :partial => "form", :locals => {:f => f} = render :partial => "form", :locals => {:f => f}
- content_for :sidebar, render(:partial => 'sidebar') -# content_for :sidebar, render(:partial => 'sidebar')

View File

@ -1,35 +1,3 @@
.block = link_to t("layout.platforms.new"), new_platform_path, :class => 'button' if can? :create, Platform
.secondary-navigation = render :partial => 'platforms/list', :object => @platforms
%ul.wat-cf = will_paginate @platforms
%li.first.active= link_to t("layout.platforms.list"), platforms_path
%li= link_to t("layout.platforms.new"), new_platform_path if can? :create, Platform
.content
%h2.title
= t("layout.platforms.list_header")
.inner
= render :partial => 'shared/search_form'
= render :partial => 'platforms/list', :object => @platforms
.actions-bar.wat-cf
.actions
= will_paginate @platforms, :param_name => :platform_page
/.block
/ .secondary-navigation
/ %ul.wat-cf
/ %li.first.active= link_to t("layout.platforms.list"), platforms_path
/ %li= link_to t("layout.platforms.new"), new_platform_path
/ .content
/ %h2.title
/ = t("layout.platforms.list_header")
/ .inner
/ %table.table
/ %tr
/ %th.first= t("activerecord.attributes.platform.name")
/ %th.last &nbsp;
/ - @platforms.each do |platform|
/ %tr{:class => cycle("odd", "even")}
/ %td
/ = link_to platform.name, platform_path(platform)
/ %td.last
/ #{link_to t("layout.show"), platform_path(platform)} | #{link_to t("layout.delete"), platform_path(platform), :method => :delete, :confirm => t("layout.platforms.confirm_delete")}
/ .actions-bar.wat-cf
/ .actions

View File

@ -1,4 +1,9 @@
.block %h3= t("layout.platforms.new_header")
= form_for :platform, :url => platforms_path, :html => { :class => :form } do |f|
= render :partial => "form", :locals => {:f => f}
-#.block
.secondary-navigation .secondary-navigation
%ul.wat-cf %ul.wat-cf
%li.first= link_to "#{t("layout.platforms.list")}", @platforms_path %li.first= link_to "#{t("layout.platforms.list")}", @platforms_path

View File

@ -1,4 +1,46 @@
.block = render :partial => 'submenu'
= render :partial => 'sidebar'
%h3.fix= t("layout.platforms.about")
%p= @platform.description
%table.tablesorter.unbordered
- if @platform.parent
%tr
%td
%b= "#{t("activerecord.attributes.platform.parent")}:"
%td= link_to @platform.parent.description, platform_path(@platform.parent)
%tr
%td
%b= "#{t('layout.platforms.owner')}:"
%td= link_to @platform.owner.try(:name), url_for(@platform.owner)
%tr
%td
%b= "#{t('layout.platforms.visibility')}:"
%td= t("layout.visibilities.#{@platform.visibility}")
%tr
%td
%b= "#{t('layout.platforms.platform_type')}:"
%td= @platform.platform_type
%tr
%td
%b= "#{t('layout.platforms.distrib_type')}:"
%td= @platform.distrib_type
.buttons_block
- if can? :build_all, @platform
= link_to t("layout.platforms.build_all"), build_all_platform_path(@platform), :confirm => I18n.t("layout.confirm"), :method => :post, :class => "button left_floated"
- if @platform.released?
- if can? :unfreeze, @platform
= link_to t("layout.platforms.unfreeze"), unfreeze_platform_path(@platform), :confirm => I18n.t("layout.platforms.confirm_unfreeze"), :method => :post, :class => "button left_floated"
- else
- if can? :freeze, @platform
= link_to t("layout.platforms.freeze"), freeze_platform_path(@platform), :confirm => I18n.t("layout.platforms.confirm_freeze"), :method => :post, :class => "button left_floated"
= link_to "Клонировать", clone_platform_path(@platform), :class => "button left_floated" if can? :clone, @platform
.both
-#.block
.secondary-navigation .secondary-navigation
%ul.wat-cf %ul.wat-cf
%li.first= link_to t("layout.platforms.list"), platforms_path %li.first= link_to t("layout.platforms.list"), platforms_path
@ -66,8 +108,8 @@
= link_to t("layout.platforms.build_all"), build_all_platform_path(@platform), :confirm => I18n.t("layout.confirm"), :method => :post, :class => "button" if can? :build_all, @platform = link_to t("layout.platforms.build_all"), build_all_platform_path(@platform), :confirm => I18n.t("layout.confirm"), :method => :post, :class => "button" if can? :build_all, @platform
= link_to t("layout.platforms.edit"), edit_platform_path(@platform), :class => "button" if can? :edit, @platform = link_to t("layout.platforms.edit"), edit_platform_path(@platform), :class => "button" if can? :edit, @platform
%a{ :name => "repositories" } -#%a{ :name => "repositories" }
.block -#.block
.secondary-navigation .secondary-navigation
%ul.wat-cf %ul.wat-cf
%li.first.active= link_to t("layout.repositories.list"), platform_path(@platform) + "#repositories" %li.first.active= link_to t("layout.repositories.list"), platform_path(@platform) + "#repositories"
@ -91,8 +133,8 @@
.actions-bar.wat-cf .actions-bar.wat-cf
.actions .actions
%a{ :name => "producs" } -#%a{ :name => "producs" }
.block -#.block
.secondary-navigation .secondary-navigation
%ul.wat-cf %ul.wat-cf
%li.first.active= link_to t("layout.products.list"), platform_path(@platform) + "#products" %li.first.active= link_to t("layout.products.list"), platform_path(@platform) + "#products"
@ -116,4 +158,4 @@
=# (product.can_clone? ? "| #{link_to t("layout.products.clone"), clone_platform_product_path(@platform, product)}" : "").html_safe =# (product.can_clone? ? "| #{link_to t("layout.products.clone"), clone_platform_product_path(@platform, product)}" : "").html_safe
.actions-bar.wat-cf .actions-bar.wat-cf
.actions .actions
- content_for :sidebar, render(:partial => 'sidebar') -# content_for :sidebar, render(:partial => 'sidebar')

View File

@ -1,7 +1,5 @@
%tr{:class => cycle("odd", "even")} %tr{:class => cycle("odd", "even")}
%td= product_build_list.id %td= product_build_list.id
%td= link_to product_build_list.product.name, [product_build_list.product.platform, product_build_list.product]
%td= link_to nil, product_build_list.container_path
%td= product_build_list.human_status %td= product_build_list.human_status
%td= link_to t("layout.product_build_lists.delete"), 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 nil, product_build_list.container_path
%td= product_build_list.notified_at %td= l(product_build_list.notified_at, :format => :long)

View File

@ -63,88 +63,89 @@
} }
.group .leftlist= form.label :use_cron
= form.check_box :use_cron .rightlist= form.check_box :use_cron
= form.label :use_cron .both
#genereator_btn #genereator_btn
%a{ :href => "#" }= t("layout.products.cron_tab_generator.show") %a{ :href => "#" }= t("layout.products.cron_tab_generator.show")
#crontab_generator{ :style => "display: none;" } #crontab_generator{ :style => "display: none;" }
.columns.wat-cf .leftlist
.column.left %h3.title= t("layout.products.cron_tab_generator.minutes")
%h3.title= t("layout.products.cron_tab_generator.minutes") .group
.group = label_tag :minute_chooser_every, t("layout.products.cron_tab_generator.every_minute"), :class => :label
= label_tag :minute_chooser_every, t("layout.products.cron_tab_generator.every_minute"), :class => :label = radio_button_tag :minute_chooser, 0, @product.cron_tab_minutes.blank?, :id => :minute_chooser_every, :class => "chooser cron"
= radio_button_tag :minute_chooser, 0, @product.cron_tab_minutes.blank?, :id => :minute_chooser_every, :class => "chooser cron"
= label_tag :minute_chooser_choose, t("layout.products.cron_tab_generator.choose"), :class => :label = label_tag :minute_chooser_choose, t("layout.products.cron_tab_generator.choose"), :class => :label
= radio_button_tag :minute_chooser, 1, @product.cron_tab_minutes.present?, :id => :minute_chooser_choose, :class => "chooser cron" = radio_button_tag :minute_chooser, 1, @product.cron_tab_minutes.present?, :id => :minute_chooser_choose, :class => "chooser cron"
.group .group
%select{ :name => :minute, :id => :minute, :multiple => true, :disabled => @product.cron_tab_minutes.blank?, :class => "cron" } %select{ :name => :minute, :id => :minute, :multiple => true, :disabled => @product.cron_tab_minutes.blank?, :class => "cron" }
- (0..59).each do |min| - (0..59).each do |min|
%option{ :value => min, :selected => @product.cron_tab_minutes.include?(min) }= min %option{ :value => min, :selected => @product.cron_tab_minutes.include?(min) }= min
.column.right .rightlist
%h3.title= t("layout.products.cron_tab_generator.hours") %h3.title= t("layout.products.cron_tab_generator.hours")
.group .group
= label_tag :hour_chooser_every, t("layout.products.cron_tab_generator.every_hour"), :class => :label = label_tag :hour_chooser_every, t("layout.products.cron_tab_generator.every_hour"), :class => :label
= radio_button_tag :hour_chooser, 0, @product.cron_tab_hours.blank?, :id => :minute_chooser_every, :class => "chooser cron" = radio_button_tag :hour_chooser, 0, @product.cron_tab_hours.blank?, :id => :minute_chooser_every, :class => "chooser cron"
= label_tag :hour_chooser_choose, t("layout.products.cron_tab_generator.choose"), :class => :label = label_tag :hour_chooser_choose, t("layout.products.cron_tab_generator.choose"), :class => :label
= radio_button_tag :hour_chooser, 1, @product.cron_tab_hours.present?, :id => :minute_chooser_choose, :class => "chooser cron" = radio_button_tag :hour_chooser, 1, @product.cron_tab_hours.present?, :id => :minute_chooser_choose, :class => "chooser cron"
.group .group
%select{ :name => :hour, :id => :hour, :multiple => true, :disabled => @product.cron_tab_hours.blank?, :class => "cron" } %select{ :name => :hour, :id => :hour, :multiple => true, :disabled => @product.cron_tab_hours.blank?, :class => "cron" }
- (0..23).each do |hour| - (0..23).each do |hour|
%option{ :value => hour, :selected => @product.cron_tab_hours.include?(hour) }= hour %option{ :value => hour, :selected => @product.cron_tab_hours.include?(hour) }= hour
.both
.columns.wat-cf .leftlist
.column.left %h3.title= t("layout.products.cron_tab_generator.days")
%h3.title= t("layout.products.cron_tab_generator.days") .group
.group = label_tag :day_chooser_every, t("layout.products.cron_tab_generator.every_day"), :class => :label
= label_tag :day_chooser_every, t("layout.products.cron_tab_generator.every_day"), :class => :label = radio_button_tag :day_chooser, 0, @product.cron_tab_days.blank?, :id => :day_chooser_every, :class => "chooser cron"
= radio_button_tag :day_chooser, 0, @product.cron_tab_days.blank?, :id => :day_chooser_every, :class => "chooser cron"
= label_tag :day_chooser_choose, t("layout.products.cron_tab_generator.choose"), :class => :label = label_tag :day_chooser_choose, t("layout.products.cron_tab_generator.choose"), :class => :label
= radio_button_tag :day_chooser, 1, @product.cron_tab_days.present?, :id => :day_chooser_choose, :class => "chooser cron" = radio_button_tag :day_chooser, 1, @product.cron_tab_days.present?, :id => :day_chooser_choose, :class => "chooser cron"
.group .group
%select{ :name => "day", :id => "day", :multiple => true, :disabled => @product.cron_tab_days.blank?, :class => "cron" } %select{ :name => "day", :id => "day", :multiple => true, :disabled => @product.cron_tab_days.blank?, :class => "cron" }
- (1..31).each do |day| - (1..31).each do |day|
%option{ :value => day, :selected => @product.cron_tab_days.include?(day) }= day %option{ :value => day, :selected => @product.cron_tab_days.include?(day) }= day
.column.right .rightlist
%h3.title= t("layout.products.cron_tab_generator.months") %h3.title= t("layout.products.cron_tab_generator.months")
.group .group
= label_tag :month_chooser_every, t("layout.products.cron_tab_generator.every_month"), :class => :label = label_tag :month_chooser_every, t("layout.products.cron_tab_generator.every_month"), :class => :label
= radio_button_tag :month_chooser, 0, @product.cron_tab_months.blank?, :id => :month_chooser_every, :class => "chooser cron" = radio_button_tag :month_chooser, 0, @product.cron_tab_months.blank?, :id => :month_chooser_every, :class => "chooser cron"
= label_tag :month_chooser_choose, t("layout.products.cron_tab_generator.choose"), :class => :label = label_tag :month_chooser_choose, t("layout.products.cron_tab_generator.choose"), :class => :label
= radio_button_tag :month_chooser, 1, @product.cron_tab_months.present?, :id => :month_chooser_choose, :class => "chooser cron" = radio_button_tag :month_chooser, 1, @product.cron_tab_months.present?, :id => :month_chooser_choose, :class => "chooser cron"
.group .group
%select{ :name => "month", :id => "month", :multiple => true, :disabled => @product.cron_tab_months.blank?, :class => "cron" } %select{ :name => "month", :id => "month", :multiple => true, :disabled => @product.cron_tab_months.blank?, :class => "cron" }
- (1..12).each do |month| - (1..12).each do |month|
%option{ :value => month, :selected => @product.cron_tab_months.include?(month) }= I18n.localize(Time.local(2000, month), :format => "%B") %option{ :value => month, :selected => @product.cron_tab_months.include?(month) }= I18n.localize(Time.local(2000, month), :format => "%B")
.both
.columns.wat-cf .leftlist
.column.left %h3.title= t("layout.products.cron_tab_generator.weekdays")
%h3.title= t("layout.products.cron_tab_generator.weekdays") .group
.group = label_tag :weekday_chooser_every, t("layout.products.cron_tab_generator.every_weekday"), :class => :label
= label_tag :weekday_chooser_every, t("layout.products.cron_tab_generator.every_weekday"), :class => :label = radio_button_tag :weekday_chooser, 0, @product.cron_tab_weekdays.blank?, :id => :weekday_chooser_every, :class => "chooser cron"
= radio_button_tag :weekday_chooser, 0, @product.cron_tab_weekdays.blank?, :id => :weekday_chooser_every, :class => "chooser cron"
= label_tag :weekday_chooser_choose, t("layout.products.cron_tab_generator.choose"), :class => :label = label_tag :weekday_chooser_choose, t("layout.products.cron_tab_generator.choose"), :class => :label
= radio_button_tag :weekday_chooser, 1, @product.cron_tab_weekdays.present?, :id => :weekday_chooser_choose, :class => "chooser cron" = radio_button_tag :weekday_chooser, 1, @product.cron_tab_weekdays.present?, :id => :weekday_chooser_choose, :class => "chooser cron"
.group .group
%select{ :name => "weekday", :id => "weekday", :multiple => true, :disabled => @product.cron_tab_weekdays.blank?, :class => "cron" } %select{ :name => "weekday", :id => "weekday", :multiple => true, :disabled => @product.cron_tab_weekdays.blank?, :class => "cron" }
- Date::DAYNAMES.each_with_index do |day, index| - Date::DAYNAMES.each_with_index do |day, index|
%option{ :value => index, :selected => @product.cron_tab_weekdays.include?(index) }= t("layout.weekdays.#{day}") %option{ :value => index, :selected => @product.cron_tab_weekdays.include?(index) }= t("layout.weekdays.#{day}")
.both
.group .both
= form.label :cron_tab, :class => :label .leftlist= form.label :cron_tab, :class => :label
= form.text_field :cron_tab, :id => "cron", :class => "text_field", :style => "width: 40%", :disabled => !@product.use_cron, :value => @product.cron_tab .rightlist= form.text_field :cron_tab, :id => "cron", :class => "text_field", :style => "width: 40%", :disabled => !@product.use_cron, :value => @product.cron_tab
= @product.cron_command =# @product.cron_command
.both

View File

@ -1,44 +1,52 @@
.group .leftlist= f.label :name, t("activerecord.attributes.product.name"), :class => :label
= f.label :name, t("activerecord.attributes.product.name"), :class => :label .rightlist= f.text_field :name, :class => 'text_field'
= f.text_field :name, :class => 'text_field' .both
.group
= f.label :build_script, t("activerecord.attributes.product.build_script"), :class => :label
= f.text_area :build_script, :class => 'text_field', :cols => 80
.group
= f.label :counter, t("activerecord.attributes.product.counter"), :class => :label
= f.text_area :counter, :class => 'text_field', :cols => 80
.group
= f.label :ks, t("activerecord.attributes.product.ks"), :class => :label
= f.text_area :ks, :class => 'text_field', :cols => 80
.group
= f.label :menu, t("activerecord.attributes.product.menu"), :class => :label
= f.text_area :menu, :class => 'text_field', :cols => 80
.group
%p
= f.label :tar, t("activerecord.attributes.product.tar"), :class => :label
= f.file_field :tar, :class => 'file_field'
%p
- if @product.tar?
= link_to @product.tar_file_name, @product.tar.url
= f.check_box :delete_tar
= f.label :delete_tar, t('layout.delete')
.group .leftlist= f.label :description, t("activerecord.attributes.product.description"), :class => :label
= render :partial => "products/crontab", :locals => { :form => f } .rightlist= f.text_area :description, :class => 'text_field', :cols => 80
.both
.group .leftlist= f.label :build_script, t("activerecord.attributes.product.build_script"), :class => :label
= f.label :is_template, :class => :label .rightlist= f.text_area :build_script, :class => 'text_field', :cols => 80
= f.check_box :is_template, :class => 'check_box' .both
.leftlist= f.label :counter, t("activerecord.attributes.product.counter"), :class => :label
.rightlist= f.text_area :counter, :class => 'text_field', :cols => 80
.both
.leftlist= f.label :ks, t("activerecord.attributes.product.ks"), :class => :label
.rightlist= f.text_area :ks, :class => 'text_field', :cols => 80
.both
.leftlist= f.label :menu, t("activerecord.attributes.product.menu"), :class => :label
.rightlist= f.text_area :menu, :class => 'text_field', :cols => 80
.both
%p
.leftlist= f.label :tar, t("activerecord.attributes.product.tar"), :class => :label
.rightlist= f.file_field :tar, :class => 'file_field'
.both
%p
- if @product.tar?
.leftlist= link_to @product.tar_file_name, @product.tar.url
.both
%br
.leftlist= f.label :delete_tar, t('layout.delete')
.rightlist= f.check_box :delete_tar
.both
= render :partial => "products/crontab", :locals => { :form => f }
- content_for :commented do - content_for :commented do
.group .leftlist= f.label :system_wide, :class => :label
= f.label :system_wide, :class => :label .rightlist= f.check_box :system_wide, :class => 'check_box'
= f.check_box :system_wide, :class => 'check_box'
.group.navform.wat-cf .both
%button.button{:type => "submit"} .button_block
= image_tag("choose.png", :alt => t("layout.save")) = submit_tag t("layout.save")
= t("layout.save") -#%input.button{:type => "submit", :class => "button"}
-#= image_tag("choose.png", :alt => t("layout.save"))
-#= t("layout.clone")
%span.text_button_padding= t("layout.or") %span.text_button_padding= t("layout.or")
= link_to t("layout.cancel"), platform_path(@platform), :class => "text_button_padding link_button" = link_to t("layout.cancel"), @product.new_record? ? platform_path(@platform) : platform_product_path(@platform, @product), :class => "button"

View File

@ -0,0 +1,14 @@
%table#myTable.tablesorter.platform-products{:cellspacing => "0", :cellpadding => "0"}
%thead
%tr
%th.th1= t("activerecord.attributes.product.name")
%th= t("layout.delete")
%tbody
- @products.each do |product|
%tr{:class => cycle("odd", "even")}
%td
= link_to product.name, platform_product_path(@platform, product)
%td.buttons
- if can? :destroy, product
= link_to platform_product_path(@platform, product), :method => :delete, :confirm => t("layout.products.confirm_delete") do
%span.delete &nbsp;

View File

@ -1,4 +1,15 @@
.block = render :partial => 'platforms/submenu'
= render :partial => 'platforms/sidebar'
%h3
= t("layout.products.edit_header")
= link_to @product.name, platform_product_path(@platform, @product)
%br
= form_for [@platform, @product], :html => { :class => :form, :multipart => true } do |f|
= render :partial => "form", :locals => {:f => f}
-#.block
.secondary-navigation .secondary-navigation
%ul.wat-cf %ul.wat-cf
%li.first= link_to @platform.name, platform_path(@platform) + "#products" %li.first= link_to @platform.name, platform_path(@platform) + "#products"

View File

@ -0,0 +1,6 @@
= render :partial => 'platforms/submenu' if params[:platform_id]
= render :partial => 'platforms/sidebar' if params[:platform_id]
= link_to t("layout.products.new"), new_platform_product_path(@platform), :class => 'button' if can? :create, @platform.products.build
= render :partial => 'list', :object => @products
= will_paginate @products

View File

@ -1,4 +1,10 @@
.block = render :partial => 'platforms/submenu'
= render :partial => 'platforms/sidebar'
= form_for [@platform, @product], :html => { :class => :form, :multipart => true } do |f|
= render :partial => "form", :locals => {:f => f}
-#.block
.secondary-navigation .secondary-navigation
%ul.wat-cf %ul.wat-cf
%li.first= link_to @platform.name, platform_path(@platform) + "#products" %li.first= link_to @platform.name, platform_path(@platform) + "#products"

View File

@ -1,4 +1,32 @@
.block = render :partial => 'platforms/submenu'
= render :partial => 'platforms/sidebar'
%h3= "#{t("layout.products.about")} #{@product.name}"
%p= @product.description
.buttons_block
- if can? :update, @product
= link_to image_tag("code.png", :alt => t("layout.edit")) + " " + t("layout.edit"), edit_platform_product_path(@platform, @product), :class => "button"
- if can? :destroy, @product
= link_to image_tag("x.png", :alt => t("layout.delete")) + " " + t("layout.delete"), platform_product_path(@platform, @product), :method => "delete", :class => "button", :confirm => t("layout.products.confirm_delete")
-# if @product.can_clone?
=# link_to t("layout.products.clone"), clone_platform_product_path(@platform, @product), :class => "button"
- if can?(:create, @product.product_build_lists.build)
= link_to t("layout.products.build"), platform_product_product_build_lists_path(@platform, @product), :class => "button", :method => 'post', :confirm => t("layout.confirm")
%h3= t("layout.products.build_lists_monitoring")
%table#myTable.tablesorter.platform-product-main{:cellspacing => "0", :cellpadding => "0"}
%thead
%tr
%th.th1= t("activerecord.attributes.product_build_list.id")
%th.th2= t("activerecord.attributes.product_build_list.status")
%th.th3= t("layout.product_build_lists.action")
%th.th4= t("activerecord.attributes.product_build_list.notified_at")
%tbody
= render @product.product_build_lists.default_order
-#.block
.secondary-navigation .secondary-navigation
%ul.wat-cf %ul.wat-cf
%li.first= link_to @platform.name, platform_path(@platform) + "#products" %li.first= link_to @platform.name, platform_path(@platform) + "#products"
@ -35,7 +63,7 @@
- if can?(:create, @product => ProductBuildList) - if can?(:create, @product => ProductBuildList)
= link_to t("layout.products.build"), platform_product_product_build_lists_path(@platform, @product), :class => "button", :method => 'post', :confirm => t("layout.confirm") = link_to t("layout.products.build"), platform_product_product_build_lists_path(@platform, @product), :class => "button", :method => 'post', :confirm => t("layout.confirm")
.block -#.block
.content .content
.inner .inner
%table.table %table.table

View File

@ -1,14 +1,15 @@
.group .leftlist= f.label :name, t("activerecord.attributes.repository.name"), :class => :label
= f.label :name, t("activerecord.attributes.repository.name"), :class => :label .rightlist= f.text_field :name, :class => 'text_field'
= f.text_field :name, :class => 'text_field'
.group
= f.label :description, t("activerecord.attributes.repository.description"), :class => :label
= f.text_field :description, :class => 'text_field'
.group.navform.wat-cf .leftlist= f.label :description, t("activerecord.attributes.repository.description"), :class => :label
%button.button{:type => "submit"} .rightlist= f.text_field :description, :class => 'text_field'
= image_tag("choose.png", :alt => t("layout.save"))
= t("layout.save") .both
.button_block
= submit_tag t("layout.save")
-#%input.button{:type => "submit", :class => "button"}
-#= image_tag("choose.png", :alt => t("layout.save"))
-#= t("layout.clone")
%span.text_button_padding= t("layout.or") %span.text_button_padding= t("layout.or")
= link_to t("layout.cancel"), @repositories_path + "#repositories", :class => "text_button_padding link_button" = link_to t("layout.cancel"), @repository.new_record? ? platform_repositories_path(@platform) : platform_repository_path(@platform, @repository), :class => "button"

View File

@ -1,4 +1,21 @@
%table.table %table#myTable.tablesorter.platform-repos{:cellspacing => "0", :cellpadding => "0"}
%thead
%tr
%th.th1= t("activerecord.attributes.repository.name")
%th.th2= t("layout.repositories.projects")
%th= t("layout.delete")
%tbody
- @repositories.each do |repository|
%tr{:class => cycle("odd", "even")}
%td
= link_to repository.name, platform_repository_path(@platform, repository)
%td
= repository.projects.count
%td.buttons
- if can? :destroy, repository
= link_to platform_repository_path(@platform, repository), :method => :delete, :confirm => t("layout.repositories.confirm_delete") do
%span.delete &nbsp;
-#%table.table
%tr %tr
%th.first= t("activerecord.attributes.repository.name") %th.first= t("activerecord.attributes.repository.name")
%th.last &nbsp; %th.last &nbsp;

View File

@ -5,8 +5,8 @@
"aaData": [ "aaData": [
<% @projects.each do |project| %> <% @projects.each do |project| %>
[ [
"<%=j link_to project.owner.uname, project.owner %>", "<%=j link_to("#{project.owner.respond_to?(:uname) ? project.owner.uname : project.owner.name} / #{project.name}", project) %>",
"<%=j link_to project.name, project %>", "<%=j project.description %>",
"<%=j link_to t("layout.add"), url_for(:controller => :repositories, :action => :add_project, :project_id => project.id) %>" "<%=j link_to t("layout.add"), url_for(:controller => :repositories, :action => :add_project, :project_id => project.id) %>"
]<%= project == @projects.last ? '' : ',' %> ]<%= project == @projects.last ? '' : ',' %>
<% end %> <% end %>

View File

@ -1,18 +1,19 @@
- columns = [{:type => 'html', :searchable => false}, {:type => 'html'}, {:type => nil, :sortable => false, :searchable => false}] - columns = [{:type => 'html'}, {:type => 'html', :sortable => false, :searchable => false}, {:type => nil, :sortable => false, :searchable => false, :class => 'buttons'}]
= raw datatable(columns, {:sort_by => "[1, 'asc']", :search_label => t("layout.search_by_name"), :processing => t("layout.processing"), = raw datatable(columns, {:sort_by => "[0, 'asc']", :search_label => t("layout.search_by_name"), :processing => t("layout.processing"),
:pagination_labels => {:first => t("datatables.first_label"), :previous => t("datatables.previous_label"), :pagination_labels => {:previous => t("datatables.previous_label"), :next => t("datatables.next_label")},
:next => t("datatables.next_label"), :last => t("datatables.last_label")},
:empty_label => t("datatables.empty_label"), :empty_label => t("datatables.empty_label"),
:info_label => t("datatables.info_label"), :info_label => t("datatables.info_label"),
:info_empty_label => t("datatables.info_empty_label"), :info_empty_label => t("datatables.info_empty_label"),
:filtered_label => t("datatables.filtered_label"), :filtered_label => t("datatables.filtered_label"),
:ajax_source => "#{url_for :controller => :repositories, :action => :projects_list, :id => @repository.id}" }) :table_dom_id => 'datatable',
:auto_width => 'false',
:ajax_source => "#{url_for :controller => :repositories, :action => :projects_list, :id => @repository.id, :added => "#{controller.action_name.to_sym == :show}"}" })
%table.table.datatable %table#datatable.tablesorter.repo-projects{:cellspacing => 0, :cellpadding => 0}
%thead %thead
%tr %tr
%th.first{:style => 'width: 80px'}= t("activerecord.attributes.user.uname") %th.th1= t("activerecord.attributes.project.name")
%th= t("activerecord.attributes.project.name") %th.th2= t("activerecord.attributes.project.description")
%th.last &nbsp; %th.buttons &nbsp;
%tbody %tbody
%br %br

View File

@ -1,6 +1,15 @@
%table.table %table#myTable.tablesorter.repo-projects{:cellpadding => "0", :cellspacing => "0"}
%thead
%tr
%th.th1= t("activerecord.attributes.project.name")
%th.th2= t("activerecord.attributes.project.description")
%th.th3= t("layout.remove")
%tbody= render :partial => 'repositories/project', :collection => @projects
-#%table.tablesorter
%tr %tr
%th.first= t("activerecord.attributes.project.name") %th.first= t("activerecord.attributes.project.name")
%th.
%th.last &nbsp; %th.last &nbsp;
- @projects.each do |project| - @projects.each do |project|
%tr{:class => cycle("odd", "even")} %tr{:class => cycle("odd", "even")}

View File

@ -0,0 +1,10 @@
%tr{:id => "Row#{project_counter}", :class => cycle('odd', 'even')}
%td
= link_to project do
.table-sort-left= image_tag visibility_icon(project.visibility)
.table-sort-right #{project.owner.uname} / #{project.name}
%td.td2
%span= project.description
%td.buttons
= link_to remove_project_repository_path(@repository, :project_id => project.id), :method => :delete, :confirm => t("layout.confirm") do
%span.delete &nbsp;

View File

@ -0,0 +1,31 @@
{
"sEcho": <%=h params[:sEcho].to_i || -1 %>,
"iTotalRecords": <%= @total_projects %>,
"iTotalDisplayRecords": <%= @total_project %>,
"aaData": [
<% @projects.each do |project| %>
[
"<%=(
"<div class='table-sort-left'>" +
j(image_tag(visibility_icon(project.visibility))) +
"</div>" +
"<div class='table-sort-right'>" +
j(link_to("#{project.owner.respond_to?(:uname) ? project.owner.uname : project.owner.name} / #{project.name}", project)) +
"</div>").html_safe
%>",
"<%=j project.description %>",
"<%=
if can? :remove_project, @repository
j(link_to('<span class="delete">&nbsp;</span>'.html_safe,
remove_project_repository_path(@repository, :project_id => project.id),
:method => :delete, :confirm => t("layout.confirm")
)
)
else
''
end
%>"
]<%= project == @projects.last ? '' : ',' %>
<% end %>
]
}

View File

@ -1,4 +1,9 @@
.block = render :partial => 'platforms/submenu' if params[:platform_id]
= render :partial => 'platforms/sidebar' if params[:platform_id]
= link_to t("layout.repositories.new"), new_platform_repository_path(@platform), :class => 'button' if can? :create, @platform.repositories.build
= render :partial => 'list', :object => @repositories
= will_paginate @repositories
-#.block
.secondary-navigation .secondary-navigation
%ul.wat-cf %ul.wat-cf
%li.first.active= link_to t("layout.repositories.list"), repositories_path %li.first.active= link_to t("layout.repositories.list"), repositories_path

View File

@ -1,4 +1,12 @@
.block = render :partial => 'platforms/submenu'
= render :partial => 'platforms/sidebar'
%h3= t("layout.repositories.new_header")
= form_for :repository, :url => @repositories_path, :html => { :class => :form } do |f|
= render :partial => "form", :locals => {:f => f}
-#.block
.secondary-navigation .secondary-navigation
%ul.wat-cf %ul.wat-cf
%li.first= link_to t("layout.repositories.list"), @repositories_path + "#platforms" %li.first= link_to t("layout.repositories.list"), @repositories_path + "#platforms"

View File

@ -1,45 +1,6 @@
.block = render :partial => 'platforms/submenu'
.secondary-navigation = render :partial => 'platforms/sidebar'
%ul.wat-cf
%li.first= link_to t("layout.repositories.list"), @repositories_path + "#repositories"
%li= link_to t("layout.repositories.new"), @new_repository_path
%li.active= link_to t("layout.repositories.show"), repository_path(@repository)
.content
.inner
%p
%b
= t("activerecord.attributes.repository.name")
\:
= @repository.name
%p
%b
= t("activerecord.attributes.repository.description")
\:
= @repository.description
%p
%b
= t("activerecord.attributes.repository.platform")
\:
= link_to @repository.platform.description, url_for(@repository.platform)
.wat-cf
= link_to image_tag("x.png", :alt => t("layout.delete")) + " " + t("layout.delete"), @repository_path, :method => "delete", :class => "button", :confirm => t("layout.repositories.confirm_delete")
%a{ :name => "projects" } %h3= raw "#{t("layout.repositories.add_project_to")}: #{link_to @repository.name, platform_repository_path(@platform, @repository)}"
.block
.secondary-navigation
%ul.wat-cf
%li.first= link_to t("layout.projects.list"), repository_path(@repository) + "#projects"
%li.active= link_to t("layout.projects.add"), url_for(:controller => :repositories, :action => :add_project)
.content
%h2.title
= t("layout.projects.list_header")
.inner
-#= render :partial => 'shared/search_form'
= render :partial => 'proj_list', :object => @projects
-#.actions-bar.wat-cf
.actions
= will_paginate @projects, :param_name => :project_page
-# content_for :sidebar, render(:partial => 'sidebar')
= render :partial => 'proj_list', :object => @projects

View File

@ -1,4 +1,19 @@
.block = render :partial => 'platforms/submenu'
= render :partial => 'platforms/sidebar'
%h3.fix= "#{t("layout.repositories.about")}: #{@repository.name}"
%p= @platform.description
%br
%br
%h3.fix= t("layout.projects.list_header")
- if can? :add_project, @repository
= link_to t("layout.projects.add"), add_project_repository_path(@repository), :class => 'button'
= render :partial => 'proj_list'#, :object => @projects
=# will_paginate @projects
-#.block
.secondary-navigation .secondary-navigation
%ul.wat-cf %ul.wat-cf
%li.first= link_to t("layout.repositories.list"), @repositories_path + "#repositories" %li.first= link_to t("layout.repositories.list"), @repositories_path + "#repositories"
@ -24,8 +39,8 @@
.wat-cf .wat-cf
= link_to image_tag("x.png", :alt => t("layout.delete")) + " " + t("layout.delete"), @repository_path, :method => "delete", :class => "button", :confirm => t("layout.repositories.confirm_delete") if can? :destroy, @repository = link_to image_tag("x.png", :alt => t("layout.delete")) + " " + t("layout.delete"), @repository_path, :method => "delete", :class => "button", :confirm => t("layout.repositories.confirm_delete") if can? :destroy, @repository
%a{ :name => "projects" } -#%a{ :name => "projects" }
.block -#.block
.secondary-navigation .secondary-navigation
%ul.wat-cf %ul.wat-cf
%li.first.active= link_to t("layout.projects.list"), repository_path(@repository) + "#projects" %li.first.active= link_to t("layout.projects.list"), repository_path(@repository) + "#projects"

View File

@ -24,3 +24,6 @@ types = [
types.each do |type| types.each do |type|
MIME::Types.add MIME::Type.from_array(type) MIME::Types.add MIME::Type.from_array(type)
end end
# load datatables plugin
require Rails.root.join("lib/rails_datatables")

View File

@ -11,3 +11,7 @@ en:
read_write_access: read & write read_write_access: read & write
by: by by: by
visibilities:
open: open
hidden: hidden

View File

@ -11,3 +11,7 @@ ru:
read_write_access: чтение и запись read_write_access: чтение и запись
by: '' by: ''
visibilities:
open: открытая
hidden: скрытая

View File

@ -33,3 +33,5 @@ en:
tracker: Tracker tracker: Tracker
build: Build build: Build
wiki: Wiki wiki: Wiki
platform_menu:
settings: Settings

View File

@ -33,3 +33,5 @@ ru:
tracker: Трекер tracker: Трекер
build: Сборка build: Сборка
wiki: Вики wiki: Вики
platform_menu:
settings: Настройки

View File

@ -6,6 +6,7 @@ en:
list: List list: List
new: Create new: Create
edit: Edit edit: Edit
about: About platform
new_header: New platform new_header: New platform
edit_header: Edit edit_header: Edit
list_header: Platforms list_header: Platforms
@ -22,7 +23,7 @@ en:
freeze: Freeze freeze: Freeze
unfreeze: Unfeeze unfreeze: Unfeeze
confirm_freeze: Are you sure to freeze this platform? confirm_freeze: Are you sure to freeze this platform?
confirm_freeze: Are you sure to clone this platform? confirm_clone: Are you sure to clone this platform?
confirm_unfreeze: Are you sure to defrost this platform? confirm_unfreeze: Are you sure to defrost this platform?
released_suffix: (released) released_suffix: (released)
confirm_delete: Are you sure to delete this platform? confirm_delete: Are you sure to delete this platform?
@ -38,7 +39,9 @@ en:
flash: flash:
platform: platform:
saved: Platform saved saved: Platform saved
created: Platform created
save_error: Platform saves error save_error: Platform saves error
create_error: Platform create error
freezed: Platform freezed freezed: Platform freezed
freeze_error: Platform freezing error, try again freeze_error: Platform freezing error, try again
unfreezed: Platform unfreezed unfreezed: Platform unfreezed

View File

@ -6,6 +6,7 @@ ru:
list: Список list: Список
new: Создать new: Создать
edit: Редактировать edit: Редактировать
about: О платформе
new_header: Новая платформа new_header: Новая платформа
edit_header: Редактировать edit_header: Редактировать
list_header: Платформы list_header: Платформы
@ -22,7 +23,7 @@ ru:
freeze: Заморозить freeze: Заморозить
unfreeze: Разморозить unfreeze: Разморозить
confirm_freeze: Вы уверены, что хотите заморозить эту платформу? confirm_freeze: Вы уверены, что хотите заморозить эту платформу?
confirm_freeze: Вы уверены, что хотите клонировать эту платформу? confirm_clone: Вы уверены, что хотите клонировать эту платформу?
confirm_unfreeze: Вы уверены, что хотите разморозить эту платформу? confirm_unfreeze: Вы уверены, что хотите разморозить эту платформу?
released_suffix: (выпущена) released_suffix: (выпущена)
confirm_delete: Вы уверены, что хотите удалить эту платформу? confirm_delete: Вы уверены, что хотите удалить эту платформу?
@ -37,8 +38,10 @@ ru:
flash: flash:
platform: platform:
saved: Платформа успешно добавлена saved: Платформа успешно сохранена
save_error: Не удалось создать платформу created: Платформа успешно добавлена
save_error: Не удалось сохранить платформу
create_error: Не удалось создать платформу
freezed: Платформа успешно заморожена freezed: Платформа успешно заморожена
freeze_error: Не удалось заморозить платформу, попробуйте еще раз freeze_error: Не удалось заморозить платформу, попробуйте еще раз
unfreezed: Платформа успешно разморожена unfreezed: Платформа успешно разморожена

View File

@ -2,6 +2,8 @@ en:
layout: layout:
products: products:
list: List list: List
about: About product
build_lists_monitoring: Build lists monitoring
new: New product new: New product
list_header: Products list_header: Products
clone: Clone clone: Clone
@ -39,6 +41,7 @@ en:
attributes: attributes:
product: product:
name: Name name: Name
description: Description
platform_id: Platform platform_id: Platform
build_status: Build status build_status: Build status
build_path: ISO path build_path: ISO path

View File

@ -2,6 +2,8 @@ ru:
layout: layout:
products: products:
list: Список list: Список
about: О продукте
build_lists_monitoring: Мониторинг сборочных заданий
new: Новый продукт new: Новый продукт
list_header: Продукты list_header: Продукты
clone: Клонировать clone: Клонировать
@ -39,6 +41,7 @@ ru:
attributes: attributes:
product: product:
name: Название name: Название
description: Описание
platform_id: Платформа platform_id: Платформа
build_status: Статус последней сборки build_status: Статус последней сборки
build_path: Путь к iso build_path: Путь к iso

View File

@ -1,7 +1,9 @@
en: en:
layout: layout:
repositories: repositories:
add_project_to: Add project to repository
list: List list: List
about: About repository
list_header: Repositories list_header: Repositories
new: New repository new: New repository
new_header: New repository new_header: New repository

View File

@ -1,7 +1,9 @@
ru: ru:
layout: layout:
repositories: repositories:
add_project_to: Добавить проект к репозиторию
list: Список list: Список
about: О репозитории
list_header: Репозитории list_header: Репозитории
new: Новый репозиторий new: Новый репозиторий
new_header: Новый репозиторий new_header: Новый репозиторий

View File

@ -5,8 +5,8 @@ ru:
page_gap: ... page_gap: ...
datatables: datatables:
previous_label: Пред. previous_label: Предыдущая
next_label: След. next_label: Следующая
first_label: « Первая first_label: « Первая
last_label: Последняя » last_label: Последняя »
empty_label: Нет доступных данных empty_label: Нет доступных данных

View File

@ -164,7 +164,7 @@ Rosa::Application.routes.draw do
resources :repositories do resources :repositories do
member do member do
get :add_project get :add_project
get :remove_project delete :remove_project
get :projects_list get :projects_list
end end
end end

View File

@ -0,0 +1,12 @@
class DeleteDublicateSubscribes < ActiveRecord::Migration
def up
execute <<-SQL
DELETE FROM subscribes s
WHERE s.id NOT IN (SELECT MIN(s1.id) FROM SUBSCRIBES s1
GROUP BY s1.subscribeable_type, s1.user_id, s1.status, s1.subscribeable_id)
SQL
end
def down
end
end

View File

@ -0,0 +1,10 @@
class AddDescriptionToProducts < ActiveRecord::Migration
def self.up
add_column :products, :description, :text
execute "UPDATE products SET description = name"
end
def self.down
remove_column :products, :description
end
end

View File

@ -0,0 +1,9 @@
class RemoveIsTemplateFromProducts < ActiveRecord::Migration
def up
remove_column :products, :is_template
end
def down
add_column :products, "is_template", :boolean, :default => false
end
end

View File

@ -11,7 +11,7 @@
# #
# It's strongly recommended to check this file into your version control system. # It's strongly recommended to check this file into your version control system.
ActiveRecord::Schema.define(:version => 20120306212914) do ActiveRecord::Schema.define(:version => 20120314223151) do
create_table "activity_feeds", :force => true do |t| create_table "activity_feeds", :force => true do |t|
t.integer "user_id", :null => false t.integer "user_id", :null => false
@ -23,8 +23,8 @@ ActiveRecord::Schema.define(:version => 20120306212914) do
create_table "arches", :force => true do |t| create_table "arches", :force => true do |t|
t.string "name", :null => false t.string "name", :null => false
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
end end
add_index "arches", ["name"], :name => "index_arches_on_name", :unique => true add_index "arches", ["name"], :name => "index_arches_on_name", :unique => true
@ -33,8 +33,8 @@ ActiveRecord::Schema.define(:version => 20120306212914) do
t.integer "user_id" t.integer "user_id"
t.string "provider" t.string "provider"
t.string "uid" t.string "uid"
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
end end
add_index "authentications", ["provider", "uid"], :name => "index_authentications_on_provider_and_uid", :unique => true add_index "authentications", ["provider", "uid"], :name => "index_authentications_on_provider_and_uid", :unique => true
@ -45,8 +45,8 @@ ActiveRecord::Schema.define(:version => 20120306212914) do
t.integer "arch_id" t.integer "arch_id"
t.integer "pl_id" t.integer "pl_id"
t.integer "bpl_id" t.integer "bpl_id"
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
end end
create_table "build_list_items", :force => true do |t| create_table "build_list_items", :force => true do |t|
@ -54,8 +54,8 @@ ActiveRecord::Schema.define(:version => 20120306212914) do
t.integer "level" t.integer "level"
t.integer "status" t.integer "status"
t.integer "build_list_id" t.integer "build_list_id"
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
t.string "version" t.string "version"
end end
@ -69,8 +69,8 @@ ActiveRecord::Schema.define(:version => 20120306212914) do
t.integer "project_id" t.integer "project_id"
t.integer "arch_id" t.integer "arch_id"
t.datetime "notified_at" t.datetime "notified_at"
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
t.boolean "is_circle", :default => false t.boolean "is_circle", :default => false
t.text "additional_repos" t.text "additional_repos"
t.string "name" t.string "name"
@ -93,16 +93,16 @@ ActiveRecord::Schema.define(:version => 20120306212914) do
t.string "name" t.string "name"
t.string "ancestry" t.string "ancestry"
t.integer "projects_count", :default => 0, :null => false t.integer "projects_count", :default => 0, :null => false
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
end end
create_table "comments", :force => true do |t| create_table "comments", :force => true do |t|
t.string "commentable_type" t.string "commentable_type"
t.integer "user_id" t.integer "user_id"
t.text "body" t.text "body"
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
t.decimal "commentable_id", :precision => 50, :scale => 0 t.decimal "commentable_id", :precision => 50, :scale => 0
t.integer "project_id" t.integer "project_id"
end end
@ -111,8 +111,8 @@ ActiveRecord::Schema.define(:version => 20120306212914) do
t.string "name", :null => false t.string "name", :null => false
t.integer "project_id", :null => false t.integer "project_id", :null => false
t.integer "owner_id", :null => false t.integer "owner_id", :null => false
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
end end
create_table "delayed_jobs", :force => true do |t| create_table "delayed_jobs", :force => true do |t|
@ -124,8 +124,8 @@ ActiveRecord::Schema.define(:version => 20120306212914) do
t.datetime "locked_at" t.datetime "locked_at"
t.datetime "failed_at" t.datetime "failed_at"
t.string "locked_by" t.string "locked_by"
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
t.string "queue" t.string "queue"
end end
@ -137,8 +137,8 @@ ActiveRecord::Schema.define(:version => 20120306212914) do
t.string "distro" t.string "distro"
t.string "platform" t.string "platform"
t.integer "counter", :default => 0 t.integer "counter", :default => 0
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
end end
create_table "event_logs", :force => true do |t| create_table "event_logs", :force => true do |t|
@ -153,14 +153,14 @@ ActiveRecord::Schema.define(:version => 20120306212914) do
t.string "controller" t.string "controller"
t.string "action" t.string "action"
t.text "message" t.text "message"
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
end end
create_table "groups", :force => true do |t| create_table "groups", :force => true do |t|
t.integer "owner_id" t.integer "owner_id"
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
t.string "uname" t.string "uname"
t.integer "own_projects_count", :default => 0, :null => false t.integer "own_projects_count", :default => 0, :null => false
t.text "description" t.text "description"
@ -173,8 +173,8 @@ ActiveRecord::Schema.define(:version => 20120306212914) do
t.string "title" t.string "title"
t.text "body" t.text "body"
t.string "status", :default => "open" t.string "status", :default => "open"
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
t.integer "creator_id" t.integer "creator_id"
t.datetime "closed_at" t.datetime "closed_at"
t.integer "closed_by" t.integer "closed_by"
@ -205,8 +205,8 @@ ActiveRecord::Schema.define(:version => 20120306212914) do
t.string "description" t.string "description"
t.string "name" t.string "name"
t.integer "parent_platform_id" t.integer "parent_platform_id"
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
t.boolean "released", :default => false t.boolean "released", :default => false
t.integer "owner_id" t.integer "owner_id"
t.string "owner_type" t.string "owner_type"
@ -219,8 +219,8 @@ ActiveRecord::Schema.define(:version => 20120306212914) do
t.integer "platform_id" t.integer "platform_id"
t.string "login" t.string "login"
t.string "password" t.string "password"
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
t.integer "user_id" t.integer "user_id"
end end
@ -228,8 +228,8 @@ ActiveRecord::Schema.define(:version => 20120306212914) do
t.integer "product_id" t.integer "product_id"
t.integer "status", :default => 2, :null => false t.integer "status", :default => 2, :null => false
t.datetime "notified_at" t.datetime "notified_at"
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
end end
add_index "product_build_lists", ["product_id"], :name => "index_product_build_lists_on_product_id" add_index "product_build_lists", ["product_id"], :name => "index_product_build_lists_on_product_id"
@ -239,8 +239,8 @@ ActiveRecord::Schema.define(:version => 20120306212914) do
t.integer "platform_id", :null => false t.integer "platform_id", :null => false
t.integer "build_status", :default => 2, :null => false t.integer "build_status", :default => 2, :null => false
t.string "build_path" t.string "build_path"
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
t.text "build_script" t.text "build_script"
t.text "counter" t.text "counter"
t.text "ks" t.text "ks"
@ -249,10 +249,10 @@ ActiveRecord::Schema.define(:version => 20120306212914) do
t.string "tar_content_type" t.string "tar_content_type"
t.integer "tar_file_size" t.integer "tar_file_size"
t.datetime "tar_updated_at" t.datetime "tar_updated_at"
t.boolean "is_template", :default => false
t.boolean "system_wide", :default => false t.boolean "system_wide", :default => false
t.text "cron_tab" t.text "cron_tab"
t.boolean "use_cron", :default => false t.boolean "use_cron", :default => false
t.text "description"
end end
create_table "project_imports", :force => true do |t| create_table "project_imports", :force => true do |t|
@ -260,8 +260,8 @@ ActiveRecord::Schema.define(:version => 20120306212914) do
t.string "name" t.string "name"
t.string "version" t.string "version"
t.datetime "file_mtime" t.datetime "file_mtime"
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
t.integer "platform_id" t.integer "platform_id"
end end
@ -270,14 +270,14 @@ ActiveRecord::Schema.define(:version => 20120306212914) do
create_table "project_to_repositories", :force => true do |t| create_table "project_to_repositories", :force => true do |t|
t.integer "project_id" t.integer "project_id"
t.integer "repository_id" t.integer "repository_id"
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
end end
create_table "projects", :force => true do |t| create_table "projects", :force => true do |t|
t.string "name" t.string "name"
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
t.integer "owner_id" t.integer "owner_id"
t.string "owner_type" t.string "owner_type"
t.string "visibility", :default => "open" t.string "visibility", :default => "open"
@ -303,30 +303,29 @@ ActiveRecord::Schema.define(:version => 20120306212914) do
t.string "token" t.string "token"
t.boolean "approved", :default => false t.boolean "approved", :default => false
t.boolean "rejected", :default => false t.boolean "rejected", :default => false
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
t.string "interest" t.string "interest"
t.text "more" t.text "more"
end end
add_index "register_requests", ["email"], :name => "index_register_requests_on_email", :unique => true, :case_sensitive => false add_index "register_requests", ["email"], :name => "index_register_requests_on_email", :unique => true, :case_sensitive => false
add_index "register_requests", ["token"], :name => "index_register_requests_on_token", :unique => true, :case_sensitive => false
create_table "relations", :force => true do |t| create_table "relations", :force => true do |t|
t.integer "object_id" t.integer "object_id"
t.string "object_type" t.string "object_type"
t.integer "target_id" t.integer "target_id"
t.string "target_type" t.string "target_type"
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
t.string "role" t.string "role"
end end
create_table "repositories", :force => true do |t| create_table "repositories", :force => true do |t|
t.string "description", :null => false t.string "description", :null => false
t.integer "platform_id", :null => false t.integer "platform_id", :null => false
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
t.string "name", :null => false t.string "name", :null => false
end end
@ -334,8 +333,8 @@ ActiveRecord::Schema.define(:version => 20120306212914) do
t.string "name", :null => false t.string "name", :null => false
t.integer "arch_id", :null => false t.integer "arch_id", :null => false
t.integer "project_id", :null => false t.integer "project_id", :null => false
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
end end
add_index "rpms", ["project_id", "arch_id"], :name => "index_rpms_on_project_id_and_arch_id" add_index "rpms", ["project_id", "arch_id"], :name => "index_rpms_on_project_id_and_arch_id"
@ -348,8 +347,8 @@ ActiveRecord::Schema.define(:version => 20120306212914) do
t.boolean "new_comment_reply", :default => true t.boolean "new_comment_reply", :default => true
t.boolean "new_issue", :default => true t.boolean "new_issue", :default => true
t.boolean "issue_assign", :default => true t.boolean "issue_assign", :default => true
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
t.boolean "new_comment_commit_owner", :default => true t.boolean "new_comment_commit_owner", :default => true
t.boolean "new_comment_commit_repo_owner", :default => true t.boolean "new_comment_commit_repo_owner", :default => true
t.boolean "new_comment_commit_commentor", :default => true t.boolean "new_comment_commit_commentor", :default => true
@ -358,8 +357,8 @@ ActiveRecord::Schema.define(:version => 20120306212914) do
create_table "subscribes", :force => true do |t| create_table "subscribes", :force => true do |t|
t.string "subscribeable_type" t.string "subscribeable_type"
t.integer "user_id" t.integer "user_id"
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
t.boolean "status", :default => true t.boolean "status", :default => true
t.integer "project_id" t.integer "project_id"
t.decimal "subscribeable_id", :precision => 50, :scale => 0 t.decimal "subscribeable_id", :precision => 50, :scale => 0
@ -367,18 +366,18 @@ ActiveRecord::Schema.define(:version => 20120306212914) do
create_table "users", :force => true do |t| create_table "users", :force => true do |t|
t.string "name" t.string "name"
t.string "email", :default => "", :null => false t.string "email", :default => "", :null => false
t.string "encrypted_password", :default => "", :null => false t.string "encrypted_password", :limit => 128, :default => "", :null => false
t.string "reset_password_token" t.string "reset_password_token"
t.datetime "reset_password_sent_at" t.datetime "reset_password_sent_at"
t.datetime "remember_created_at" t.datetime "remember_created_at"
t.datetime "created_at", :null => false t.datetime "created_at"
t.datetime "updated_at", :null => false t.datetime "updated_at"
t.text "ssh_key" 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.integer "own_projects_count", :default => 0, :null => false t.integer "own_projects_count", :default => 0, :null => false
t.text "professional_experience" t.text "professional_experience"
t.string "site" t.string "site"
t.string "company" t.string "company"

View File

@ -444,7 +444,7 @@ article a.button {
background-image: linear-gradient(top, #68a3d8, #125687); background-image: linear-gradient(top, #68a3d8, #125687);
filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#68a3d8', EndColorStr='#125687'); filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#68a3d8', EndColorStr='#125687');
border: 1px solid #5084b4; border: 1px solid #5084b4;
padding: 4px 20px; padding: 4px 20px 6px;
margin: 0; margin: 0;
font-size: 12px; font-size: 12px;
text-decoration: none; text-decoration: none;
@ -513,7 +513,7 @@ article input[type="submit"] {
background-image: linear-gradient(top, #68a3d8, #125687); background-image: linear-gradient(top, #68a3d8, #125687);
filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#68a3d8', EndColorStr='#125687'); filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#68a3d8', EndColorStr='#125687');
border: 1px solid #5084b4; border: 1px solid #5084b4;
padding: 0px 20px 0px; padding: 3px 20px 5px;
margin: 0; margin: 0;
font-size: 12px; font-size: 12px;
text-decoration: none; text-decoration: none;
@ -523,7 +523,6 @@ article input[type="submit"] {
border-radius: 5px; border-radius: 5px;
text-align: center; text-align: center;
height: auto; height: auto;
height: 28px;
width: auto; width: auto;
font-family: Tahoma; font-family: Tahoma;
} }
@ -2364,3 +2363,7 @@ table.tablesorter tr.search td input[type="text"] {
table.tablesorter.width565 { table.tablesorter.width565 {
width: 565px; width: 565px;
} }
article h3 a {
font-size: 14px;
}

View File

@ -1,2 +1,3 @@
# -*- encoding : utf-8 -*- # -*- encoding : utf-8 -*-
require Rails.root.join('lib/rails_datatables/rails_datatables')
ActionView::Base.send :include, RailsDatatables ActionView::Base.send :include, RailsDatatables

View File

@ -60,7 +60,7 @@ module RailsDatatables
"sProcessing": '#{processing}' "sProcessing": '#{processing}'
}, },
"sPaginationType": "full_numbers", "sPaginationType": "will_paginate_like",
"iDisplayLength": #{per_page}, "iDisplayLength": #{per_page},
"bProcessing": true, "bProcessing": true,
"bServerSide": #{server_side}, "bServerSide": #{server_side},
@ -81,6 +81,8 @@ module RailsDatatables
} ); } );
} }
})#{append}; })#{append};
$('#datatable_wrapper').append("<div class='both'></div>");
}); });
</script> </script>
} }

View File

@ -2,6 +2,7 @@
//= require gollum/gollum.dialog //= require gollum/gollum.dialog
//= require gollum/gollum.placeholder //= require gollum/gollum.placeholder
//= require gollum/editor/gollum.editor //= require gollum/editor/gollum.editor
//= require jquery.dataTables
//= require codemirror //= require codemirror
//= require codemirror/runmode //= require codemirror/runmode
//= require_tree ./codemirror/modes //= require_tree ./codemirror/modes

View File

@ -1,23 +0,0 @@
require 'rake'
require 'rake/testtask'
require 'rake/rdoctask'
desc 'Default: run unit tests.'
task :default => :test
desc 'Test the rails_datatables plugin.'
Rake::TestTask.new(:test) do |t|
t.libs << 'lib'
t.libs << 'test'
t.pattern = 'test/**/*_test.rb'
t.verbose = true
end
desc 'Generate documentation for the rails_datatables plugin.'
Rake::RDocTask.new(:rdoc) do |rdoc|
rdoc.rdoc_dir = 'rdoc'
rdoc.title = 'RailsDatatables'
rdoc.options << '--line-numbers' << '--inline-source'
rdoc.rdoc_files.include('README')
rdoc.rdoc_files.include('lib/**/*.rb')
end

View File

@ -1,2 +0,0 @@
# -*- encoding : utf-8 -*-
# Install hook code here

View File

@ -1,2 +0,0 @@
# -*- encoding : utf-8 -*-
# Uninstall hook code here