user:owns in item search
This commit is contained in:
parent
eac0d327f9
commit
884ad2d5b8
3 changed files with 34 additions and 10 deletions
|
@ -10,7 +10,7 @@ class ItemsController < ApplicationController
|
||||||
else
|
else
|
||||||
per_page = nil
|
per_page = nil
|
||||||
end
|
end
|
||||||
@items = Item.search(@query).alphabetize.paginate :page => params[:page], :per_page => per_page
|
@items = Item.search(@query, current_user).alphabetize.paginate :page => params[:page], :per_page => per_page
|
||||||
assign_closeted!
|
assign_closeted!
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html { render }
|
format.html { render }
|
||||||
|
|
|
@ -43,6 +43,8 @@ class Item < ActiveRecord::Base
|
||||||
|
|
||||||
scope :sitemap, select([:id, :name]).order(:id).limit(49999)
|
scope :sitemap, select([:id, :name]).order(:id).limit(49999)
|
||||||
|
|
||||||
|
scope :with_closet_hangers, joins(:closet_hangers)
|
||||||
|
|
||||||
def closeted?
|
def closeted?
|
||||||
!!@closeted
|
!!@closeted
|
||||||
end
|
end
|
||||||
|
@ -118,7 +120,7 @@ class Item < ActiveRecord::Base
|
||||||
@supported_species ||= species_support_ids.blank? ? Species.all : species_support_ids.sort.map { |id| Species.find(id) }
|
@supported_species ||= species_support_ids.blank? ? Species.all : species_support_ids.sort.map { |id| Species.find(id) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.search(query)
|
def self.search(query, user=nil)
|
||||||
raise SearchError, "Please provide a search query" unless query
|
raise SearchError, "Please provide a search query" unless query
|
||||||
query = query.strip
|
query = query.strip
|
||||||
raise SearchError, "Search queries should be at least 3 characters" if query.length < 3
|
raise SearchError, "Search queries should be at least 3 characters" if query.length < 3
|
||||||
|
@ -146,7 +148,7 @@ class Item < ActiveRecord::Base
|
||||||
limited_filters_used << condition.filter
|
limited_filters_used << condition.filter
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
condition.narrow(scope)
|
condition.narrow(scope, user)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -616,6 +618,7 @@ class Item < ActiveRecord::Base
|
||||||
name = name.to_s
|
name = name.to_s
|
||||||
SearchFilterScopes << name
|
SearchFilterScopes << name
|
||||||
LimitedSearchFilters << name if options[:limit]
|
LimitedSearchFilters << name if options[:limit]
|
||||||
|
|
||||||
(class << self; self; end).instance_eval do
|
(class << self; self; end).instance_eval do
|
||||||
if options[:full]
|
if options[:full]
|
||||||
define_method "search_filter_#{name}", &options[:full]
|
define_method "search_filter_#{name}", &options[:full]
|
||||||
|
@ -633,9 +636,9 @@ class Item < ActiveRecord::Base
|
||||||
search_filter name, options, &block
|
search_filter name, options, &block
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.search_filter_block(options, positive)
|
def self.search_filter_block(options, positive, &block)
|
||||||
Proc.new { |str, scope|
|
Proc.new { |str, user, scope|
|
||||||
condition = yield(str)
|
condition = block.arity == 1 ? block.call(str) : block.call(str, user)
|
||||||
condition = "!(#{condition.to_sql})" unless positive
|
condition = "!(#{condition.to_sql})" unless positive
|
||||||
scope = scope.send(options[:scope]) if options[:scope]
|
scope = scope.send(options[:scope]) if options[:scope]
|
||||||
scope.where(condition)
|
scope.where(condition)
|
||||||
|
@ -664,6 +667,27 @@ class Item < ActiveRecord::Base
|
||||||
filter
|
filter
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.validate_user_condition(adjective, user)
|
||||||
|
unless adjective == "owns"
|
||||||
|
raise SearchError, "We don't understand user:#{adjective}. " +
|
||||||
|
"Did you mean user:owns?"
|
||||||
|
end
|
||||||
|
|
||||||
|
unless user
|
||||||
|
raise SearchError, "It looks like you're not logged in, so you don't own any items."
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
single_search_filter :user, :full => lambda { |adjective, user, scope|
|
||||||
|
validate_user_condition(adjective, user)
|
||||||
|
scope.joins(:closet_hangers).where(ClosetHanger.arel_table[:user_id].eq(user.id))
|
||||||
|
}
|
||||||
|
|
||||||
|
single_search_filter :not_user do |adjective, user|
|
||||||
|
validate_user_condition(adjective, user)
|
||||||
|
arel_table[:id].not_in(user.closeted_items.map(&:id))
|
||||||
|
end
|
||||||
|
|
||||||
search_filter :only do |species_name|
|
search_filter :only do |species_name|
|
||||||
begin
|
begin
|
||||||
id = Species.require_by_name(species_name).id
|
id = Species.require_by_name(species_name).id
|
||||||
|
@ -694,7 +718,7 @@ class Item < ActiveRecord::Base
|
||||||
SwfAsset.arel_table[:zone_id].in(zone_set.map(&:id))
|
SwfAsset.arel_table[:zone_id].in(zone_set.map(&:id))
|
||||||
end
|
end
|
||||||
|
|
||||||
single_search_filter :not_type, :full => lambda { |zone_set_name, scope|
|
single_search_filter :not_type, :full => lambda { |zone_set_name, user, scope|
|
||||||
zone_set = Zone::ItemZoneSets[zone_set_name]
|
zone_set = Zone::ItemZoneSets[zone_set_name]
|
||||||
raise SearchError, "Type \"#{zone_set_name}\" does not exist" unless zone_set
|
raise SearchError, "Type \"#{zone_set_name}\" does not exist" unless zone_set
|
||||||
psa = ParentSwfAssetRelationship.arel_table.alias
|
psa = ParentSwfAssetRelationship.arel_table.alias
|
||||||
|
@ -742,10 +766,10 @@ class Item < ActiveRecord::Base
|
||||||
@positive = !@positive
|
@positive = !@positive
|
||||||
end
|
end
|
||||||
|
|
||||||
def narrow(scope)
|
def narrow(scope, user)
|
||||||
if SearchFilterScopes.include?(filter)
|
if SearchFilterScopes.include?(filter)
|
||||||
polarized_filter = @positive ? filter : "not_#{filter}"
|
polarized_filter = @positive ? filter : "not_#{filter}"
|
||||||
Item.send("search_filter_#{polarized_filter}", self, scope)
|
Item.send("search_filter_#{polarized_filter}", self, user, scope)
|
||||||
else
|
else
|
||||||
raise SearchError, "Filter #{filter} does not exist"
|
raise SearchError, "Filter #{filter} does not exist"
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
- content_for :before_flashes do
|
- content_for :before_flashes do
|
||||||
= link_to "Import closet from Neopets", new_closet_page_path, :id => 'import-link'
|
= link_to "Import closet from Neopets", new_closet_page_path, :id => 'import-link'
|
||||||
= form_tag items_path, :method => :get, :id => 'closet-hangers-items-search', 'data-current-user-id' => current_user.id do
|
= form_tag items_path, :method => :get, :id => 'closet-hangers-items-search', 'data-current-user-id' => current_user.id do
|
||||||
= search_field_tag :q, nil, :placeholder => "Search items"
|
= search_field_tag :q, nil, :placeholder => "Find items to add"
|
||||||
= submit_tag 'Search', :name => nil
|
= submit_tag 'Search', :name => nil
|
||||||
- else
|
- else
|
||||||
- title "#{@user.name}'s Items"
|
- title "#{@user.name}'s Items"
|
||||||
|
|
Loading…
Reference in a new issue