--- /dev/null
+##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)