Example #1
0
def IdentifiersIndexer(instance):
    """Return a list of unique Identifier strings
    This populates the Identifiers Keyword index, but with some
    replacements to prevent the word-splitter etc from taking effect.
    """
    identifiers = instance.Schema()['Identifiers'].get(instance)
    return [safe_unicode(i['Identifier']) for i in identifiers]
Example #2
0
def IdentifiersIndexer(instance):
    """Return a list of unique Identifier strings
    This populates the Identifiers Keyword index, but with some
    replacements to prevent the word-splitter etc from taking effect.
    """
    identifiers = instance.Schema()['Identifiers'].get(instance)
    return [safe_unicode(i['Identifier']) for i in identifiers]
Example #3
0
def SearchableText(self):
    """This overrides the default method from Archetypes.BaseObject,
    and allows Identifiers field to be included in SearchableText despite
    the field being an incompatible type.
    """
    data = []
    for field in self.Schema().fields():
        if not field.searchable:
            continue
        #### The following is the addition made to the default AT method:
        fieldname = field.getName()
        if IHaveIdentifiers.providedBy(self) and fieldname == 'Identifiers':
            identifiers = self.Schema()['Identifiers'].get(self)
            idents = [safe_unicode(i['Identifier']) for i in identifiers]
            if idents:
                data.extend(idents)
            continue
        ### The code from this point on is lifted directly from BaseObject
        method = field.getIndexAccessor(self)
        try:
            datum = method(mimetype="text/plain")
        except TypeError:
            # Retry in case typeerror was raised because accessor doesn't
            # handle the mimetype argument
            try:
                datum = method()
            except (ConflictError, KeyboardInterrupt):
                raise
            except:
                continue
        if datum:
            vocab = field.Vocabulary(self)
            if isinstance(datum, (list, tuple)):
                #  Unmangle vocabulary: we index key AND value
                vocab_values = map(
                    lambda value, vocab=vocab: vocab.getValue(value, ''),
                    datum)
                datum = list(datum)
                datum.extend(vocab_values)
                datum = ' '.join(datum)
            elif isinstance(datum, basestring):
                if isinstance(datum, unicode):
                    datum = datum.encode('utf-8')
                value = vocab.getValue(datum, '')
                if isinstance(value, unicode):
                    value = value.encode('utf-8')
                datum = "%s %s" % (
                    datum,
                    value,
                )

            if isinstance(datum, unicode):
                datum = datum.encode('utf-8')
            data.append(str(datum))

    data = ' '.join(data)
    return data
Example #4
0
def SearchableText(self):
    """This overrides the default method from Archetypes.BaseObject,
    and allows Identifiers field to be included in SearchableText despite
    the field being an incompatible type.
    """
    data = []
    for field in self.Schema().fields():
        if not field.searchable:
            continue
        #### The following is the addition made to the default AT method:
        fieldname = field.getName()
        if IHaveIdentifiers.providedBy(self) and fieldname == 'Identifiers':
            identifiers = self.Schema()['Identifiers'].get(self)
            idents = [safe_unicode(i['Identifier']) for i in identifiers]
            if idents:
                data.extend(idents)
            continue
        ### The code from this point on is lifted directly from BaseObject
        method = field.getIndexAccessor(self)
        try:
            datum = method(mimetype="text/plain")
        except TypeError:
            # Retry in case typeerror was raised because accessor doesn't
            # handle the mimetype argument
            try:
                datum = method()
            except (ConflictError, KeyboardInterrupt):
                raise
            except:
                continue
        if datum:
            vocab = field.Vocabulary(self)
            if isinstance(datum, (list, tuple)):
                #  Unmangle vocabulary: we index key AND value
                vocab_values = map(
                    lambda value, vocab=vocab: vocab.getValue(value, ''),
                    datum)
                datum = list(datum)
                datum.extend(vocab_values)
                datum = ' '.join(datum)
            elif isinstance(datum, basestring):
                if isinstance(datum, unicode):
                    datum = datum.encode('utf-8')
                value = vocab.getValue(datum, '')
                if isinstance(value, unicode):
                    value = value.encode('utf-8')
                datum = "%s %s" % (datum, value,)

            if isinstance(datum, unicode):
                datum = datum.encode('utf-8')
            data.append(str(datum))

    data = ' '.join(data)
    return data