Skip to content

Commit

Permalink
[webui] Refactor the Project autocomplete functions
Browse files Browse the repository at this point in the history
fixes #927
  • Loading branch information
Moisés Déniz Alemán committed Aug 4, 2015
1 parent e6deaa7 commit 511a511
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 60 deletions.
74 changes: 19 additions & 55 deletions src/api/app/controllers/webui/project_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,16 @@ class Webui::ProjectController < Webui::WebuiController

helper 'webui/comment'

before_filter :require_project, :except => [:autocomplete_projects, :autocomplete_incidents,
:clear_failed_comment, :edit_comment_form, :index,
:list, :list_all, :list_simple,
:list_public, :new, :package_buildresult,
:save_new, :save_prjconf,
:rebuild_time_png, :new_incident]
before_filter :set_project, only: [:autocomplete_packages, :autocomplete_repositories]
# This is the deprecated way of loading WebuiProject
# FIXME: Get rid of "except" clauses, use "only" instead
before_filter :require_project, except: [:autocomplete_projects, :autocomplete_incidents,
:autocomplete_packages, :autocomplete_repositories,
:clear_failed_comment, :edit_comment_form, :index,
:list, :list_all, :list_simple,
:list_public, :new, :package_buildresult,
:save_new, :save_prjconf,
:rebuild_time_png, :new_incident]
before_filter :load_project_info, :only => [:show, :packages_simple]
before_filter :require_login, :only => [:save_new, :toggle_watch, :delete, :new]
before_filter :require_available_architectures, :only => [:add_repository, :add_repository_from_default_list,
Expand Down Expand Up @@ -89,64 +93,20 @@ def list_simple
end

def autocomplete_projects
required_parameters :term
get_filtered_projectlist params[:term], ''
render json: @projects
render json: Project.autocomplete(params[:term]).not_maintenance_incident.order(:name).pluck(:name)
end

def autocomplete_incidents
required_parameters :term
get_filtered_projectlist params[:term], '', :only_incidents => true
render json: @projects
render json: Project.autocomplete(params[:term]).maintenance_incident.order(:name).pluck(:name)
end

def autocomplete_packages
required_parameters :term
if Package.valid_name?( params[:term] ) or params[:term] == ''
packages=Package.arel_table
render json: @project.api_obj.packages.where(packages[:name].matches("#{params[:term]}%")).limit(100).pluck(:name)
else
render text: '[]'
end
render json: @project.packages.autocomplete(params[:term]).pluck(:name)
end

def autocomplete_repositories
render json: @project.repositories
end

def project_key(a)
a = a.downcase

if a[0..4] == 'home:'
a = 'zz' + a
end
return a
end
private :project_key

def get_filtered_projectlist(filterstring, excludefilter='', opts={})
opts = {:only_incidents => false}.merge(opts)
# remove illegal xpath characters
filterstring.gsub!(/[\[\]\n]/, '')
filterstring.gsub!(/[']/, '&apos;')
filterstring.gsub!(/["]/, '&quot;')
rel = Project.all
projects=Project.arel_table
unless filterstring.blank?
rel = rel.where(projects[:name].matches("#{filterstring}%"))
end
unless excludefilter.blank?
rel = rel.where.not(projects[:name].matches("#{excludefilter}%"))
end
if opts[:only_incidents]
rel = rel.where(kind: 'maintenance_incident')
else
rel = rel.where.not(kind: 'maintenance_incident')
end
@projects = rel.pluck(:name)
@projects = @projects.sort_by { |a| project_key a }
render json: @project.repositories.pluck(:name)
end
private :get_filtered_projectlist

def users
@users = @project.users
Expand Down Expand Up @@ -926,7 +886,7 @@ def monitor
fill_status_cache

load_local_packages

@packagenames = @packagenames.flatten.uniq.sort

## Filter for PackageNames ####
Expand Down Expand Up @@ -1519,4 +1479,8 @@ def move_path(direction)
flash[:success] = "Path #{params['path_project']}/#{params['path_repository']} moved successfully"
redirect_to :action => :repositories, :project => @project
end

def set_project
@project = Project.find_by(name: params[:project])
end
end
30 changes: 25 additions & 5 deletions src/api/app/models/project.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,11 @@ class ForbiddenError < APIException
after_rollback 'Relationship.discard_cache'
after_initialize :init

has_many :packages, :dependent => :destroy, inverse_of: :project
has_many :packages, :dependent => :destroy, inverse_of: :project do
def autocomplete(search)
where(['lower(packages.name) like lower(?)',"#{search}%"])
end
end
has_many :attribs, :dependent => :destroy
has_many :repositories, :dependent => :destroy, foreign_key: :db_project_id
has_many :messages, :as => :db_object, :dependent => :delete_all
Expand Down Expand Up @@ -76,6 +80,13 @@ class ForbiddenError < APIException

default_scope { where('projects.id not in (?)', Relationship.forbidden_project_ids ) }

scope :maintenance, -> { where("kind = 'maintenance'") }
scope :not_maintenance_incident, -> { where("kind <> 'maintenance_incident'") }
scope :maintenance_incident, -> { where("kind = 'maintenance_incident'") }
scope :maintenance_release, -> { where("kind = 'maintenance_release'") }
scope :home, -> { where("name like 'home:%'") }
scope :not_home, -> { where.not("name like 'home:%'") }

validates :name, presence: true, length: { maximum: 200 }, uniqueness: true
validates :title, length: { maximum: 250 }
validate :valid_name
Expand All @@ -88,6 +99,15 @@ def init
self.kind ||= 'standard' if self.has_attribute? :kind
end

def self.autocomplete(search)
projects = Project.where(["lower(name) like lower(?)", "#{search}%"])
if search.to_s.match(/home:./)
projects.home
else
projects.not_home
end
end

def self.deleted_instance
Project.create_with(title: 'Place holder for a deleted project instance').
find_or_create_by(name: 'deleted')
Expand Down Expand Up @@ -409,7 +429,7 @@ def can_be_deleted?
raise DeleteError.new 'This maintenance project has incident projects and can therefore not be deleted.'
end
end

end

def update_from_xml(xmlhash, force=nil)
Expand Down Expand Up @@ -728,7 +748,7 @@ def write_to_backend
# expire cache
reset_cache
@commit_opts ||= {}

if CONFIG['global_write_through'] && !@commit_opts[:no_backend_write]
login = @commit_opts[:login] || User.current.login
query = { user: login }
Expand Down Expand Up @@ -830,7 +850,7 @@ def flag_status(default, repo, arch, prj_flags, pkg_flags)
# give out the XML for all repos/arch combos
def expand_flags(pkg = nil)
ret = Hash.new

repos = repositories.not_remote

FlagHelper.flag_types.each do |flag_name|
Expand Down Expand Up @@ -1256,7 +1276,7 @@ def self.valid_name?(name)
return false unless name.kind_of? String
# this length check is duplicated but useful for other uses for this function
return false if name.length > 200 || name.blank?
return false if name =~ %r{^[_\.]}
return false if name =~ %r{^[_\.]}
return false if name =~ %r{::}
return false if name.end_with?(':')
return true if name =~ /\A\w[-+\w\.:]*\z/
Expand Down

0 comments on commit 511a511

Please sign in to comment.