Commit 12a26bee066ee360d963b9f6ca64a8c0c2b7ff67
1 parent
fc273ce5
Exists in
temp_soft_comm_refactoring
Refactoring search controller from software communities
Showing
3 changed files
with
89 additions
and
58 deletions
Show diff stats
src/noosfero-spb/software_communities/lib/ext/search_controller.rb
... | ... | @@ -45,11 +45,11 @@ class SearchController |
45 | 45 | communities_list |
46 | 46 | end |
47 | 47 | |
48 | - def filter_software_infos_list | |
49 | - filtered_software_list = get_filtered_software_list | |
50 | - # filtered_community_list = get_communities_list(filtered_software_list) | |
51 | - sort_communities_list filtered_software_list | |
52 | - end | |
48 | + # def filter_software_infos_list | |
49 | + # filtered_software_list = get_community_ids_from_filtered_software | |
50 | + # filtered_community_list = get_communities_list(filtered_software_list) | |
51 | + # sort_communities_list filtered_community_list | |
52 | + # end | |
53 | 53 | |
54 | 54 | def get_filter_category_ids |
55 | 55 | category_ids = [] |
... | ... | @@ -59,46 +59,16 @@ class SearchController |
59 | 59 | category_ids.map(&:to_i) |
60 | 60 | end |
61 | 61 | |
62 | - def get_filtered_software_list | |
63 | - params[:query] ||= "" | |
64 | - visible_communities = visible_profiles(Community) | |
65 | - | |
66 | - filtered_software_list = SoftwareCommunitiesPlugin::SoftwareInfo.search_by_query(params[:query]) | |
67 | - | |
68 | - if params[:only_softwares] | |
69 | - params[:only_softwares].collect!{ |software_name| software_name.to_slug } | |
70 | - filtered_software_list = SoftwareCommunitiesPlugin::SoftwareInfo.all.select{ |s| params[:only_softwares].include?(s.identifier) } | |
71 | - @public_software_selected = false | |
72 | - end | |
73 | - | |
74 | - filtered_software_list.select!{ |software| visible_communities.include?(software.community) } | |
75 | - category_ids = get_filter_category_ids | |
76 | - | |
77 | - unless category_ids.empty? | |
78 | - filtered_software_list.select! do |software| | |
79 | - if software.nil? || software.community.nil? | |
80 | - false | |
81 | - else | |
82 | - result_ids = (software.community.category_ids & category_ids).sort | |
83 | - result_ids == category_ids.sort | |
84 | - end | |
85 | - end | |
86 | - end | |
62 | + # def sort_communities_list communities_list | |
63 | + # communities_list.sort! {|a, b| a.name.downcase <=> b.name.downcase} | |
87 | 64 | |
88 | - ids = filtered_software_list.pluck(:id) | |
89 | - visible_communities.joins(:software_infos).where("software_infos.id IN ?", ids) | |
90 | - end | |
91 | - | |
92 | - def sort_communities_list communities_list | |
93 | - communities_list.order('name') | |
94 | - | |
95 | - if params[:sort] && params[:sort] == "desc" | |
96 | - communities_list.order('name DESC') | |
97 | - elsif params[:sort] && params[:sort] == "relevance" | |
98 | - communities_list = sort_by_relevance(communities_list, params[:query]){ |community| [community.software_info.finality, community.name] } | |
99 | - end | |
100 | - communities_list | |
101 | - end | |
65 | + # if params[:sort] && params[:sort] == "desc" | |
66 | + # communities_list.reverse! | |
67 | + # elsif params[:sort] && params[:sort] == "relevance" | |
68 | + # communities_list = sort_by_relevance(communities_list, params[:query]){ |community| [community.software_info.finality, community.name] } | |
69 | + # end | |
70 | + # communities_list | |
71 | + # end | |
102 | 72 | |
103 | 73 | def prepare_software_search_page |
104 | 74 | prepare_software_infos_params | ... | ... |
src/noosfero-spb/software_communities/lib/software_communities_plugin.rb
... | ... | @@ -123,12 +123,12 @@ class SoftwareCommunitiesPlugin < Noosfero::Plugin |
123 | 123 | where('softwares.community_id IS NULL') |
124 | 124 | |
125 | 125 | return [scope, asset] |
126 | - # Select only communities that are related to a software. | |
127 | - elsif asset.to_s == 'software_communities_plugin/software_infos' | |
128 | - scope = scope.joins('INNER JOIN software_communities_plugin_software_infos as softwares | |
129 | - ON profiles.id = softwares.community_id') | |
130 | - return [scope, asset] | |
131 | - # Go with the flow. | |
126 | + # # Select only communities that are related to a software. | |
127 | + # elsif asset.to_s == 'software_communities_plugin/software_infos' | |
128 | + # scope = scope.joins('INNER JOIN software_communities_plugin_software_infos as softwares | |
129 | + # ON profiles.id = softwares.community_id') | |
130 | + # return [scope, asset] | |
131 | + # # Go with the flow. | |
132 | 132 | else |
133 | 133 | return [scope, asset] |
134 | 134 | end |
... | ... | @@ -138,7 +138,6 @@ class SoftwareCommunitiesPlugin < Noosfero::Plugin |
138 | 138 | class_name_underscored = "software_communities_plugin/software_infos" |
139 | 139 | block = proc do |
140 | 140 | prepare_software_search_page |
141 | - results = filter_software_infos_list | |
142 | 141 | @scope = visible_profiles(Community) |
143 | 142 | @asset = class_name_underscored |
144 | 143 | @assets = [@asset] |
... | ... | @@ -156,8 +155,62 @@ class SoftwareCommunitiesPlugin < Noosfero::Plugin |
156 | 155 | [{:name => 'software', :block => block, :common_profile_list_block => class_name_underscored}] |
157 | 156 | end |
158 | 157 | |
158 | + def find_by_contents(asset, scope, query, paginate_options={}, options={}) | |
159 | + if query && asset.to_s == 'software_communities_plugin/software_infos' | |
160 | + community_ids = get_community_ids_from_filtered_software(query) | |
161 | + scope = Community.where(:id => community_ids) | |
162 | + end | |
163 | + | |
164 | + scope.order(:name) | |
165 | + # scope = scope.like_search(query, options) unless query.blank? | |
166 | + # scope = scope.send(options[:filter]) unless options[:filter].blank? | |
167 | + {:results => scope.paginate(paginate_options)} | |
168 | + end | |
169 | + | |
159 | 170 | protected |
160 | 171 | |
172 | + def get_community_ids_from_filtered_software(query) | |
173 | + filtered_software_list = SoftwareCommunitiesPlugin::SoftwareInfo.search_by_query(query) | |
174 | + | |
175 | + if context.params[:only_softwares] | |
176 | + context.params[:only_softwares].collect!{ |software_name| software_name.to_slug } | |
177 | + filtered_software_list = SoftwareCommunitiesPlugin::SoftwareInfo.all.select{ |s| context.params[:only_softwares].include?(s.identifier) } | |
178 | + @public_software_selected = false | |
179 | + end | |
180 | + | |
181 | + category_ids = get_filter_category_ids | |
182 | + | |
183 | + unless category_ids.empty? | |
184 | + filtered_software_list.select! do |software| | |
185 | + if software.nil? || software.community.nil? | |
186 | + false | |
187 | + else | |
188 | + result_ids = (software.community.category_ids & category_ids).sort | |
189 | + result_ids == category_ids.sort | |
190 | + end | |
191 | + end | |
192 | + end | |
193 | + | |
194 | + community_ids = [] | |
195 | + | |
196 | + filtered_software_list.each do |software| | |
197 | + community_ids << software.community_id | |
198 | + end | |
199 | + | |
200 | + community_ids | |
201 | + end | |
202 | + | |
203 | + def sort_communities_list communities_list | |
204 | + communities_list.sort! {|a, b| a.name.downcase <=> b.name.downcase} | |
205 | + | |
206 | + if params[:sort] && params[:sort] == "desc" | |
207 | + communities_list.reverse! | |
208 | + elsif params[:sort] && params[:sort] == "relevance" | |
209 | + communities_list = sort_by_relevance(communities_list, params[:query]){ |community| [community.software_info.finality, community.name] } | |
210 | + end | |
211 | + communities_list | |
212 | + end | |
213 | + | |
161 | 214 | def software_info_transaction |
162 | 215 | SoftwareCommunitiesPlugin::SoftwareInfo.transaction do |
163 | 216 | context.profile. | ... | ... |
src/noosfero-spb/software_communities/models/software_communities_plugin/software_info.rb
... | ... | @@ -13,6 +13,13 @@ class SoftwareCommunitiesPlugin::SoftwareInfo < ActiveRecord::Base |
13 | 13 | SoftwareCommunitiesPlugin::DatabaseDescription |
14 | 14 | ] |
15 | 15 | |
16 | + SEARCHABLE_SOFTWARE_CLASSES_ATTRIBUTES = { | |
17 | + SoftwareCommunitiesPlugin::SoftwareInfo => "software_info", | |
18 | + Community => "community", | |
19 | + SoftwareCommunitiesPlugin::ProgrammingLanguage => "programming_language", | |
20 | + SoftwareCommunitiesPlugin::DatabaseDescription => "database_description" | |
21 | + } | |
22 | + | |
16 | 23 | scope :search_by_query, lambda { |query = ""| |
17 | 24 | filtered_query = query.gsub(/[\|\(\)\\\/\s\[\]'"*%&!:]/,' ').split.map{|w| w += ":*"}.join('|') |
18 | 25 | search_fields = SoftwareCommunitiesPlugin::SoftwareInfo.pg_search_plugin_fields |
... | ... | @@ -20,7 +27,8 @@ class SoftwareCommunitiesPlugin::SoftwareInfo < ActiveRecord::Base |
20 | 27 | if query.empty? |
21 | 28 | SoftwareCommunitiesPlugin::SoftwareInfo.joins(:community).where("profiles.visible = ?", true) |
22 | 29 | else |
23 | - searchable_software_objects = SoftwareCommunitiesPlugin::SoftwareInfo.transform_list_in_methods_list(SEARCHABLE_SOFTWARE_CLASSES) | |
30 | + searchable_software_objects = SoftwareCommunitiesPlugin::SoftwareInfo.transform_list_in_methods_list(SEARCHABLE_SOFTWARE_CLASSES_ATTRIBUTES) | |
31 | + | |
24 | 32 | includes(searchable_software_objects).where("to_tsvector('simple', #{search_fields}) @@ to_tsquery('#{filtered_query}')").where("profiles.visible = ?", true) |
25 | 33 | end |
26 | 34 | } |
... | ... | @@ -28,11 +36,11 @@ class SoftwareCommunitiesPlugin::SoftwareInfo < ActiveRecord::Base |
28 | 36 | def self.transform_list_in_methods_list list |
29 | 37 | methods_list = [] |
30 | 38 | |
31 | - list.each do |element| | |
32 | - if SoftwareCommunitiesPlugin::SoftwareInfo.instance_methods.include?(element.to_s.underscore.to_sym) | |
33 | - methods_list << element.to_s.underscore.to_sym | |
34 | - elsif SoftwareCommunitiesPlugin::SoftwareInfo.instance_methods.include?(element.to_s.underscore.pluralize.to_sym) | |
35 | - methods_list << element.to_s.underscore.pluralize.to_sym | |
39 | + list.each do |klass, method| | |
40 | + if SoftwareCommunitiesPlugin::SoftwareInfo.instance_methods.include?(method.to_sym) | |
41 | + methods_list << method.to_sym | |
42 | + elsif SoftwareCommunitiesPlugin::SoftwareInfo.instance_methods.include?(method.pluralize.to_sym) | |
43 | + methods_list << method.pluralize.to_sym | |
36 | 44 | end |
37 | 45 | end |
38 | 46 | |
... | ... | @@ -70,7 +78,7 @@ class SoftwareCommunitiesPlugin::SoftwareInfo < ActiveRecord::Base |
70 | 78 | |
71 | 79 | has_many :libraries, :dependent => :destroy, :class_name => 'SoftwareCommunitiesPlugin::Library' |
72 | 80 | has_many :software_databases, :class_name => 'SoftwareCommunitiesPlugin::SoftwareDatabase' |
73 | - has_many :database_descriptions, :class_name => 'SoftwareCommunitiesPlugin::SoftwareDatabaseDescription', :through => :software_databases | |
81 | + has_many :database_descriptions, :class_name => 'SoftwareCommunitiesPlugin::DatabaseDescription', :through => :software_databases | |
74 | 82 | has_many :software_languages, :class_name => 'SoftwareCommunitiesPlugin::SoftwareLanguage' |
75 | 83 | has_many :operating_systems, :class_name => 'SoftwareCommunitiesPlugin::OperatingSystem' |
76 | 84 | has_many :programming_languages, :class_name => 'SoftwareCommunitiesPlugin::ProgrammingLanguage', :through => :software_languages | ... | ... |