From ecec330b4d2dc6efe0a27b643bb29f61b70b4fb0 Mon Sep 17 00:00:00 2001 From: Vokhmin Alexey V Date: Tue, 6 Nov 2012 18:13:16 +0400 Subject: [PATCH] added migration, updated models, UI --- .../platforms/products_controller.rb | 17 +++ app/models/build_list.rb | 17 +-- app/models/product.rb | 5 +- app/models/product_build_list.rb | 7 +- app/views/platforms/products/_form.html.haml | 9 ++ .../products/_iso_build_form.html.haml | 10 ++ config/locales/models/product.en.yml | 3 + config/locales/models/product.ru.yml | 3 + config/routes.rb | 1 + ...integrate_new_iso_builder_with_products.rb | 17 +++ db/schema.rb | 125 ++++++++++-------- lib/modules/models/commit_and_version.rb | 30 +++++ 12 files changed, 169 insertions(+), 75 deletions(-) create mode 100644 app/views/platforms/products/_iso_build_form.html.haml create mode 100644 db/migrate/20121106113338_integrate_new_iso_builder_with_products.rb create mode 100644 lib/modules/models/commit_and_version.rb diff --git a/app/controllers/platforms/products_controller.rb b/app/controllers/platforms/products_controller.rb index 7d97915ba..27b13f1f8 100644 --- a/app/controllers/platforms/products_controller.rb +++ b/app/controllers/platforms/products_controller.rb @@ -23,6 +23,7 @@ class Platforms::ProductsController < Platforms::BaseController end def create + @product.project = find_project if @product.save flash[:notice] = t('flash.product.saved') redirect_to platform_product_path(@platform, @product) @@ -34,6 +35,7 @@ class Platforms::ProductsController < Platforms::BaseController end def update + @product.project = find_project if @product.update_attributes(params[:product]) flash[:notice] = t('flash.product.saved') redirect_to platform_product_path(@platform, @product) @@ -53,4 +55,19 @@ class Platforms::ProductsController < Platforms::BaseController redirect_to platform_products_path(@platform) end + def autocomplete_project + items = Project.accessible_by(current_ability, :membered). + search(params[:term]).search_order + items.select! {|e| e.repo.branches.count > 0} + render :json => items.map{ |p| + {:id => p.id, :label => p.name_with_owner, :value => p.name_with_owner} + } + end + + protected + + def find_project + args = params[:src_project].try(:split, '/') || [] + (args.length == 2) ? Project.find_by_owner_and_name(*args) : nil + end end diff --git a/app/models/build_list.rb b/app/models/build_list.rb index c3976f623..aa7af138f 100644 --- a/app/models/build_list.rb +++ b/app/models/build_list.rb @@ -1,5 +1,7 @@ # -*- encoding : utf-8 -*- class BuildList < ActiveRecord::Base + include Modules::Models::CommitAndVersion + belongs_to :project belongs_to :arch belongs_to :save_to_platform, :class_name => 'Platform' @@ -32,11 +34,6 @@ class BuildList < ActiveRecord::Base errors.add(:save_to_repository, I18n.t('flash.build_list.wrong_include_repos')) unless build_for_platform.repository_ids.include? ir.to_i } } - validate lambda { - if commit_hash.blank? || project.repo.commit(commit_hash).blank? - errors.add :commit_hash, I18n.t('flash.build_list.wrong_commit_hash', :commit_hash => commit_hash) - end - } LIVE_TIME = 4.week # for unpublished MAX_LIVE_TIME = 3.month # for published @@ -115,7 +112,6 @@ class BuildList < ActiveRecord::Base after_commit :place_build after_destroy :delete_container - before_validation :set_commit_and_version @queue = :clone_and_build @@ -349,13 +345,4 @@ class BuildList < ActiveRecord::Base yield p end end - - def set_commit_and_version - if project_version.present? && commit_hash.blank? - self.commit_hash = project.repo.commits(project_version.match(/^latest_(.+)/).to_a.last || - project_version).try(:first).try(:id) - elsif project_version.blank? && commit_hash.present? - self.project_version = commit_hash - end - end end diff --git a/app/models/product.rb b/app/models/product.rb index 013ef34b1..7dfb29cb9 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -3,6 +3,7 @@ class Product < ActiveRecord::Base ATTRS_TO_CLONE = [ 'build_path', 'build_script', 'counter', 'ks', 'menu', 'tar', 'use_cron', 'cron_tab' ] belongs_to :platform + belongs_to :project has_many :product_build_lists, :dependent => :destroy after_validation :merge_tar_errors @@ -15,7 +16,9 @@ class Product < ActiveRecord::Base scope :recent, order("name ASC") - attr_accessible :name, :counter, :ks, :menu, :tar, :cron_tab, :use_cron, :description, :build_script, :delete_tar + attr_accessible :name, :counter, :ks, :menu, :tar, + :cron_tab, :use_cron, :description, :build_script, + :delete_tar, :lst, :repos, :project_id attr_readonly :platform_id def delete_tar diff --git a/app/models/product_build_list.rb b/app/models/product_build_list.rb index 0a792dfd8..72750ab88 100644 --- a/app/models/product_build_list.rb +++ b/app/models/product_build_list.rb @@ -1,5 +1,7 @@ # -*- encoding : utf-8 -*- class ProductBuildList < ActiveRecord::Base + include Modules::Models::CommitAndVersion + BUILD_STARTED = 2 BUILD_COMPLETED = 0 BUILD_FAILED = 1 @@ -15,12 +17,15 @@ class ProductBuildList < ActiveRecord::Base } belongs_to :product + belongs_to :project + belongs_to :arch + validates :product_id, :status, :presence => true validates :status, :inclusion => { :in => [BUILD_STARTED, BUILD_COMPLETED, BUILD_FAILED] } attr_accessor :base_url - attr_accessible :status, :base_url + attr_accessible :status, :base_url, :branch, :arch_id, :project_id attr_readonly :product_id diff --git a/app/views/platforms/products/_form.html.haml b/app/views/platforms/products/_form.html.haml index ea8f33886..631f0d4cb 100644 --- a/app/views/platforms/products/_form.html.haml +++ b/app/views/platforms/products/_form.html.haml @@ -37,6 +37,15 @@ = render "crontab", :form => f + +%b + = t('layout.products.new_iso_builder') +%br +%br += render 'iso_build_form', :f => f + +.both + .both .button_block = submit_tag t("layout.save") diff --git a/app/views/platforms/products/_iso_build_form.html.haml b/app/views/platforms/products/_iso_build_form.html.haml new file mode 100644 index 000000000..875bc4cc1 --- /dev/null +++ b/app/views/platforms/products/_iso_build_form.html.haml @@ -0,0 +1,10 @@ +.leftlist= f.label :lst, t("activerecord.attributes.product.lst"), :class => :label +.rightlist= f.text_field :lst, :class => 'text_field' +.both + +.leftlist= f.label :repos, t("activerecord.attributes.product.repos"), :class => :label +.rightlist= f.text_area :repos, :class => 'text_field resizable' +.both + +.leftlist= f.label :project, t("activerecord.attributes.product.project"), :class => :label +.rightlist= f.autocomplete_field :project, autocomplete_project_platform_products_path(@platform), :id_element => 'src_project_id', :name => 'src_project', :value => @product.project.try(:name_with_owner) \ No newline at end of file diff --git a/config/locales/models/product.en.yml b/config/locales/models/product.en.yml index 5a8c5608c..416cf4886 100644 --- a/config/locales/models/product.en.yml +++ b/config/locales/models/product.en.yml @@ -1,6 +1,7 @@ en: layout: products: + new_iso_builder: Params for new ISO builder (betta version) list: List about: About product build_lists_monitoring: Build lists monitoring @@ -55,3 +56,5 @@ en: system_wide: System-wide cron_tab: Cron tab use_cron: Use cron + repos: Repositories + project: Project \ No newline at end of file diff --git a/config/locales/models/product.ru.yml b/config/locales/models/product.ru.yml index 8969105e9..fec14b299 100644 --- a/config/locales/models/product.ru.yml +++ b/config/locales/models/product.ru.yml @@ -1,6 +1,7 @@ ru: layout: products: + new_iso_builder: Параметры для нового сборщика ISO образов (бетта версия) list: Список about: О продукте build_lists_monitoring: Мониторинг сборочных заданий @@ -55,3 +56,5 @@ ru: system_wide: Общесистемный cron_tab: Cron tab use_cron: Использовать крон + repos: Репозитории + project: Проект diff --git a/config/routes.rb b/config/routes.rb index 4e6795e81..db4262ab9 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -146,6 +146,7 @@ Rosa::Application.routes.draw do resources :key_pairs, :only => [:create, :index, :destroy] resources :products do resources :product_build_lists, :only => [:create, :destroy] + collection { get :autocomplete_project } end resources :maintainers, :only => [:index] end diff --git a/db/migrate/20121106113338_integrate_new_iso_builder_with_products.rb b/db/migrate/20121106113338_integrate_new_iso_builder_with_products.rb new file mode 100644 index 000000000..290738447 --- /dev/null +++ b/db/migrate/20121106113338_integrate_new_iso_builder_with_products.rb @@ -0,0 +1,17 @@ +class IntegrateNewIsoBuilderWithProducts < ActiveRecord::Migration + def change + add_column :products, :project_id, :integer + add_column :product_build_lists, :project_id, :integer + + add_column :product_build_lists, :project_version, :string + add_column :product_build_lists, :commit_hash, :string + + add_column :products, :lst, :string + add_column :product_build_lists, :lst, :string + + add_column :products, :repos, :text + add_column :product_build_lists, :repo, :string + + add_column :product_build_lists, :arch_id, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index bd9ee3cdb..44e990748 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,14 +11,14 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20121005100158) do +ActiveRecord::Schema.define(:version => 20121106113338) 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| @@ -53,8 +53,8 @@ ActiveRecord::Schema.define(:version => 20121005100158) 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 @@ -63,8 +63,8 @@ ActiveRecord::Schema.define(:version => 20121005100158) 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 @@ -75,8 +75,8 @@ ActiveRecord::Schema.define(:version => 20121005100158) 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 @@ -110,8 +110,8 @@ ActiveRecord::Schema.define(:version => 20121005100158) 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" @@ -142,8 +142,8 @@ ActiveRecord::Schema.define(:version => 20121005100158) do 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 t.integer "project_id" t.text "data" @@ -161,8 +161,8 @@ ActiveRecord::Schema.define(:version => 20121005100158) 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 "flash_notifies", :force => true do |t| @@ -176,8 +176,8 @@ ActiveRecord::Schema.define(:version => 20121005100158) do create_table "groups", :force => true do |t| 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 t.text "description" @@ -194,8 +194,8 @@ ActiveRecord::Schema.define(:version => 20121005100158) 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 "user_id" t.datetime "closed_at" t.integer "closed_by" @@ -255,14 +255,14 @@ ActiveRecord::Schema.define(:version => 20121005100158) do t.string "description" t.string "name", :null => false 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, :null => false t.integer "owner_id" t.string "owner_type" t.string "visibility", :default => "open", :null => false t.string "platform_type", :default => "main", :null => false - t.string "distrib_type" + t.string "distrib_type", :null => false end add_index "platforms", ["name"], :name => "index_platforms_on_name", :unique => true, :case_sensitive => false @@ -271,16 +271,22 @@ ActiveRecord::Schema.define(:version => 20121005100158) 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 create_table "product_build_lists", :force => true do |t| t.integer "product_id" - t.integer "status", :default => 2, :null => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.integer "status", :default => 2, :null => false + t.datetime "created_at" + t.datetime "updated_at" + t.integer "project_id" + t.string "project_version" + t.string "commit_hash" + t.string "lst" + t.string "repo" + t.integer "arch_id" end add_index "product_build_lists", ["product_id"], :name => "index_product_build_lists_on_product_id" @@ -288,8 +294,8 @@ ActiveRecord::Schema.define(:version => 20121005100158) do create_table "products", :force => true do |t| t.string "name", :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.text "build_script" t.text "counter" t.text "ks" @@ -301,6 +307,9 @@ ActiveRecord::Schema.define(:version => 20121005100158) do t.text "cron_tab" t.boolean "use_cron", :default => false t.text "description" + t.integer "project_id" + t.string "lst" + t.text "repos" end create_table "project_imports", :force => true do |t| @@ -308,8 +317,8 @@ ActiveRecord::Schema.define(:version => 20121005100158) 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 @@ -318,25 +327,25 @@ ActiveRecord::Schema.define(:version => 20121005100158) 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" 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.string "srpm_content_type" + t.boolean "has_wiki", :default => false t.string "default_branch", :default => "master" t.boolean "is_package", :default => true, :null => false t.integer "average_build_time", :default => 0, :null => false @@ -364,8 +373,8 @@ ActiveRecord::Schema.define(:version => 20121005100158) 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" t.string "language" @@ -379,16 +388,16 @@ ActiveRecord::Schema.define(:version => 20121005100158) do t.string "actor_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 t.boolean "publish_without_qa", :default => true end @@ -400,8 +409,8 @@ ActiveRecord::Schema.define(:version => 20121005100158) 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 @@ -412,8 +421,8 @@ ActiveRecord::Schema.define(:version => 20121005100158) 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 @@ -421,21 +430,18 @@ ActiveRecord::Schema.define(:version => 20121005100158) 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 "confirmation_token" - t.datetime "confirmed_at" - t.datetime "confirmation_sent_at" + t.string "language", :default => "en" + t.integer "own_projects_count", :default => 0, :null => false t.text "professional_experience" t.string "site" t.string "company" @@ -444,11 +450,14 @@ ActiveRecord::Schema.define(:version => 20121005100158) do t.string "avatar_content_type" t.integer "avatar_file_size" t.datetime "avatar_updated_at" - t.integer "failed_attempts", :default => 0 + t.integer "failed_attempts", :default => 0 t.string "unlock_token" t.datetime "locked_at" + t.string "confirmation_token" + t.datetime "confirmed_at" + t.datetime "confirmation_sent_at" t.string "authentication_token" - t.integer "build_priority", :default => 50 + t.integer "build_priority", :default => 50 end add_index "users", ["authentication_token"], :name => "index_users_on_authentication_token" diff --git a/lib/modules/models/commit_and_version.rb b/lib/modules/models/commit_and_version.rb new file mode 100644 index 000000000..70d76d271 --- /dev/null +++ b/lib/modules/models/commit_and_version.rb @@ -0,0 +1,30 @@ +# -*- encoding : utf-8 -*- +module Modules + module Models + module CommitAndVersion + extend ActiveSupport::Concern + + included do + + validate lambda { + if commit_hash.blank? || project.repo.commit(commit_hash).blank? + errors.add :commit_hash, I18n.t('flash.build_list.wrong_commit_hash', :commit_hash => commit_hash) + end + } + + before_validation :set_commit_and_version + end + + protected + + def set_commit_and_version + if project_version.present? && commit_hash.blank? + self.commit_hash = project.repo.commits(project_version.match(/^latest_(.+)/).to_a.last || + project_version).try(:first).try(:id) + elsif project_version.blank? && commit_hash.present? + self.project_version = commit_hash + end + end + end + end +end \ No newline at end of file