2023-06-27 23:15:12 +02:00
|
|
|
from app import app, db
|
|
|
|
from app.forms.search import AdvancedSearchForm, SearchForm
|
|
|
|
from app.models.post import Post
|
2023-08-08 23:10:06 +02:00
|
|
|
from app.models.comment import Comment
|
|
|
|
from app.models.topic import Topic
|
|
|
|
from app.models.forum import Forum
|
2019-02-03 16:20:05 +01:00
|
|
|
from app.utils.render import render
|
2023-08-08 23:10:06 +02:00
|
|
|
from sqlalchemy import text, func
|
2023-06-27 23:15:12 +02:00
|
|
|
from flask import request
|
2023-08-09 18:26:38 +02:00
|
|
|
from flask_sqlalchemy import Pagination
|
2019-02-03 16:20:05 +01:00
|
|
|
|
2019-06-05 11:35:54 +02:00
|
|
|
|
2023-08-09 18:26:38 +02:00
|
|
|
SEARCH_RESULTS_PER_PAGE = 20
|
|
|
|
|
|
|
|
def paginate(data, page, per_page):
|
|
|
|
# Based on page and per_page info, calculate start and end index of items to keep
|
|
|
|
start_index = (page - 1) * per_page
|
|
|
|
end_index = start_index + per_page
|
|
|
|
|
|
|
|
# Get the paginated list of items
|
|
|
|
items = data[start_index:end_index]
|
|
|
|
|
|
|
|
# Create Pagination object
|
|
|
|
return Pagination(None, page, per_page, len(data), items)
|
|
|
|
|
2023-08-08 23:10:06 +02:00
|
|
|
def websearch_to_tsquery_multilang(search):
|
2023-08-08 23:39:11 +02:00
|
|
|
return func.websearch_to_tsquery('french', search).op('||')(func.websearch_to_tsquery('english', search))
|
2023-08-08 23:10:06 +02:00
|
|
|
|
|
|
|
def to_tsvector_multilang(text):
|
2023-08-08 23:39:11 +02:00
|
|
|
return func.to_tsvector('french', text).op('||')(func.to_tsvector('english', text))
|
2023-08-08 23:10:06 +02:00
|
|
|
|
|
|
|
|
2023-08-09 18:26:38 +02:00
|
|
|
@app.route('/rechercher/')
|
|
|
|
@app.route('/rechercher/<int:page>/')
|
|
|
|
def search(page=1):
|
2023-06-27 23:15:12 +02:00
|
|
|
form = AdvancedSearchForm(request.args)
|
|
|
|
results = list()
|
|
|
|
if form.validate():
|
2023-07-04 23:18:58 +02:00
|
|
|
# Topics are sorted first in results
|
2023-08-08 23:10:06 +02:00
|
|
|
tsquery = websearch_to_tsquery_multilang(form.q.data)
|
2023-08-09 18:26:38 +02:00
|
|
|
topic_query = db.session.query(Topic).where(
|
2023-08-08 23:10:06 +02:00
|
|
|
to_tsvector_multilang(Topic.title).bool_op('@@')(tsquery)
|
|
|
|
).group_by(
|
|
|
|
Topic.id,
|
|
|
|
Post.id
|
|
|
|
)
|
2023-07-04 23:18:58 +02:00
|
|
|
# Comments are less important than topics and programs
|
2023-08-09 18:26:38 +02:00
|
|
|
comments_query = db.session.query(Comment).where(
|
2023-08-08 23:10:06 +02:00
|
|
|
to_tsvector_multilang(Comment.text).bool_op('@@')(tsquery)
|
|
|
|
).group_by(
|
|
|
|
Comment.id,
|
|
|
|
Post.id
|
|
|
|
)
|
2023-08-09 18:26:38 +02:00
|
|
|
results = list(topic_query) + list(comments_query)
|
2023-06-27 23:15:12 +02:00
|
|
|
|
2023-08-09 18:26:38 +02:00
|
|
|
results = paginate(results, page, SEARCH_RESULTS_PER_PAGE)
|
2023-06-27 23:15:12 +02:00
|
|
|
return render('search.html', form=form, results=results)
|