Implement search functionality with pagination and enhance templates for improved user experience
This commit is contained in:
parent
67c85a4569
commit
eb7e446e56
7 changed files with 193 additions and 43 deletions
62
routes.py
62
routes.py
|
@ -1,7 +1,8 @@
|
|||
from flask import Blueprint, render_template, url_for, request
|
||||
from flask import Blueprint, render_template, url_for, request, redirect
|
||||
from .models import Area, Brand, Item, Inventory, RoomFunction, User, WorkLog, Room
|
||||
import html
|
||||
from sqlalchemy.orm import joinedload
|
||||
from sqlalchemy import or_
|
||||
from sqlalchemy.orm import aliased
|
||||
from typing import Callable, Any, List
|
||||
from . import db
|
||||
from .utils import eager_load_user_relationships, eager_load_inventory_relationships, eager_load_room_relationships, eager_load_worklog_relationships, chunk_list
|
||||
|
@ -307,4 +308,59 @@ def worklog_entry(id):
|
|||
|
||||
@main.route("/search")
|
||||
def search():
|
||||
return render_template('search.html', title="Database Search")
|
||||
query = request.args.get('q', '').strip()
|
||||
inventory_page = request.args.get('inventory_page', default=1, type=int)
|
||||
user_page = request.args.get('user_page', default=1, type=int)
|
||||
worklog_page = request.args.get('worklog_page', default=1, type=int)
|
||||
|
||||
if not query:
|
||||
return redirect(url_for('index'))
|
||||
|
||||
UserAlias = aliased(User)
|
||||
|
||||
inventory_query = eager_load_inventory_relationships(db.session.query(Inventory).join(UserAlias, Inventory.owner)).filter(
|
||||
or_(
|
||||
Inventory.inventory_name.ilike(f"%{query}%"),
|
||||
Inventory.serial.ilike(f"%{query}%"),
|
||||
Inventory.barcode.ilike(f"%{query}%"),
|
||||
Inventory.notes.ilike(f"%{query}%"),
|
||||
UserAlias.first_name.ilike(f"%{query}%"),
|
||||
UserAlias.last_name.ilike(f"%{query}%")
|
||||
))
|
||||
inventory_pagination = make_paginated_data(inventory_query, inventory_page)
|
||||
user_query = eager_load_user_relationships(db.session.query(User)).filter(
|
||||
or_(
|
||||
User.first_name.ilike(f"%{query}%"),
|
||||
User.last_name.ilike(f"%{query}%")
|
||||
))
|
||||
user_pagination = make_paginated_data(user_query, user_page)
|
||||
worklog_query = eager_load_worklog_relationships(db.session.query(WorkLog).join(UserAlias, WorkLog.contact)).filter(
|
||||
or_(
|
||||
WorkLog.notes.ilike(f"%{query}%"),
|
||||
UserAlias.first_name.ilike(f"%{query}%"),
|
||||
UserAlias.last_name.ilike(f"%{query}%")
|
||||
))
|
||||
worklog_pagination = make_paginated_data(worklog_query, worklog_page)
|
||||
|
||||
results = {
|
||||
'inventory': {
|
||||
'results': inventory_query,
|
||||
'headers': inventory_headers,
|
||||
'rows': [{"id": item.id, "cells": [fn(item) for fn in inventory_headers.values()]} for item in inventory_pagination['items']],
|
||||
'pagination': inventory_pagination
|
||||
},
|
||||
'users': {
|
||||
'results': user_query,
|
||||
'headers': user_headers,
|
||||
'rows': [{"id": user.id, "cells": [fn(user) for fn in user_headers.values()]} for user in user_pagination['items']],
|
||||
'pagination': user_pagination
|
||||
},
|
||||
'worklog': {
|
||||
'results': worklog_query,
|
||||
'headers': worklog_headers,
|
||||
'rows': [{"id": log.id, "cells": [fn(log) for fn in worklog_headers.values()]} for log in worklog_pagination['items']],
|
||||
'pagination': worklog_pagination
|
||||
}
|
||||
}
|
||||
|
||||
return render_template('search.html', title="Database Search", results=results, query=query)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue