From caac6a7e7fbc6a9d10ab6bbb0441464ef0cea456 Mon Sep 17 00:00:00 2001
From: Stephan Kulow
Date: Wed, 9 Oct 2013 22:14:41 +0200
Subject: [PATCH] [webui] move the rest of the webui/projects_controller
---
.../controllers/webui/projects_controller.rb | 318 -----------------
src/api/config/routes.rb | 6 +-
.../test/functional/webui_controller_test.rb | 35 --
src/api/test/unit/code_quality_test.rb | 1 -
.../controllers/webui/project_controller.rb | 325 ++++++++++++++++--
src/api/webui/app/models/webui/api_details.rb | 5 -
.../webui/project/new_package_branch.html.erb | 5 +-
.../app/views/webui/project/show.html.erb | 4 +-
8 files changed, 296 insertions(+), 403 deletions(-)
delete mode 100644 src/api/app/controllers/webui/projects_controller.rb
diff --git a/src/api/app/controllers/webui/projects_controller.rb b/src/api/app/controllers/webui/projects_controller.rb
deleted file mode 100644
index 3dcb36ab81e..00000000000
--- a/src/api/app/controllers/webui/projects_controller.rb
+++ /dev/null
@@ -1,318 +0,0 @@
-require_dependency 'status_helper'
-
-class Webui::ProjectsController < Webui::BaseController
-
-
- # return all data related that the webui wants to show on /project/show
- def infos
- required_parameters :id
- project_name = params[:id]
- infos = Hash.new
- @pro = ::Project.find_by_name!(project_name)
- infos[:name] = @pro.name
- infos[:packages] = find_packages_info
-
- infos[:xml] = @pro.to_axml
-
- infos.merge! find_maintenance_infos
-
- infos[:linking_projects] = @pro.find_linking_projects.map { |p| p.name }
-
- reqs = @pro.request_ids_by_class
- infos[:requests] = (reqs['reviews'] + reqs['targets'] + reqs['incidents'] + reqs['maintenance_release']).sort.uniq
-
- infos[:nr_of_problem_packages] = find_nr_of_problems
-
- render json: infos
- end
-
- def remotes
- # return all remote projects and their title
- ret = {}
- projects = Project.where.not(remoteurl: nil).pluck(:id, :name, :title)
- projects.each do |id, name, title|
- ret[id] = {name: name, title: title }
- end
- render json: ret
- end
-
- def find_packages_info
- ret = Array.new
- packages=@pro.expand_all_packages
- prj_names = Hash.new
- Project.where(id: packages.map { |a| a[1] }.uniq).pluck(:id, :name).each do |id, name|
- prj_names[id] = name
- end
- packages.each do |name, prj_id|
- if prj_id==@pro.id
- ret << [name, nil]
- else
- ret << [name, prj_names[prj_id]]
- end
- end
- ret
- end
-
- def find_maintenance_infos
- infos = {}
- pm = @pro.maintenance_project
- infos[:maintenance_project] = pm.name if pm
-
- if @pro.is_maintenance?
- mi = DbProjectType.find_by_name!('maintenance_incident')
- subprojects = Project.where("projects.name like ?", @pro.name + ":%").
- where(type_id: mi.id).joins(:repositories => :release_targets).
- where("release_targets.trigger = 'maintenance'")
- infos[:incidents] = subprojects.pluck("projects.name").sort.uniq
-
- maintained_projects = []
- @pro.maintained_projects.each do |mp|
- maintained_projects << mp.name
- end
- infos[:maintained_projects] = maintained_projects
- end
- if @pro.is_maintenance_incident?
- rel = BsRequestCollection.new(project: @pro.name, states: ['new', 'review'], types: ['maintenance_release'], roles: ['source'])
- infos[:open_release_requests] = rel.ids
- end
- infos
- end
-
- def find_nr_of_problems
- begin
- result = backend_get("/build/#{URI.escape(@pro.name)}/_result?view=status&code=failed&code=broken&code=unresolvable")
- rescue ActiveXML::Transport::NotFoundError
- return 0
- end
- ret = {}
- Xmlhash.parse(result).elements('result') do |r|
- r.elements('status') { |p| ret[p['package']] = 1 }
- end
- ret.keys.size
- end
-
- def status
- required_parameters :id
- @project = ::Project.where(name: params[:id]).includes(:packages).first
- @status = Hash.new
-
- # needed to map requests to package id
- @name2id = Hash.new
-
- @ignore_pending = params[:ignore_pending] == "true"
- @limit_to_fails = params[:limit_to_fails] == "true"
- @limit_to_old = params[:limit_to_old] == "true"
- @include_versions = params[:include_versions] == "true"
-
- @prj_status = Rails.cache.fetch("prj_status-#{@project.to_s}", expires_in: 5.minutes) do
- ProjectStatusCalculator.new(@project).calc_status(pure_project: true)
- end
-
- status_filter_packages
- status_gather_attributes
- status_gather_requests
-
- @packages = Array.new
- @status.each_value do |p|
- status_check_package(p)
- end
-
- render json: {packages: @packages, projects: @develprojects.keys}
- end
-
- def status_check_package(p)
- currentpack = Hash.new
- pname = p.name
-
- currentpack['name'] = pname
- currentpack['failedcomment'] = p.failed_comment unless p.failed_comment.blank?
-
- newest = 0
-
- p.fails.each do |repo, arch, time, md5|
- next if newest > time
- next if md5 != p.verifymd5
- currentpack['failedarch'] = arch
- currentpack['failedrepo'] = repo
- newest = time
- currentpack['firstfail'] = newest
- end
- return if !currentpack['firstfail'] && @limit_to_fails
-
- currentpack['problems'] = Array.new
- currentpack['requests_from'] = Array.new
- currentpack['requests_to'] = Array.new
-
- key = @project.name + '/' + pname
- if @submits.has_key? key
- currentpack['requests_from'].concat(@submits[key])
- end
-
- currentpack['md5'] = p.verifymd5
-
- dp = p.develpack
- if dp
- dproject = p.develpack.project
- currentpack['develproject'] = dproject
- currentpack['develpackage'] = p.develpack.name
- key = "%s/%s" % [dproject, p.develpack.name]
- if @submits.has_key? key
- currentpack['requests_to'].concat(@submits[key])
- end
- return if !currentpack['requests_from'].empty? && @ignore_pending
-
- currentpack['develmd5'] = dp.verifymd5
- currentpack['develmtime'] = dp.maxmtime
-
- if dp.error
- currentpack['problems'] << 'error-' + dp.error
- end
-
- if currentpack['md5'] && currentpack['develmd5'] && currentpack['md5'] != currentpack['develmd5']
- if p.declined_request
- @declined_requests[p.declined_request].bs_request_actions.each do |action|
- return unless action.source_project == dp.project && action.source_package == dp.name
-
- sourcerev = Rails.cache.fetch("rev-#{dp.project}-#{dp.name}-#{currentpack['md5']}") do
- Directory.hashed(project: dp.project, package: dp.name)['rev']
- end
- if sourcerev == action.source_rev
- currentpack['currently_declined'] = p.declined_request
- currentpack['problems'] << 'currently_declined'
- end
- end
- end
- if currentpack['currently_declined'].nil?
- if p.changesmd5 != dp.changesmd5
- currentpack['problems'] << 'different_changes'
- else
- currentpack['problems'] << 'different_sources'
- end
- end
- end
- end
- currentpack.merge!(project_status_set_version(p))
-
- if p.links_to
- if currentpack['md5'] != p.links_to.verifymd5
- currentpack['problems'] << 'diff_against_link'
- currentpack['lproject'] = p.links_to.project
- currentpack['lpackage'] = p.links_to.name
- end
- end
-
- return unless (currentpack['firstfail'] or currentpack['failedcomment'] or currentpack['upstream_version'] or
- !currentpack['problems'].empty? or !currentpack['requests_from'].empty? or !currentpack['requests_to'].empty?)
- if @limit_to_old
- return if (currentpack['firstfail'] or currentpack['failedcomment'] or
- !currentpack['problems'].empty? or !currentpack['requests_from'].empty? or !currentpack['requests_to'].empty?)
- end
- @packages << currentpack
- end
-
- def status_filter_packages
- filter_for_user = User.get_by_login(params[:filter_for_user]) unless params[:filter_for_user].blank?
- no_project = "_none_"
- all_projects = "_all_"
- current_develproject = params[:filter_devel] || all_projects
- @develprojects = Hash.new
- packages_to_filter_for = nil
- if filter_for_user
- packages_to_filter_for = filter_for_user.user_relevant_packages_for_status
- end
- @prj_status.each_value do |value|
- if value.develpack
- dproject = value.develpack.project
- @develprojects[dproject] = 1
- if (current_develproject != dproject or current_develproject == no_project) and current_develproject != all_projects
- next
- end
- else
- next if @current_develproject == no_project
- end
- if filter_for_user
- if value.develpack
- next unless packages_to_filter_for.include? value.develpack.package_id
- else
- next unless packages_to_filter_for.include? value.package_id
- end
- end
- @status[value.package_id] = value
- @name2id[value.name] = value.package_id
- end
- end
-
- def status_gather_requests
- # we do not filter requests for project because we need devel projects too later on and as long as the
- # number of open requests is limited this is the easiest solution
- raw_requests = ::BsRequest.order(:id).where(state: [:new, :review, :declined]).joins(:bs_request_actions).
- where(bs_request_actions: {type: 'submit'}).pluck("bs_requests.id", "bs_requests.state",
- "bs_request_actions.target_project",
- "bs_request_actions.target_package")
-
- @declined_requests = {}
- @submits = Hash.new
- raw_requests.each do |id, state, tproject, tpackage|
- if state == "declined"
- next if tproject != @project.name || !@name2id.has_key?(tpackage)
- @status[@name2id[tpackage]].declined_request = id
- @declined_requests[id] = nil
- else
- key = "#{tproject}/#{tpackage}"
- @submits[key] ||= Array.new
- @submits[key] << id
- end
- end
- BsRequest.where(id: @declined_requests.keys).each do |r|
- @declined_requests[r.id] = r
- end
- end
-
- def status_gather_attributes
- project_status_attributes(@status.keys, 'OBS', 'ProjectStatusPackageFailComment') do |package, value|
- @status[package].failed_comment = value
- end
-
- if @include_versions || @limit_to_old
- project_status_attributes(@status.keys, 'openSUSE', 'UpstreamVersion') do |package, value|
- @status[package].upstream_version = value
- end
- project_status_attributes(@status.keys, 'openSUSE', 'UpstreamTarballURL') do |package, value|
- @status[package].upstream_url= value
- end
- end
- end
-
- protected
-
- def project_status_attributes(packages, namespace, name)
- ret = Hash.new
- at = AttribType.find_by_namespace_and_name(namespace, name)
- return unless at
- attribs = at.attribs.where(db_package_id: packages)
- AttribValue.where(attrib_id: attribs).joins(:attrib).pluck("attribs.db_package_id, value").each do |id, value|
- yield id, value
- end
- ret
- end
-
- def project_status_set_version(p)
- ret = {}
- ret['version'] = p.version
- if p.upstream_version
- begin
- gup = Gem::Version.new(p.version)
- guv = Gem::Version.new(p.upstream_version)
- rescue ArgumentError
- # if one of the versions can't be parsed we simply can't say
- end
-
- if gup && guv && gup < guv
- ret['upstream_version'] = p.upstream_version
- ret['upstream_url'] = p.upstream_url
- end
- end
- ret
- end
-
-end
diff --git a/src/api/config/routes.rb b/src/api/config/routes.rb
index 3b45426f3ff..022f022fe4e 100644
--- a/src/api/config/routes.rb
+++ b/src/api/config/routes.rb
@@ -332,11 +332,7 @@
# DO NOT USE THEM IN YOUR TOOLS!
#
namespace :webui do
- resources :projects, :only => [:index], constraints: { :id => %r{[^\/]*} } do
- member do
- get 'infos'
- get 'status'
- end
+ resources :projects, constraints: { :id => %r{[^\/]*} } do
resources :flags, :only => [:index]
resources :packages, :only => [], constraints: { :id => %r{[^\/]*} } do
resources :relationships, :only => [:create] do
diff --git a/src/api/test/functional/webui_controller_test.rb b/src/api/test/functional/webui_controller_test.rb
index 21a8216c8e3..63b3ab15e7c 100644
--- a/src/api/test/functional/webui_controller_test.rb
+++ b/src/api/test/functional/webui_controller_test.rb
@@ -9,34 +9,6 @@ def setup
wait_for_scheduler_start
end
- def test_project_infos
- get '/webui/projects/home:Iggy/infos'
- assert_response 401
-
- login_Iggy
- get '/webui/projects/home:Iggy/infos'
- assert_response :success
-
- end
-
- def test_remote_projects
- get "/webui/projects/remotes"
- assert_response 401
-
- login_Iggy
- get "/webui/projects/remotes"
- assert_response :success
- assert_match(/RemoteInstance/, @response.body)
- end
-
- def test_remote_projects_as_admin
- login_king
- get "/webui/projects/remotes"
- assert_response :success
- assert_match(/RemoteInstance/, @response.body)
- assert_match(/Remoteurl project which is hidden/, @response.body)
- end
-
def test_search_owner
login_king
@@ -100,13 +72,6 @@ def test_search_owner
assert_response :success
end
- test 'project status' do
- login_Iggy
-
- get '/webui/projects/LocalProject/status?limit_to_fails=true&limit_to_old=false&include_versions=true&ignore_pending=false&filter_devel=_all_'
- assert_response :success
- end
-
test 'package rdiff' do
login_Iggy
diff --git a/src/api/test/unit/code_quality_test.rb b/src/api/test/unit/code_quality_test.rb
index 03f294f5016..f0c2127e5ef 100644
--- a/src/api/test/unit/code_quality_test.rb
+++ b/src/api/test/unit/code_quality_test.rb
@@ -150,7 +150,6 @@ def setup
'UserLdapStrategy::initialize_ldap_con' => 64.05,
'UserLdapStrategy::render_grouplist_ldap' => 100.3,
'UserLdapStrategy::update_entry_ldap' => 59.56,
- 'Webui::ProjectsController#status_check_package' => 200,
'WizardController#package_wizard' => 135.16,
}
diff --git a/src/api/webui/app/controllers/webui/project_controller.rb b/src/api/webui/app/controllers/webui/project_controller.rb
index d3539535c44..d4f6080790e 100644
--- a/src/api/webui/app/controllers/webui/project_controller.rb
+++ b/src/api/webui/app/controllers/webui/project_controller.rb
@@ -202,7 +202,7 @@ def new_package
end
def new_package_branch
- @remote_projects = ApiDetails.read(:projects_remotes)
+ @remote_projects = Project.where.not(remoteurl: nil).pluck(:id, :name, :title)
end
def incident_request_dialog
@@ -246,26 +246,72 @@ def new_release_request
redirect_to :action => 'show', :project => params[:project]
end
- def load_project_info
- return unless check_valid_project_name
+ def find_packages_info
+ ret = Array.new
+ packages=@pro.expand_all_packages
+ prj_names = Hash.new
+ Project.where(id: packages.map { |a| a[1] }.uniq).pluck(:id, :name).each do |id, name|
+ prj_names[id] = name
+ end
+ packages.each do |name, prj_id|
+ if prj_id==@pro.id
+ ret << [name, nil]
+ else
+ ret << [name, prj_names[prj_id]]
+ end
+ end
+ ret
+ end
+
+ def find_maintenance_infos
+ pm = @pro.maintenance_project
+ @project_maintenance_project = pm.name if pm
+
+ @is_maintenance_project = @pro.is_maintenance?
+ if @is_maintenance_project
+ mi = DbProjectType.find_by_name!('maintenance_incident')
+ subprojects = Project.where("projects.name like ?", @pro.name + ":%").
+ where(type_id: mi.id).joins(:repositories => :release_targets).
+ where("release_targets.trigger = 'maintenance'")
+ @open_maintenance_incidents = subprojects.pluck("projects.name").sort.uniq
+
+ @maintained_projects = []
+ @pro.maintained_projects.each do |mp|
+ @maintained_projects << mp.name
+ end
+ end
+ @is_incident_project = @pro.is_maintenance_incident?
+ if @is_incident_project
+ rel = BsRequestCollection.new(project: @pro.name, states: ['new', 'review'], types: ['maintenance_release'], roles: ['source'])
+ @open_release_requests = rel.ids
+ end
+ end
+
+ def find_nr_of_problems
begin
- @project_info = ApiDetails.read(:infos_project, params[:project])
- rescue ApiDetails::NotFoundError
- return render_project_missing
+ result = ActiveXML.backend.direct_http("/build/#{URI.escape(@pro.name)}/_result?view=status&code=failed&code=broken&code=unresolvable")
+ rescue ActiveXML::Transport::NotFoundError
+ return 0
end
- @project = WebuiProject.new(@project_info['xml'])
- @packages = @project_info['packages'].map { |p| p[0] }.sort
- @open_maintenance_incidents = @project_info['incidents']
- @linking_projects = @project_info['linking_projects']
- @requests = @project_info['requests']
- @nr_of_problem_packages = @project_info['nr_of_problem_packages']
+ ret = {}
+ Xmlhash.parse(result).elements('result') do |r|
+ r.elements('status') { |p| ret[p['package']] = 1 }
+ end
+ ret.keys.size
+ end
- # Is this a maintenance master project ?
- @is_maintenance_project = @project.project_type == "maintenance"
- @is_incident_project = @project.project_type == 'maintenance_incident'
+ def load_project_info
+ return unless check_valid_project_name
+ @pro = Project.find_by_name(params[:project])
+ return render_project_missing unless @pro
- @maintained_projects = @project_info['maintained_projects']
- @open_release_requests = @project_info['open_release_requests']
+ find_maintenance_infos
+ @project = WebuiProject.new(@pro.to_axml)
+ @packages = find_packages_info.map { |p| p[0] }.sort
+ @linking_projects = @pro.find_linking_projects.map { |p| p.name }
+ reqs = @pro.request_ids_by_class
+ @requests = (reqs['reviews'] + reqs['targets'] + reqs['incidents'] + reqs['maintenance_release']).sort.uniq
+ @nr_of_problem_packages = find_nr_of_problems
end
def show
@@ -276,8 +322,6 @@ def show
@bugowners_mail.push(mail.to_s) if mail
end unless @spider_bot
- @project_maintenance_project = @project_info['maintenance_project'] unless @spider_bot
-
# An incident has a patchinfo if there is a package 'patchinfo' with file '_patchinfo', try to find that:
@has_patchinfo = false
@packages.each do |pkg_element|
@@ -629,7 +673,9 @@ def save_new
@project.title.text = params[:title]
@project.description.text = params[:description]
@project.set_project_type('maintenance') if params[:maintenance_project]
- @project.set_remoteurl(params[:remoteurl]) if params[:remoteurl]
+ if params[:remoteurl]
+ @project.add_element('remoteurl').text = params[:remoteurl]
+ end
if params[:access_protection]
@project.add_element 'access'
@project.access.add_element 'disable'
@@ -1161,15 +1207,231 @@ def edit_comment
@update = params[:update]
end
+ def calc_status(project_name)
+ @api_project = ::Project.where(name: project_name).includes(:packages).first
+ @status = Hash.new
+
+ # needed to map requests to package id
+ @name2id = Hash.new
+
+ @prj_status = Rails.cache.fetch("prj_status-#{@api_project.to_s}", expires_in: 5.minutes) do
+ ProjectStatusCalculator.new(@api_project).calc_status(pure_project: true)
+ end
+
+ status_filter_packages
+ status_gather_attributes
+ status_gather_requests
+
+ @packages = Array.new
+ @status.each_value do |p|
+ status_check_package(p)
+ end
+
+ return {packages: @packages, projects: @develprojects.keys}
+ end
+
+ def status_check_package(p)
+ currentpack = Hash.new
+ pname = p.name
+
+ currentpack['name'] = pname
+ currentpack['failedcomment'] = p.failed_comment unless p.failed_comment.blank?
+
+ newest = 0
+
+ p.fails.each do |repo, arch, time, md5|
+ next if newest > time
+ next if md5 != p.verifymd5
+ currentpack['failedarch'] = arch
+ currentpack['failedrepo'] = repo
+ newest = time
+ currentpack['firstfail'] = newest
+ end
+ return if !currentpack['firstfail'] && @limit_to_fails
+
+ currentpack['problems'] = Array.new
+ currentpack['requests_from'] = Array.new
+ currentpack['requests_to'] = Array.new
+
+ key = @api_project.name + '/' + pname
+ if @submits.has_key? key
+ currentpack['requests_from'].concat(@submits[key])
+ end
+
+ currentpack['md5'] = p.verifymd5
+
+ dp = p.develpack
+ if dp
+ dproject = p.develpack.project
+ currentpack['develproject'] = dproject
+ currentpack['develpackage'] = p.develpack.name
+ key = "%s/%s" % [dproject, p.develpack.name]
+ if @submits.has_key? key
+ currentpack['requests_to'].concat(@submits[key])
+ end
+ return if !currentpack['requests_from'].empty? && @ignore_pending
+
+ currentpack['develmd5'] = dp.verifymd5
+ currentpack['develmtime'] = dp.maxmtime
+
+ if dp.error
+ currentpack['problems'] << 'error-' + dp.error
+ end
+
+ if currentpack['md5'] && currentpack['develmd5'] && currentpack['md5'] != currentpack['develmd5']
+ if p.declined_request
+ @declined_requests[p.declined_request].bs_request_actions.each do |action|
+ return unless action.source_project == dp.project && action.source_package == dp.name
+
+ sourcerev = Rails.cache.fetch("rev-#{dp.project}-#{dp.name}-#{currentpack['md5']}") do
+ Directory.hashed(project: dp.project, package: dp.name)['rev']
+ end
+ if sourcerev == action.source_rev
+ currentpack['currently_declined'] = p.declined_request
+ currentpack['problems'] << 'currently_declined'
+ end
+ end
+ end
+ if currentpack['currently_declined'].nil?
+ if p.changesmd5 != dp.changesmd5
+ currentpack['problems'] << 'different_changes'
+ else
+ currentpack['problems'] << 'different_sources'
+ end
+ end
+ end
+ end
+ currentpack.merge!(project_status_set_version(p))
+
+ if p.links_to
+ if currentpack['md5'] != p.links_to.verifymd5
+ currentpack['problems'] << 'diff_against_link'
+ currentpack['lproject'] = p.links_to.project
+ currentpack['lpackage'] = p.links_to.name
+ end
+ end
+
+ return unless (currentpack['firstfail'] or currentpack['failedcomment'] or currentpack['upstream_version'] or
+ !currentpack['problems'].empty? or !currentpack['requests_from'].empty? or !currentpack['requests_to'].empty?)
+ if @limit_to_old
+ return if (currentpack['firstfail'] or currentpack['failedcomment'] or
+ !currentpack['problems'].empty? or !currentpack['requests_from'].empty? or !currentpack['requests_to'].empty?)
+ end
+ @packages << currentpack
+ end
+
+ def status_filter_packages
+ filter_for_user = User.get_by_login(@filter_for_user) unless @filter_for_user.blank?
+ current_develproject = @filter || @all_projects
+ @develprojects = Hash.new
+ packages_to_filter_for = nil
+ if filter_for_user
+ packages_to_filter_for = filter_for_user.user_relevant_packages_for_status
+ end
+ @prj_status.each_value do |value|
+ if value.develpack
+ dproject = value.develpack.project
+ @develprojects[dproject] = 1
+ if (current_develproject != dproject or current_develproject == @no_project) and current_develproject != @all_projects
+ next
+ end
+ else
+ next if @current_develproject == @no_project
+ end
+ if filter_for_user
+ if value.develpack
+ next unless packages_to_filter_for.include? value.develpack.package_id
+ else
+ next unless packages_to_filter_for.include? value.package_id
+ end
+ end
+ @status[value.package_id] = value
+ @name2id[value.name] = value.package_id
+ end
+ end
+
+ def status_gather_requests
+ # we do not filter requests for project because we need devel projects too later on and as long as the
+ # number of open requests is limited this is the easiest solution
+ raw_requests = ::BsRequest.order(:id).where(state: [:new, :review, :declined]).joins(:bs_request_actions).
+ where(bs_request_actions: {type: 'submit'}).pluck("bs_requests.id", "bs_requests.state",
+ "bs_request_actions.target_project",
+ "bs_request_actions.target_package")
+
+ @declined_requests = {}
+ @submits = Hash.new
+ raw_requests.each do |id, state, tproject, tpackage|
+ if state == "declined"
+ next if tproject != @api_project.name || !@name2id.has_key?(tpackage)
+ @status[@name2id[tpackage]].declined_request = id
+ @declined_requests[id] = nil
+ else
+ key = "#{tproject}/#{tpackage}"
+ @submits[key] ||= Array.new
+ @submits[key] << id
+ end
+ end
+ ::BsRequest.where(id: @declined_requests.keys).each do |r|
+ @declined_requests[r.id] = r
+ end
+ end
+
+ def status_gather_attributes
+ project_status_attributes(@status.keys, 'OBS', 'ProjectStatusPackageFailComment') do |package, value|
+ @status[package].failed_comment = value
+ end
+
+ if @include_versions || @limit_to_old
+ project_status_attributes(@status.keys, 'openSUSE', 'UpstreamVersion') do |package, value|
+ @status[package].upstream_version = value
+ end
+ project_status_attributes(@status.keys, 'openSUSE', 'UpstreamTarballURL') do |package, value|
+ @status[package].upstream_url= value
+ end
+ end
+ end
+
+ def project_status_attributes(packages, namespace, name)
+ ret = Hash.new
+ at = AttribType.find_by_namespace_and_name(namespace, name)
+ return unless at
+ attribs = at.attribs.where(db_package_id: packages)
+ AttribValue.where(attrib_id: attribs).joins(:attrib).pluck("attribs.db_package_id, value").each do |id, value|
+ yield id, value
+ end
+ ret
+ end
+
+ def project_status_set_version(p)
+ ret = {}
+ ret['version'] = p.version
+ if p.upstream_version
+ begin
+ gup = Gem::Version.new(p.version)
+ guv = Gem::Version.new(p.upstream_version)
+ rescue ArgumentError
+ # if one of the versions can't be parsed we simply can't say
+ end
+
+ if gup && guv && gup < guv
+ ret['upstream_version'] = p.upstream_version
+ ret['upstream_url'] = p.upstream_url
+ end
+ end
+ ret
+ end
+
def status
all_packages = 'All Packages'
no_project = 'No Project'
+ @no_project = "_none_"
+ @all_projects = "_all_"
@current_develproject = params[:filter_devel] || all_packages
- filter = @current_develproject
- if filter == all_packages
- filter = '_all_'
+ @filter = @current_develproject
+ if @filter == all_packages
+ @filter = @all_projects
elsif filter == no_project
- filter = '_none_'
+ @filter = @no_project
end
@ignore_pending = params[:ignore_pending] || false
@limit_to_fails = !(!params[:limit_to_fails].nil? && params[:limit_to_fails] == 'false')
@@ -1178,15 +1440,10 @@ def status
@filter_for_user = params[:filter_for_user]
@develprojects = Hash.new
- ps = ApiDetails.read(:status_project, params[:project],
- filter_devel: filter,
- ignore_pending: @ignore_pending,
- limit_to_fails: @limit_to_fails,
- limit_to_old: @limit_to_old,
- include_versions: @include_versions,
- filter_for_user: params[:filter_for_user])
- @packages = ps['packages']
- @develprojects = ps['projects'].sort { |x,y| x.downcase <=> y.downcase }
+ ps = calc_status(params[:project])
+
+ @packages = ps[:packages]
+ @develprojects = ps[:projects].sort { |x,y| x.downcase <=> y.downcase }
@develprojects.insert(0, all_packages)
@develprojects.insert(1, no_project)
@@ -1354,7 +1611,7 @@ def render_project_missing
def require_project
return unless check_valid_project_name
- @project ||= find_cached(WebuiProject, params[:project], :expires_in => 5.minutes )
+ @project ||= WebuiProject.find(params[:project])
unless @project
return render_project_missing
end
diff --git a/src/api/webui/app/models/webui/api_details.rb b/src/api/webui/app/models/webui/api_details.rb
index 6081ae0ec0f..8019e00b6b1 100644
--- a/src/api/webui/app/models/webui/api_details.rb
+++ b/src/api/webui/app/models/webui/api_details.rb
@@ -63,11 +63,6 @@ def self.http_do(verb, route_name, *args)
uri = "/webui/" +
case route_name.to_sym
- when :projects then "projects"
- when :projects_remotes then "projects/remotes"
- when :infos_project then "projects/#{ids.first}/infos"
- when :status_project then "projects/#{ids.first}/status"
-
when :package_rdiff then "projects/#{ids.first}/packages/#{ids.last}/rdiff"
when :requests then "requests"
diff --git a/src/api/webui/app/views/webui/project/new_package_branch.html.erb b/src/api/webui/app/views/webui/project/new_package_branch.html.erb
index 510891036ec..ae31499d95e 100644
--- a/src/api/webui/app/views/webui/project/new_package_branch.html.erb
+++ b/src/api/webui/app/views/webui/project/new_package_branch.html.erb
@@ -16,9 +16,8 @@ package.
<%= pluralize(@remote_projects.count, 'interconnect.', 'interconnects.') %>
- <% @remote_projects.each do |p| %>
- <% prj = Project.find_cached(p[1]["name"]) %>
- - <%= link_to(prj.name, { controller: 'project', action: 'show', project: prj}, {:class => 'project'}) %>
+ <% @remote_projects.each do |id,name,title| %>
+ - <%= link_to("#{name}: #{title}", { controller: 'project', action: 'show', project: name}, {:class => 'project'}) %>
<% end %>
<% end %>
diff --git a/src/api/webui/app/views/webui/project/show.html.erb b/src/api/webui/app/views/webui/project/show.html.erb
index 16c9d459273..7733a2cd87a 100644
--- a/src/api/webui/app/views/webui/project/show.html.erb
+++ b/src/api/webui/app/views/webui/project/show.html.erb
@@ -21,7 +21,7 @@
<%= @open_maintenance_incidents.length %> <%= link_to "open incident#{@open_maintenance_incidents.length == 1 ? '' : 's'}", action: 'maintenance_incidents', project: @project %>
- <% if @maintained_projects.length == 0 %>
+ <% if @maintained_projects.empty? %>
<%= sprite_tag 'exclamation' %>
<% else %>
<%= sprite_tag 'accept' %>
@@ -110,7 +110,7 @@
<% end -%>
<% if @project.can_edit?( @user ) %>
<% unless @project.is_remote? %>
- <% if @is_incident_project && !@packages.blank? && @has_patchinfo && @open_release_requests.length == 0 %>
+ <% if @is_incident_project && @packages.present? && @has_patchinfo && @open_release_requests.blank? %>
<%= link_to(sprite_tag('brick_go') + 'Request to release', {controller: 'project', action: 'release_request_dialog', project: @project}, remote: true) %>