Merge branch 'master' into 90-pull

Conflicts:
	db/schema.rb
This commit is contained in:
Alexander Machehin 2012-05-21 17:31:49 +06:00
commit 6b6887250b
31 changed files with 260 additions and 304 deletions

View File

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 130 KiB

View File

@ -1,3 +1,11 @@
//= require jquery
//= require jquery_ujs
//= require jquery-ui
//= require pirobox_extended_min
//= require ./design/all
$(document).ready(function() {
$('div.information > div.profile > a').live('click', function(e) {
e.preventDefault();
});
});

View File

@ -75,7 +75,7 @@ class Projects::BuildListsController < Projects::BaseController
def update
if params[:publish].present? and can?(:publish, @build_list)
publish
elsif params[:reject_publish].present? and can?(:reject_publish)
elsif params[:reject_publish].present? and can?(:reject_publish, @build_list)
reject_publish
else
# King Arthur, we are under attack!
@ -112,7 +112,7 @@ class Projects::BuildListsController < Projects::BaseController
@build_list.container_path = params[:container_path]
@build_list.save
@build_list.set_packages(ActiveSupport::JSON.decode(params[:pkg_info])) if params[:status].to_i == BuildServer::SUCCESS and params[:pkg_info].present?
@build_list.set_packages(ActiveSupport::JSON.decode(params[:pkg_info]), params[:package_name]) if params[:status].to_i == BuildServer::SUCCESS and params[:pkg_info].present?
render :nothing => true, :status => 200
end
@ -172,12 +172,12 @@ class Projects::BuildListsController < Projects::BaseController
def publish
@build_list.update_type = params[:build_list][:update_type] if params[:build_list][:update_type].present?
if params[:create_advisory].present?
a = @build_list.build_advisory
a.update_type = @build_list.update_type
a.project = @build_list.project
a.platforms << @build_list.save_to_platform unless a.platforms.include? @build_list.save_to_platform
redirect_to :back, :notice => t('layout.build_lists.publish_fail') unless a.update_attributes(params[:build_list][:advisory])
if params[:create_advisory].present? and !@build_list.build_advisory(params[:build_list][:advisory]) do |a|
a.update_type = @build_list.update_type
a.project = @build_list.project
a.platforms << @build_list.save_to_platform unless a.platforms.include? @build_list.save_to_platform
end.save
redirect_to :back, :notice => t('layout.build_lists.publish_fail') and return
end
if @build_list.save and @build_list.publish
redirect_to :back, :notice => t('layout.build_lists.publish_success')

View File

@ -2,6 +2,10 @@
class Projects::ProjectsController < Projects::BaseController
before_filter :authenticate_user!
load_and_authorize_resource
# TODO WTF ? fork, update, sections not authorize
before_filter do |controller|
authorize! params[:action].to_sym, @project if params[:action] != 'index'
end
def index
@projects = Project.accessible_by(current_ability, :membered)
@ -57,7 +61,6 @@ class Projects::ProjectsController < Projects::BaseController
end
def fork
authorize! :fork, @project # TODO WTF ?
owner = (Group.find params[:group] if params[:group].present?) || current_user
authorize! :update, owner if owner.class == Group
if forked = @project.fork(owner) and forked.valid?

View File

@ -1,11 +1,20 @@
# -*- encoding : utf-8 -*-
class Users::RegisterRequestsController < ApplicationController
before_filter :user_choose_locale
layout 'invite'
def new
redirect_to '/invite.html'
render :invite
end
def create
RegisterRequest.create(params[:register_request])
redirect_to '/thanks.html'
render :thanks
end
protected
def user_choose_locale
I18n.locale = params[:format] if User::LANGUAGES.include?(params[:format])
end
end

View File

@ -66,7 +66,7 @@ class Ability
can [:read, :related], BuildList, :project => {:owner_type => 'User', :owner_id => user.id}
can [:read, :related], BuildList, :project => {:owner_type => 'Group', :owner_id => user.group_ids}
can(:read, BuildList, read_relations_for('build_lists', 'projects')) {|build_list| can? :read, build_list.project}
can([:create, :update], BuildList) {|build_list| build_list.project.is_rpm && can?(:write, build_list.project)}
can([:create, :update], BuildList) {|build_list| build_list.project.is_package && can?(:write, build_list.project)}
can(:publish, BuildList) do |build_list|
build_list.can_publish? and build_list.save_to_platform.released ? local_admin?(build_list.save_to_platform) : can?(:write, build_list.project)

