open-law/app/views/search.py

126 lines
4.1 KiB
Python

from flask import Blueprint, render_template, request
from sqlalchemy import func, and_, or_
from app import models as m, db
from app.controllers import create_pagination
bp = Blueprint("search", __name__)
@bp.route("/search_interpretations", methods=["GET"])
def search_interpretations():
q = request.args.get("q", type=str, default="").lower()
interpretations = m.Interpretation.query.order_by(m.Interpretation.id).filter(
(func.lower(m.Interpretation.plain_text).like(f"%{q}%"))
)
count = interpretations.count()
pagination = create_pagination(total=interpretations.count())
return render_template(
"searchResultsInterpretations.html",
query=q,
interpretations=interpretations.paginate(
page=pagination.page, per_page=pagination.per_page
),
page=pagination,
count=count,
)
@bp.route("/search_books", methods=["GET"])
def search_books():
q = request.args.get("q", type=str, default="")
books = (
db.session.query(m.Book)
.filter(
or_(
and_(
func.lower(m.Book.label).like(f"%{q}%"),
m.Book.is_deleted == False, # noqa: E712
),
and_(
func.lower(m.Collection.label).like(f"%{q}%"),
m.Collection.is_deleted == False, # noqa: E712
m.Collection.is_root == False, # noqa: E712
m.BookVersion.id == m.Collection.version_id,
m.Book.id == m.BookVersion.book_id,
m.Book.is_deleted == False, # noqa: E712
),
and_(
func.lower(m.Section.label).like(f"%{q}%"),
m.Section.is_deleted == False, # noqa: E712
m.BookVersion.id == m.Section.version_id,
m.Book.id == m.BookVersion.book_id,
m.Book.is_deleted == False, # noqa: E712
),
and_(
func.lower(m.Interpretation.plain_text).like(f"%{q}%"),
m.Interpretation.is_deleted == False, # noqa: E712
m.Interpretation.section_id == m.Section.id,
m.Section.is_deleted == False, # noqa: E712
m.BookVersion.id == m.Section.version_id,
m.Book.id == m.BookVersion.book_id,
m.Book.is_deleted == False, # noqa: E712
),
),
)
.order_by(m.Book.created_at.asc())
.group_by(m.Book.id)
)
count = books.count()
pagination = create_pagination(total=books.count())
return render_template(
"searchResultsBooks.html",
query=q,
books=books.paginate(page=pagination.page, per_page=pagination.per_page),
page=pagination,
count=count,
)
@bp.route("/search_users", methods=["GET"])
def search_users():
q = request.args.get("q", type=str, default="")
users = (
m.User.query.order_by(m.User.id)
.filter(
or_(
func.lower(m.User.username).like(f"%{q}%"),
func.lower(m.User.wallet_id).like(f"%{q}%"),
)
)
.order_by(m.User.id.asc())
.group_by(m.User.id)
)
count = users.count()
pagination = create_pagination(total=users.count())
return render_template(
"searchResultsUsers.html",
query=q,
users=users.paginate(page=pagination.page, per_page=pagination.per_page),
page=pagination,
count=count,
)
@bp.route("/search_tags", methods=["GET"])
def search_tags():
q = request.args.get("q", type=str, default="")
tags = m.Tag.query.order_by(m.Tag.id)
if q:
tags = tags.filter(func.lower(m.Tag.name).like(f"%{q}%"))
count = tags.count()
pagination = create_pagination(total=tags.count())
return render_template(
"searchResultsTags.html",
query=q,
tags=tags.paginate(page=pagination.page, per_page=pagination.per_page),
page=pagination,
count=count,
)