Esempio n. 1
0
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()
Esempio n. 2
0
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)
Esempio n. 3
0
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,
        ))
Esempio n. 4
0
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
Esempio n. 5
0
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)
Esempio n. 6
0
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)
Esempio n. 7
0
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()
Esempio n. 9
0
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
Esempio n. 10
0
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()
Esempio n. 11
0
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)
Esempio n. 12
0
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)
Esempio n. 13
0
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)
Esempio n. 14
0
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)
Esempio n. 15
0
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
Esempio n. 16
0
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)