From 60d18083cfae545345a6e2eaeeed55182b6216b8 Mon Sep 17 00:00:00 2001 From: Ancor Gonzalez Sosa Date: Thu, 17 Oct 2013 11:24:36 +0200 Subject: [PATCH] [api] Using models directly in webui2/search_controller --- src/api/app/controllers/search_controller.rb | 6 +- .../controllers/webui/owners_controller.rb | 13 - .../controllers/webui/searches_controller.rb | 14 - src/api/app/helpers/search_helper.rb | 68 ---- src/api/app/models/full_text_search.rb | 16 - .../maintainership.rb => models/owner.rb} | 351 +++++++++++------- src/api/config/routes.rb | 2 - .../webui/search_controller_test.rb | 2 +- .../controllers/webui/search_controller.rb | 86 +---- .../webui/app/helpers/webui/search_helper.rb | 22 +- .../webui/app/helpers/webui/webui_helper.rb | 25 ++ src/api/webui/app/models/webui/api_details.rb | 2 - src/api/webui/app/models/webui/owner.rb | 2 - ...r_and_role_with_realname_and_icon.html.erb | 23 +- .../app/views/webui/search/_owners.html.erb | 18 + .../app/views/webui/search/_results.html.erb | 77 ++-- .../app/views/webui/search/index.html.erb | 4 +- .../app/views/webui/search/owner.html.erb | 5 +- 18 files changed, 317 insertions(+), 419 deletions(-) delete mode 100644 src/api/app/controllers/webui/owners_controller.rb delete mode 100644 src/api/app/controllers/webui/searches_controller.rb delete mode 100644 src/api/app/helpers/search_helper.rb rename src/api/app/{helpers/maintainership.rb => models/owner.rb} (60%) delete mode 100644 src/api/webui/app/models/webui/owner.rb create mode 100644 src/api/webui/app/views/webui/search/_owners.html.erb diff --git a/src/api/app/controllers/search_controller.rb b/src/api/app/controllers/search_controller.rb index a554b727ed3..6a9d00d97c1 100644 --- a/src/api/app/controllers/search_controller.rb +++ b/src/api/app/controllers/search_controller.rb @@ -1,5 +1,3 @@ -include SearchHelper - class SearchController < ApplicationController require_dependency 'xpath_engine' @@ -51,7 +49,7 @@ def attribute def missing_owner params[:limit] ||= "0" #unlimited by default - @owners = search_owner(params, nil) + @owners = Owner.search(params, nil).map(&:to_hash) end @@ -70,7 +68,7 @@ def owner return end - @owners = search_owner(params, obj) + @owners = Owner.search(params, obj).map(&:to_hash) end def predicate_from_match_parameter(p) diff --git a/src/api/app/controllers/webui/owners_controller.rb b/src/api/app/controllers/webui/owners_controller.rb deleted file mode 100644 index 3b64b234120..00000000000 --- a/src/api/app/controllers/webui/owners_controller.rb +++ /dev/null @@ -1,13 +0,0 @@ -include SearchHelper - -class Webui::OwnersController < Webui::BaseController - - def index - required_parameters :binary - - Suse::Backend.start_test_backend if Rails.env.test? - - @owners = search_owner(params, params[:binary]) - end - -end diff --git a/src/api/app/controllers/webui/searches_controller.rb b/src/api/app/controllers/webui/searches_controller.rb deleted file mode 100644 index 5126c011cdc..00000000000 --- a/src/api/app/controllers/webui/searches_controller.rb +++ /dev/null @@ -1,14 +0,0 @@ -class Webui::SearchesController < Webui::BaseController - - def new - @search = FullTextSearch.new(classes: %(Project Package), - fields: %w(name title)) - render json: @search - end - - def create - @search = FullTextSearch.new(params[:search]) - @search.search(:page => params[:page], :per_page => params[:per_page]) - render json: @search - end -end diff --git a/src/api/app/helpers/search_helper.rb b/src/api/app/helpers/search_helper.rb deleted file mode 100644 index 979e19d4e6b..00000000000 --- a/src/api/app/helpers/search_helper.rb +++ /dev/null @@ -1,68 +0,0 @@ - -module SearchHelper - - include Maintainership - - def search_owner(params, obj) - params[:attribute] ||= "OBS:OwnerRootProject" - at = AttribType.find_by_name(params[:attribute]) - unless at - render_error :status => 404, :errorcode => "unknown_attribute_type", - :message => "Attribute Type #{params[:attribute]} does not exist" - return - end - - limit = params[:limit] || 1 - - projects = [] - if params[:project] - # default project specified - projects = [Project.get_by_name(params[:project])] - else - # Find all marked projects - projects = Project.find_by_attribute_type(at) - if projects.empty? - render_error :status => 400, :errorcode => "attribute_not_set", - :message => "The attribute type #{params[:attribute]} is not set on any projects. No default projects defined." - return - end - end - - # search in each marked project - owners = [] - projects.each do |project| - - attrib = project.attribs.where(attrib_type_id: at.id).first - filter = ["maintainer","bugowner"] - devel = true - if params[:filter] - filter=params[:filter].split(",") - else - if attrib and v=attrib.values.where(value: "BugownerOnly").exists? - filter=["bugowner"] - end - end - if params[:devel] - devel=false if [ "0", "false" ].include? params[:devel] - else - if attrib and v=attrib.values.where(value: "DisableDevel").exists? - devel=false - end - end - - if obj.nil? - owners += find_containers_without_definition(project, devel, filter) - elsif obj.is_a? String - owners += find_assignees(project, obj, limit.to_i, devel, - filter, (true unless params[:webui_mode].blank?)) - else - owners += find_containers(project, obj, devel, filter) - end - - end - - return owners - end - -end - diff --git a/src/api/app/models/full_text_search.rb b/src/api/app/models/full_text_search.rb index 09115b6873d..cd33eb13f62 100644 --- a/src/api/app/models/full_text_search.rb +++ b/src/api/app/models/full_text_search.rb @@ -83,20 +83,4 @@ def find_issue_id nil end end - - def read_attribute_for_serialization(attrib) - if attrib.to_sym == :result - # Format expected by webui search controller - if @result.nil? - nil - else - @result.map {|r| {:type => r.class.model_name.to_s.downcase, - :data => r, :search_attributes => r.sphinx_attributes}} - end - elsif attrib.to_sym == :total_entries - @result.nil? ? nil : @result.total_entries - else - super - end - end end diff --git a/src/api/app/helpers/maintainership.rb b/src/api/app/models/owner.rb similarity index 60% rename from src/api/app/helpers/maintainership.rb rename to src/api/app/models/owner.rb index cf724267587..f57cc9d22cc 100644 --- a/src/api/app/helpers/maintainership.rb +++ b/src/api/app/models/owner.rb @@ -1,108 +1,148 @@ -module Maintainership +# -*- encoding: utf-8 i*- +require 'api_exception' - def extract_maintainer(rootproject, pkg, rolefilter, objfilter=nil) - return nil unless pkg - return nil unless Package.check_access?(pkg) - m = {} +class Owner - m[:rootproject] = rootproject.name - m[:project] = pkg.project.name - m[:package] = pkg.name - m[:filter] = rolefilter + class UnknownAttributeTypeError < APIException + setup 'unknown_attribute_type', 404 + end + class AttributeNotSetError < APIException + setup 'attribute_not_set', 400 + end - # no filter defined, so do not check for roles and just return container - return m if rolefilter.length == 0 + def self.attribute_names + [:rootproject, :project, :package, :filter, :users, :groups] + end - # construct where condition - sql = nil - if rolefilter.length > 0 - rolefilter.each do |rf| - if sql.nil? - sql = "( " - else - sql << " OR " - end - role = Role.find_by_title!(rf) - sql << "role_id = " << role.id.to_s - end - else - # match all roles - sql = "( 1 " + include ActiveModel::Model + attr_accessor *attribute_names + + def to_hash + # Sure it can be implemented in a less tricky way + Hash[*(Owner.attribute_names.map {|a| [a, send(a)] }.select {|a| !a.last.nil? }.flatten(1))] + end + + def self.search(params, obj) + params[:attribute] ||= "OBS:OwnerRootProject" + at = AttribType.find_by_name(params[:attribute]) + unless at + raise UnknownAttributeTypeError, "Attribute Type #{params[:attribute]} does not exist" end - sql << " )" - usersql = groupsql = sql - usersql = sql << " AND user_id = " << objfilter.id.to_s if objfilter.class == User - groupsql = sql << " AND group_id = " << objfilter.id.to_s if objfilter.class == Group - # lookup - pkg.relationships.users.where(usersql).each do |p| - m[:users] ||= {} - m[:users][p.role.title] ||= [] - m[:users][p.role.title] << p.user.login - end unless objfilter.class == Group + limit = params[:limit] || 1 - pkg.relationships.groups.where(groupsql).each do |p| - m[:groups] ||= {} - m[:groups][p.role.title] ||= [] - m[:groups][p.role.title] << p.group.title - end unless objfilter.class == User + projects = [] + if params[:project] + # default project specified + projects = [Project.get_by_name(params[:project])] + else + # Find all marked projects + projects = Project.find_by_attribute_type(at) + if projects.empty? + raise(AttributeNotSetError, + "The attribute type #{params[:attribute]} is not set on any projects. No default projects defined.") + end + end - # did it it match? if not fallback to project level - unless m[:users] or m[:groups] - m[:package] = nil - pkg.project.relationships.users.where(usersql).each do |p| - m[:users] ||= {} - m[:users][p.role.title] ||= [] - m[:users][p.role.title] << p.user.login - end unless objfilter.class == Group + # search in each marked project + owners = [] + projects.each do |project| + + attrib = project.attribs.where(attrib_type_id: at.id).first + filter = ["maintainer","bugowner"] + devel = true + if params[:filter] + filter=params[:filter].split(",") + else + if attrib and v=attrib.values.where(value: "BugownerOnly").exists? + filter=["bugowner"] + end + end + if params[:devel] + devel=false if [ "0", "false" ].include? params[:devel] + else + if attrib and v=attrib.values.where(value: "DisableDevel").exists? + devel=false + end + end + + if obj.nil? + owners += find_containers_without_definition(project, devel, filter) + elsif obj.is_a? String + owners += find_assignees(project, obj, limit.to_i, devel, + filter, (true unless params[:webui_mode].blank?)) + else + owners += find_containers(project, obj, devel, filter) + end - pkg.project.relationships.groups.where(groupsql).each do |p| - m[:groups] ||= {} - m[:groups][p.role.title] ||= [] - m[:groups][p.role.title] << p.group.title - end unless objfilter.class == User end - # still not matched? Ignore it - return nil unless m[:users] or m[:groups] - return m + return owners end - private :extract_maintainer + protected - def lookup_package_owner(rootproject, pkg, owner, limit, devel, filter, deepest, already_checked={}) - return nil, limit, already_checked if already_checked[pkg.id] + def self.find_assignees(rootproject, binary_name, limit=1, devel=true, filter=["maintainer","bugowner"], webui_mode=false) + projects=rootproject.expand_all_projects + instances_without_definition=[] + maintainers=[] + pkg=nil - # optional check for devel package instance first - m = nil - m = extract_maintainer(rootproject, pkg.resolve_devel_package, filter, owner) if devel == true - m = extract_maintainer(rootproject, pkg, filter, owner) unless m + match_all = (limit == 0) + deepest = (limit < 0) - already_checked[pkg.id] = 1 + # binary search via all projects + prjlist = projects.map { |p| "@project='#{CGI.escape(p.name)}'" } + path = "/search/published/binary/id?match=(@name='"+CGI.escape(binary_name)+"'" + path += "+and+(" + path += prjlist.join("+or+") + path += "))" + answer = Suse::Backend.post path, nil + data = Xmlhash.parse(answer.body) - # no match, loop about projects below with this package container name - unless m - pkg.project.expand_all_projects.each do |prj| - p = prj.packages.find_by_name(pkg.name ) - next if p.nil? or already_checked[p.id] - - already_checked[p.id] = 1 + # found binary package? + return [] if data["matches"].to_i == 0 - m = extract_maintainer(rootproject, p.resolve_devel_package, filter, owner) if devel == true - m = extract_maintainer(rootproject, p, filter, owner) unless m - if m - break unless deepest + already_checked = {} + deepest_match = nil + projects.each do |prj| # project link order + data.elements("binary").each do |b| # no order + next unless b["project"] == prj.name + + pkg = prj.packages.find_by_name( b["package"] ) + next if pkg.nil? + + # the "" means any matching relationships will get taken + m, limit, already_checked = lookup_package_owner(rootproject, pkg, "", limit, devel, filter, deepest, already_checked) + + unless m + # collect all no matched entries + m = Owner.new(rootproject: rootproject.name, project: pkg.project.name, package: pkg.name, filter: filter) + instances_without_definition << m + next end + + # remember as deepest candidate + if deepest == true + deepest_match = m + next + end + + # add matching entry + maintainers << m + limit = limit - 1 + return maintainers if limit < 1 and not match_all end end - # found entry - return m, (limit-1), already_checked - end + return instances_without_definition if webui_mode and maintainers.length < 1 - private :lookup_package_owner + maintainers << deepest_match if deepest_match - def find_containers_without_definition(rootproject, devel=true, filter=["maintainer","bugowner"] ) + return maintainers + end + + def self.find_containers_without_definition(rootproject, devel=true, filter=["maintainer","bugowner"] ) projects=rootproject.expand_all_projects roles=[] filter.each do |f| @@ -122,19 +162,19 @@ def find_containers_without_definition(rootproject, devel=true, filter=["maintai defined_packages.uniq! all_packages = Package.where("db_project_id in (?)", projects).pluck(:name) - - undefined_packages = all_packages - defined_packages + + undefined_packages = all_packages - defined_packages maintainers=[] undefined_packages.each do |p| next if p =~ /\A_product:\w[-+\w\.]*\z/ pkg = rootproject.find_package(p) - - m = {} - m[:rootproject] = rootproject.name - m[:project] = pkg.project.name - m[:package] = pkg.name + + m = Owner.new + m.rootproject = rootproject.name + m.project = pkg.project.name + m.package = pkg.name maintainers << m end @@ -142,7 +182,7 @@ def find_containers_without_definition(rootproject, devel=true, filter=["maintai return maintainers end - def find_containers(rootproject, owner, devel=true, filter=["maintainer","bugowner"] ) + def self.find_containers(rootproject, owner, devel=true, filter=["maintainer","bugowner"] ) projects=rootproject.expand_all_projects roles=[] @@ -175,73 +215,110 @@ def find_containers(rootproject, owner, devel=true, filter=["maintainer","bugown maintainers=[] Project.where(id: found_projects).pluck(:name).each do |prj| - maintainers << { :rootproject => rootproject.name, :project => prj } + maintainers << Owner.new(rootproject: rootproject.name, project: prj) end Package.where(id: found_packages).each do |pkg| - maintainers << { :rootproject => rootproject.name, :project => pkg.project.name, :package => pkg.name } + maintainers << Owner.new(rootproject: rootproject.name, project: pkg.project.name, package: pkg.name) end return maintainers end - def find_assignees(rootproject, binary_name, limit=1, devel=true, filter=["maintainer","bugowner"], webui_mode=false) - projects=rootproject.expand_all_projects - instances_without_definition=[] - maintainers=[] - pkg=nil - - match_all = (limit == 0) - deepest = (limit < 0) - - # binary search via all projects - prjlist = projects.map { |p| "@project='#{CGI.escape(p.name)}'" } - path = "/search/published/binary/id?match=(@name='"+CGI.escape(binary_name)+"'" - path += "+and+(" - path += prjlist.join("+or+") - path += "))" - answer = Suse::Backend.post path, nil - data = Xmlhash.parse(answer.body) + def self.lookup_package_owner(rootproject, pkg, owner, limit, devel, filter, deepest, already_checked={}) + return nil, limit, already_checked if already_checked[pkg.id] - # found binary package? - return [] if data["matches"].to_i == 0 + # optional check for devel package instance first + m = nil + m = extract_maintainer(rootproject, pkg.resolve_devel_package, filter, owner) if devel == true + m = extract_maintainer(rootproject, pkg, filter, owner) unless m - already_checked = {} - deepest_match = nil - projects.each do |prj| # project link order - data.elements("binary").each do |b| # no order - next unless b["project"] == prj.name + already_checked[pkg.id] = 1 - pkg = prj.packages.find_by_name( b["package"] ) - next if pkg.nil? + # no match, loop about projects below with this package container name + unless m + pkg.project.expand_all_projects.each do |prj| + p = prj.packages.find_by_name(pkg.name ) + next if p.nil? or already_checked[p.id] - # the "" means any matching relationships will get taken - m, limit, already_checked = lookup_package_owner(rootproject, pkg, "", limit, devel, filter, deepest, already_checked) + already_checked[p.id] = 1 - unless m - # collect all no matched entries - m = { :rootproject => rootproject.name, :project => pkg.project.name, :package => pkg.name, :filter => filter } - instances_without_definition << m - next + m = extract_maintainer(rootproject, p.resolve_devel_package, filter, owner) if devel == true + m = extract_maintainer(rootproject, p, filter, owner) unless m + if m + break unless deepest end + end + end - # remember as deepest candidate - if deepest == true - deepest_match = m - next - end + # found entry + return m, (limit-1), already_checked + end - # add matching entry - maintainers << m - limit = limit - 1 - return maintainers if limit < 1 and not match_all + def self.extract_maintainer(rootproject, pkg, rolefilter, objfilter=nil) + return nil unless pkg + return nil unless Package.check_access?(pkg) + m = Owner.new + + m.rootproject = rootproject.name + m.project = pkg.project.name + m.package = pkg.name + m.filter = rolefilter + + # no filter defined, so do not check for roles and just return container + return m if rolefilter.empty? + + # construct where condition + sql = nil + if rolefilter.length > 0 + rolefilter.each do |rf| + if sql.nil? + sql = "( " + else + sql << " OR " + end + role = Role.find_by_title!(rf) + sql << "role_id = " << role.id.to_s end + else + # match all roles + sql = "( 1 " end + sql << " )" + usersql = groupsql = sql + usersql = sql << " AND user_id = " << objfilter.id.to_s if objfilter.class == User + groupsql = sql << " AND group_id = " << objfilter.id.to_s if objfilter.class == Group - return instances_without_definition if webui_mode and maintainers.length < 1 + # lookup + pkg.relationships.users.where(usersql).each do |p| + m.users ||= {} + m.users[p.role.title] ||= [] + m.users[p.role.title] << p.user.login + end unless objfilter.class == Group - maintainers << deepest_match if deepest_match + pkg.relationships.groups.where(groupsql).each do |p| + m.groups ||= {} + m.groups[p.role.title] ||= [] + m.groups[p.role.title] << p.group.title + end unless objfilter.class == User - return maintainers - end + # did it it match? if not fallback to project level + unless m.users or m.groups + m.package = nil + pkg.project.relationships.users.where(usersql).each do |p| + m.users ||= {} + m.users[p.role.title] ||= [] + m.users[p.role.title] << p.user.login + end unless objfilter.class == Group + pkg.project.relationships.groups.where(groupsql).each do |p| + m.groups ||= {} + m.groups[p.role.title] ||= [] + m.groups[p.role.title] << p.group.title + end unless objfilter.class == User + end + # still not matched? Ignore it + return nil unless m.users or m.groups + + return m + end end diff --git a/src/api/config/routes.rb b/src/api/config/routes.rb index 022f022fe4e..fb7a6e5b79e 100644 --- a/src/api/config/routes.rb +++ b/src/api/config/routes.rb @@ -355,8 +355,6 @@ get :by_class end end - resources :owners, :only => [:index] - resources :searches, :only => [:new, :create] # comments get 'comments/request/:id/' => 'comments#requests', constraints: cons diff --git a/src/api/test/functional/webui/search_controller_test.rb b/src/api/test/functional/webui/search_controller_test.rb index c2e73a6c1e1..4855a0a5f67 100644 --- a/src/api/test/functional/webui/search_controller_test.rb +++ b/src/api/test/functional/webui/search_controller_test.rb @@ -106,7 +106,7 @@ def search_results fill_in 'search', with: 'basedistro3' page.evaluate_script("$('#global-search-form').get(0).submit()") validate_search_page - page.must_have_text(/Base.* distro without update project/) + page.must_have_text(/Base.* distro without update/) end test "search_by_baseurl" do diff --git a/src/api/webui/app/controllers/webui/search_controller.rb b/src/api/webui/app/controllers/webui/search_controller.rb index f4652d256bd..5c1d46df26c 100644 --- a/src/api/webui/app/controllers/webui/search_controller.rb +++ b/src/api/webui/app/controllers/webui/search_controller.rb @@ -9,6 +9,8 @@ def index end def owner + Suse::Backend.start_test_backend if Rails.env.test? + # If the search is too short, return return if @search_text.blank? if @search_text and @search_text.length < 2 @@ -16,45 +18,8 @@ def owner return end - r = [] - collection = find_cached(Owner, :binary => "#{@search_text}", :limit => "#{@owner_limit}", :devel => "#{@owner_devel}", :expires_in => 5.minutes) - collection.send("each_owner") do |result| - users = [] - groups = [] - if result.to_hash['person'] - if result.to_hash['person'].class != Array - blah = [] - blah << result.to_hash['person'] - users = blah - else - result.to_hash['person'].each do |p| - users << p - end - end - end - if result.to_hash['group'] - if result.to_hash['group'].class != Array - blah = [] - blah << result.to_hash['group'] - groups = blah - else - result.to_hash['group'].each do |g| - groups << g - end - end - end - project = find_cached(WebuiProject, result.project) - if result.package - package = find_cached(Package, result.package, :project => project) - end - r << {:type => "owner", :data => result, - :users => users, :groups => groups, - :project => project, :package => package} - end - @results.concat(r) - @per_page = nil - - validate_result + @results = Owner.search({:limit => "#{@owner_limit}", :devel => "#{@owner_devel}"}, @search_text) + flash[:notice] = 'Your search did not return any results.' if @results.count < 1 end # The search method does the search and renders the results @@ -93,18 +58,14 @@ def search end @per_page = 20 - search = Webui::ApiDetails.create(:searches, :page => params[:page], :per_page => @per_page, :search => { - text: @search_text, - classes: @search_what, - attrib_type_id: @search_attrib_type_id, - fields: @search_where, - issue_name: @search_issue, - issue_tracker_name: @search_tracker}) - @results = search["result"].map {|i| i.symbolize_keys} - @results = Kaminari.paginate_array(@results, total_count: search["total_entries"]) - @results = @results.page(params[:page]).per(@per_page) - - validate_result + search = FullTextSearch.new(text: @search_text, + classes: @search_what, + attrib_type_id: @search_attrib_type_id, + fields: @search_where, + issue_name: @search_issue, + issue_tracker_name: @search_tracker) + @results = search.search(:page => params[:page], :per_page => @per_page) + flash[:notice] = 'Your search did not return any results.' if @results.count < 1 end # This method handles obs:// disturls @@ -147,8 +108,6 @@ def handle_disturl(disturl) # - @results -> An empty array for the results # def set_parameters - @results = [] - @search_attrib_type_id = nil @search_attrib_type_id = params[:attrib_type_id] unless params[:attrib_type_id].blank? @@ -190,24 +149,9 @@ def set_attribute_list end def set_tracker_list - trackers = find_cached(Webui::IssueTracker, :all) - @issue_tracker_list = [] - @default_tracker = 'bnc' - trackers.each('/issue-trackers/issue-tracker') do |t| - @issue_tracker_list << ["#{t.name.text} (#{t.description.text})", t.name.text] - end - @issue_tracker_list.sort_by! {|a| a.first.downcase } - end - - def validate_result - logger.debug "Found #{@results.length} search results: #{@results.inspect}" - if @results.length < 1 - flash[:notice] = 'Your search did not return any results.' - end - if @results.length > 200 - @results = @results[0..199] - flash[:notice] = 'Your search returned more than 200 results. Please be more precise.' + @issue_tracker_list = ::IssueTracker.order(:name).map do |t| + ["#{t.name} (#{t.description})", t.name] end + @default_tracker = 'bnc' end - end diff --git a/src/api/webui/app/helpers/webui/search_helper.rb b/src/api/webui/app/helpers/webui/search_helper.rb index 79868a97929..671fdfd57fa 100644 --- a/src/api/webui/app/helpers/webui/search_helper.rb +++ b/src/api/webui/app/helpers/webui/search_helper.rb @@ -1,18 +1,14 @@ module Webui::SearchHelper - def description_text(obj) - desc = nil - if obj.respond_to?(:has_element?) && obj.has_element?("description") - desc = obj.description.to_s - elsif obj.respond_to?(:has_key?) && obj.has_key?("description") - desc = obj["description"].to_s - else - return nil - end - if desc.empty? - nil - else - desc[0,80] + "..." + # @param [Hash] users a hash with roles as keys and an array of logins as + # value. That is {"roletitle1" => ["login1", "login2"]} + def search_users_list(users) + return "" if users.nil? || users.empty? + output = [] + users.each do |role, logins| + output += logins.map {|user| user_and_role(user, role)} end + output.join("
").html_safe end + end diff --git a/src/api/webui/app/helpers/webui/webui_helper.rb b/src/api/webui/app/helpers/webui/webui_helper.rb index a93465f8c80..7ed9fb5854a 100644 --- a/src/api/webui/app/helpers/webui/webui_helper.rb +++ b/src/api/webui/app/helpers/webui/webui_helper.rb @@ -409,6 +409,31 @@ def render_dialog(dialog_init = nil) render partial: 'dialog', content_type: 'application/javascript' end + # @param [String] user login of the user + # @param [String] role title of the login + # @param [Hash] options boolean flags :short, :no_icon and :no_link + def user_and_role(user, role=nil, options = {}) + opt = {short: false, no_icon: false, no_link: false}.merge(options) + realname = User.realname_for_login(user) + output = "" + + output += user_icon(user) unless opt[:no_icon] + unless realname.empty? or opt[:short] == true + printed_name = realname + ' (' + user + ')' + else + printed_name = user + end + if role + printed_name += " as " + role + end + if logged_in? + output += link_to_if(!opt[:no_link], printed_name, :controller => 'home', :user => user) + else + output += printed_name + end + output.html_safe + end + end end diff --git a/src/api/webui/app/models/webui/api_details.rb b/src/api/webui/app/models/webui/api_details.rb index 8019e00b6b1..45ba95945ee 100644 --- a/src/api/webui/app/models/webui/api_details.rb +++ b/src/api/webui/app/models/webui/api_details.rb @@ -70,8 +70,6 @@ def self.http_do(verb, route_name, *args) when :ids_requests then "requests/ids" when :by_class_requests then "requests/by_class" - when :searches then "searches" - when :comments_by_package then "comments/package/#{ids.first}/#{ids.last}" when :comments_by_project then "comments/project/#{ids.first}" when :comments_by_request then "comments/request/#{ids.first}" diff --git a/src/api/webui/app/models/webui/owner.rb b/src/api/webui/app/models/webui/owner.rb deleted file mode 100644 index 5cd394a17bd..00000000000 --- a/src/api/webui/app/models/webui/owner.rb +++ /dev/null @@ -1,2 +0,0 @@ -class Webui::Owner < Webui::Node -end diff --git a/src/api/webui/app/views/shared/_user_and_role_with_realname_and_icon.html.erb b/src/api/webui/app/views/shared/_user_and_role_with_realname_and_icon.html.erb index c7c46b7b937..1f1b14b6366 100644 --- a/src/api/webui/app/views/shared/_user_and_role_with_realname_and_icon.html.erb +++ b/src/api/webui/app/views/shared/_user_and_role_with_realname_and_icon.html.erb @@ -1,22 +1 @@ -<% short ||= false %> -<% no_icon ||= false %> -<% no_link ||= false %> -<% realname = User.realname_for_login(user) %> - -<% unless no_icon %> - <%= user_icon(user) %> -<% end %> - -<% unless realname.empty? or short == true %> - <% printed_name = realname + ' (' + user + ')' %> -<% else %> - <% printed_name = user %> -<% end %> -<% if role %> - <% printed_name += " as " + role %> -<% end %> -<% if @user %> - <%= link_to_if(!no_link, printed_name, :controller => 'home', :user => user) %> -<% else %> - <%= printed_name %> -<% end %> +<%= user_and_role(user, role, short: short, no_icon: no_icon, no_link: no_link) %> diff --git a/src/api/webui/app/views/webui/search/_owners.html.erb b/src/api/webui/app/views/webui/search/_owners.html.erb new file mode 100644 index 00000000000..9eecbaec564 --- /dev/null +++ b/src/api/webui/app/views/webui/search/_owners.html.erb @@ -0,0 +1,18 @@ +
+<% @results.each do |result| %> +
+
+ Responsible for package + <%= params['search_text'] %> + for <%= result.rootproject %> set in + <%= render :partial => 'shared/project_or_package_link', :locals => {:project => result.project, :package => result.package, :short => false} %> +
+

