From 061320a5df07802d5be8cd3eb41453067014ffeb Mon Sep 17 00:00:00 2001 From: Bartuccio Antoine Date: Tue, 18 Jun 2019 21:41:11 +0200 Subject: [PATCH] pedagogy: search index for uvs and search api --- pedagogy/search_indexes.py | 58 +++++++++++++++++++ .../search/indexes/pedagogy/uv_auto.txt | 2 + .../search/indexes/pedagogy/uv_text.txt | 2 + pedagogy/views.py | 24 ++++++++ 4 files changed, 86 insertions(+) create mode 100644 pedagogy/search_indexes.py create mode 100644 pedagogy/templates/search/indexes/pedagogy/uv_auto.txt create mode 100644 pedagogy/templates/search/indexes/pedagogy/uv_text.txt diff --git a/pedagogy/search_indexes.py b/pedagogy/search_indexes.py new file mode 100644 index 00000000..604987d4 --- /dev/null +++ b/pedagogy/search_indexes.py @@ -0,0 +1,58 @@ +# -*- coding:utf-8 -* +# +# Copyright 2017 +# - Sli +# +# Ce fichier fait partie du site de l'Association des Étudiants de l'UTBM, +# http://ae.utbm.fr. +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License a published by the Free Software +# Foundation; either version 3 of the License, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Sofware Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA. +# +# + +from django.db import models + +from haystack import indexes, signals + +from core.search_indexes import BigCharFieldIndex +from pedagogy.models import UV + + +class IndexSignalProcessor(signals.BaseSignalProcessor): + """ + Auto update index on CRUD operations + """ + + def setup(self): + # Listen only to the ``UV`` model. + models.signals.post_save.connect(self.handle_save, sender=UV) + models.signals.post_delete.connect(self.handle_delete, sender=UV) + + def teardown(self): + # Disconnect only to the ``UV`` model. + models.signals.post_save.disconnect(self.handle_save, sender=UV) + models.signals.post_delete.disconnect(self.handle_delete, sender=UV) + + +class UVIndex(indexes.SearchIndex, indexes.Indexable): + """ + Indexer class for UVs + """ + + text = BigCharFieldIndex(document=True, use_template=True) + auto = indexes.EdgeNgramField(use_template=True) + + def get_model(self): + return UV diff --git a/pedagogy/templates/search/indexes/pedagogy/uv_auto.txt b/pedagogy/templates/search/indexes/pedagogy/uv_auto.txt new file mode 100644 index 00000000..9472642f --- /dev/null +++ b/pedagogy/templates/search/indexes/pedagogy/uv_auto.txt @@ -0,0 +1,2 @@ +{{ object.code }} +{{ object.manager }} \ No newline at end of file diff --git a/pedagogy/templates/search/indexes/pedagogy/uv_text.txt b/pedagogy/templates/search/indexes/pedagogy/uv_text.txt new file mode 100644 index 00000000..0bd9adb6 --- /dev/null +++ b/pedagogy/templates/search/indexes/pedagogy/uv_text.txt @@ -0,0 +1,2 @@ +{{ object.code }} +{{ object.manager }} diff --git a/pedagogy/views.py b/pedagogy/views.py index 38309a56..234e12b7 100644 --- a/pedagogy/views.py +++ b/pedagogy/views.py @@ -32,6 +32,7 @@ from django.views.generic import ( View, ) from django.core.urlresolvers import reverse_lazy +from django.utils import html from core.views import ( DetailFormView, @@ -41,6 +42,8 @@ from core.views import ( CanEditPropMixin, ) +from haystack.query import SearchQuerySet + from pedagogy.forms import UVForm, UVCommentForm from pedagogy.models import UV, UVComment @@ -144,6 +147,27 @@ class UVListView(CanViewMixin, CanCreateUVFunctionMixin, ListView): ordering = ["code"] template_name = "pedagogy/guide.jinja" + def get_queryset(self): + query = self.request.GET.get("query", None) + + if not query: + return super(UVListView, self).get_queryset() + + try: + queryset = ( + SearchQuerySet() + .models(self.model) + .autocomplete(auto=html.escape(query)) + ) + except TypeError: + return self.model.objects.none() + + return ( + super(UVListView, self) + .get_queryset() + .filter(id__in=([o.object.id for o in queryset])) + ) + class UVCommentReportCreateView(CreateView): """