]> CRI, Mines Paris - PSL - Plinn.git/blobdiff - Products/Plinn/skins/generic/search.py
Déplacement pour eggification.
[Plinn.git] / Products / Plinn / skins / generic / search.py
diff --git a/Products/Plinn/skins/generic/search.py b/Products/Plinn/skins/generic/search.py
new file mode 100755 (executable)
index 0000000..0d02e57
--- /dev/null
@@ -0,0 +1,144 @@
+##parameters=
+from Products.CMFCore.utils import getToolByName
+from ZTUtils import make_query as mq
+from ZTUtils import make_hidden_input
+from Products.Plinn.utils import translate
+def _(message) : return translate(message, context).encode('utf-8')
+
+utool = getToolByName(context, 'portal_url')
+portal_url = utool()
+ctool = getToolByName(context, 'portal_catalog')
+mtool = getToolByName(context,'portal_membership')
+homeDir = mtool.getHomeFolder(verifyPermission=True)
+options = {}
+indexes = {}
+for i in ctool.indexes() :
+       indexes[i] = True
+hasindex = indexes.has_key
+
+form = context.REQUEST.form
+query = {}
+skip_vars = ['strCreator', 'ajax', 'b_start']
+
+# list typed criterions
+select_vars = ( 'review_state'
+                         , 'Subject'
+                         , 'portal_type'
+                         )
+noFollowVars = []
+
+# first cleaning: remove empty values / dict cast.
+for k, v in form.items() :
+       if not v : continue
+       if k in select_vars :
+               if same_type( v, [] ):
+                       v = filter( None, v )
+               if not v:
+                       continue
+       if hasattr(v, 'has_key') :
+               v = dict(v.items())
+       
+       query[ k ] = v
+
+# simplifications / cleaning again
+if query.has_key('portal_type') :
+       try : query['portal_type'].remove('Member Data')
+       except (ValueError, AttributeError) : pass
+else :
+       query['portal_type'] = context.portal_types.objectIds()
+       noFollowVars.append('portal_type')
+
+# clean parameters that are not indexes
+for k in skip_vars:
+       if query.has_key(k) :
+               del query[k]
+
+# expand creator search item
+if form.has_key('strCreator') and form['strCreator'].strip() :
+       query['listCreators'] = [ m.getId() for m in context.portal_membership.looseSearchMembers(form['strCreator']) ]
+
+# 'mofified' index solving
+if query.has_key('modified') :
+       def resolveDate(modified) :
+               today = context.ZopeTime().earliestTime()
+               dateResolution = {'yesterday'   : (today-1).Date()
+                                               , 'lastWeek'    : (today-7).Date()
+                                               , 'lastMonth'   : (today-31).Date()
+                                               }
+               member = mtool.getAuthenticatedMember()
+               if member :
+                       lastLoginTime = member.getProperty('last_login_time', None)
+                       if lastLoginTime :
+                               dateResolution['lastLogin'] = lastLoginTime
+               return dateResolution.get(modified)
+       
+       date = resolveDate(query['modified'])
+       if date :
+               query['modified'] = {'query':date, 'range':'min'}
+       else :
+               del query['modified']
+
+sort_on = query.get('sort_on', 'fTitle')
+if hasindex(sort_on) :
+       query['sort_on'] = sort_on
+       query['sort_order'] = query.get('sort_order', 'ascending')
+else :
+       if query.has_key('sort_on')             : query.pop('sort_on')
+       if query.has_key('sort_order')  : query.pop('sort_order')       
+
+def makeColumnHeader(indexName) :
+       toggleSortOrder = indexName == sort_on
+       columnQuery = query.copy()
+       for name in noFollowVars :
+               if columnQuery.has_key(name) :
+                       columnQuery.pop(name)
+       columnQuery['sort_on'] = indexName
+       sort_order = query.get('sort_order', 'ascending')
+       if toggleSortOrder :
+               if sort_order == 'ascending' :
+                       sort_order = 'reverse'
+               elif sort_order == 'reverse' :
+                       sort_order = 'ascending'
+       columnQuery['sort_order'] = sort_order
+       url = '%s/search?%s' % (portal_url, mq(**columnQuery))
+       
+       toggleImg = None
+       if toggleSortOrder : # e.g. selected
+               if query['sort_order'] == 'ascending' :
+                       toggleImg = {'src':'%s/arrowUp.gif' % portal_url
+                                               ,'alt' : _('ascending sort')}
+
+               elif query['sort_order'] == 'reverse' :
+                       toggleImg = {'src':'%s/arrowDown.gif' % portal_url
+                                               ,'alt' : _('ascending sort')}
+       return {'url':url, 'img':toggleImg}
+                       
+
+options['makeColumnHeader'] = makeColumnHeader
+results = ctool( **query )
+options['results'] = results
+options['resultsLength'] = len(results)
+if homeDir and results :
+       options['canSaveAsTopic'] = True
+       args = query.copy()
+       for name in noFollowVars :
+               try : args.pop(name)
+               except : pass
+       if form.has_key('modified') :
+               possibleValues = {'yesterday'   : 1
+                                                ,'lastWeek'    : 7
+                                                ,'lastMonth' : 31}
+               value = possibleValues.get(form['modified'])
+               if value :
+                       d = {'critType' : 'Friendly Date Criterion'
+                               ,'value'        : value
+                               ,'operation': 'max'
+                               ,'daterange': 'old'}
+                       args['modified'] = d
+               else :
+                       try : del args['modified']
+                       except KeyError : pass
+       options['queryAsHiddenInputs'] = make_hidden_input(**args)
+else :
+       options['canSaveAsTopic'] = False
+return context.search_results_template(**options)