Author: rmarianski
Date: 2007-05-09 18:51:22 -0400 (Wed, 09 May 2007)
New Revision: 5150
Modified:
opencore/trunk/opencore/nui/opencoreview.py
opencore/trunk/opencore/nui/pages/projects-searchresults.pt
Log:
add ability to sort project search results
Modified: opencore/trunk/opencore/nui/opencoreview.py
===================================================================
--- opencore/trunk/opencore/nui/opencoreview.py 2007-05-09 22:41:41 UTC (rev
5149)
+++ opencore/trunk/opencore/nui/opencoreview.py 2007-05-09 22:51:22 UTC (rev
5150)
@@ -243,25 +243,25 @@
return projects
def __call__(self):
- search_action = self.request.get('action_search_projects', None)
projname = self.request.get('projname', None)
letter_search = self.request.get('letter_search', None)
start = self.request.get('b_start', 0)
+ sort_by = self.request.get('sort_by', None)
self.search_results = None
self.search_query = None
if letter_search:
- self.search_results =
self._get_batch(self.search_for_project_by_letter(letter_search), start)
+ self.search_results =
self._get_batch(self.search_for_project_by_letter(letter_search, sort_by),
start)
self.search_query = 'for projects starting with “%s”'
% letter_search
- elif search_action and projname:
- self.search_results =
self._get_batch(self.search_for_project(projname), start)
+ elif projname:
+ self.search_results =
self._get_batch(self.search_for_project(projname, sort_by), start)
self.search_query = 'for “%s”' % projname
return self.template()
def _get_batch(self, brains, start=0):
return Batch(brains,
- size=12,
+ size=3,
start=start,
end=0,
orphan=0,
@@ -270,7 +270,7 @@
quantumleap=0,
b_start_str='b_start')
- def search_for_project_by_letter(self, letter):
+ def search_for_project_by_letter(self, letter, sort_by):
letter = letter.lower()
query = dict(portal_type="OpenProject",
Title=letter + '*')
@@ -284,31 +284,40 @@
or title.startswith('an ' + letter)
project_brains = filter(matches, project_brains)
- # this is expensive $$$
- # we get object for project creation time
-# projects = [{'brain':x} for x in project_brains]
+
+ def sort_key_fn(x):
+ if sort_by is None: return 0
+
+ prop = getattr(x, sort_by)
+ if prop == 'relevancy': return 0
+
+ if callable(prop):
+ return prop()
+ return prop
+
+ project_brains.sort(key=sort_key_fn)
+
return project_brains
- def search_for_project(self, project):
+ def search_for_project(self, project, sort_by):
project = project.lower()
proj_query = project
if not proj_query.endswith('*'):
proj_query = proj_query + '*'
- rs = RankByQueries_Sum((Eq('Title', proj_query),32),
(Eq('getFull_name', proj_query),16))
- norm = 1 + rs.getQueryValueSum()
+ if not sort_by or sort_by == 'relevancy':
+ rs = (RankByQueries_Sum((Eq('Title', proj_query),32),
(Eq('getFull_name', proj_query),16)),)
+ else:
+ # we can't sort by title
+ if sort_by == 'Title':
+ sort_by = 'sortable_title'
+ rs = ((sort_by, 'desc'),)
project_brains = self.catalogtool.evalAdvancedQuery(
- Eq('portal_type', 'OpenProject') & Eq('SearchableText',
proj_query),
- (rs,)
- )
-
- # XXX this is expensive $$$
- # we get object for project creation time
-# projects = [{'brain':x,
-# 'rel':round(100*float((1 + x.data_record_score_[0])) /
norm, 1)}
-# for x in project_brains]
+ Eq('portal_type', 'OpenProject') & Eq('SearchableText',
proj_query),
+ rs,
+ )
return project_brains
def create_date(self, project):
Modified: opencore/trunk/opencore/nui/pages/projects-searchresults.pt
===================================================================
--- opencore/trunk/opencore/nui/pages/projects-searchresults.pt 2007-05-09
22:41:41 UTC (rev 5149)
+++ opencore/trunk/opencore/nui/pages/projects-searchresults.pt 2007-05-09
22:51:22 UTC (rev 5150)
@@ -28,14 +28,20 @@
Result<tal:plural condition="many">s</tal:plural> <span
tal:replace="start">1</span>
<tal:justone condition="many">– <span
tal:replace="end">10</span></tal:justone>
of <span tal:replace="sequence_length">376</span> sorted by
- <form>
- <select>
- <option value="">relevancy</option>
- <option value="">date updated</option>
- <option value="">date created</option>
- <option value="">project name</option>
- <option value="">member name</option>
+ <form name="projects_sort" action="." tal:attributes="action
string:${context/portal_url}/oc-projects-searchresults">
+ <select name="sort_by" tal:define="sorted_by python:
request.get('sort_by')">
+ <option value="relevancy" tal:attributes="selected python:
sorted_by == 'relevancy'">relevancy</option>
+ <option value="modified" tal:attributes="selected python:
sorted_by == 'modified'">date updated</option>
+ <option value="created" tal:attributes="selected python:
sorted_by == 'created'">date created</option>
+ <option value="Title" tal:attributes="selected python: sorted_by
== 'Title'">project name</option>
+ <option value="Creator" tal:attributes="selected python:
sorted_by == 'Creator'">member name</option>
</select>
+ <input tal:condition="request/projname | nothing" type="hidden"
name="projname"
+ tal:attributes="value request/projname" />
+ <input tal:condition="request/letter_search | nothing"
type="hidden" name="letter_search"
+ tal:attributes="value request/letter_search" />
+ <input tal:condition="request/b_start | nothing" type="hidden"
name="b_start:int"
+ tal:attributes="value request/b_start" />
<input type="submit" value="sort" />
</form>
</div>
--
Archive:
http://www.openplans.org/projects/opencore/lists/openplans-svn/archive/2007/05/1178751112876
To unsubscribe send an email with subject unsubscribe to [EMAIL PROTECTED]
Please contact [EMAIL PROTECTED] for questions.
X-pstn-neptune: 106/67/0.63/57
X-pstn-levels: (S:99.90000/99.90000 R:95.9108 P:95.9108 M:97.0282 C:98.6951
)
X-pstn-settings: 4 (1.5000:1.5000) s gt3 gt2 gt1 r p m c
X-pstn-addresses: from <[EMAIL PROTECTED]> [294/10]