+ <%= search_users_list(result.users) %> + <%# Does it work with group names? %> + <%= search_users_list(result.groups) %> +

+
+<% end %> + +
diff --git a/src/api/webui/app/views/webui/search/_results.html.erb b/src/api/webui/app/views/webui/search/_results.html.erb index 81885389cba..7b3b73bbace 100644 --- a/src/api/webui/app/views/webui/search/_results.html.erb +++ b/src/api/webui/app/views/webui/search/_results.html.erb @@ -1,64 +1,39 @@ -<% unless @results.nil? || @results.length < 1 %> -
- <% @results.each do |result| %> - <% if %w(project package).include? result[:type] %> - <% rtype = result[:type] %> - <% project = rtype == "project" ? result[:data]["name"] : result[:data]["project_name"] %> - <% package = rtype == "project" ? nil : result[:data]["name"] %> -
+
+ <% + @results.each do |result| + if result.kind_of? Project + project = result.name + package = nil + rtype = "project" + else + project = result.project_name + package = result.name + rtype = "package" + end + %> +
<%= sprite_tag(rtype, class: rtype, title: rtype.humanize) %> <%= render :partial => 'shared/project_or_package_link', :locals => {:project => project, - :package => package, + :package => package, :short => false} %> - <%= content_tag :span, result[:search_attributes], style: "display:none" %> + <%= content_tag :span, result.sphinx_attributes, style: "display:none" %>
- <% elsif result[:type] == 'owner' %> -
-
- Responsible for package - <%= params['search_text'] %> - for <%= result[:data].rootproject %> set in - <%= render :partial => 'shared/project_or_package_link', :locals => {:project => result[:data].project, :package => result[:data].package, :short => false} %> -
-

