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
Exemple #2
0
    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
Exemple #3
0
    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 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')
Exemple #5
0
    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.")
 def getDescription(self):
     return _("Only search below this content.")
Exemple #12
0
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 getTitle(self):
     return _("full text")
 def getTitle(self):
     return _("below path")
 def getDescription(self):
     return _('Search for the selected content types.')
 def getDescription(self):
     return _("Search the full text.")
 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')),
    ]