diff --git a/app/models/build_list/package.rb b/app/models/build_list/package.rb index 026dad4a1..5428b48e5 100644 --- a/app/models/build_list/package.rb +++ b/app/models/build_list/package.rb @@ -1,11 +1,14 @@ class BuildList::Package < ActiveRecord::Base PACKAGE_TYPES = %w(source binary) - belongs_to :build_list + belongs_to :build_list, touch: true belongs_to :project belongs_to :platform - attr_accessible :fullname, :name, :release, :version, :sha1, :epoch + serialize :dependent_packages, Array + serialize :dependent_projects, Array + + attr_accessible :fullname, :name, :release, :version, :sha1, :epoch, :dependent_packages validates :build_list_id, :project_id, :platform_id, :fullname, :package_type, :name, :release, :version, @@ -23,6 +26,8 @@ class BuildList::Package < ActiveRecord::Base scope :like_name, ->(name) { where("#{table_name}.name ILIKE ?", "%#{name}%") if name.present? } before_create :set_epoch + before_create :normalize_dependent_packages + after_commit(on: :create) { |p| p.find_dependent_projects if p.dependent_packages.present? } # later with resque def assignee project.maintainer @@ -45,8 +50,17 @@ class BuildList::Package < ActiveRecord::Base end end + def find_dependent_projects + # TODO + end + later :find_dependent_projects, queue: :middle + protected + def normalize_dependent_packages + self.dependent_packages = dependent_packages.split(/\s/).select(&:present?) if dependent_packages.present? + end + def set_epoch self.epoch = nil if epoch.blank? || epoch == 0 end diff --git a/app/views/projects/build_lists/show.json.jbuilder b/app/views/projects/build_lists/show.json.jbuilder index c502fc670..f462f329d 100644 --- a/app/views/projects/build_lists/show.json.jbuilder +++ b/app/views/projects/build_lists/show.json.jbuilder @@ -1,67 +1,75 @@ json.build_list do - json.(@build_list, :id, :container_status, :status) - json.(@build_list, :update_type) - json.updated_at @build_list.updated_at - json.updated_at_utc @build_list.updated_at.strftime('%Y-%m-%d %H:%M:%S UTC') - if !@build_list.in_work? && @build_list.started_at json.human_duration @build_list.human_duration elsif @build_list.in_work? json.human_duration "#{@build_list.human_current_duration} / #{@build_list.human_average_build_time}" end - - json.can_publish can?(:publish, @build_list) - json.can_publish_into_testing can?(:publish_into_testing, @build_list) && @build_list.can_publish_into_testing? - json.can_cancel @build_list.can_cancel? - json.can_create_container @build_list.can_create_container? - json.can_reject_publish @build_list.can_reject_publish? - - json.extra_build_lists_published @build_list.extra_build_lists_published? - json.can_publish_in_future can_publish_in_future?(@build_list) - json.can_publish_into_repository @build_list.can_publish_into_repository? + + json.cache! @build_list, expires_in: 1.minute do + json.(@build_list, :id, :container_status, :status) + json.(@build_list, :update_type) + json.updated_at @build_list.updated_at + json.updated_at_utc @build_list.updated_at.strftime('%Y-%m-%d %H:%M:%S UTC') - json.container_path container_url if @build_list.container_published? + json.can_publish can?(:publish, @build_list) + json.can_publish_into_testing can?(:publish_into_testing, @build_list) && @build_list.can_publish_into_testing? + json.can_cancel @build_list.can_cancel? + json.can_create_container @build_list.can_create_container? + json.can_reject_publish @build_list.can_reject_publish? - json.publisher do - json.fullname @build_list.publisher.try(:fullname) - json.path user_path(@build_list.publisher) - end if @build_list.publisher + json.extra_build_lists_published @build_list.extra_build_lists_published? + json.can_publish_in_future can_publish_in_future?(@build_list) + json.can_publish_into_repository @build_list.can_publish_into_repository? - json.builder do - json.fullname @build_list.builder.try(:fullname) - json.path user_path(@build_list.builder) - end if @build_list.builder && (!@build_list.builder.system? || current_user.try(:admin?)) - json.advisory do - json.(@build_list.advisory, :description, :advisory_id) - json.path advisory_path(@build_list.advisory) - end if @build_list.advisory + json.container_path container_url if @build_list.container_published? - json.results @build_list.results do |result| - json.file_name result['file_name'] - json.sha1 result['sha1'] - json.size result['size'] + json.publisher do + json.fullname @build_list.publisher.try(:fullname) + json.path user_path(@build_list.publisher) + end if @build_list.publisher - timestamp = result['timestamp'] - json.created_at Time.zone.at(result['timestamp']).to_s if timestamp + json.builder do + json.fullname @build_list.builder.try(:fullname) + json.path user_path(@build_list.builder) + end if @build_list.builder && (!@build_list.builder.system? || current_user.try(:admin?)) - json.url file_store_results_url(result['sha1'], result['file_name']) - end if @build_list.new_core? && @build_list.results.present? + json.advisory do + json.(@build_list.advisory, :description, :advisory_id) + json.path advisory_path(@build_list.advisory) + end if @build_list.advisory - json.packages @build_list.packages do |package| - json.(package, :id, :name, :fullname, :release, :version, :sha1, :epoch) - json.url "#{APP_CONFIG['file_store_url']}/api/v1/file_stores/#{package.sha1}" if package.sha1 - end if @build_list.packages.present? + json.results @build_list.results do |result| + json.file_name result['file_name'] + json.sha1 result['sha1'] + json.size result['size'] - json.item_groups do |group| - @item_groups.each_with_index do |group, level| - json.group group do |item| - json.(item, :name, :status) - json.path build_list_item_version_link item - json.level level + timestamp = result['timestamp'] + json.created_at Time.zone.at(result['timestamp']).to_s if timestamp + + json.url file_store_results_url(result['sha1'], result['file_name']) + end if @build_list.new_core? && @build_list.results.present? + + json.packages @build_list.packages do |package| + json.(package, :id, :name, :fullname, :release, :version, :sha1, :epoch) + json.url "#{APP_CONFIG['file_store_url']}/api/v1/file_stores/#{package.sha1}" if package.sha1 + + json.dependent_projects Project.where(id: package.dependent_projects).to_a do |project| + json.project_path project_path(project) + json.new_project_build_list_path new_project_build_list_path(@project) end - end - end if @item_groups.present? + end if @build_list.packages.present? + + json.item_groups do |group| + @item_groups.each_with_index do |group, level| + json.group group do |item| + json.(item, :name, :status) + json.path build_list_item_version_link item + json.level level + end + end + end if @item_groups.present? + end end diff --git a/db/migrate/20140606193047_add_dependent_packages_and_dependent_projects_to_build_list_packages.rb b/db/migrate/20140606193047_add_dependent_packages_and_dependent_projects_to_build_list_packages.rb new file mode 100644 index 000000000..c2d1db1db --- /dev/null +++ b/db/migrate/20140606193047_add_dependent_packages_and_dependent_projects_to_build_list_packages.rb @@ -0,0 +1,6 @@ +class AddDependentPackagesAndDependentProjectsToBuildListPackages < ActiveRecord::Migration + def change + add_column :build_list_packages, :dependent_packages, :text + add_column :build_list_packages, :dependent_projects, :text + end +end diff --git a/db/schema.rb b/db/schema.rb index 82c9152ac..3bc0ac99d 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20140602164337) do +ActiveRecord::Schema.define(version: 20140606193047) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -90,11 +90,13 @@ ActiveRecord::Schema.define(version: 20140602164337) do t.string "version" t.string "release" t.string "package_type" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.boolean "actual", default: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.boolean "actual", default: false t.string "sha1" t.integer "epoch" + t.text "dependent_packages" + t.text "dependent_projects" t.index ["actual", "platform_id"], :name => "index_build_list_packages_on_actual_and_platform_id" t.index ["build_list_id"], :name => "index_build_list_packages_on_build_list_id" t.index ["name", "project_id"], :name => "index_build_list_packages_on_name_and_project_id"