View File

@ -7,7 +7,7 @@ class Advisory < ActiveRecord::Base
after_create :generate_advisory_id
ID_TEMPLATE = 'ROSA%<type>s-%<year>d:%<id>04d'
ID_TEMPLATE = 'ROSA-%<type>s-%<year>d:%<id>04d'
TYPES = {'security' => 'SA', 'bugfix' => 'A'}
def to_param

View File

@ -114,10 +114,11 @@ class BuildList < ActiveRecord::Base
end
end
def set_packages(pkg_hash)
build_package(pkg_hash['srpm'], 'source') {|p| p.save!}
def set_packages(pkg_hash, project_name)
prj = Project.joins(:repositories => :platform).where('platforms.id = ?', save_to_platform.id).find_by_name!(project_name)
build_package(pkg_hash['srpm'], 'source', prj) {|p| p.save!}
pkg_hash['rpm'].each do |rpm_hash|
build_package(rpm_hash, 'binary') {|p| p.save!}
build_package(rpm_hash, 'binary', prj) {|p| p.save!}
end
end
@ -188,9 +189,9 @@ class BuildList < ActiveRecord::Base
save
end
def build_package(pkg_hash, package_type)
def build_package(pkg_hash, package_type, prj)
packages.create(pkg_hash) do |p|
p.project = project # Project.joins(:repositories => :platform).where('platforms.id = ?', save_to_platform.id).find_by_name!(pkg_hash['name'])
p.project = prj
p.platform = save_to_platform
p.package_type = package_type
yield p

View File

@ -29,7 +29,7 @@ class Project < ActiveRecord::Base
validates_attachment_size :srpm, :less_than => 500.megabytes
validates_attachment_content_type :srpm, :content_type => ['application/octet-stream', "application/x-rpm", "application/x-redhat-package-manager"], :message => I18n.t('layout.invalid_content_type')
attr_accessible :name, :description, :visibility, :srpm, :is_rpm, :default_branch, :has_issues, :has_wiki
attr_accessible :name, :description, :visibility, :srpm, :is_package, :default_branch, :has_issues, :has_wiki
attr_readonly :name
scope :recent, order("name ASC")

View File

@ -0,0 +1,22 @@
!!!
%html
%head
%meta{:content => "text/html; charset=utf-8", "http-equiv" => "Content-Type"}/
%title=t 'invites.title'
%script{:src => "http://html5shiv.googlecode.com/svn/trunk/html5.js", :type => "text/javascript"}
%link{:href => "/styles/prereg.css", :rel => "stylesheet", :type => "text/css"}/
%body
.wrap
= yield :nav if content_for?(:nav)
/ Top block
%header
.logo
.text=t 'invites.header'
.both
/ Page
%article
=yield
.both
/ Footer
%footer= render "layouts/menu/bottom"
= render 'layouts/counters' unless current_user.try(:admin?)

View File

