diff --git a/app/forms/search.py b/app/forms/search.py index 0ef2ce8..576d8ea 100644 --- a/app/forms/search.py +++ b/app/forms/search.py @@ -7,6 +7,8 @@ from app.models.forum import Forum # TODO: compléter le formulaire de recherche avancée class SearchForm(FlaskForm): + class Meta: + csrf = False q = StringField('Rechercher', validators=[InputRequired()]) diff --git a/app/routes/search.py b/app/routes/search.py index 633edb1..0267c81 100644 --- a/app/routes/search.py +++ b/app/routes/search.py @@ -1,9 +1,18 @@ -from app import app -from app.forms.search import AdvancedSearchForm +from app import app, db +from app.forms.search import AdvancedSearchForm, SearchForm +from app.models.post import Post from app.utils.render import render +from sqlalchemy import text +from flask import request @app.route('/rechercher') def search(): - form = AdvancedSearchForm() - return render('search.html', form=form) + form = AdvancedSearchForm(request.args) + results = list() + if form.validate(): + # Search stuff + req = text("""SELECT id, text, thread_id, ts_rank_cd(textsearch, query) AS rank FROM comment, websearch_to_tsquery_multilang(:keywords) query, to_tsvector_multilang(text) textsearch WHERE query @@ textsearch ORDER BY rank DESC;""") + results = list(db.session.execute(req, {'keywords': '%' + form.q.data + '%'})); + + return render('search.html', form=form, results=results) diff --git a/app/templates/search.html b/app/templates/search.html index 0d57329..79eedb8 100644 --- a/app/templates/search.html +++ b/app/templates/search.html @@ -7,6 +7,7 @@

Recherche avancée

+ {{ form.csrf_token }}
{{ form.q.label }} {{ form.q(value=request.args.get('q')) }} @@ -24,12 +25,13 @@ {{ form.scope(value=request.args.get('scope')) }}
{{ form.submit(class_="bg-ok") }}
+ {{form.errors}}
{% for i in results %}
- {{ i }} + {{ i.id }}
{{ i.text }}
{{ i.thread_id }}
{% endfor %}
diff --git a/migrations/versions/a803745f7840_search_functions.py b/migrations/versions/a803745f7840_search_functions.py new file mode 100644 index 0000000..732a308 --- /dev/null +++ b/migrations/versions/a803745f7840_search_functions.py @@ -0,0 +1,34 @@ +"""Search functions + +Revision ID: a803745f7840 +Revises: 5ffc4e562ed8 +Create Date: 2023-06-27 23:10:06.088917 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'a803745f7840' +down_revision = '5ffc4e562ed8' +branch_labels = None +depends_on = None + + +def upgrade(): + op.execute("""CREATE FUNCTION websearch_to_tsquery_multilang(text) RETURNS tsquery AS $$ +SELECT websearch_to_tsquery('french', $1) || + websearch_to_tsquery('english', $1) || + websearch_to_tsquery('simple', $1) +$$ LANGUAGE sql IMMUTABLE;""") + op.execute("""CREATE FUNCTION to_tsvector_multilang(text) RETURNS tsvector AS $$ +SELECT to_tsvector('french', $1) || + to_tsvector('english', $1) || + to_tsvector('simple', $1) +$$ LANGUAGE sql IMMUTABLE;""") + + +def downgrade(): + op.execute("DROP FUNCTION websearch_to_tsquery_multilang(text);") + op.execute("DROP FUNCTION to_tsvector_multilang(text);")