class PeopleIndex(get_index_base()): haystack_use_for_indexing = getattr(settings, "ALDRYN_PEOPLE_SEARCH", True) INDEX_TITLE = True def get_title(self, obj): return obj.name def get_description(self, obj): return obj.description def get_index_kwargs(self, language): return {'translations__language_code': language} def get_index_queryset(self, language): return self.get_model().objects.active_translations( language_code=language).translated(language) def get_model(self): return Person def get_search_data(self, obj, language, request): with switch_language(obj, language): description = self.get_description(obj) return strip_tags(description).strip()
class BlogIndex(get_index_base()): haystack_use_for_indexing = settings.ALDRYN_BLOG_SEARCH INDEX_TITLE = True def get_title(self, obj): return obj.title def get_description(self, obj): return obj.lead_in def get_language(self, obj): return obj.language def prepare_pub_date(self, obj): return obj.publication_start def get_index_queryset(self, language): queryset = self.get_model().published.all() return queryset.filter(Q(language=language) | Q(language__isnull=True)) def get_model(self): return Post def get_search_data(self, obj, language, request): lead_in = self.get_description(obj) text_bits = [strip_tags(lead_in)] plugins = obj.content.cmsplugin_set.filter(language=language) for base_plugin in plugins: instance, plugin_type = base_plugin.get_plugin_instance() if not instance is None: content = strip_tags( instance.render_plugin(context=RequestContext(request))) text_bits.append(content) return ' '.join(text_bits)
class ServiceIndex(get_index_base()): haystack_use_for_indexing = True index_title = True @staticmethod def get_title(obj): return obj.name @staticmethod def get_index_queryset(language): # For this language's index, don't include services with no name # provided in this language. return Service.objects.filter(status=Service.STATUS_CURRENT).exclude(**{ 'name_%s' % language: '' }) @staticmethod def get_model(): return Service @staticmethod def get_search_data(service, language, request): description = getattr(service, 'description_%s' % language, '') additional_info = getattr(service, 'additional_info_%s' % language, '') return ' '.join(( service.provider.name, service.name, service.area_of_service.name, description, additional_info, service.type.name, ))
class ArticleIndex(get_index_base()): haystack_use_for_indexing = True index_title = True def get_title(self, obj): return obj.safe_translation_getter('title') def get_description(self, obj): return obj.safe_translation_getter('lead_in') def index_queryset(self, using=None): self._get_backend(using) language = self.get_current_language(using) filter_kwargs = self.get_index_kwargs(language) qs = self.get_index_queryset(language) if filter_kwargs: return qs.translated(language, **filter_kwargs) return qs def get_index_queryset(self, language): return self.get_model().objects.published().active_translations( language_code=language).filter(app_config__search_indexed=True) def get_model(self): return Article def get_search_data(self, article, language, request): if not article.search_data: article.search_data = article.get_search_data(language, request) article.save() return article.search_data
class JobOpeningsIndex(get_index_base()): haystack_use_for_indexing = getattr(settings, "ALDRYN_JOBS_SEARCH", True) INDEX_TITLE = True def prepare_pub_date(self, obj): return obj.publication_start def get_title(self, obj): return obj.title def get_index_kwargs(self, language): return {'translations__language_code': language} def get_index_queryset(self, language): return self.get_model().objects.active() def get_model(self): return JobOpening def get_search_data(self, obj, language, request): text_bits = [strip_tags(obj.lead_in)] plugins = obj.content.cmsplugin_set.filter(language=language) for base_plugin in plugins: instance, plugin_type = base_plugin.get_plugin_instance() if instance is not None: plugin_content = strip_tags( instance.render_plugin(context=RequestContext(request))) text_bits.append(plugin_content) return ' '.join(text_bits)
class QuestionIndex(get_index_base()): haystack_use_for_indexing = getattr( settings, "ALDRYN_FAQ_QUESTION_SEARCH", True) index_title = True def get_title(self, obj): with switch_language(obj): return obj.safe_translation_getter('title') def get_index_queryset(self, language): questions = self.get_model().objects.language(language) return questions.active_translations(language) def get_model(self): return Question def get_search_data(self, obj, language, request): with switch_language(obj, language): context = RequestContext(request) text_bits = [ strip_tags(obj.safe_translation_getter('title') or ''), strip_tags(obj.safe_translation_getter('answer_text') or '') ] plugins = obj.answer.cmsplugin_set.filter(language=language) for base_plugin in plugins: instance, plugin_type = base_plugin.get_plugin_instance() if instance is not None: plugin_content = strip_tags( instance.render_plugin(context=context) ) text_bits.append(plugin_content) return ' '.join(text_bits)
class CategoryIndex(get_index_base()): haystack_use_for_indexing = getattr(settings, "ALDRYN_FAQ_CATEGORY_SEARCH", True) index_title = True def get_title(self, obj): with switch_language(obj): return obj.safe_translation_getter('name') def get_index_queryset(self, language): categories = self.get_model().objects.language( language).active_translations(language) return categories def get_model(self): return Category def get_search_data(self, obj, language, request): with switch_language(obj): return strip_tags(obj.safe_translation_getter('name')) def get_index_kwargs(self, language): return {'translations__language_code': language} def get_language(self, obj): if hasattr(obj, 'language_code'): return obj.language_code return None
class ArticleIndex(get_index_base()): haystack_use_for_indexing = getattr( settings, 'ALDRYN_NEWSBLOG_SEARCH', True) index_title = True def get_language(self, obj): return getattr(obj, '_current_language', None) def get_title(self, obj): return obj.title def get_url(self, obj): using = getattr(self, '_backend_alias', DEFAULT_ALIAS) language = self.get_current_language(using=using, obj=obj) return obj.get_absolute_url(language) def get_description(self, obj): return obj.lead_in def get_index_kwargs(self, language): """ This is called to filter the index queryset. """ site = Site.objects.get_current() pages_with_app = Page.objects.filter( application_urls='NewsBlogApp', publisher_is_draft=False, ) if LooseVersion(cms.__version__) < LooseVersion('3.5'): pages_with_app = pages_with_app.filter(site=site) else: # django CMS >= 3.5 pages_with_app = pages_with_app.filter(node__site=site) namespaces = pages_with_app.values_list('application_namespace', flat=True) kwargs = { 'app_config__namespace__in': namespaces, 'app_config__search_indexed': True, 'translations__language_code': language, } return kwargs def get_index_queryset(self, language): queryset = super(ArticleIndex, self).get_index_queryset(language) return queryset.published().exclude(catagories__translations__slug__contains='price-analysis').language(language) def get_model(self): return Article def get_search_data(self, article, language, request): return article.search_data def should_update(self, instance, **kwargs): using = getattr(self, '_backend_alias', DEFAULT_ALIAS) language = self.get_current_language(using=using, obj=instance) translations = instance.get_available_languages() return translations.filter(language_code=language).exists()
class EventsIndex(get_index_base()): haystack_use_for_indexing = getattr(settings, "ALDRYN_EVENTS_SEARCH", True) index_title = True def prepare_pub_date(self, obj): return obj.publish_at def get_description(self, obj): with switch_language(obj): return obj.safe_translation_getter('short_description') def get_title(self, obj): with switch_language(obj): return obj.safe_translation_getter('title') def get_url(self, obj): return obj.get_absolute_url() def get_index_kwargs(self, language): return {'translations__language_code': language} def get_index_queryset(self, language): return (self.get_model().objects.published().language( language).active_translations(language)) def get_model(self): return Event def get_search_data(self, obj, language, request): description = self.get_description(obj) or '' text_bits = [strip_tags(description)] plugins = obj.description.cmsplugin_set.filter(language=language) for base_plugin in plugins: try: instance, plugin_type = base_plugin.get_plugin_instance() if instance is not None: content = strip_tags( instance.render_plugin( context=RequestContext(request))) text_bits.append(content) except Exception: # avoid that bad plugins breaks entire indexer # TODO: logging pass return ' '.join(text_bits) def get_language(self, obj): if hasattr(obj, 'language_code'): return obj.language_code return None
class EventIndex(get_index_base()): haystack_use_for_indexing = getattr( settings, 'EVENTS_SEARCH', True) index_title = True def get_language(self, obj): return getattr(obj, '_current_language', None) def get_title(self, obj): return obj.title def get_url(self, obj): using = getattr(self, '_backend_alias', DEFAULT_ALIAS) language = self.get_current_language(using=using, obj=obj) return obj.get_absolute_url(language) def get_description(self, obj): return obj.lead_in def get_index_kwargs(self, language): """ This is called to filter the index queryset. """ kwargs = { 'app_config__search_indexed': True, 'translations__language_code': language, } return kwargs def get_index_queryset(self, language): queryset = super(EventIndex, self).get_index_queryset(language) return queryset.published().language(language) def get_model(self): return Event def get_search_data(self, event, language, request): return event.search_data def should_update(self, instance, **kwargs): using = getattr(self, '_backend_alias', DEFAULT_ALIAS) language = self.get_current_language(using=using, obj=instance) translations = instance.get_available_languages() return translations.filter(language_code=language).exists()
class JobOpeningsIndex(get_index_base()): haystack_use_for_indexing = getattr(settings, "ALDRYN_JOBS_SEARCH", True) INDEX_TITLE = True def prepare_pub_date(self, obj): return obj.publication_start def get_title(self, obj): return obj.title def get_index_kwargs(self, language): return {'translations__language_code': language} def get_index_queryset(self, language): return self.get_model().objects.active() def get_model(self): return JobOpening def get_search_data(self, obj, language, request): return obj.get_search_data(language=language, request=request)
class ArticleIndex(get_index_base()): haystack_use_for_indexing = getattr(settings, "ALDRYN_NEWSBLOG_SEARCH", True) index_title = True def get_title(self, obj): return obj.safe_translation_getter('title') def get_description(self, obj): return obj.safe_translation_getter('lead_in') def index_queryset(self, using=None): self._get_backend(using) language = self.get_current_language(using) filter_kwargs = self.get_index_kwargs(language) qs = self.get_index_queryset(language) if filter_kwargs: return qs.translated(language, **filter_kwargs) return qs def get_index_queryset(self, language): return self.get_model().objects.active_translations( language_code=language) def get_model(self): return Article def get_search_data(self, obj, language, request): description = self.get_description(obj) text_bits = [strip_tags(description)] for category in obj.categories.all(): text_bits.append(force_text(category.safe_translation_getter('name'))) for tag in obj.tags.all(): text_bits.append(force_text(tag.name)) if obj.content: for base_plugin in obj.content.cmsplugin_set.filter(language=language): plugin_text_content = ' '.join(get_plugin_index_data(base_plugin, request)) text_bits.append(plugin_text_content) return ' '.join(text_bits)
class DoctorsIndex(get_index_base()): haystack_use_for_indexing = getattr(settings, "NNUH_DOCTORS_SEARCH", True) INDEX_TITLE = True def get_title(self, obj): return obj.name # def get_description(self, obj): # return gettext('NNUH Doctor') def get_index_kwargs(self, language): return {'translations__language_code': language} def get_index_queryset(self, language): return super(DoctorsIndex, self).get_index_queryset(language).language(language) # return self.get_model().objects.active_translations( # language_code=language).translated(language) def get_model(self): return Doctor def get_search_data(self, obj, language, request): text_bits = [] text_bits.append(obj.name) if obj.speciality: text_bits.append(obj.speciality) if obj.sub_speciality: text_bits.append(obj.sub_speciality) if obj.function: text_bits.append(obj.function) if obj.phone: text_bits.append(obj.phone) if obj.mobile: text_bits.append(obj.mobile) if obj.website: text_bits.append(obj.website) if obj.email: text_bits.append(obj.email) if obj.section: text_bits.append(obj.section.title) placeholders = [ obj.content, obj.content_bottom, obj.sidebar, obj.sidebar_bottom ] plugins = CMSPlugin.objects.filter(language=language).filter( placeholder__in=placeholders) for base_plugin in plugins: plugin_text_content = self.get_plugin_search_text( base_plugin, request) text_bits.append(plugin_text_content) return clean_join(' ', text_bits) def get_plugin_search_text(self, base_plugin, request): plugin_content_bits = get_plugin_index_data(base_plugin, request) return clean_join(' ', plugin_content_bits)
class PostIndex(get_index_base()): haystack_use_for_indexing = get_setting('ENABLE_SEARCH') index_title = True author = indexes.CharField(indexed=True, model_attr='get_author') keywords = indexes.CharField(null=True) tags = indexes.CharField(null=True, model_attr='get_tags') post_text = indexes.CharField(null=True) def get_title(self, post): return post.get_title() def get_description(self, post): return post.get_description() def prepare_pub_date(self, post): return post.date_published def index_queryset(self, using=None): self._get_backend(using) language = self.get_current_language(using) filter_kwargs = self.get_index_kwargs(language) qs = self.get_index_queryset(language) if filter_kwargs: return qs.translated(language, **filter_kwargs) return qs def get_index_queryset(self, language): return self.get_model().objects.published().active_translations( language_code=language) def get_model(self): return Post def get_search_data(self, post, language, request): with switch_language(post, language): description = post.get_description() abstract = strip_tags(post.safe_translation_getter('abstract', default='')) keywords = post.get_keywords() text_bits = [] if abstract: text_bits.append(abstract) if description: text_bits.append(description) if keywords: text_bits.append(' '.join(keywords)) self.prepared_data['keywords'] = ','.join(keywords) for category in post.categories.all(): text_bits.append( force_text(category.safe_translation_getter('name'))) for tag in post.tags.all(): text_bits.append(force_text(tag.name)) if get_setting('USE_PLACEHOLDER'): plugins = post.content.cmsplugin_set.filter(language=language) content_bits = [] for base_plugin in plugins: content = get_plugin_index_data(base_plugin, request) content_bits.append(' '.join(content)) post_text = ' '.join(content_bits) else: post_text = post.safe_translation_getter('post_text') if post_text: post_text = strip_tags(post_text) self.prepared_data['post_text'] = post_text text_bits.append(post_text) return ' '.join(text_bits)
class TitleIndex(get_index_base()): index_title = True object_actions = ('publish', 'unpublish') haystack_use_for_indexing = settings.CMS_ARTICLES_USE_HAYSTACK def prepare_pub_date(self, obj): return obj.article.publication_date def prepare_login_required(self, obj): return obj.article.login_required def prepare_site_id(self, obj): return obj.article.tree.node.site_id def get_language(self, obj): return obj.language def get_url(self, obj): return obj.article.get_absolute_url() def get_title(self, obj): return obj.title def get_description(self, obj): return obj.meta_description or None def get_plugin_queryset(self, language): queryset = CMSPlugin.objects.filter(language=language) return queryset def get_article_placeholders(self, article): """ In the project settings set up the variable CMS_ARTICLES_PLACEHOLDERS_SEARCH_LIST = { 'include': [ 'slot1', 'slot2', etc. ], 'exclude': [ 'slot3', 'slot4', etc. ], } or leave it empty CMS_ARTICLES_PLACEHOLDERS_SEARCH_LIST = {} """ placeholders_search_list = getattr( settings, 'CMS_ARTICLES_PLACEHOLDERS_SEARCH_LIST', {}) included = placeholders_search_list.get('include', []) excluded = placeholders_search_list.get('exclude', []) diff = set(included) - set(excluded) if diff: return article.placeholders.filter(slot__in=diff) elif excluded: return article.placeholders.exclude(slot__in=excluded) else: return article.placeholders.all() def get_search_data(self, obj, language, request): current_article = obj.article placeholders = self.get_article_placeholders(current_article) plugins = self.get_plugin_queryset(language).filter( placeholder__in=placeholders) text_bits = [] for base_plugin in plugins: plugin_text_content = self.get_plugin_search_text( base_plugin, request) text_bits.append(plugin_text_content) article_meta_description = current_article.get_meta_description( fallback=False, language=language) if article_meta_description: text_bits.append(article_meta_description) article_meta_keywords = getattr(current_article, 'get_meta_keywords', None) if callable(article_meta_keywords): text_bits.append(article_meta_keywords()) return clean_join(' ', text_bits) def get_plugin_search_text(self, base_plugin, request): plugin_content_bits = get_plugin_index_data(base_plugin, request) return clean_join(' ', plugin_content_bits) def get_model(self): return Title def get_index_queryset(self, language): queryset = Title.objects.public().filter( Q(article__publication_date__lt=timezone.now()) | Q(article__publication_date__isnull=True), Q(article__publication_end_date__gte=timezone.now()) | Q(article__publication_end_date__isnull=True), language=language).select_related('article').distinct() return queryset def should_update(self, instance, **kwargs): # We use the action flag to prevent # updating the cms article on save. return kwargs.get('object_action') in self.object_actions
class PostIndex(get_index_base()): haystack_use_for_indexing = get_setting('ENABLE_SEARCH') index_title = True author = indexes.CharField(indexed=True, model_attr='get_author') keywords = indexes.CharField(null=True) tags = indexes.CharField(null=True) post_text = indexes.CharField(null=True) def get_keywords(self, post): return ','.join(post.get_keywords()) def get_title(self, post): return post.safe_translation_getter('title') def get_description(self, post): return post.get_description() def prepare_pub_date(self, post): return post.date_published.strftime("%Y-%m-%d %H:%M:%S") def index_queryset(self, using=None): self._get_backend(using) language = self.get_current_language(using) filter_kwargs = self.get_index_kwargs(language) qs = self.get_index_queryset(language) if filter_kwargs: return qs.translated(language, **filter_kwargs) return qs def get_index_queryset(self, language): return self.get_model().objects.published().active_translations( language_code=language) def get_model(self): return Post def get_search_data(self, post, language, request): optional_attributes = [] abstract = post.safe_translation_getter('abstract') text_bits = [post.get_title()] text_bits.append(strip_tags(abstract)) text_bits.append(post.get_description()) text_bits.append(' '.join(post.get_keywords())) for category in post.categories.all(): text_bits.append( force_text(category.safe_translation_getter('name'))) for tag in post.tags.all(): text_bits.append(force_text(tag.name)) if post.content: plugins = post.content.cmsplugin_set.filter(language=language) for base_plugin in plugins: content = get_plugin_index_data(base_plugin, request) text_bits.append(' '.join(content)) for attribute in optional_attributes: value = force_text(getattr(post, attribute)) if value and value not in text_bits: text_bits.append(value) return ' '.join(text_bits) def prepare_fields(self, post, language, request): super(PostIndex, self).prepare_fields(post, language, request) data = [self.prepared_data['text']] self.prepared_data['keywords'] = ' '.join(post.get_keywords()) self.prepared_data['tags'] = ' '.join(post.get_tags()) self.prepared_data['post_text'] = ' '.join(post.safe_translation_getter('post_text')) self.prepared_data['text'] = ' '.join(data)