@ -1,65 +0,0 @@
.sub-menu.tour
%nav
%ul
%li
=link_to 'Управление проектами', tour_inside_path('projects')
%li
=link_to 'Исходный код', tour_inside_path('sources'), :class => 'active'
%li
=link_to 'Сборка проектов', tour_inside_path('builds')
.both
/ Page
%article
/ Single page content
.feature-wrap
.feature
.left
%a.pirobox{:href => image_path('tour/big/source.png'), :rel => "single", :title => "Исходный код онлайн"}
=image_tag 'tour/2/source.png'
.right
%h1 Исходный код онлайн
%p
Мы сфокусировались на том, чтобы сделать исходный код
доступным и прозрачным. Все, что вы выложите в git-репозиторий,
мгновенно станет доступным для просмотра в режиме онлайн,
чтобы вы могли поделиться им с людьми, даже если они не
используют Git. На главной странице каждого проекта есть список
файлов проекта, а также информация о последнем изменении.
Вы можете сразу увидеть самое важное в вашем проекте: код.
.both
.feature-wrap
.feature
.left
%h1 История файла
%p
Каждый файл в git-репозитории имеет историю, которую вы
легко можете посмотреть: кто, когда и что в нем поменял.
.right
%a.pirobox{:href => image_path('tour/big/history.png'), :rel => "single", :title => "История файла"}
=image_tag 'tour/2/history.png'
.both
.feature-wrap
.feature
.left
%a.pirobox{:href => image_path('tour/big/annotation.png'), :rel => "single", :title => "Аннотация файла"}
=image_tag 'tour/2/annotation.png'
.right
%h1 Аннотация файла
%p
Ищете автора фрагмента кода? Откройте аннотацию файла
(Blame), чтобы увидеть: кто и в каком коммите последний
изменял данный фрагмент.
.both
.feature-wrap
.feature
.left
%h1 Редактирования онлайн
%p
Вам нужно быстро внести изменение в файл? Исправить
орфографические ошибки на вашем мобильном телефоне?
Мы предлагаем простой редактор для каждого файла в
git-репозитории.
.right
%a.pirobox{:href => image_path('tour/big/edit.png'), :rel => "single", :title => "Редактирования онлайн"}
=image_tag 'tour/2/edit.png'
.both

View File

@ -7,7 +7,7 @@
%ul
%li= link_to t("project_menu.project"), project_path(@project), :class => (act.in?([:show, :edit]) && contr.in?([:trees, :blobs]) ? 'active' : nil)
%li= link_to t("project_menu.commits"), commits_path(@project), :class => (act.in?([:index, :show]) && contr == :commits ? 'active' : nil)
- if @project.is_rpm and can?(:read, @project => BuildList)
- if @project.is_package and can?(:read, @project => BuildList)
%li= link_to t("project_menu.builds"), project_build_lists_path(@project), :class => (contr == :build_lists ? 'active' : nil)
- if @project.has_issues
%li= link_to t("project_menu.tracker"), project_issues_path(@project), :class => (contr == :issues ? 'active' : nil)

View File

@ -42,8 +42,8 @@
\ 
.rightlist
.check
%span#niceCheckbox1.niceCheck-main= f.check_box :is_rpm#, :class => 'niceCheckbox1'
.forcheck= t("activerecord.attributes.project.is_rpm")
%span#niceCheckbox1.niceCheck-main= f.check_box :is_package#, :class => 'niceCheckbox1'
.forcheck= t("activerecord.attributes.project.is_package")
.both
.both
- if [:new, :create].include? act

View File

@ -0,0 +1,44 @@
-content_for :nav do
%nav
-if I18n.locale == :ru
%a{:href => "#{new_register_request_path}.en"}
%p
English
%br>/
version
-elsif I18n.locale == :en
%a{:href => "#{new_register_request_path}.ru"}
%p
Русская
%br>/
версия
.left
%p
=raw t 'invites.description'
%div{:style => "clear: both;"}
.right
%h3=t 'invites.want'
%form#new_register_request{"accept-charset" => "UTF-8", :action => "/register_requests", :method => "post", :name => "invite_form"}
.signup-left=t 'invites.name'
.signup-right
%input#email.registartion-input-signup{:name => "register_request[name]", :onClick => "this.className='registartion-input-focus';disError(this);", :onblur => "if(this.value==''){this.value='';this.className='registartion-input-signup';}else{this.className='registartion-input-no-focus';};buttonCheck();", :onfocus => "if(this.value=='#{t 'invites.login_email'}'){this.value='';this.className='registartion-input-focus';};", :onkeydown => "buttonCheck();", :type => "text"}/
%div{:style => "clear: both;"}
.signup-left=t 'invites.email'
.signup-right
%input#email.registartion-input-signup{:name => "register_request[email]", :onClick => "this.className='registartion-input-focus';disError(this);", :onblur => "if(this.value==''){this.value='';this.className='registartion-input-signup';}else{this.className='registartion-input-no-focus';};buttonCheck();", :onfocus => "if(this.value=='#{t 'invites.login_email'}'){this.value='';this.className='registartion-input-focus';};", :onkeydown => "buttonCheck();", :type => "text"}/
%div{:style => "clear: both;"}
.signup-left=raw t 'invites.interest'
.signup-right
%select.registartion-input-signup{:name => "register_request[interest]"}
-t('invites.interests').each do |base, title|
%option=title
%div{:style => "clear: both;"}
.signup-left=t 'invites.comments'
.signup-right
%textarea.registartion-input-signup{:name => "register_request[more]", :rows => "3"}
%div{:style => "clear: both;"}
=hidden_field_tag :format, I18n.locale
.button
%input.button{:type => "submit", :value => t('invites.send')}
%div{:style => "clear: both;"}

