From 1bbebba9a9451135d0421c4dfcf958447373059e Mon Sep 17 00:00:00 2001 From: AntonioTerceiro Date: Tue, 8 Jul 2008 20:26:43 +0000 Subject: [PATCH] ActionItem485: listing upcoming events --- app/controllers/public/search_controller.rb | 14 +++++++++----- app/models/category_finder.rb | 24 ++++++++++++++++++++---- app/models/environment_finder.rb | 8 +++++++- test/functional/search_controller_test.rb | 44 ++++++++++++++++++++++++++++++++++++++++++++ test/unit/category_finder_test.rb | 28 ++++++++++++++++++++++++++++ 5 files changed, 108 insertions(+), 10 deletions(-) diff --git a/app/controllers/public/search_controller.rb b/app/controllers/public/search_controller.rb index a9839f6..d3b38cc 100644 --- a/app/controllers/public/search_controller.rb +++ b/app/controllers/public/search_controller.rb @@ -89,24 +89,28 @@ class SearchController < ApplicationController def load_product_categories_menu(asset) @results[asset].uniq! @categories_menu = ProductCategory.menu_categories(@product_category, environment).map do |cat| - hits = @finder.count(asset, @filtered_query, calculate_find_options(asset, nil, nil, cat, @region, params[:radius])) + hits = @finder.count(asset, @filtered_query, calculate_find_options(asset, nil, nil, cat, @region, params[:radius], nil, nil)) childs = [] # REFACTOR DUPLICATED CODE inner loop doing the same thing that outter loop childs = cat.children.map do |child| - child_hits = @finder.count(asset, @filtered_query, calculate_find_options(asset, nil, nil, child, @region, params[:radius])) + child_hits = @finder.count(asset, @filtered_query, calculate_find_options(asset, nil, nil, child, @region, params[:radius], nil, nil)) [child, child_hits] end.select{|child, child_hits| child_hits > 0 } [cat, hits, childs] end.select{|cat, hits| hits > 0 } end - def calculate_find_options(asset, limit, page, product_category, region, radius) + def calculate_find_options(asset, limit, page, product_category, region, radius, year, month) result = { :product_category => product_category, :per_page => limit, :page => page } if [:enterprises, :people].include?(asset) && region result.merge!(:within => radius, :region => region.id) end + if month || year + result[:date_range] = Event.date_range(year, month) + end + result end @@ -154,7 +158,7 @@ class SearchController < ApplicationController SEARCH_IN.select { |key,description| @searching[key] }.each do |key, description| @order << key - @results[key] = @finder.find(key, @filtered_query, calculate_find_options(key, limit, params[:page], @product_category, @region, params[:radius])) + @results[key] = @finder.find(key, @filtered_query, calculate_find_options(key, limit, params[:page], @product_category, @region, params[:radius], params[:year], params[:month])) @names[key] = gettext(description) end @@ -184,7 +188,7 @@ class SearchController < ApplicationController [ :people, _('Newer people'), @finder.recent('people', limit) ], [ :enterprises, _('Newer enterprises'), @finder.recent('enterprises', limit) ], [ :products, ('Newer products'), @finder.recent('products', limit) ], - [ :events, _('Near events TODO'), @finder.current_events(params[:year], params[:month], {:per_page => limit}) ], + [ :events, _('Upcoming events'), @finder.upcoming_events({:per_page => limit}) ], [ :communities, _('Newer communities'), @finder.recent('communities', limit) ], [ :articles, _('Newer articles'), @finder.recent('articles', limit) ], [ :most_commented_articles, _('Most commented articles'), @finder.most_commented_articles(limit) ] diff --git a/app/models/category_finder.rb b/app/models/category_finder.rb index a5291b5..b40ff43 100644 --- a/app/models/category_finder.rb +++ b/app/models/category_finder.rb @@ -15,12 +15,14 @@ class CategoryFinder options.delete(:within) end + date_range = options.delete(:date_range) + options = {:page => 1, :per_page => options.delete(:limit)}.merge(options) if query.blank? - asset_class(asset).paginate(:all, options_for_find(asset_class(asset), {:order => "created_at desc, #{asset_table(asset)}.id desc"}.merge(options))) + asset_class(asset).paginate(:all, options_for_find(asset_class(asset), {:order => "created_at desc, #{asset_table(asset)}.id desc"}.merge(options), date_range)) else ferret_options = {:page => options.delete(:page), :per_page => options.delete(:per_page)} - asset_class(asset).find_by_contents(query, ferret_options, options_for_find(asset_class(asset), options)) + asset_class(asset).find_by_contents(query, ferret_options, options_for_find(asset_class(asset), options, date_range)) end end @@ -46,9 +48,15 @@ class CategoryFinder Event.paginate(:all, {:include => :categories, :conditions => { 'categories.id' => category_id, :start_date => range }}.merge(options)) end + def upcoming_events(options = {}) + options = { :page => 1}.merge(options) + + Event.paginate(:all, {:include => :categories, :conditions => [ 'categories.id = ? and start_date >= ?', category_id, Date.today ], :order => :start_date }.merge(options)) + end + protected - def options_for_find(klass, options={}) + def options_for_find(klass, options={}, date_range = nil) if defined? options[:product_category] prod_cat = options.delete(:product_category) # FIXME this is SLOOOOW @@ -64,8 +72,16 @@ class CategoryFinder else {:joins => 'inner join categories_profiles on products.enterprise_id = categories_profiles.profile_id', :conditions => ['categories_profiles.category_id = (?)', category_id]}.merge!(options) end - when 'Article', 'Event' + when 'Article' {:joins => 'inner join articles_categories on (articles_categories.article_id = articles.id)', :conditions => ['articles_categories.category_id = (?)', category_id]}.merge!(options) + when 'Event' + conditions = + if date_range + ['articles_categories.category_id = (?) and start_date between ? and ?', category_id, date_range.first, date_range.last] + else + ['articles_categories.category_id = (?) ', category_id ] + end + {:joins => 'inner join articles_categories on (articles_categories.article_id = articles.id)', :conditions => conditions}.merge!(options) when 'Enterprise' if prod_cat_ids {:joins => 'inner join categories_profiles on (categories_profiles.profile_id = profiles.id) inner join products on (products.enterprise_id = profiles.id)', :conditions => ['categories_profiles.category_id = (?) and products.product_category_id in (?)', category_id, prod_cat_ids]}.merge!(options) diff --git a/app/models/environment_finder.rb b/app/models/environment_finder.rb index 0b6d8e5..0242e0e 100644 --- a/app/models/environment_finder.rb +++ b/app/models/environment_finder.rb @@ -15,6 +15,8 @@ class EnvironmentFinder product_category = options.delete(:product_category) product_category_ids = product_category.map_traversal(&:id) if product_category + date_range = options.delete(:date_range) + options = {:page => 1, :per_page => options.delete(:limit)}.merge(options) if query.blank? options = {:order => 'created_at desc, id desc'}.merge(options) @@ -23,7 +25,11 @@ class EnvironmentFinder elsif product_category && asset == :enterprises @environment.send(asset).paginate(:all, options.merge(:order => 'profiles.created_at desc, profiles.id desc', :include => 'products', :conditions => ['products.product_category_id in (?)', product_category_ids])) else - @environment.send(asset).paginate(:all, options) + if (asset == :events) && date_range + @environment.send(asset).paginate(:all, options.merge(:conditions => { :start_date => date_range})) + else + @environment.send(asset).paginate(:all, options) + end end else ferret_options = {:page => options.delete(:page), :per_page => options.delete(:per_page)} diff --git a/test/functional/search_controller_test.rb b/test/functional/search_controller_test.rb index afa7846..dab17fd 100644 --- a/test/functional/search_controller_test.rb +++ b/test/functional/search_controller_test.rb @@ -647,6 +647,50 @@ class SearchControllerTest < Test::Unit::TestCase assert_not_includes assigns(:results)[:events], ev3 end + should 'list events for a given month' do + person = create_user('testuser').person + + create_event(person, :name => 'upcoming event 1', :category_ids => [@category.id], :start_date => Date.new(2008, 1, 25)) + create_event(person, :name => 'upcoming event 2', :category_ids => [@category.id], :start_date => Date.new(2008, 2, 27)) + + get :assets, :asset => 'events', :year => '2008', :month => '1' + + assert_equal [ 'upcoming event 1' ], assigns(:results)[:events].map(&:name) + end + + should 'list events for a given month in a specific category' do + person = create_user('testuser').person + + create_event(person, :name => 'upcoming event 1', :category_ids => [@category.id], :start_date => Date.new(2008, 1, 25)) + create_event(person, :name => 'upcoming event 2', :category_ids => [@category.id], :start_date => Date.new(2008, 2, 27)) + + get :assets, :asset => 'events', :category_path => [ 'my-category' ], :year => '2008', :month => '1' + + assert_equal [ 'upcoming event 1' ], assigns(:results)[:events].map(&:name) + end + + should 'list upcoming events in a specific category' do + person = create_user('testuser').person + + # today is January 15th, 2008 + Date.expects(:today).returns(Date.new(2008,1,15)).at_least_once + + # in category, but in the past + create_event(person, :name => 'past event', :category_ids => [@category.id], :start_date => Date.new(2008, 1, 1)) + + # in category, upcoming + create_event(person, :name => 'upcoming event 1', :category_ids => [@category.id], :start_date => Date.new(2008, 1, 25)) + create_event(person, :name => 'upcoming event 2', :category_ids => [@category.id], :start_date => Date.new(2008, 1, 27)) + + # not in category + create_event(person, :name => 'event not in category') + + get :category_index, :category_path => ['my-category'] + + assert_equal [ 'upcoming event 1', 'upcoming event 2' ], assigns(:results)[:events].map(&:name) + end + + %w[ people enterprises articles events communities products ].each do |asset| should "render asset-specific template when searching for #{asset}" do get :index, :find_in => [ asset ] diff --git a/test/unit/category_finder_test.rb b/test/unit/category_finder_test.rb index 6e0d53b..c9bf7d2 100644 --- a/test/unit/category_finder_test.rb +++ b/test/unit/category_finder_test.rb @@ -290,6 +290,34 @@ class CategoryFinderTest < ActiveSupport::TestCase assert_respond_to events, :total_entries end + should 'list upcoming events' do + person = create_user('testuser').person + + Date.expects(:today).returns(Date.new(2008, 1, 15)).at_least_once + + past_event = Event.create!(:name => 'past event', :profile => person, :start_date => Date.new(2008,1,1), :category_ids => [@category.id]) + + # event 2 is created after, but must be listed before (since it happens before) + upcoming_event_2 = Event.create!(:name => 'upcoming event 2', :profile => person, :start_date => Date.new(2008,1,25), :category_ids => [@category.id]) + upcoming_event_1 = Event.create!(:name => 'upcoming event 1', :profile => person, :start_date => Date.new(2008,1,20), :category_ids => [@category.id]) + not_in_category = Event.create!(:name => 'e1', :profile => person, :start_date => Date.new(2008,1,20)) + + assert_equal [upcoming_event_1, upcoming_event_2], @finder.upcoming_events + end + + should 'limit events' do + person = create_user('testuser').person + + Date.expects(:today).returns(Date.new(2008, 1, 15)).at_least_once + + past_event = Event.create!(:name => 'past event', :profile => person, :start_date => Date.new(2008,1,1), :category_ids => [@category.id]) + upcoming_event_1 = Event.create!(:name => 'upcoming event 1', :profile => person, :start_date => Date.new(2008,1,20), :category_ids => [@category.id]) + upcoming_event_2 = Event.create!(:name => 'upcoming event 2', :profile => person, :start_date => Date.new(2008,1,25), :category_ids => [@category.id]) + not_in_category = Event.create!(:name => 'e1', :profile => person, :start_date => Date.new(2008,1,20)) + + assert_equal [upcoming_event_1], @finder.upcoming_events(:per_page => 1) + end + should 'find person and enterprise in category by radius and region even without query' do cat = Category.create!(:name => 'test category', :environment => Environment.default) finder = CategoryFinder.new(cat) -- libgit2 0.21.2