def searchResults(self, request={}, validate=True): options = self.getSearchCriterias(request) if validate: queryEmpty = True for key, value in options.items(): if key in ['path', 'meta_type']: # these fields do not count as a real search query # they are always there to filter unwanted results continue if type(value) is unicode and value.strip(): queryEmpty = False break elif type(value) is list: queryEmpty = False break query = options.get('fulltext', '').strip() if query and query[0] in ['?', '*']: raise ValueError( _(u'Search query can not start with wildcard character.')) if queryEmpty: raise ValueError( _(u'You need to fill at least one field in the search form.')) options['publication_status'] = ['public'] catalog = self.get_root().service_catalog try: results = catalog.searchResults(options) except ParseError: raise ValueError( _(u'Search query contains only common or reserved words.')) return results
def searchResults(self, request={}, validate=True): options = self.getSearchCriterias(request) if validate: queryEmpty = True for key, value in options.items(): if key in ['path', 'meta_type']: # these fields do not count as a real search query # they are always there to filter unwanted results continue if type(value) is unicode and value.strip(): queryEmpty = False break elif type(value) is list: queryEmpty = False break query = options.get('fulltext', '').strip() if query and query[0] in ['?', '*']: raise ValueError( _(u'Search query can not start with wildcard character.')) if queryEmpty: raise ValueError( _(u'You need to fill at least one field in the search form.' )) options['publication_status'] = ['public'] catalog = self.get_root().service_catalog try: results = catalog.searchResults(options) except ParseError: raise ValueError( _(u'Search query contains only common or reserved words.')) return results
def save(self): """Store fields values """ # Validate values def validate(prefix, schema): atLeastOneShown = False for field in schema: shown = self.request.get(prefix + field.getName(), False) atLeastOneShown = atLeastOneShown or shown return atLeastOneShown if not validate('show_', self.context.getSearchFields()): self.send_message( _(u'You need to activate at least one search criterion.'), type=u'error') return if not validate('show_result_', self.context.getResultFields()): self.send_message( _(u'You need to display at least one field in the results.'), type=u'error') return for widget in self.widgets: widget.saveWidgetValue() for field in self.context.getSearchFields(): fieldName = field.getName() self.context.shownFields[fieldName] = bool( self.request.form.get('show_' + fieldName, False)) for field in self.context.getResultFields(): fieldName = field.getName() self.context.shownResultsFields[fieldName] = bool( self.request.form.get('show_result_' + fieldName, False)) notify(ObjectModifiedEvent(self.context)) return self.send_message(_(u'Changes saved.'), type=u'feedback')
def update(self): need(self.resources) self.results = [] self.result_widgets = [] self.message = u'' self.batch = u'' # Search for results if 'search_submit' in self.request.form: try: results = self.context.searchResults(self.request) except ValueError as error: self.message = error[0] else: # Filter results on View permission # XXX This could be done more in a more lazy fashion verify = getSecurityManager().checkPermission self.results = batch(filter( lambda b: verify('View', b.getObject()), results), count=20, request=self.request) if self.results: for field in self.context.getPublicResultFields(): widget = getMultiAdapter( (field, self.context, self.request), IResultView) widget.update(self) self.result_widgets.append(widget) self.batch = component.getMultiAdapter( (self.context, self.results, self.request), IBatching)() else: self.message = _(u'No items matched your search.') # Search Widgets self.widgets = [] for field in self.context.getPublicSearchFields(): widget = getMultiAdapter((field, self.context, self.request), ICriterionView) self.widgets.append(widget)
def update(self): need(self.resources) self.results = [] self.result_widgets = [] self.message = u'' self.batch = u'' # Search for results if 'search_submit' in self.request.form: try: results = self.context.searchResults(self.request) except ValueError as error: self.message = error[0] else: # Filter results on View permission # XXX This could be done more in a more lazy fashion verify = getSecurityManager().checkPermission self.results = batch( filter(lambda b: verify('View', b.getObject()), results), count=20, request=self.request) if self.results: for field in self.context.getPublicResultFields(): widget = getMultiAdapter( (field, self.context, self.request), IResultView) widget.update(self) self.result_widgets.append(widget) self.batch = component.getMultiAdapter( (self.context, self.results, self.request), IBatching)() else: self.message = _(u'No items matched your search.') # Search Widgets self.widgets = [] for field in self.context.getPublicSearchFields(): widget = getMultiAdapter(( field, self.context, self.request), ICriterionView) self.widgets.append(widget)
def getTitle(self): return _("full text")
def getDescription(self): return _("Search the full text.")
def getTitle(self): return _("below path")
def getDescription(self): return _("Only search below this content.")
class SilvaFind(Query, Content, SimpleItem): __doc__ = _("""Silva Find is a powerful search feature that allows easy creation of search forms and result pages. Users can add a Find anywhere and define which fields to make searchable by site visitors and/or which fields to limit to a preset value. Users also can determine which fields should be displayed in the search results. All metadata sets/fields are supported.""") security = ClassSecurityInfo() meta_type = "Silva Find" grok.implements(IFind) silvaconf.icon('SilvaFind.png') def __init__(self, id): Content.__init__(self, id) Query.__init__(self) self.shownFields = PersistentMapping() self.shownResultsFields = PersistentMapping() # by default we only show fulltext search # and a couple of resultfields self.shownFields['fulltext'] = True self.shownResultsFields['link'] = True self.shownResultsFields['ranking'] = True self.shownResultsFields['resultcount'] = True self.shownResultsFields['icon'] = True self.shownResultsFields['date'] = True self.shownResultsFields['textsnippet'] = True self.shownResultsFields['thumbnail'] = True self.shownResultsFields['breadcrumbs'] = True # ACCESSORS security.declareProtected(SilvaPermissions.View, 'getPublicResultFields') def getPublicResultFields(self): return filter(lambda field: self.isResultShown(field.getName()), self.getResultFields()) security.declareProtected(SilvaPermissions.View, 'getPublicSearchFields') def getPublicSearchFields(self): return filter(lambda field: self.isCriterionShown(field.getName()), self.getSearchFields()) security.declareProtected(SilvaPermissions.View, 'isCriterionShown') def isCriterionShown(self, fieldName): return self.shownFields.get(fieldName, False) security.declareProtected(SilvaPermissions.View, 'isResultShown') def isResultShown(self, fieldName): return self.shownResultsFields.get(fieldName, False) security.declareProtected(SilvaPermissions.View, 'havePublicSearchFields') def havePublicSearchFields(self): # BBB map(bool) is here for previously non-boolean stored values return reduce(operator.or_, map(bool, self.shownFields.values())) security.declareProtected(SilvaPermissions.View, 'searchResults') def searchResults(self, request={}, validate=True): options = self.getSearchCriterias(request) if validate: queryEmpty = True for key, value in options.items(): if key in ['path', 'meta_type']: # these fields do not count as a real search query # they are always there to filter unwanted results continue if type(value) is unicode and value.strip(): queryEmpty = False break elif type(value) is list: queryEmpty = False break query = options.get('fulltext', '').strip() if query and query[0] in ['?', '*']: raise ValueError( _(u'Search query can not start with wildcard character.')) if queryEmpty: raise ValueError( _(u'You need to fill at least one field in the search form.' )) options['publication_status'] = ['public'] catalog = self.get_root().service_catalog try: results = catalog.searchResults(options) except ParseError: raise ValueError( _(u'Search query contains only common or reserved words.')) return results def getSearchCriterias(self, request): options = {} for field in self.getSearchFields(): name = field.getName() if (self.shownFields.get(name, False) or name == 'path'): queryPart = getMultiAdapter((field, self, request), IQueryPart) value = queryPart.getIndexValue() if value is None: value = '' options[queryPart.getIndexId()] = value return options
def getDescription(self): return _('Search for the selected content types.')
from Products.SilvaFind.results import TotalResultCountField from Products.SilvaFind.criterion import FullTextCriterionField from Products.SilvaFind.criterion import MetatypeCriterionField from Products.SilvaFind.criterion import PathCriterionField from Products.SilvaFind.criterion import AutomaticMetaDataCriterionField globalSearchFields = [ MetatypeCriterionField(), FullTextCriterionField(), AutomaticMetaDataCriterionField(), PathCriterionField(), ] globalResultsFields = [ RankingResultField('', _(u'Ranking'), _(u'Full text result ranking')), TotalResultCountField('', _(u'TotalResultCount'), _(u'Show total number of results')), ResultCountField('', _(u'ResultCount'), _(u'Search result count')), MetatypeResultField('', _(u'Icon'), _(u'Display the icon of the content type.')), LinkResultField('', _(u'Link')), DateResultField('', _(u'Date')), FullTextResultField( '', _(u'Text snippet'), ), ThumbnailResultField('', _(u'Thumbnail')), AutomaticMetaDataResultField(), BreadcrumbsResultField('', _(u'Breadcrumbs')), ]
from Products.SilvaFind.criterion import FullTextCriterionField from Products.SilvaFind.criterion import MetatypeCriterionField from Products.SilvaFind.criterion import PathCriterionField from Products.SilvaFind.criterion import AutomaticMetaDataCriterionField globalSearchFields= [ MetatypeCriterionField(), FullTextCriterionField(), AutomaticMetaDataCriterionField(), PathCriterionField(), ] globalResultsFields = [ RankingResultField('', _(u'Ranking'), _(u'Full text result ranking')), TotalResultCountField('', _(u'TotalResultCount'), _(u'Show total number of results')), ResultCountField('', _(u'ResultCount'), _(u'Search result count')), MetatypeResultField('', _(u'Icon'), _(u'Display the icon of the content type.')), LinkResultField('', _(u'Link')), DateResultField('', _(u'Date')), FullTextResultField('', _(u'Text snippet'),), ThumbnailResultField('', _(u'Thumbnail')), AutomaticMetaDataResultField(), BreadcrumbsResultField('', _(u'Breadcrumbs')), ]