View File

@ -0,0 +1,3 @@
.all
%p
%span{:style => "font-size: 28px;"}=raw t 'invites.thanks'

View File

@ -45,5 +45,5 @@ end
require 'stub_xml_rpc'
Rails.application.config.to_prepare {
Platform.send :include, Modules::Models::RsyncStub
Platform.send :include, Modules::Models::SymlinkStub
}

View File

@ -0,0 +1,29 @@
en:
invites:
title: ABF
header: 'A platform for distribution development and lifecycle management: from source code to ISO images.'
description: |
Welcome!<br><br>
On this page you can submit a request to participate in beta testing of ABF build service of ROSA company.<br><br>
In the first place we process requests from prospective maintainers and representatives of distribution teams.<br><br>
You can get detailed documentation <a class='last' href="http://wiki.rosalab.ru/index.php/Сборочная_среда_ABF">here</a>.<br><br>
We will be glad to answer your questions at the project <a class='last' href="http://forum.rosalab.ru/viewforum.php?f=10">here</a>.<br><br>
thanks: |
Thank You!<br><br>
We are glad that you have expressed interest in our ABF service!<br><br>
Your registration confirmation will be sent to the e-mail address you have specified in the registration form.<br><br>
We will be glad to get feedback and to answer your questions in our <a class='last' href="http://forum.rosalab.ru/viewforum.php?f=10">forum</a>.<br><br>
You can get detailed documentation <a class='last' href="http://wiki.rosalab.ru/index.php/Сборочная_среда_ABF">here</a>.
want: I want to become ABF beta-tester!
login_email: Login or email
name: 'First/Last name'
email: E-mail address
interest: Interest in the project
Comments: Comments
send: Send
interests:
evaluate: Evaluate ABF possibilities
maintainer: I want to become ROSA maintainer
build: I want to build a distribution using ABF

View File

@ -0,0 +1,30 @@
ru:
invites:
title: Сборочная среда
header: 'Платформа разработки и управления жизненным циклом дистрибутивов: от исходного кода до ISO-образов.'
description: |
Приветствуем Вас!<br><br>
Вы находитесь на странице размещения заявок на участие в бета-тестировании сборочного сервиса ABF компании РОСА.<br><br>
В первую очередь одобряются заявки от потенциальных майнтейнеров и представителей дистрибутивных команд.<br><br>
Ознакомиться с документацией можно <a class='last' href="http://wiki.rosalab.ru/index.php/Сборочная_среда_ABF">здесь</a>.<br><br>
Мы будем рады ответить на Ваши вопросы на <a class='last' href="http://forum.rosalab.ru/viewforum.php?f=10">форуме</a> проекта.
thanks: |
Спасибо!<br><br>
Благодарим за интерес к нашему сервису ABF!<br><br>
Приглашение будет выслано вам по указанной электронной почте.<br><br>
Приглашаем Вас на <a class='last' href="http://forum.rosalab.ru/viewforum.php?f=10">форум</a> проекта,
где мы будем рады ответить на Ваши вопросы и получить Ваши пожелания.<br><br>
Ознакомиться с документацией можно <a href="http://wiki.rosalab.ru/index.php/Сборочная_среда_ABF">здесь</a>.
want: Хочу стать бета-тестером ABF!
login_email: Логин или email
name: Имя, Фамилия
email: Электронная почта
interest: Степень интереса<br> к проекту
Comments: Также хочу сказать
send: Отправить
interests:
evaluate: Общеобразовательные цели
maintainer: Хочу стать майнтейнером РОСы
build: Хочу собрать в ABF дистрибутив

View File

@ -87,7 +87,7 @@ en:
me: Myself
group: Group
default_branch: Default branch
is_rpm: Project is a packet
is_package: Project is a package
errors:
project:
uname: The name can only use lower case Latin letters (a-z), numbers (0-9) and underscore (_)

