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">&ndash; <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] 

Reply via email to