diff --git a/lib/mpog_software_plugin.rb b/lib/mpog_software_plugin.rb index 591a058..dca35b6 100644 --- a/lib/mpog_software_plugin.rb +++ b/lib/mpog_software_plugin.rb @@ -353,11 +353,16 @@ class MpogSoftwarePlugin < Noosfero::Plugin elsif params[:action] == "communities" and params[:type] == "Institution" elsif params[:action] == "communities" and params[:type] == "Software" - SoftwareInfo.search(params[:name], params[:database_description][:id], - params[:programming_language][:id], params[:operating_system][:id], - params[:controlled_vocabulary], params[:license_info][:id], params[:e_ping], params[:e_mag], - params[:icp_brasil], params[:e_arq], params[:internacionalizable]) - + softwares = SoftwareInfo.search(params[:name], params[:database_description][:id], + params[:programming_language][:id], params[:operating_system][:id], + params[:license_info][:id], params[:e_ping], params[:e_mag], params[:internacionalizable], + params[:icp_brasil], params[:e_arq], params[:controlled_vocabulary]) + communities = [] + + softwares.each do |s| + communities << s.community + end + communities else [] # An empty list will trigger noosfero's default communities search end diff --git a/lib/software_info.rb b/lib/software_info.rb index a31e18b..b32d8f9 100644 --- a/lib/software_info.rb +++ b/lib/software_info.rb @@ -21,9 +21,10 @@ class SoftwareInfo < ActiveRecord::Base joins(:community).where("name ilike ?", "%#{name}%") } - scope :search, lambda { |name="", database_description="", programming_language="", operating_system="", - controlled_vocabulary="", license_info="", e_ping="", e_mag="", - icp_brasil="", e_arq="", internacionalizable=""| + scope :search, lambda { |name="", database_description_id = "", + programming_language_id = "", operating_system_name_id = "", + license_info_id = "", e_ping = "", e_mag = "", internacionalizable = "", + icp_brasil = "", e_arq = "", controlled_vocabulary = "" | like_sql = "" values = [] @@ -33,61 +34,66 @@ class SoftwareInfo < ActiveRecord::Base values << "%#{name}%" end - unless database_description.nil? and database_description.blank? - software_databases = SoftwareDatabase.where(:database_description_id => database_description) - like_sql << "software_databases ILIKE ? AND " - values << "%#{software_databases}%" + if (not database_description_id.nil?) and (not database_description_id.blank?) + like_sql << "software_databases.database_description_id = ? AND " + values << "#{database_description_id}" end - unless programming_language.nil? and programming_language.blank? - like_sql << "programming_language_id ILIKE ? AND " - values << "%#{programming_language}%" + if (not programming_language_id.nil?) and (not programming_language_id.blank?) + like_sql << "software_languages.programming_language_id = ? AND " + values << "#{programming_language_id}" end - unless operating_system.nil? and operating_system.blank? - like_sql << "operating_system_id ILIKE ? AND " - values << "%#{operating_system}%" + if (not operating_system_name_id.nil?) and (not operating_system_name_id.blank?) + like_sql << "operating_systems.operating_system_name_id = ? AND " + values << "#{operating_system_name_id}" end - unless license_info.nil? and license_info.blank? - like_sql << "license_info_id ILIKE ? AND " - values << "%#{license_info}%" + if (not license_info_id.nil?) and (not license_info_id.blank?) + like_sql << "license_info_id = ? AND " + values << "#{license_info_id}" end - unless e_ping.nil? and e_ping.blank? and e_ping == "Any" - like_sql << "e_ping ILIKE ? AND " - values << "%#{e_ping}%" + if (not internacionalizable.nil?) and (not internacionalizable.blank?) + like_sql << "internacionalizable = ? AND " + values << "#{internacionalizable}" end - unless e_mag.nil? and e_mag.blank? and e_mag == "Any" - like_sql << "e_mag ILIKE ? AND " - values << "%#{e_mag}%" + if (not icp_brasil.nil?) and (not icp_brasil.blank?) + like_sql << "icp_brasil = ? AND " + values << "#{icp_brasil}" end - unless icp_brasil.nil? and icp_brasil.blank? and icp_brasil == "Any" - like_sql << "icp_brasil ILIKE ? AND " - values << "%#{icp_brasil}%" + if (not e_ping.nil?) and (not e_ping.blank?) + like_sql << "e_ping = ? AND " + values << "#{e_ping}" end - unless e_arq.nil? and e_arq.blank? and e_arq == "Any" - like_sql << "e_arq ILIKE ? AND " - values << "%#{e_arq}%" + if (not e_mag.nil?) and (not e_mag.blank?) + like_sql << "e_mag = ? AND " + values << "#{e_mag}" end - unless internacionalizable.nil? and internacionalizable.blank? and internacionalizable == "Any" - like_sql << "internacionalizable ILIKE ? AND " - values << "%#{internacionalizable}%" + if (not e_arq.nil?) and (not e_arq.blank?) + like_sql << "e_arq = ? AND " + values << "#{e_arq}" + end + + if (not controlled_vocabulary.nil?) and (not controlled_vocabulary.blank?) + controlled_vocabulary = controlled_vocabulary.gsub(' ', '').underscore + like_sql << "controlled_vocabulary.#{controlled_vocabulary} = ? AND " + values << "true" end like_sql = like_sql[0..like_sql.length-5] { - :joins => :community, + :joins => [:community, :software_databases, :software_languages, + :operating_systems, :controlled_vocabulary], :conditions=>[like_sql, *values] } } - def validate_operating_platform self.errors.add(:operating_platform, _("can't be blank")) if self.operating_platform.blank? && self.errors.messages[:operating_platform].nil? end diff --git a/public/mpog-search.js b/public/mpog-search.js index 28e6b60..8717585 100644 --- a/public/mpog-search.js +++ b/public/mpog-search.js @@ -19,7 +19,7 @@ } function display_search_fields_on_page_load() { - var active_search = jQuery(".search_type input[checked='checked'").val(); + var active_search = jQuery(".search_type input[checked='checked']").val(); switch(active_search) { case "Community": show_community_fields(); break; diff --git a/views/search/search_forms/_software_fields.html.erb b/views/search/search_forms/_software_fields.html.erb index 76e312e..33854e0 100644 --- a/views/search/search_forms/_software_fields.html.erb +++ b/views/search/search_forms/_software_fields.html.erb @@ -43,17 +43,17 @@