View File

@ -87,7 +87,7 @@ ru:
me: Я
group: Группа
default_branch: Ветка по умолчанию
is_rpm: Проект является пакетом
is_package: Проект является пакетом
errors:
project:
uname: В имени можно использовать только строчные символы латинского алфавита (a-z), цифры (0-9) и символ нижнего подчеркивания (_)

View File

@ -46,16 +46,16 @@ ru:
edit_description: |
Вам нужно быстро внести изменение в файл? Исправить орфографические ошибки c вашего мобильного телефона?
Мы предлагаем простой редактор для каждого файла в git-репозитории.
control: |
control_description: |
Существует 3 возможных роли для участника проекта: только чтение, чтение/запись и административный уровень.
Участником проекта может выступать как пользователь, так и группа. Проект, как и группа, может иметь неограниченное
число участников (пользователей, групп или всех вместе).
git: |
git_description: |
Вики проекта создана с помощью Gollum — открытого вики-движка, созданного GitHub. В основе своей это полноценный
git-репозиторий, который можно клонировать, использовать в режиме офлайн, изменять и загружать изменения обратно на
сервер, как в случае с обычным кодом. Удобный веб-редактор позволит работать с ней в онлайн. Теперь данные о проекте не
пропадут и доступны для редактирования в любимом редакторе!
<br/><br/>Примечание: для приватного проекта вики доступна только его участникам. Для публичного — всем для чтения.
tracker: |
tracker_description: |
Каждый проект также может использовать легкий и простой трекер задач. Метки и назначения позволят не потеряться среди
задач, а понятный интерфейс позволит сконцентрироваться на работе, а не на заполнении огромных формуляров.

View File

@ -81,7 +81,7 @@ Rosa::Application.routes.draw do
resources :users, :controller => 'profile', :only => [] do
get :autocomplete_user_uname, :on => :collection
end
resources :register_requests, :only => [:new, :create]
resources :register_requests, :only => [:new, :create], :format => /ru|en/ #view support only two languages
end
scope :module => 'groups' do

View File

@ -0,0 +1,11 @@
class RenameIsRpmToIsPackageInProjects < ActiveRecord::Migration
def up
rename_column :projects, :is_rpm, :is_package
change_column :projects, :is_package, :boolean, :default => true, :null => false
end
def down
rename_column :projects, :is_package, :is_rpm
change_column :projects, :is_package, :boolean, :default => true
end
end

View File

@ -11,14 +11,14 @@
#
# It's strongly recommended to check this file into your version control system.
ActiveRecord::Schema.define(:version => 20120512102707) do
ActiveRecord::Schema.define(:version => 20120515095324) do
create_table "activity_feeds", :force => true do |t|
t.integer "user_id", :null => false
t.string "kind"
t.text "data"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "advisories", :force => true do |t|
@ -299,7 +299,7 @@ ActiveRecord::Schema.define(:version => 20120512102707) do
t.integer "srpm_file_size"
t.datetime "srpm_updated_at"
t.string "default_branch", :default => "master"
t.boolean "is_rpm", :default => true
t.boolean "is_package", :default => true, :null => false
t.integer "average_build_time", :default => 0, :null => false
t.integer "build_count", :default => 0, :null => false
end
@ -373,8 +373,9 @@ ActiveRecord::Schema.define(:version => 20120512102707) do
create_table "users", :force => true do |t|
t.string "name"
t.string "email", :default => "", :null => false
t.string "encrypted_password", :default => "", :null => false
t.string "email", :default => "", :null => false
t.string "encrypted_password", :limit => 128, :default => "", :null => false
t.string "password_salt", :default => "", :null => false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
@ -383,11 +384,12 @@ ActiveRecord::Schema.define(:version => 20120512102707) do
t.text "ssh_key"
t.string "uname"
t.string "role"
t.string "language", :default => "en"
t.integer "own_projects_count", :default => 0, :null => false
t.string "language", :default => "en"
t.string "confirmation_token"
t.datetime "confirmed_at"
t.datetime "confirmation_sent_at"
t.integer "own_projects_count", :default => 0, :null => false
t.datetime "reset_password_sent_at"
t.text "professional_experience"
t.string "site"
t.string "company"