- <% if result[:users] %> - <% result[:users].each do |u| %> - <%= render :partial => 'shared/user_and_role_with_realname_and_icon', :locals => {:user => u['name'], :role => u['role'] }%> - <% if result[:users].length > 1 %> -
- <% end %> - <% end %> - <% end %> - <% if result[:groups] %> - <% result[:groups].each do |g| %> - <%= render :partial => 'shared/user_and_role_with_realname_and_icon', :locals => {:user => g['name'], :role => g['role'] }%> - <% if result[:groups].length > 1 %> -
- <% end %> - <% end %> - <% end %> -

- <% end %> - <% descr = description_text(result[:data]) - if descr %> -

- <% descr.split(/\n/).each do |line| -%> - <%= highlight(line, @search_text, highlighter: '\1') %> + <% if result.description.empty? %> +

...

+ <% else %> + <% desc = truncate(result.description, lenght: 80) %> +

+ <% desc.split(/\n/).each do |line| -%> + <%= highlight(line, @search_text, highlighter: '\1') %> + <% end %> +

<% end %> -

- <% else %> -

- ... -

- <% end %> -
<% end %> <% if @per_page %> <%= paginate @results %> <% end %> -
-<% end %> +
diff --git a/src/api/webui/app/views/webui/search/index.html.erb b/src/api/webui/app/views/webui/search/index.html.erb index a026c7089c3..13a3c025631 100644 --- a/src/api/webui/app/views/webui/search/index.html.erb +++ b/src/api/webui/app/views/webui/search/index.html.erb @@ -82,6 +82,8 @@
<% end %>
-<%= render :partial => 'results' %> +<% unless @results.nil? || @results.length < 1 %> + <%= render :partial => 'results' %> +<% end %> diff --git a/src/api/webui/app/views/webui/search/owner.html.erb b/src/api/webui/app/views/webui/search/owner.html.erb index 312de70d427..c60e90ed158 100644 --- a/src/api/webui/app/views/webui/search/owner.html.erb +++ b/src/api/webui/app/views/webui/search/owner.html.erb @@ -79,13 +79,14 @@ <% end %> -<%= render :partial => 'results' %> <% unless @results.nil? || @results.length < 1 %> + <%= render :partial => 'owners' %> +
<% projects = [] %> <% @results.each do |result| %> - <% link = Hash["project", result[:data].project, "package", result[:data].package ] %> + <% link = Hash["project", result.project, "package", result.package ] %> <% projects << link %> <% end %>