From 12a26bee066ee360d963b9f6ca64a8c0c2b7ff67 Mon Sep 17 00:00:00 2001 From: Arthur Del Esposte Date: Fri, 30 Oct 2015 18:00:06 -0200 Subject: [PATCH] Refactoring search controller from software communities --- src/noosfero-spb/software_communities/lib/ext/search_controller.rb | 58 ++++++++++++++-------------------------------------------- src/noosfero-spb/software_communities/lib/software_communities_plugin.rb | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------- src/noosfero-spb/software_communities/models/software_communities_plugin/software_info.rb | 22 +++++++++++++++------- 3 files changed, 89 insertions(+), 58 deletions(-) diff --git a/src/noosfero-spb/software_communities/lib/ext/search_controller.rb b/src/noosfero-spb/software_communities/lib/ext/search_controller.rb index 0bf869d..8d02980 100644 --- a/src/noosfero-spb/software_communities/lib/ext/search_controller.rb +++ b/src/noosfero-spb/software_communities/lib/ext/search_controller.rb @@ -45,11 +45,11 @@ class SearchController communities_list end - def filter_software_infos_list - filtered_software_list = get_filtered_software_list - # filtered_community_list = get_communities_list(filtered_software_list) - sort_communities_list filtered_software_list - end + # def filter_software_infos_list + # filtered_software_list = get_community_ids_from_filtered_software + # filtered_community_list = get_communities_list(filtered_software_list) + # sort_communities_list filtered_community_list + # end def get_filter_category_ids category_ids = [] @@ -59,46 +59,16 @@ class SearchController category_ids.map(&:to_i) end - def get_filtered_software_list - params[:query] ||= "" - visible_communities = visible_profiles(Community) - - filtered_software_list = SoftwareCommunitiesPlugin::SoftwareInfo.search_by_query(params[:query]) - - if params[:only_softwares] - params[:only_softwares].collect!{ |software_name| software_name.to_slug } - filtered_software_list = SoftwareCommunitiesPlugin::SoftwareInfo.all.select{ |s| params[:only_softwares].include?(s.identifier) } - @public_software_selected = false - end - - filtered_software_list.select!{ |software| visible_communities.include?(software.community) } - category_ids = get_filter_category_ids - - unless category_ids.empty? - filtered_software_list.select! do |software| - if software.nil? || software.community.nil? - false - else - result_ids = (software.community.category_ids & category_ids).sort - result_ids == category_ids.sort - end - end - end + # def sort_communities_list communities_list + # communities_list.sort! {|a, b| a.name.downcase <=> b.name.downcase} - ids = filtered_software_list.pluck(:id) - visible_communities.joins(:software_infos).where("software_infos.id IN ?", ids) - end - - def sort_communities_list communities_list - communities_list.order('name') - - if params[:sort] && params[:sort] == "desc" - communities_list.order('name DESC') - elsif params[:sort] && params[:sort] == "relevance" - communities_list = sort_by_relevance(communities_list, params[:query]){ |community| [community.software_info.finality, community.name] } - end - communities_list - end + # if params[:sort] && params[:sort] == "desc" + # communities_list.reverse! + # elsif params[:sort] && params[:sort] == "relevance" + # communities_list = sort_by_relevance(communities_list, params[:query]){ |community| [community.software_info.finality, community.name] } + # end + # communities_list + # end def prepare_software_search_page prepare_software_infos_params diff --git a/src/noosfero-spb/software_communities/lib/software_communities_plugin.rb b/src/noosfero-spb/software_communities/lib/software_communities_plugin.rb index a90d553..d788f13 100644 --- a/src/noosfero-spb/software_communities/lib/software_communities_plugin.rb +++ b/src/noosfero-spb/software_communities/lib/software_communities_plugin.rb @@ -123,12 +123,12 @@ class SoftwareCommunitiesPlugin < Noosfero::Plugin where('softwares.community_id IS NULL') return [scope, asset] - # Select only communities that are related to a software. - elsif asset.to_s == 'software_communities_plugin/software_infos' - scope = scope.joins('INNER JOIN software_communities_plugin_software_infos as softwares - ON profiles.id = softwares.community_id') - return [scope, asset] - # Go with the flow. + # # Select only communities that are related to a software. + # elsif asset.to_s == 'software_communities_plugin/software_infos' + # scope = scope.joins('INNER JOIN software_communities_plugin_software_infos as softwares + # ON profiles.id = softwares.community_id') + # return [scope, asset] + # # Go with the flow. else return [scope, asset] end @@ -138,7 +138,6 @@ class SoftwareCommunitiesPlugin < Noosfero::Plugin class_name_underscored = "software_communities_plugin/software_infos" block = proc do prepare_software_search_page - results = filter_software_infos_list @scope = visible_profiles(Community) @asset = class_name_underscored @assets = [@asset] @@ -156,8 +155,62 @@ class SoftwareCommunitiesPlugin < Noosfero::Plugin [{:name => 'software', :block => block, :common_profile_list_block => class_name_underscored}] end + def find_by_contents(asset, scope, query, paginate_options={}, options={}) + if query && asset.to_s == 'software_communities_plugin/software_infos' + community_ids = get_community_ids_from_filtered_software(query) + scope = Community.where(:id => community_ids) + end + + scope.order(:name) + # scope = scope.like_search(query, options) unless query.blank? + # scope = scope.send(options[:filter]) unless options[:filter].blank? + {:results => scope.paginate(paginate_options)} + end + protected + def get_community_ids_from_filtered_software(query) + filtered_software_list = SoftwareCommunitiesPlugin::SoftwareInfo.search_by_query(query) + + if context.params[:only_softwares] + context.params[:only_softwares].collect!{ |software_name| software_name.to_slug } + filtered_software_list = SoftwareCommunitiesPlugin::SoftwareInfo.all.select{ |s| context.params[:only_softwares].include?(s.identifier) } + @public_software_selected = false + end + + category_ids = get_filter_category_ids + + unless category_ids.empty? + filtered_software_list.select! do |software| + if software.nil? || software.community.nil? + false + else + result_ids = (software.community.category_ids & category_ids).sort + result_ids == category_ids.sort + end + end + end + + community_ids = [] + + filtered_software_list.each do |software| + community_ids << software.community_id + end + + community_ids + end + + def sort_communities_list communities_list + communities_list.sort! {|a, b| a.name.downcase <=> b.name.downcase} + + if params[:sort] && params[:sort] == "desc" + communities_list.reverse! + elsif params[:sort] && params[:sort] == "relevance" + communities_list = sort_by_relevance(communities_list, params[:query]){ |community| [community.software_info.finality, community.name] } + end + communities_list + end + def software_info_transaction SoftwareCommunitiesPlugin::SoftwareInfo.transaction do context.profile. diff --git a/src/noosfero-spb/software_communities/models/software_communities_plugin/software_info.rb b/src/noosfero-spb/software_communities/models/software_communities_plugin/software_info.rb index 67a9b9e..25c4ac4 100644 --- a/src/noosfero-spb/software_communities/models/software_communities_plugin/software_info.rb +++ b/src/noosfero-spb/software_communities/models/software_communities_plugin/software_info.rb @@ -13,6 +13,13 @@ class SoftwareCommunitiesPlugin::SoftwareInfo < ActiveRecord::Base SoftwareCommunitiesPlugin::DatabaseDescription ] + SEARCHABLE_SOFTWARE_CLASSES_ATTRIBUTES = { + SoftwareCommunitiesPlugin::SoftwareInfo => "software_info", + Community => "community", + SoftwareCommunitiesPlugin::ProgrammingLanguage => "programming_language", + SoftwareCommunitiesPlugin::DatabaseDescription => "database_description" + } + scope :search_by_query, lambda { |query = ""| filtered_query = query.gsub(/[\|\(\)\\\/\s\[\]'"*%&!:]/,' ').split.map{|w| w += ":*"}.join('|') search_fields = SoftwareCommunitiesPlugin::SoftwareInfo.pg_search_plugin_fields @@ -20,7 +27,8 @@ class SoftwareCommunitiesPlugin::SoftwareInfo < ActiveRecord::Base if query.empty? SoftwareCommunitiesPlugin::SoftwareInfo.joins(:community).where("profiles.visible = ?", true) else - searchable_software_objects = SoftwareCommunitiesPlugin::SoftwareInfo.transform_list_in_methods_list(SEARCHABLE_SOFTWARE_CLASSES) + searchable_software_objects = SoftwareCommunitiesPlugin::SoftwareInfo.transform_list_in_methods_list(SEARCHABLE_SOFTWARE_CLASSES_ATTRIBUTES) + includes(searchable_software_objects).where("to_tsvector('simple', #{search_fields}) @@ to_tsquery('#{filtered_query}')").where("profiles.visible = ?", true) end } @@ -28,11 +36,11 @@ class SoftwareCommunitiesPlugin::SoftwareInfo < ActiveRecord::Base def self.transform_list_in_methods_list list methods_list = [] - list.each do |element| - if SoftwareCommunitiesPlugin::SoftwareInfo.instance_methods.include?(element.to_s.underscore.to_sym) - methods_list << element.to_s.underscore.to_sym - elsif SoftwareCommunitiesPlugin::SoftwareInfo.instance_methods.include?(element.to_s.underscore.pluralize.to_sym) - methods_list << element.to_s.underscore.pluralize.to_sym + list.each do |klass, method| + if SoftwareCommunitiesPlugin::SoftwareInfo.instance_methods.include?(method.to_sym) + methods_list << method.to_sym + elsif SoftwareCommunitiesPlugin::SoftwareInfo.instance_methods.include?(method.pluralize.to_sym) + methods_list << method.pluralize.to_sym end end @@ -70,7 +78,7 @@ class SoftwareCommunitiesPlugin::SoftwareInfo < ActiveRecord::Base has_many :libraries, :dependent => :destroy, :class_name => 'SoftwareCommunitiesPlugin::Library' has_many :software_databases, :class_name => 'SoftwareCommunitiesPlugin::SoftwareDatabase' - has_many :database_descriptions, :class_name => 'SoftwareCommunitiesPlugin::SoftwareDatabaseDescription', :through => :software_databases + has_many :database_descriptions, :class_name => 'SoftwareCommunitiesPlugin::DatabaseDescription', :through => :software_databases has_many :software_languages, :class_name => 'SoftwareCommunitiesPlugin::SoftwareLanguage' has_many :operating_systems, :class_name => 'SoftwareCommunitiesPlugin::OperatingSystem' has_many :programming_languages, :class_name => 'SoftwareCommunitiesPlugin::ProgrammingLanguage', :through => :software_languages -- libgit2 0.21.2