View File

@ -1,7 +1,7 @@
# -*- encoding : utf-8 -*-
module Modules
module Models
module RsyncStub
module SymlinkStub
extend ActiveSupport::Concern
included do
@ -9,11 +9,11 @@ module Modules
true
end
def mount_directory_for_rsync
def symlink_directory
true
end
def umount_directory_for_rsync
def remove_symlink_directory
true
end
end

View File

@ -3,6 +3,7 @@ namespace :downloads do
desc "Migrate from mount to symlinks"
task :migrate => :environment do
Platform.opened.each do |pl|
system("sudo mv #{pl.symlink_path}/*.lst #{pl.path}")
system("sudo umount #{pl.symlink_path}")
system("sudo rm -Rf #{pl.symlink_path}")

View File

@ -1,126 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Сборочная среда</title>
<script type="text/javascript" src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<link rel="stylesheet" type="text/css" href="styles/prereg.css" />
</head>
<body>
<div class="wrap">
<!--Top block-->
<header>
<div class="logo">
</div>
<div class="text">
Платформа разработки и управления жизненным циклом дистрибутивов: от исходного кода до ISO-образов
</div>
<div class="both">
</div>
</header>
<!--Page-->
<article>
<div class="left">
<p>
Приветствуем Вас!<br /><br />
Вы находитесь на странице размещения заявок на участие в бета-тестировании сборочного сервиса ABF компании РОСА.<br /><br />
В первую очередь одобряются заявки от потенциальных майнтейнеров и представителей дистрибутивных команд.<br /><br />
Ознакомиться с документацией можно <a href="http://wiki.rosalab.ru/index.php/Сборочная_среда_ABF">здесь</a>.<br /><br />
Мы будем рады ответить на Ваши вопросы на <a href="http://forum.rosalab.ru/viewforum.php?f=10">форуме</a> проекта.
</p>
<div style="clear: both;">
</div>
</div>
<div class="right">
<h3>Хочу стать бета-тестером ABF!</h3>
<form accept-charset="UTF-8" name='invite_form' action="/register_requests" id="new_register_request" method="post">
<div class="signup-left">
Имя, Фамилия
</div>
<div class="signup-right">
<input type="text" id="email" name="register_request[name]" class="registartion-input-signup" onkeydown="buttonCheck();" onClick="this.className='registartion-input-focus';disError(this);" onfocus="if(this.value=='Логин или email'){this.value='';this.className='registartion-input-focus';};" onblur="if(this.value==''){this.value='';this.className='registartion-input-signup';}else{this.className='registartion-input-no-focus';};buttonCheck();" />
</div>
<div style="clear: both;">
</div>
<div class="signup-left">
Электронная почта
</div>
<div class="signup-right">
<input type="text" id="email" name="register_request[email]" class="registartion-input-signup" onkeydown="buttonCheck();" onClick="this.className='registartion-input-focus';disError(this);" onfocus="if(this.value=='Логин или email'){this.value='';this.className='registartion-input-focus';};" onblur="if(this.value==''){this.value='';this.className='registartion-input-signup';}else{this.className='registartion-input-no-focus';};buttonCheck();" />
</div>
<div style="clear: both;">
</div>
<div class="signup-left">
Степень интереса<br>к проекту
</div>
<div class="signup-right">
<select name="register_request[interest]" class="registartion-input-signup">
<option>Общеобразовательные цели</option>
<option>Хочу стать майнтейнером РОСы</option>
<option>Хочу собрать в ABF дистрибутив</option>
</select>
</div>
<div style="clear: both;">
</div>
<div class="signup-left">
Также хочу сказать
</div>
<div class="signup-right">
<textarea name="register_request[more]" class="registartion-input-signup" rows="3"></textarea>
</div>
<div style="clear: both;">
</div>
<div class="button">
<input class="button" type="submit" value="Отправить">
</div>
</form>
</div>
<div style="clear: both;">
</div>
<div class="both">
</div>
</article>
</div>
<!--Footer-->
<footer>
<ul>
<li>
ROSA Лаб. © 2012 <img src="pics/square.png" alt="_" />
</li>
<li>
<img src="pics/flag.png" alt="rosa" /> <img src="pics/square.png" alt="_" />
</li>
<li>
<a href="http://www.rosalab.ru/about">О компании</a> <img src="pics/square.png" alt="_" />
</li>
<li>
<a href="http://www.rosalab.ru/about/contacts">Контакты</a>
</li>
</ul>
</footer>
<script type="text/javascript">
 var _gaq = _gaq || [];
 _gaq.push(['_setAccount', 'UA-29164163-1']);
 _gaq.push(['_trackPageview']);
 (function() {
   var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
   ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
   var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
 })();
