From cefaa902b179f5858bdb1792e11104aa4909e33c Mon Sep 17 00:00:00 2001 From: Pavel Chipiga Date: Wed, 29 Feb 2012 16:04:04 +0200 Subject: [PATCH] Apply new design for projects build monitoring page. Improve and refactor filters. Improve abilities. Switch off old statuses. Separate build_lists translations. Refactor and remove duplicate translations. Refactor and code cleanup. Fix specs. Apply layout class helper. Refs #223 --- app/assets/stylesheets/custom.scss | 4 + app/controllers/build_lists_controller.rb | 13 +- app/helpers/application_helper.rb | 11 + app/models/ability.rb | 6 +- app/models/build_list.rb | 9 +- app/models/build_list/filter.rb | 8 +- app/views/build_lists/_build_list.html.haml | 9 + app/views/build_lists/_build_lists.html.haml | 25 -- app/views/build_lists/_filter.html.haml | 50 --- app/views/build_lists/_sidebar.html.haml | 61 +++- app/views/build_lists/_sub_menu.html.haml | 6 + app/views/build_lists/index.html.haml | 43 +-- app/views/issues/new.html.haml | 2 - app/views/layouts/application.html.haml | 2 +- config/locales/build_list.en.yml | 107 +++++++ config/locales/build_list.ru.yml | 107 +++++++ config/locales/en.yml | 308 ------------------- config/locales/ru.yml | 98 ------ db/schema.rb | 144 +++++---- 19 files changed, 415 insertions(+), 598 deletions(-) create mode 100644 app/views/build_lists/_build_list.html.haml delete mode 100644 app/views/build_lists/_build_lists.html.haml delete mode 100644 app/views/build_lists/_filter.html.haml create mode 100644 app/views/build_lists/_sub_menu.html.haml create mode 100644 config/locales/build_list.en.yml create mode 100644 config/locales/build_list.ru.yml diff --git a/app/assets/stylesheets/custom.scss b/app/assets/stylesheets/custom.scss index f77220532..d95773f2b 100644 --- a/app/assets/stylesheets/custom.scss +++ b/app/assets/stylesheets/custom.scss @@ -128,3 +128,7 @@ article h3 { article div.date-block div.date { height: 52px; } + +.date_select { + select {margin:3px 0px; padding:0px;} +} diff --git a/app/controllers/build_lists_controller.rb b/app/controllers/build_lists_controller.rb index 9bed99bbf..7b17c4899 100644 --- a/app/controllers/build_lists_controller.rb +++ b/app/controllers/build_lists_controller.rb @@ -19,18 +19,11 @@ class BuildListsController < ApplicationController params[:filter].each do |k,v| new_params[:filter][k] = v unless v.empty? end - redirect_to build_lists_path(new_params) else - filter_params = params[:filter] || {} - if @project - @action_url = project_build_lists_path(@project) - else - @action_url = build_lists_path - end - - @filter = BuildList::Filter.new(@project, filter_params) - @build_lists = @filter.find.accessible_by(current_ability).recent.paginate :page => params[:page] + @action_url = @project ? project_build_lists_path(@project) : build_lists_path + @filter = BuildList::Filter.new(@project, current_user, params[:filter] || {}) + @build_lists = @filter.find.recent.paginate :page => params[:page] @build_server_status = begin BuildServer.get_status diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 05055fa4f..5cd649a41 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -9,4 +9,15 @@ module ApplicationHelper return title end + + def layout_class + case + when params[:controller] == 'issues' && params[:action] == 'new' + 'nopadding' + when params[:controller] == 'build_lists' + 'slim' + else + nil + end + end end diff --git a/app/models/ability.rb b/app/models/ability.rb index bca5689a6..56917791d 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -55,12 +55,14 @@ class Ability #can :create, AutoBuildList #can [:index, :destroy], AutoBuildList, :project_id => user.own_project_ids + can [:read, :owned], BuildList, :user_id => user.id can :read, BuildList, :project => {:visibility => 'open'} - can :read, BuildList, :project => {:owner_type => 'User', :owner_id => user.id} - can :read, BuildList, :project => {:owner_type => 'Group', :owner_id => user.group_ids} + 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, BuildList) {|build_list| can? :write, build_list.project} can(:publish, BuildList) {|build_list| build_list.can_publish? && can?(:write, build_list.project)} + can(:cancel, BuildList) {|build_list| build_list.can_cancel? && can?(:write, build_list.project)} can :read, Platform, :visibility => 'open' can :read, Platform, :owner_type => 'User', :owner_id => user.id diff --git a/app/models/build_list.rb b/app/models/build_list.rb index 4da5118a8..6fdedf10e 100644 --- a/app/models/build_list.rb +++ b/app/models/build_list.rb @@ -35,8 +35,9 @@ class BuildList < ActiveRecord::Base BuildServer::PLATFORM_PENDING, BuildServer::PROJECT_NOT_FOUND, BuildServer::PROJECT_VERSION_NOT_FOUND, - BuildServer::BINARY_TEST_FAILED, - BuildServer::DEPENDENCY_TEST_FAILED ] + # BuildServer::BINARY_TEST_FAILED, + # BuildServer::DEPENDENCY_TEST_FAILED + ] HUMAN_STATUSES = { WAITING_FOR_RESPONSE => :waiting_for_response, BUILD_CANCELED => :build_canceled, @@ -51,8 +52,8 @@ class BuildList < ActiveRecord::Base BuildServer::PLATFORM_PENDING => :platform_pending, BuildServer::PROJECT_NOT_FOUND => :project_not_found, BuildServer::PROJECT_VERSION_NOT_FOUND => :project_version_not_found, - BuildServer::DEPENDENCY_TEST_FAILED => :dependency_test_failed, - BuildServer::BINARY_TEST_FAILED => :binary_test_failed + # BuildServer::DEPENDENCY_TEST_FAILED => :dependency_test_failed, + # BuildServer::BINARY_TEST_FAILED => :binary_test_failed } scope :recent, order("#{table_name}.updated_at DESC") diff --git a/app/models/build_list/filter.rb b/app/models/build_list/filter.rb index 70b491286..2b21aec25 100644 --- a/app/models/build_list/filter.rb +++ b/app/models/build_list/filter.rb @@ -1,7 +1,8 @@ # -*- encoding : utf-8 -*- class BuildList::Filter - def initialize(project, options = {}) + def initialize(project, user, options = {}) @project = project + @user = user set_options(options) end @@ -11,6 +12,7 @@ class BuildList::Filter if @options[:bs_id] build_lists = build_lists.where(:bs_id => @options[:bs_id]) else + build_lists = build_lists.accessible_by(::Ability.new(@user), @options[:ownership].to_sym) if @options[:ownership] build_lists = build_lists.for_status(@options[:status]) if @options[:status] build_lists = build_lists.scoped_to_arch(@options[:arch_id]) if @options[:arch_id] build_lists = build_lists.scoped_to_project_version(@options[:project_version]) if @options[:project_version] @@ -25,7 +27,7 @@ class BuildList::Filter end end - build_lists.recent + build_lists end def respond_to?(name) @@ -41,6 +43,7 @@ class BuildList::Filter def set_options(options) @options = HashWithIndifferentAccess.new(options.reverse_merge({ + :ownership => nil, :status => nil, :created_at_start => nil, :created_at_end => nil, @@ -53,6 +56,7 @@ class BuildList::Filter :project_name => nil })) + @options[:ownership] = @options[:ownership].presence || 'index' @options[:status] = @options[:status].present? ? @options[:status].to_i : nil @options[:created_at_start] = build_date_from_params(:created_at_start, @options) @options[:created_at_end] = build_date_from_params(:created_at_end, @options) diff --git a/app/views/build_lists/_build_list.html.haml b/app/views/build_lists/_build_list.html.haml new file mode 100644 index 000000000..2af6a086e --- /dev/null +++ b/app/views/build_lists/_build_list.html.haml @@ -0,0 +1,9 @@ +%tr{:id => "row#{build_list_counter}"} + %td= link_to (build_list.bs_id.present? ? build_list.bs_id : t("layout.build_lists.bs_id_not_set")), build_list + %td= build_list.human_status + %td= link_to build_list.project_version, "#" + %td= link_to build_list.project.name, build_list.project + %td= build_list.arch.name + %td= link_to build_list.user.fullname, build_list.user + %td= link_to image_tag('x.png', :class => 'delete-row', :id => "delete-row#{build_list_counter}"), cancel_build_list_path(build_list), :method => :put, :confirm => t('layout.confirm') if can?(:cancel, build_list) + %td= build_list.notified_at \ No newline at end of file diff --git a/app/views/build_lists/_build_lists.html.haml b/app/views/build_lists/_build_lists.html.haml deleted file mode 100644 index a51c428f3..000000000 --- a/app/views/build_lists/_build_lists.html.haml +++ /dev/null @@ -1,25 +0,0 @@ -%table.table - %tr - %th.first= t("activerecord.attributes.build_list.bs_id") - %th= t("activerecord.attributes.build_list.status") - %th= t("activerecord.attributes.build_list.project_version") - %th= t("activerecord.attributes.build_list.project") - %th= t("activerecord.attributes.build_list.arch") - %th= t("activerecord.attributes.build_list.user") - - unless @project - %th= t("layout.build_lists.cancel_button_header") - %th.last= t("activerecord.attributes.build_list.notified_at") - - - build_lists.each do |build_list| - %tr{:class => cycle("odd", "even")} - %td= link_to (build_list.bs_id.present? ? build_list.bs_id : t("layout.build_lists.bs_id_not_set")), build_list - %td= build_list.human_status - %td= link_to build_list.project_version, "#" - %td= link_to build_list.project.name, project_path(build_list.project) - %td= build_list.arch.name - %td= build_list.user.try(:fullname) - - unless @project - %td= link_to t("layout.build_lists.cancel_button"), cancel_build_list_path(build_list), :method => "put", :confirm => t("layout.confirm") if build_list.can_cancel? - %td.last= build_list.notified_at - -= will_paginate build_lists diff --git a/app/views/build_lists/_filter.html.haml b/app/views/build_lists/_filter.html.haml deleted file mode 100644 index 928716066..000000000 --- a/app/views/build_lists/_filter.html.haml +++ /dev/null @@ -1,50 +0,0 @@ -%h2.title= t("layout.build_lists.filter_header") - -= form_for :filter, :url => @action_url, :html => { :method => :post, :class => :form } do |f| - .columns.wat-cf - .column.left - .group - = f.label :status, t("activerecord.attributes.build_list.status"), :class => :label - = f.select :status, BuildList::STATUSES.collect{|status| [BuildList.human_status(status), status]}, :include_blank => true, :selected => @filter.status - .group - = f.label :arch_id, t("activerecord.attributes.build_list.arch"), :class => :label - = f.select :arch_id, Arch.recent.collect{|arch| [arch.name, arch.id]}, :include_blank => true, :selected => @filter.arch_id - .column.right - - if @project - .group - = f.label :project_version, t("activerecord.attributes.build_list.project_version"), :class => :label - = f.select :project_version, @project.versions, :include_blank => true, :selected => @filter.project_version - .group - = f.label :is_circle, t("activerecord.attributes.build_list.is_circle"), :class => :label - = f.select :is_circle, [[t("layout.yes_"), 1], [t("layout.no_"), 0]], :include_blank => true, :selected => @filter.is_circle.present? ? (@filter.is_circle ? "1" : "0") : nil - - .columns.wat-cf - .column.left - .group - = f.label :created_at_start, t("layout.build_lists.created_at_start"), :class => :label - = f.date_select(:created_at_start, :include_blank => true, :selected => @filter.created_at_start) - .group - = f.label :notified_at_start, t("layout.build_lists.notified_at_start"), :class => :label - = f.date_select(:notified_at_start, :include_blank => true, :selected => @filter.notified_at_start) - .column.right - .group - = f.label :created_at_end, t("layout.build_lists.created_at_end"), :class => :label - = f.date_select(:created_at_end, :include_blank => true, :selected => @filter.created_at_end) - .group - = f.label :notified_at_end, t("layout.build_lists.notified_at_end"), :class => :label - = f.date_select(:notified_at_end, :include_blank => true, :selected => @filter.notified_at_end) - - .columns.wat-cf - .column.left - .group - = f.label :project_name, t("layout.build_lists.project_name_search"), :class => :label - = f.text_field :project_name, :class => :text_field - .column.right - .group - = f.label :bs_id, t("layout.build_lists.bs_id_search"), :class => :label - = f.text_field :bs_id, :class => :text_field - - .group.navform.wat-cf - %button.button{ :type => "submit" } - = image_tag("choose.png", :alt => "Save") - = t("layout.search") diff --git a/app/views/build_lists/_sidebar.html.haml b/app/views/build_lists/_sidebar.html.haml index 55d964a20..19cc34443 100644 --- a/app/views/build_lists/_sidebar.html.haml +++ b/app/views/build_lists/_sidebar.html.haml @@ -1,10 +1,53 @@ -.block.notice - %h3= t("layout.repositories.current_repository_header") - .content - - project.repositories.each do |repository| - %p= link_to "#{repository.name} (#{repository.platform.name})", platform_repository_path(repository.platform, repository) +- content_for :sidebar do + .bordered.nopadding + %h3= t('layout.build_lists.build_server_status.header') + .table + .lefter= t('layout.build_lists.build_server_status.client_count') + .righter= @build_server_status['client_count'] + .both + .table + .lefter= t('layout.build_lists.build_server_status.count_new_task') + .righter= @build_server_status['count_new_task'] + .both + .table + .lefter= t('layout.build_lists.build_server_status.count_build_task') + .righter= @build_server_status['count_build_task'] + .both -.block.notice - %h3= t("layout.projects.current_project_header") - .content - %p= link_to project.name, project \ No newline at end of file + = form_for :filter, :url => @action_url, :html => { :method => :post, :class => :form } do |f| + .bordered.nopadding + %h3= t("layout.build_lists.ownership.header") + .table + .lefter= f.radio_button :ownership, 'owned', :class => 'niceRadio', :id => 'myradio1' + .lefter= t("layout.build_lists.ownership.owned") + .both + .table + .lefter= f.radio_button :ownership, 'related', :class => 'niceRadio', :id => 'myradio2' + .lefter= t("layout.build_lists.ownership.related") + .both + .table + .lefter= f.radio_button :ownership, 'index', :class => 'niceRadio', :id => 'myradio3' + .lefter= t("layout.build_lists.ownership.index") + .both + .block + %h3.small= t("activerecord.attributes.build_list.status") + .lineForm.aside= f.select :status, BuildList::STATUSES.collect{|status| [BuildList.human_status(status), status]}, {:include_blank => true, :selected => @filter.status}, {:class => 'sel80 aside', :id => 'status', :tabindex => 2} + %h3.small= t("activerecord.attributes.build_list.is_circle") + .lineForm.aside= f.select :is_circle, [[t("layout.yes_"), 1], [t("layout.no_"), 0]], {:include_blank => true, :selected => @filter.is_circle.present? ? (@filter.is_circle ? "1" : "0") : nil}, {:class => 'sel80 aside', :id => 'recurrent', :tabindex => 2} + %h3.small= t("activerecord.attributes.build_list.arch") + .lineForm.aside= f.select :arch_id, Arch.recent.collect{|arch| [arch.name, arch.id]}, {:include_blank => true, :selected => @filter.arch_id}, {:class => 'sel80 aside', :id => 'architecture', :tabindex => 2} + %h3.small= t("layout.build_lists.created_at_start") + .date_select= f.date_select(:created_at_start, :include_blank => true, :selected => @filter.created_at_start) + %h3.small= t("layout.build_lists.created_at_end") + .date_select= f.date_select(:created_at_end, :include_blank => true, :selected => @filter.created_at_end) + %h3.small= t("layout.build_lists.notified_at_start") + .date_select= f.date_select(:notified_at_start, :include_blank => true, :selected => @filter.notified_at_start) + %h3.small= t("layout.build_lists.notified_at_end") + .date_select= f.date_select(:notified_at_end, :include_blank => true, :selected => @filter.notified_at_end) + %h3.small= t("layout.build_lists.project_name_search") + = f.text_field :project_name + %h3.small= t("layout.build_lists.bs_id_search") + = f.text_field :bs_id + %br + %br + = f.submit t("layout.search") \ No newline at end of file diff --git a/app/views/build_lists/_sub_menu.html.haml b/app/views/build_lists/_sub_menu.html.haml new file mode 100644 index 000000000..971b32575 --- /dev/null +++ b/app/views/build_lists/_sub_menu.html.haml @@ -0,0 +1,6 @@ +- content_for :sub_menu do + .left + %nav + %ul + %li= link_to t('layout.projects.list_header'), build_lists_path, :class => current_page?(:controller => 'build_lists') ? 'active' : nil + %li= link_to t('layout.products.list_header'), '#' \ No newline at end of file diff --git a/app/views/build_lists/index.html.haml b/app/views/build_lists/index.html.haml index 97e5375f9..f1f807094 100644 --- a/app/views/build_lists/index.html.haml +++ b/app/views/build_lists/index.html.haml @@ -1,28 +1,19 @@ -.block - - if @project - .secondary-navigation - %ul.wat-cf - %li.first= link_to t("layout.build_lists.current"), project_path(@project) + "#build_lists" - %li.active= link_to t("layout.build_lists.all"), project_build_lists_path(@project) +/ #myTable +%table.tablesorter{:cellpadding => "0", :cellspacing => "0"} + %thead + %tr + %th.lpadding16= t("activerecord.attributes.build_list.bs_id") + %th.lpadding16= t("activerecord.attributes.build_list.status") + %th.lpadding16= t("activerecord.attributes.build_list.project_version") + %th.lpadding16= t("activerecord.attributes.build_list.project") + %th.lpadding16= t("activerecord.attributes.build_list.arch") + %th.lpadding16= t("activerecord.attributes.build_list.user") + %th= t("layout.build_lists.action") + %th.lpadding16= t("activerecord.attributes.build_list.notified_at") + %tbody= render @build_lists +.both - .content - - unless @project - .inner - %h2= t('layout.build_lists.build_server_status.header') - .field - %span= t('layout.build_lists.build_server_status.client_count') + ":" - %span= @build_server_status['client_count'] - .field - %span= t('layout.build_lists.build_server_status.count_new_task') + ":" - %span= @build_server_status['count_new_task'] - .field - %span= t('layout.build_lists.build_server_status.count_build_task') + ":" - %span= @build_server_status['count_build_task'] - - .inner - = render :partial => "build_lists/filter", :action_url => @action_url += will_paginate @build_lists - .inner - = render :partial => "build_lists/build_lists", :object => @build_lists - -- content_for :sidebar, render('sidebar', :project => @project) if @project += render 'build_lists/sub_menu' += render 'build_lists/sidebar' diff --git a/app/views/issues/new.html.haml b/app/views/issues/new.html.haml index befc4fb0f..cf1a70fc2 100644 --- a/app/views/issues/new.html.haml +++ b/app/views/issues/new.html.haml @@ -1,7 +1,5 @@ -render :partial => 'projects/submenu' -render :partial => 'issues/create_sidebar' --content_for :right_nopadding do - dummy %h3.bpadding10= t("layout.issues.create_header") = form_for :issue, :url => project_issues_path(@project), :html => { :class => 'form issue' } do |f| diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index fea6143c3..6ad3dfea8 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -43,7 +43,7 @@ %article - if content_for?(:sidebar) %aside= yield :sidebar - .right{:class => content_for?(:right_nopadding) ? ' nopadding' : ''}= yield + .right{:class => layout_class}= yield - else .all= yield .both diff --git a/config/locales/build_list.en.yml b/config/locales/build_list.en.yml new file mode 100644 index 000000000..b01f646ac --- /dev/null +++ b/config/locales/build_list.en.yml @@ -0,0 +1,107 @@ +en: + activerecord: + models: + build_list: Build list + build_list_item: Build list item + attributes: + build_list: + bs_id: Id + name: Name + container_path: Container path + status: Status + project_id: Project + project: Project + arch_id: Architecture + arch: Architecture + is_circle: Recurrent + notified_at: Notified at + additional_repos: Additional repository + include_repos: Includes repository + updated_at: Updated + created_at: Created + pl: Packet list repository + pl_id: Packet list repository + bpl: Platform + bpl_id: Platform + update_type: Update type + build_requires: Dependable build requires + auto_publish: Automated publising + project_version: Version + user: User + + build_list/item: + name: Name + level: Level + status: Status + version: Version + build_list: Build list + + layout: + build_lists: + filter_header: Filter + current: Curent + created_at_start: "Build start from:" + created_at_end: "Build start to:" + notified_at_start: "Last update time by BS from:" + notified_at_end: " Last update time by BS to:" + bs_id_search: 'Id search' + project_name_search: Project name search + bs_id_not_set: Id isn’t set + items_header: Build items + no_items_data: No data + show: Show + cancel_success: 'Build canceled' + cancel_fail: 'Errors on build cancelling!' + publish_success: 'Build on publish queue' + publish_fail: 'Errors on publish queue!' + container_published: 'Container in a repository' + action: Action + + ownership: + header: Build list ownership + owned: My + related: Related + index: All + + build_server_status: + header: Build server status + client_count: Clients count + count_new_task: New task count + count_build_task: Build task count + + items: + statuses: + build_started: Build started + build_error: Build error + dependencies_error: Dependences not found + success: Build complete + unknown: Build waiting + git_error: Git error + + statuses: + build_error: Build error + build_published: Build published + build_publish: Build publishing + failed_publish: Publishing error + dependencies_fail: Dependences not found + waiting_for_response: Waiting for response + build_pending: Build pending + dependency_test_failed: Dependency test failed + binary_test_failed: Binary test failed + build_canceled: Build canceled + success: Build complete + build_started: Build started + platform_not_found: Platform not found + platform_pending: Platforn pending + project_not_found: Project not found + project_version_not_found: Project version not found + + flash: + build_list: + saved: Project version '%{project_version}' build list, platform '%{bpl}', architecture '%{arch}' creation success + save_error: Project version '%{project_version}' build list, platform '%{bpl}', architecture '%{arch}' creation error + no_project_version_selected: Select any version of project + no_project_version_found: Project version '%{project_version}' not found + no_arch_or_platform_selected: At least one of architecture of platform must selected + wrong_platform: For the main repository its mail platform can be chosen only! + can_not_published: Build publishing with status "Build" available only diff --git a/config/locales/build_list.ru.yml b/config/locales/build_list.ru.yml new file mode 100644 index 000000000..6d34d3ac9 --- /dev/null +++ b/config/locales/build_list.ru.yml @@ -0,0 +1,107 @@ +ru: + activerecord: + models: + build_list: Сборочный лист + build_list_item: Элемент сборочного листа + attributes: + build_list: + bs_id: Id + name: Название + container_path: Путь до контейнера + status: Статус + project_id: Проект + project: Проект + arch_id: Архитектура + arch: Архитектура + is_circle: Циклическая сборка + notified_at: Информация получена + additional_repos: Дополнительные репозитории + include_repos: Подключаемые репозитории + updated_at: Обновлен + created_at: Создан + pl: Репозиторий для сохранения пакетов + pl_id: Репозиторий для сохранения пакетов + bpl: Платформа + bpl_id: Платформа + update_type: Критичность обновления + build_requires: Пересборка с зависимостями + auto_publish: Автоматическая публикация + project_version: Версия + user: Пользователь + + build_list/item: + name: Название + level: Уровень + status: Статус + version: Версия + build_list: Сборочный лист + + layout: + build_lists: + filter_header: Фильтр + current: Текущие + created_at_start: "Время постановки на сборку с:" + created_at_end: "Время постановки на сборку по:" + notified_at_start: "Время последнего обновления от BS с:" + notified_at_end: "Время последнего обновления от BS по:" + bs_id_search: 'Поиск по Id' + project_name_search: Поиск по названию проекта + bs_id_not_set: Id еще не присвоен + items_header: Элементы сборки + no_items_data: Данных нет + show: Просмотр + cancel_success: 'Сборка отменена.' + cancel_fail: 'При отмене сборки произошла ошибка!' + publish_success: 'Сборка поставлена в очередь на публикацию.' + publish_fail: 'При публикации сборки произошла ошибка!' + container_published: 'Контейнер размещен в репозитории' + action: Действие + + ownership: + header: Принадлежность заданий + owned: Мне + related: Связанные со мной + index: Все + + build_server_status: + header: Статус сборочного сервера + client_count: Число клиентов + count_new_task: Число заданий в очереди + count_build_task: Число выполняемых заданий + + items: + statuses: + build_started: собирается + build_error: ошибка сборки + dependencies_error: зависимости не найдены + success: собран + unknown: ожидает сборки + git_error: проблема с гит + + statuses: + build_error: ошибка сборки + build_published: опубликован + build_publish: публикуется + failed_publish: ошибка публикации + dependencies_fail: зависимости не найдены + waiting_for_response: ожидает ответа + build_pending: ожидает сборку + dependency_test_failed: тестирование зависимостей не пройдено + binary_test_failed: тестирование бинарной совместимости не пройдено + build_canceled: сборка отменена + success: собран + build_started: собирается + platform_not_found: платформа не найдена + platform_pending: платформа в процессе создания + project_not_found: проект не найден + project_version_not_found: версия не найдена + + flash: + build_list: + saved: Билд лист для версии '%{project_version}', платформы '%{bpl}' и архитектуры '%{arch}' создан успешно + save_error: Не удалось сохранить билд лист для версии '%{project_version}', платформы '%{bpl}' и архитектуры '%{arch}' + no_project_version_selected: Выберите какую-нибудь версию + no_project_version_found: Выбранная версия '%{project_version}' не найдена + no_arch_or_platform_selected: Выберите хотя бы одну ахритектуру и платформу + wrong_platform: Для основного репозитория (main) может быть выбран только его же основная платформа! + can_not_published: Опубликовать сборку можно только со статусом "Собран" diff --git a/config/locales/en.yml b/config/locales/en.yml index 1a151c595..bfaf314bb 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -272,122 +272,6 @@ en: filter_header: Filter git: - upload: Upload - not_access: Access denied! - owner: Owner - confirm: Sure? - back: Back - settings: - label: Settings - notifier: Notifier setting - notifiers: - edit_header: Notifier setting - processing: working ... - invalid_content_type: incorrect type - - devise: - shared_links: - sign_in: Sign in - sign_up: Sign up - forgot_password: Forgot your password? - confirm_again: Do not receive the confirmation link? - unlock: Do not receive unlock instructions? - sign_in_through: Sign in by %{provider} - - downloads: - title: Downloads statistic - message: Automatically updated every 5 minutes - refresh_btn: Refresh - - auto_build_lists: - header: Automated build projects - message: All projects build under user repository and architecture i586 - project: Project - action: Action - automate_btn: Automate - cancel_btn: Cancel - not_automated: Not automated - already_automated: Automated - - weekdays: - Monday: Monday - Tuesday: Tuesday - Wednesday: Wednesday - Thursday: Thursday - Friday: Friday - Saturday: Saturday - Sunday: Sunday - - sessions: - sign_in_header: Sign in - - private_users: - list: List - new: New pair - list_header: Pair login/password - confirm_delete: Are you sure to delete this pair login/password? - confirm_regenerate: Are you sure to regenerate this pair login/password? - regenerate_btn: Regenerate - warning_message: Warning - Old data set as invalid when new data obtaining - - categories: - list: List - new: Create - edit: Edit - platforms: By platform - list_header: Catalogue - new_header: New category - edit_header: Edit category - confirm_delete: Are you sure to delete this category? - - commits: - subscribe_btn: Subscribe to commit - unsubscribe_btn: Unsubscribe from commit - - comments: - confirm_delete: Are you sure to delete the comment? - new_header: New comment - edit_header: Editing a comment - - platforms: - admin_id: Owner - build_all: Build all - list: List - new: Create - edit: Edit - new_header: New platform - edit_header: Edit - list_header: Platforms - list_header_main: General - list_header_personal: Personal - list_header_all: All - clone_header: Platform clone - show: Platform - projects: Projects - products: Products - location: Location - repositories: Repositories - back_to_the_list: ⇐To platform list - freeze: Freeze - unfreeze: Unfeeze - confirm_freeze: Are you sure to freeze this platform? - confirm_freeze: Are you sure to clone this platform? - confirm_unfreeze: Are you sure to defrost this platform? - released_suffix: (released) - confirm_delete: Are you sure to delete this platform? - current_platform_header: Current platform - owner: Owner - visibility: Visibility - platform_type: Platform type - distrib_type: Distribution kit type - private_users: Access data - confirm_clone: To clone? - clone: To clone - - event_logs: - list: List - list_header: Event log - repositories: empty: "Repository is empty. You need to wait some time if you have forked project or imported package" source: Source @@ -405,60 +289,6 @@ en: '1': 'build error' '2': 'build in progress' - build_lists: - filter_header: Filter - current: Curent - created_at_start: "Build start from:" - created_at_end: "Build start to:" - notified_at_start: "Last update time by BS from:" - notified_at_end: " Last update time by BS to:" - bs_id_search: 'Id search' - project_name_search: Project name search - bs_id_not_set: Id isn’t set - items_header: Build items - no_items_data: No data - show: Show - cancel_button_header: Action - cancel_button: Cancel - cancel_success: 'Build canceled' - cancel_fail: 'Errors on build cancelling!' - publish_success: 'Build on publish queue' - publish_fail: 'Errors on publish queue!' - container_published: 'Container in a repository' - - build_server_status: - header: Build server status - client_count: Clients count - count_new_task: New task count - count_build_task: Build task count - - items: - statuses: - build_started: Build started - build_error: Build error - dependencies_error: Dependences not found - success: Build complete - unknown: Build waiting - git_error: Git error - - statuses: - build_error: Build error - build_published: Build published - build_publish: Build publishing - failed_publish: Publishing error - dependencies_fail: Dependences not found - waiting_for_response: Waiting for response - build_pending: Build pending - dependency_test_failed: Dependency test failed - binary_test_failed: Binary test failed - build_canceled: Build canceled - success: Build complete - build_started: Build started - platform_not_found: Platform not found - platform_pending: Platforn pending - project_not_found: Project not found - project_version_not_found: Project version not found - flash: settings: saved: Settings saved success @@ -551,15 +381,6 @@ en: build_all_success: All project build in progress clone_success: Cloned successfully - build_list: - saved: Project version '%{project_version}' build list, platform '%{bpl}', architecture '%{arch}' creation success - save_error: Project version '%{project_version}' build list, platform '%{bpl}', architecture '%{arch}' creation error - no_project_version_selected: Select any version of project - no_project_version_found: Project version '%{project_version}' not found - no_arch_or_platform_selected: At least one of architecture of platform must selected - wrong_platform: For the main repository its mail platform can be chosen only! - can_not_published: Build publishing with status "Build" available only - wiki: ref_not_exist: No such version successfully_updated: Page '%{name}' successfully updated @@ -579,7 +400,6 @@ en: remember_me: Remember name: Name parent_platform_id: Parent platform - build_list: Build list activerecord: @@ -604,8 +424,6 @@ en: private_user: Private user product: Product product_build_list: Product build list - build_list: Build list - build_list_item: Build list item download: Statistics auto_build_list: Auto rebuild list settings: @@ -774,38 +592,6 @@ en: status: Status notified_at: Notified at - build_list: - bs_id: Id - name: Name - container_path: Container path - status: Status - project_id: Project - project: Project - arch_id: Architecture - arch: Architecture - is_circle: Recurrent - notified_at: Notified at - additional_repos: Additional repository - include_repos: Includes repository - updated_at: Updated - created_at: Created - pl: Packet list repository - pl_id: Packet list repository - bpl: Platform - bpl_id: Platform - update_type: Update type - build_requires: Dependable build requires - auto_publish: Automated publising - project_version: Version - user: User - - build_list/item: - name: Name - level: Level - status: Status - version: Version - build_list: Build list - download: name: Name version: Version @@ -821,97 +607,3 @@ en: issue_assign_notification: New task assigned new_commit_comment_notification: New comment to commit invite_approve_notification: Invitation to ABF - - project: - category_id: Category - name: Name - description: Descripton - owner: Owner - visibility: Visibility - repository_id: Repository - repository: Repository - created_at: Created - updated_at: Updated - has_issues: Tracker on - srpm: Import code from src.rpm - - rpm: - name: Name - arch_id: Arch - arch: Arch - project_id: Project - project: Project - created_at: Created - updated_at: Updated - - role: - name: Name - on: Slave - to: Master - use_default: By default - use_default_for_owner: Default by owner - - group: - name: Name - uname: Nickname - owner: Owner - created_at: Created - updated_at: Updated - - user: - name: User - login: Nickname or Email - email: Email - uname: Nickname - ssh_key: SSH key - current_password: Current password - role: Role - created_at: Created - updated_at: Updated - role: System role - language: Language - - product_build_list: - id: Id - product: Product - status: Status - notified_at: Notified at - - build_list: - bs_id: Id - name: Name - container_path: Container path - status: Status - project_id: Project - project: Project - arch_id: Architecture - arch: Architecture - is_circle: Recurrent - notified_at: Notified at - additional_repos: Additional repository - include_repos: Includes repository - updated_at: Updated - created_at: Created - pl: Packet list repository - pl_id: Packet list repository - bpl: Platform - bpl_id: Platform - update_type: Update type - build_requires: Dependable build requires - auto_publish: Automated publising - project_version: Version - user: User - - build_list/item: - name: Name - level: Level - status: Status - version: Version - build_list: Build list - - download: - name: Name - version: Version - distro: Source - platform: Platform - counter: Downloads diff --git a/config/locales/ru.yml b/config/locales/ru.yml index d2f926081..d2eea738f 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -289,60 +289,6 @@ ru: '1': 'ошибка сборки' '2': 'собирается' - build_lists: - filter_header: Фильтр - current: Текущие - created_at_start: "Время постановки на сборку с:" - created_at_end: "Время постановки на сборку по:" - notified_at_start: "Время последнего обновления от BS с:" - notified_at_end: "Время последнего обновления от BS по:" - bs_id_search: 'Поиск по Id' - project_name_search: Поиск по названию проекта - bs_id_not_set: Id еще не присвоен - items_header: Элементы сборки - no_items_data: Данных нет - show: Просмотр - cancel_button_header: Действие - cancel_button: Отмена - cancel_success: 'Сборка отменена.' - cancel_fail: 'При отмене сборки произошла ошибка!' - publish_success: 'Сборка поставлена в очередь на публикацию.' - publish_fail: 'При публикации сборки произошла ошибка!' - container_published: 'Контейнер размещен в репозитории' - - build_server_status: - header: Статус сборочного сервера - client_count: Число клиентов - count_new_task: Число заданий в очереди - count_build_task: Число выполняемых заданий - - items: - statuses: - build_started: собирается - build_error: ошибка сборки - dependencies_error: зависимости не найдены - success: собран - unknown: ожидает сборки - git_error: проблема с гит - - statuses: - build_error: ошибка сборки - build_published: опубликован - build_publish: публикуется - failed_publish: ошибка публикации - dependencies_fail: зависимости не найдены - waiting_for_response: ожидает ответа - build_pending: ожидает сборку - dependency_test_failed: тестирование зависимостей не пройдено - binary_test_failed: тестирование бинарной совместимости не пройдено - build_canceled: сборка отменена - success: собран - build_started: собирается - platform_not_found: платформа не найдена - platform_pending: платформа в процессе создания - project_not_found: проект не найден - project_version_not_found: версия не найдена - flash: settings: saved: Настройки успешно сохранены @@ -440,15 +386,6 @@ ru: build_all_success: Все проекты успешно отправлены на сборку clone_success: Клонирование успешно - build_list: - saved: Билд лист для версии '%{project_version}', платформы '%{bpl}' и архитектуры '%{arch}' создан успешно - save_error: Не удалось сохранить билд лист для версии '%{project_version}', платформы '%{bpl}' и архитектуры '%{arch}' - no_project_version_selected: Выберите какую-нибудь версию - no_project_version_found: Выбранная версия '%{project_version}' не найдена - no_arch_or_platform_selected: Выберите хотя бы одну ахритектуру и платформу - wrong_platform: Для основного репозитория (main) может быть выбран только его же основная платформа! - can_not_published: Опубликовать сборку можно только со статусом "Собран" - wiki: ref_not_exist: Версия не существует successfully_updated: Страница '%{name}' успешно обновлена @@ -468,7 +405,6 @@ ru: remember_me: Запомнить name: Название parent_platform_id: Родительская платформа - build_list: Сборочный лист activerecord: @@ -493,8 +429,6 @@ ru: private_user: Приватный пользователь product: Продукт product_build_list: Сборочный лист продукта - build_list: Сборочный лист - build_list_item: Элемент сборочного листа download: Статистика auto_build_list: Автоматическая пересборка пакетов settings: @@ -653,38 +587,6 @@ ru: status: Статус notified_at: Информация получена - build_list: - bs_id: Id - name: Название - container_path: Путь до контейнера - status: Статус - project_id: Проект - project: Проект - arch_id: Архитектура - arch: Архитектура - is_circle: Циклическая сборка - notified_at: Информация получена - additional_repos: Дополнительные репозитории - include_repos: Подключаемые репозитории - updated_at: Обновлен - created_at: Создан - pl: Репозиторий для сохранения пакетов - pl_id: Репозиторий для сохранения пакетов - bpl: Платформа - bpl_id: Платформа - update_type: Критичность обновления - build_requires: Пересборка с зависимостями - auto_publish: Автоматическая публикация - project_version: Версия - user: Пользователь - - build_list/item: - name: Название - level: Уровень - status: Статус - version: Версия - build_list: Сборочный лист - download: name: Название version: Версия diff --git a/db/schema.rb b/db/schema.rb index fd2386dfc..a45190013 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,12 +11,12 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20120220185458) do +ActiveRecord::Schema.define(:version => 20120228100121) do create_table "arches", :force => true do |t| t.string "name", :null => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" end add_index "arches", ["name"], :name => "index_arches_on_name", :unique => true @@ -25,8 +25,8 @@ ActiveRecord::Schema.define(:version => 20120220185458) do t.integer "user_id" t.string "provider" t.string "uid" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" end add_index "authentications", ["provider", "uid"], :name => "index_authentications_on_provider_and_uid", :unique => true @@ -37,8 +37,8 @@ ActiveRecord::Schema.define(:version => 20120220185458) do t.integer "arch_id" t.integer "pl_id" t.integer "bpl_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" end create_table "build_list_items", :force => true do |t| @@ -46,8 +46,8 @@ ActiveRecord::Schema.define(:version => 20120220185458) do t.integer "level" t.integer "status" t.integer "build_list_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.string "version" end @@ -61,8 +61,8 @@ ActiveRecord::Schema.define(:version => 20120220185458) do t.integer "project_id" t.integer "arch_id" t.datetime "notified_at" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.boolean "is_circle", :default => false t.text "additional_repos" t.string "name" @@ -85,16 +85,16 @@ ActiveRecord::Schema.define(:version => 20120220185458) do t.string "name" t.string "ancestry" t.integer "projects_count", :default => 0, :null => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" end create_table "comments", :force => true do |t| t.string "commentable_type" t.integer "user_id" t.text "body" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.decimal "commentable_id", :precision => 50, :scale => 0 end @@ -102,8 +102,8 @@ ActiveRecord::Schema.define(:version => 20120220185458) do t.string "name", :null => false t.integer "project_id", :null => false t.integer "owner_id", :null => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" end create_table "delayed_jobs", :force => true do |t| @@ -115,8 +115,8 @@ ActiveRecord::Schema.define(:version => 20120220185458) do t.datetime "locked_at" t.datetime "failed_at" t.string "locked_by" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.string "queue" end @@ -128,8 +128,8 @@ ActiveRecord::Schema.define(:version => 20120220185458) do t.string "distro" t.string "platform" t.integer "counter", :default => 0 - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" end create_table "event_logs", :force => true do |t| @@ -144,15 +144,15 @@ ActiveRecord::Schema.define(:version => 20120220185458) do t.string "controller" t.string "action" t.text "message" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" end create_table "groups", :force => true do |t| t.string "name" t.integer "owner_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.string "uname" t.integer "own_projects_count", :default => 0, :null => false end @@ -164,18 +164,40 @@ ActiveRecord::Schema.define(:version => 20120220185458) do t.string "title" t.text "body" t.string "status", :default => "open" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" + t.integer "creator_id" + t.datetime "closed_at" + t.integer "closed_by" end add_index "issues", ["project_id", "serial_id"], :name => "index_issues_on_project_id_and_serial_id", :unique => true + create_table "labelings", :force => true do |t| + t.integer "label_id", :null => false + t.integer "issue_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "labelings", ["issue_id"], :name => "index_labelings_on_issue_id" + + create_table "labels", :force => true do |t| + t.string "name", :null => false + t.string "color", :null => false + t.integer "project_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "labels", ["project_id"], :name => "index_labels_on_project_id" + create_table "platforms", :force => true do |t| t.string "description" t.string "name" t.integer "parent_platform_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.boolean "released", :default => false t.integer "owner_id" t.string "owner_type" @@ -188,8 +210,8 @@ ActiveRecord::Schema.define(:version => 20120220185458) do t.integer "platform_id" t.string "login" t.string "password" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.integer "user_id" end @@ -197,8 +219,8 @@ ActiveRecord::Schema.define(:version => 20120220185458) do t.integer "product_id" t.integer "status", :default => 2, :null => false t.datetime "notified_at" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" end add_index "product_build_lists", ["product_id"], :name => "index_product_build_lists_on_product_id" @@ -208,8 +230,8 @@ ActiveRecord::Schema.define(:version => 20120220185458) do t.integer "platform_id", :null => false t.integer "build_status", :default => 2, :null => false t.string "build_path" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.text "build_script" t.text "counter" t.text "ks" @@ -229,8 +251,8 @@ ActiveRecord::Schema.define(:version => 20120220185458) do t.string "name" t.string "version" t.datetime "file_mtime" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.integer "platform_id" end @@ -239,14 +261,14 @@ ActiveRecord::Schema.define(:version => 20120220185458) do create_table "project_to_repositories", :force => true do |t| t.integer "project_id" t.integer "repository_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" end create_table "projects", :force => true do |t| t.string "name" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.integer "owner_id" t.string "owner_type" t.string "visibility", :default => "open" @@ -254,11 +276,11 @@ ActiveRecord::Schema.define(:version => 20120220185458) do t.text "description" t.string "ancestry" t.boolean "has_issues", :default => true - t.boolean "has_wiki", :default => false t.string "srpm_file_name" t.string "srpm_content_type" t.integer "srpm_file_size" t.datetime "srpm_updated_at" + t.boolean "has_wiki", :default => false end add_index "projects", ["category_id"], :name => "index_projects_on_category_id" @@ -270,8 +292,8 @@ ActiveRecord::Schema.define(:version => 20120220185458) do t.string "token" t.boolean "approved", :default => false t.boolean "rejected", :default => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.string "interest" t.text "more" end @@ -284,16 +306,16 @@ ActiveRecord::Schema.define(:version => 20120220185458) do t.string "object_type" t.integer "target_id" t.string "target_type" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.string "role" end create_table "repositories", :force => true do |t| t.string "description", :null => false t.integer "platform_id", :null => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.string "name", :null => false end @@ -301,8 +323,8 @@ ActiveRecord::Schema.define(:version => 20120220185458) do t.string "name", :null => false t.integer "arch_id", :null => false t.integer "project_id", :null => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" end add_index "rpms", ["project_id", "arch_id"], :name => "index_rpms_on_project_id_and_arch_id" @@ -315,8 +337,8 @@ ActiveRecord::Schema.define(:version => 20120220185458) do t.boolean "new_comment_reply", :default => true t.boolean "new_issue", :default => true t.boolean "issue_assign", :default => true - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.boolean "new_comment_commit_owner", :default => true t.boolean "new_comment_commit_repo_owner", :default => true t.boolean "new_comment_commit_commentor", :default => true @@ -325,8 +347,8 @@ ActiveRecord::Schema.define(:version => 20120220185458) do create_table "subscribes", :force => true do |t| t.string "subscribeable_type" t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" t.boolean "status", :default => true t.integer "project_id" t.decimal "subscribeable_id", :precision => 50, :scale => 0 @@ -334,18 +356,18 @@ ActiveRecord::Schema.define(:version => 20120220185458) 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 "reset_password_token" - t.datetime "reset_password_sent_at" t.datetime "remember_created_at" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at" + t.datetime "updated_at" 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.datetime "reset_password_sent_at" + t.integer "own_projects_count", :default => 0, :null => false end add_index "users", ["email"], :name => "index_users_on_email", :unique => true