search: Basic search without style or options

This commit is contained in:
Eragon 2023-06-27 23:15:12 +02:00
parent d39067e586
commit b94f4c5944
Signed by: Eragon
GPG Key ID: 087126EBFC725006
4 changed files with 52 additions and 5 deletions

View File

@ -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()])

View File

@ -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)

View File

@ -7,6 +7,7 @@
<h1>Recherche avancée</h1>
<form action="" method="get">
{{ form.csrf_token }}
<div class="query">
{{ form.q.label }}
{{ form.q(value=request.args.get('q')) }}
@ -24,12 +25,13 @@
{{ form.scope(value=request.args.get('scope')) }}
</div>
<div class="submit">{{ form.submit(class_="bg-ok") }}</div>
{{form.errors}}
</form>
</section>
<section class="search-results">
{% for i in results %}
<div>
{{ i }}
{{ i.id }}<br>{{ i.text }}<br>{{ i.thread_id }}
</div>
{% endfor %}
</section>

View File

@ -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);")