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]
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
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