mirror of
https://gitlab.com/animath/si/plateforme-corres2math.git
synced 2025-02-11 11:41:19 +00:00
Use Django-Haystack to make indexed researches
This commit is contained in:
parent
b397d00011
commit
6c59bf11be
@ -1,5 +1,7 @@
|
|||||||
import re
|
import re
|
||||||
|
|
||||||
|
from django.urls import reverse_lazy
|
||||||
|
|
||||||
from corres2math.lists import get_sympa_client
|
from corres2math.lists import get_sympa_client
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
from django.core.validators import RegexValidator
|
from django.core.validators import RegexValidator
|
||||||
@ -56,6 +58,9 @@ class Team(models.Model):
|
|||||||
|
|
||||||
return super().save(*args, **kwargs)
|
return super().save(*args, **kwargs)
|
||||||
|
|
||||||
|
def get_absolute_url(self):
|
||||||
|
return reverse_lazy("participation:team_detail", args=(self.pk,))
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return _("Team {name} ({trigram})").format(name=self.name, trigram=self.trigram)
|
return _("Team {name} ({trigram})").format(name=self.name, trigram=self.trigram)
|
||||||
|
|
||||||
@ -115,6 +120,9 @@ class Participation(models.Model):
|
|||||||
verbose_name=_("synthesis video"),
|
verbose_name=_("synthesis video"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def get_absolute_url(self):
|
||||||
|
return reverse_lazy("participation:team_detail", args=(self.pk,))
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return _("Participation of the team {name} ({trigram})").format(name=self.team.name, trigram=self.team.trigram)
|
return _("Participation of the team {name} ({trigram})").format(name=self.team.name, trigram=self.team.trigram)
|
||||||
|
|
||||||
|
18
apps/participation/search_indexes.py
Normal file
18
apps/participation/search_indexes.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
from haystack import indexes
|
||||||
|
|
||||||
|
from .models import Participation, Team, Video
|
||||||
|
|
||||||
|
|
||||||
|
class TeamIndex(indexes.SearchIndex, indexes.Indexable):
|
||||||
|
text = indexes.CharField(document=True, model_attr="name")
|
||||||
|
trigram = indexes.CharField(model_attr="trigram")
|
||||||
|
|
||||||
|
def get_model(self):
|
||||||
|
return Team
|
||||||
|
|
||||||
|
|
||||||
|
class ParticipationIndex(indexes.SearchIndex, indexes.Indexable):
|
||||||
|
text = indexes.CharField(document=True, model_attr="team__trigram")
|
||||||
|
|
||||||
|
def get_model(self):
|
||||||
|
return Participation
|
13
apps/registration/search_indexes.py
Normal file
13
apps/registration/search_indexes.py
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
from haystack import indexes
|
||||||
|
|
||||||
|
from .models import Registration
|
||||||
|
|
||||||
|
|
||||||
|
class RegistrationIndex(indexes.SearchIndex, indexes.Indexable):
|
||||||
|
text = indexes.CharField(document=True, model_attr="user__username")
|
||||||
|
last_name = indexes.CharField(model_attr="user__last_name")
|
||||||
|
first_name = indexes.CharField(model_attr="user__first_name")
|
||||||
|
email = indexes.CharField(model_attr="user__email")
|
||||||
|
|
||||||
|
def get_model(self):
|
||||||
|
return Registration
|
@ -54,6 +54,7 @@ INSTALLED_APPS = [
|
|||||||
'crispy_forms',
|
'crispy_forms',
|
||||||
'django_extensions',
|
'django_extensions',
|
||||||
'django_tables2',
|
'django_tables2',
|
||||||
|
'haystack',
|
||||||
'logs',
|
'logs',
|
||||||
'mailer',
|
'mailer',
|
||||||
'polymorphic',
|
'polymorphic',
|
||||||
@ -181,6 +182,13 @@ CRISPY_TEMPLATE_PACK = 'bootstrap4'
|
|||||||
|
|
||||||
DJANGO_TABLES2_TEMPLATE = 'django_tables2/bootstrap4.html'
|
DJANGO_TABLES2_TEMPLATE = 'django_tables2/bootstrap4.html'
|
||||||
|
|
||||||
|
HAYSTACK_CONNECTIONS = {
|
||||||
|
'default': {
|
||||||
|
'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
|
||||||
|
'PATH': os.path.join(os.path.dirname(__file__), 'whoosh_index'),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_db_type = os.getenv('DJANGO_DB_TYPE', 'sqlite').lower()
|
_db_type = os.getenv('DJANGO_DB_TYPE', 'sqlite').lower()
|
||||||
|
|
||||||
if _db_type == 'mysql' or _db_type.startswith('postgres') or _db_type == 'psql':
|
if _db_type == 'mysql' or _db_type.startswith('postgres') or _db_type == 'psql':
|
||||||
|
@ -26,6 +26,7 @@ urlpatterns = [
|
|||||||
path('admin/doc/', include('django.contrib.admindocs.urls')),
|
path('admin/doc/', include('django.contrib.admindocs.urls')),
|
||||||
path('admin/', admin.site.urls, name="admin"),
|
path('admin/', admin.site.urls, name="admin"),
|
||||||
path('accounts/', include('django.contrib.auth.urls')),
|
path('accounts/', include('django.contrib.auth.urls')),
|
||||||
|
path('search/', include('haystack.urls')),
|
||||||
|
|
||||||
path('api/', include('api.urls')),
|
path('api/', include('api.urls')),
|
||||||
path('participation/', include('participation.urls')),
|
path('participation/', include('participation.urls')),
|
||||||
|
@ -3,6 +3,7 @@ django-bootstrap-datepicker-plus
|
|||||||
django-crispy-forms
|
django-crispy-forms
|
||||||
django-extensions
|
django-extensions
|
||||||
django-filter
|
django-filter
|
||||||
|
django-haystack
|
||||||
django-mailer
|
django-mailer
|
||||||
django-polymorphic
|
django-polymorphic
|
||||||
django-tables2
|
django-tables2
|
||||||
@ -10,4 +11,5 @@ djangorestframework
|
|||||||
django-rest-polymorphic
|
django-rest-polymorphic
|
||||||
ptpython
|
ptpython
|
||||||
python-magic
|
python-magic
|
||||||
gunicorn
|
gunicorn
|
||||||
|
whoosh
|
39
templates/search/search.html
Normal file
39
templates/search/search.html
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h2>Search</h2>
|
||||||
|
|
||||||
|
<form method="get" action=".">
|
||||||
|
<table>
|
||||||
|
{{ form.as_table }}
|
||||||
|
<tr>
|
||||||
|
<td> </td>
|
||||||
|
<td>
|
||||||
|
<input type="submit" value="Search">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
{% if query %}
|
||||||
|
<h3>Results</h3>
|
||||||
|
|
||||||
|
{% for result in page.object_list %}
|
||||||
|
<p>
|
||||||
|
<a href="{{ result.object.get_absolute_url }}">{{ result.text }}</a>
|
||||||
|
</p>
|
||||||
|
{% empty %}
|
||||||
|
<p>No results found.</p>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% if page.has_previous or page.has_next %}
|
||||||
|
<div>
|
||||||
|
{% if page.has_previous %}<a href="?q={{ query }}&page={{ page.previous_page_number }}">{% endif %}« Previous{% if page.has_previous %}</a>{% endif %}
|
||||||
|
|
|
||||||
|
{% if page.has_next %}<a href="?q={{ query }}&page={{ page.next_page_number }}">{% endif %}Next »{% if page.has_next %}</a>{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
{# Show some example queries to run, maybe query syntax, something else? #}
|
||||||
|
{% endif %}
|
||||||
|
</form>
|
||||||
|
{% endblock %}
|
Loading…
x
Reference in New Issue
Block a user