</script>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -240,4 +240,41 @@ footer ul li a {
footer ul li a:hover {
text-decoration: underline;
}
/*language*/
div.langlist {
width: 760px;
margin: 0 auto;
text-align: center;
}
div.lang {
float: right;
margin: 2px 0px 2px 7px;
cursor: pointer;
}
nav {
width: 96px;
height: 47px;
background: url("../pics/registration.png") no-repeat;
float: right;
cursor: pointer;
}
nav p {
font-size: 14px;
color: #FFF;
margin: 0;
padding: 0;
padding-top: 0px;
font-weight: 700;
}
/* custom */
nav a {
text-decoration: none;
}

View File

@ -1,72 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Сборочная среда</title>
<script type="text/javascript" src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<link rel="stylesheet" type="text/css" href="styles/prereg.css" />
</head>
<body>
<div class="wrap">
<!--Top block-->
<header>
<div class="logo">
</div>
<div class="text">
Платформа разработки и управления жизненным циклом дистрибутивов: от исходного кода до ISO-образов
</div>
<div class="both">
</div>
</header>
<!--Page-->
<article>
<div class="all">
<p>
<span style="font-size: 28px;">Спасибо!</span><br /><br />
Благодарим за интерес к нашему сервису ABF!<br /><br />
Приглашение будет выслано вам по указанной электронной почте.<br /><br />
Приглашаем Вас на <a href="http://forum.rosalab.ru/viewforum.php?f=10">форум</a> проекта, где мы будем рады ответить на Ваши вопросы и получить Ваши пожелания.<br /><br />
Ознакомиться с документацией можно <a href="http://wiki.rosalab.ru/index.php/Сборочная_среда_ABF">здесь</a>.
</p>
</div>
<div class="both">
</div>
</article>
</div>
<!--Footer-->
<footer>
<ul>
<li>
ROSA Лаб. © 2012 <img src="pics/square.png" alt="_" />
</li>
<li>
<img src="pics/flag.png" alt="rosa" /> <img src="pics/square.png" alt="_" />
</li>
<li>
<a href="http://www.rosalab.ru/about">О компании</a> <img src="pics/square.png" alt="_" />
</li>
<li>
<a href="http://www.rosalab.ru/about/contacts">Контакты</a>
</li>
</ul>
</footer>
<script type="text/javascript">
 var _gaq = _gaq || [];
 _gaq.push(['_setAccount', 'UA-29164163-1']);
 _gaq.push(['_trackPageview']);
 (function() {
   var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
   ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
   var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
 })();
</script>
</body>
</html>

View File

@ -125,12 +125,31 @@ describe Projects::ProjectsController do
end
context 'for other user' do
it 'should not be able to fork hidden project' do
before(:each) do
@user = FactoryGirl.create(:user)
set_session_for(@user)
end
it 'should not be able to fork hidden project' do
@project.update_attribute(:visibility, 'hidden')
post :fork, :owner_name => @project.owner.uname, :project_name => @project.name
response.should redirect_to(forbidden_path)
end
it 'should not be able to edit project' do
description = @project.description
put :update, :project=>{:description =>"hack"}, :owner_name => @project.owner.uname, :project_name => @project.name
response.should redirect_to(forbidden_path)
Project.find(@project.id).description.should == description
end
it 'should not be able to edit project sections' do
has_wiki, has_issues = @project.has_wiki, @project.has_issues
post :sections, :project =>{:has_wiki => !has_wiki, :has_issues => !has_issues}, :owner_name => @project.owner.uname, :project_name => @project.name
response.should redirect_to(forbidden_path)
project = Project.find(@project.id)
project.has_wiki.should == has_wiki
project.has_issues.should == has_issues
end
end
end