X-Git-Url: https://scm.cri.minesparis.psl.eu/git/Plinn.git/blobdiff_plain/3c4367d8e03450e9a73e61f4247145d2b6c86a33..959d888c17d1403d2eeecc19bc4b5e2c8d1debf6:/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 index 0000000..0d02e57 --- /dev/null +++ b/Products/Plinn/skins/generic/search.py @@ -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)