diff --git a/avisstage/documents.py b/avisstage/documents.py
index 75a0aaf..6886073 100644
--- a/avisstage/documents.py
+++ b/avisstage/documents.py
@@ -1,4 +1,5 @@
from django_elasticsearch_dsl import DocType, Index, fields
+from elasticsearch_dsl import analyzer, token_filter, tokenizer
from .models import Stage, AvisStage, AvisLieu
stage = Index('stages')
@@ -6,6 +7,13 @@ stage.settings(
number_of_shards=1,
number_of_replicas=0
)
+
+text_analyzer = analyzer(
+ 'texte',
+ tokenizer="standard",
+ filters=['lowercase', 'standard', 'asciifolding',
+ token_filter("frsnow", type="snowball", language="French")])
+stage.analyzer(text_analyzer)
@stage.doc_type
class StageDocument(DocType):
@@ -27,10 +35,10 @@ class StageDocument(DocType):
]
def prepare_thematiques(self, instance):
- return ", ".join(instance.thematiques.all().values_list("slug", flat=True))
+ return ", ".join(instance.thematiques.all().values_list("name", flat=True))
def prepare_matieres(self, instance):
- return ", ".join(instance.matieres.all().values_list("slug", flat=True))
+ return ", ".join(instance.matieres.all().values_list("nom", flat=True))
def prepare_niveau_scol(self, instance):
return instance.get_niveau_scol_display()
diff --git a/avisstage/templates/avisstage/liste/recherche_resultats.html b/avisstage/templates/avisstage/liste/recherche_resultats.html
new file mode 100644
index 0000000..b1837d4
--- /dev/null
+++ b/avisstage/templates/avisstage/liste/recherche_resultats.html
@@ -0,0 +1,38 @@
+{% extends "avisstage/base.html" %}
+{% load staticfiles %}
+
+{% block title %}Dernières mises à jour - ExperiENS{% endblock %}
+
+{% block content %}
+
+
Résultats de la recherche
+
+
+
+ {% for stage in stages %}
+ {% ifchanged stage.date_maj.date %}- Mis à jour le {{ stage.date_maj.date }}
{% endifchanged %}
+ -
+
+
+
{{ stage.date_debut|date:"d/m" }}{{ stage.date_fin|date:"d/m" }}{{ stage.date_debut|date:"Y" }}
+
+
+
+ - {{ stage.get_type_stage_display }}
+ - {{ stage.structure }}
+ {% for lieu in stage.lieux.all %}- {{ lieu.nom }}
{% endfor %}
+ {% for matiere in stage.matieres.all %}
+ - {{ matiere.nom }}
+ {% endfor %}
+ {% for thematique in stage.thematiques.all %}
+ - {{ thematique.name }}
+ {% endfor %}
+
+
+
+ {% endfor %}
+
+
+{% endblock %}
diff --git a/avisstage/views.py b/avisstage/views.py
index 2e3d5d1..daf4aaf 100644
--- a/avisstage/views.py
+++ b/avisstage/views.py
@@ -14,6 +14,7 @@ from django.db.models import Q
from avisstage.models import Normalien, Stage, Lieu, AvisLieu, AvisStage
from avisstage.forms import StageForm, LieuForm, AvisStageForm, AvisLieuForm, FeedbackForm
+from avisstage.views_search import *
import random, math
@@ -60,11 +61,6 @@ class StageListe(LoginRequiredMixin, ListView):
def get_queryset(self):
return Stage.objects.filter(public=True).order_by('-date_maj')
-# Recherche
-@login_required
-def recherche(request):
- return render(request, 'avisstage/recherche.html')
-
# FAQ
def faq(request):
return render(request, 'avisstage/faq.html')
@@ -140,7 +136,7 @@ def manage_stage(request, pk=None):
{'form': form, 'avis_stage_form': avis_stage_form,
'avis_lieu_formset': avis_lieu_formset,
'creation': pk is None})
-
+
# Ajout d'un lieu de stage
#login_required
diff --git a/avisstage/views_search.py b/avisstage/views_search.py
new file mode 100644
index 0000000..8f97a28
--- /dev/null
+++ b/avisstage/views_search.py
@@ -0,0 +1,34 @@
+# coding: utf-8
+
+from django.shortcuts import render, redirect, get_object_or_404
+from django.contrib.auth.decorators import login_required
+
+from django import forms
+
+from avisstage.documents import StageDocument
+from avisstage.models import Stage
+
+# Recherche
+class SearchForm(forms.Form):
+ generique = forms.CharField()
+
+def cherche(**kwargs):
+ resultat = []
+ if "generique" in kwargs:
+ resultat = StageDocument.search().filter(
+ "match",
+ _all={"query": kwargs["generique"],
+ "fuzziness": "auto"})
+ return Stage.objects.filter(id__in=[s._id for s in resultat], public=True)
+
+@login_required
+def recherche(request):
+ stages = []
+ if request.method == "GET":
+ form = SearchForm(request.GET)
+ if form.is_valid():
+ stages = cherche(**form.cleaned_data)
+ else:
+ form = SearchForm()
+ return render(request, 'avisstage/liste/recherche_resultats.html',
+ {"form": form, "stages":stages})