Enhance search functionality with pagination and improve eager loading in utils

This commit is contained in:
Yaro Kasear 2025-06-13 16:16:56 -05:00
parent eb7e446e56
commit cffdc27724
5 changed files with 56 additions and 46 deletions

Binary file not shown.

Binary file not shown.

View file

@ -316,6 +316,7 @@ def search():
if not query: if not query:
return redirect(url_for('index')) return redirect(url_for('index'))
InventoryAlias = aliased(Inventory)
UserAlias = aliased(User) UserAlias = aliased(User)
inventory_query = eager_load_inventory_relationships(db.session.query(Inventory).join(UserAlias, Inventory.owner)).filter( inventory_query = eager_load_inventory_relationships(db.session.query(Inventory).join(UserAlias, Inventory.owner)).filter(
@ -334,11 +335,14 @@ def search():
User.last_name.ilike(f"%{query}%") User.last_name.ilike(f"%{query}%")
)) ))
user_pagination = make_paginated_data(user_query, user_page) user_pagination = make_paginated_data(user_query, user_page)
worklog_query = eager_load_worklog_relationships(db.session.query(WorkLog).join(UserAlias, WorkLog.contact)).filter( worklog_query = eager_load_worklog_relationships(db.session.query(WorkLog).join(UserAlias, WorkLog.contact).join(InventoryAlias, WorkLog.work_item)).filter(
or_( or_(
WorkLog.notes.ilike(f"%{query}%"), WorkLog.notes.ilike(f"%{query}%"),
UserAlias.first_name.ilike(f"%{query}%"), UserAlias.first_name.ilike(f"%{query}%"),
UserAlias.last_name.ilike(f"%{query}%") UserAlias.last_name.ilike(f"%{query}%"),
InventoryAlias.inventory_name.ilike(f"%{query}%"),
InventoryAlias.serial.ilike(f"%{query}%"),
InventoryAlias.barcode.ilike(f"%{query}%")
)) ))
worklog_pagination = make_paginated_data(worklog_query, worklog_page) worklog_pagination = make_paginated_data(worklog_query, worklog_page)

View file

@ -10,64 +10,70 @@ title=title,
) }} ) }}
<div class="container"> <div class="container">
{% if results['inventory']['rows'] %}
<div> <div>
{{ tables.render_table( {{ tables.render_table(
headers = results['inventory']['headers'], headers = results['inventory']['headers'],
rows = results['inventory']['rows'], rows = results['inventory']['rows'],
entry_route = 'inventory_item', entry_route = 'inventory_item',
title='Inventory Results' title='Inventory Results'
)}} )}}
{{ tables.render_pagination( {{ tables.render_pagination(
endpoint = 'main.search', endpoint = 'main.search',
page = results['inventory']['pagination']['page'], page = results['inventory']['pagination']['page'],
has_prev = results['inventory']['pagination']['has_prev'], has_prev = results['inventory']['pagination']['has_prev'],
has_next = results['inventory']['pagination']['has_next'], has_next = results['inventory']['pagination']['has_next'],
total_pages = results['inventory']['pagination']['total_pages'], total_pages = results['inventory']['pagination']['total_pages'],
page_variable = 'inventory_page', page_variable = 'inventory_page',
extra_args = { extra_args = {
'q': query, 'q': query,
'user_page': results['users']['pagination']['page'], 'user_page': results['users']['pagination']['page'],
'worklog_page': results['worklog']['pagination']['page'] 'worklog_page': results['worklog']['pagination']['page']
})}} })}}
</div> </div>
{% endif %}
{% if results['users']['rows'] %}
<div> <div>
{{ tables.render_table( {{ tables.render_table(
headers = results['users']['headers'], headers = results['users']['headers'],
rows = results['users']['rows'], rows = results['users']['rows'],
entry_route = 'user', title='User Results' entry_route = 'user', title='User Results'
)}} )}}
{{ tables.render_pagination( {{ tables.render_pagination(
endpoint = 'main.search', endpoint = 'main.search',
page = results['users']['pagination']['page'], page = results['users']['pagination']['page'],
has_prev = results['users']['pagination']['has_prev'], has_prev = results['users']['pagination']['has_prev'],
has_next = results['users']['pagination']['has_next'], has_next = results['users']['pagination']['has_next'],
total_pages = results['users']['pagination']['total_pages'], total_pages = results['users']['pagination']['total_pages'],
page_variable = 'user_page', page_variable = 'user_page',
extra_args = { extra_args = {
'q': query, 'q': query,
'inventory_page': results['inventory']['pagination']['page'], 'inventory_page': results['inventory']['pagination']['page'],
'worklog_page': results['worklog']['pagination']['page'] 'worklog_page': results['worklog']['pagination']['page']
})}} })}}
</div> </div>
{% endif %}
{% if results['worklog']['rows'] %}
<div> <div>
{{ tables.render_table( {{ tables.render_table(
headers = results['worklog']['headers'], headers = results['worklog']['headers'],
rows = results['worklog']['rows'], rows = results['worklog']['rows'],
entry_route = 'worklog_entry', entry_route = 'worklog_entry',
title='Worklog Results' title='Worklog Results'
)}} )}}
{{ tables.render_pagination( {{ tables.render_pagination(
endpoint = 'main.search', endpoint = 'main.search',
page = results['worklog']['pagination']['page'], page = results['worklog']['pagination']['page'],
has_prev = results['worklog']['pagination']['has_prev'], has_prev = results['worklog']['pagination']['has_prev'],
has_next = results['worklog']['pagination']['has_next'], has_next = results['worklog']['pagination']['has_next'],
total_pages = results['worklog']['pagination']['total_pages'], total_pages = results['worklog']['pagination']['total_pages'],
page_variable = 'worklog_page', page_variable = 'worklog_page',
extra_args = { extra_args = {
'q': query, 'q': query,
'inventory_page': results['inventory']['pagination']['page'], 'inventory_page': results['inventory']['pagination']['page'],
'user_page': results['users']['pagination']['page'] 'user_page': results['users']['pagination']['page']
})}} })}}
</div> </div>
{% endif %}
</div> </div>
{% endblock %} {% endblock %}

View file

@ -1,4 +1,4 @@
from sqlalchemy.orm import joinedload from sqlalchemy.orm import joinedload, selectinload
from .models import User, Room, Inventory, WorkLog from .models import User, Room, Inventory, WorkLog
def eager_load_user_relationships(query): def eager_load_user_relationships(query):
@ -19,8 +19,8 @@ def eager_load_room_relationships(query):
return query.options( return query.options(
joinedload(Room.area), joinedload(Room.area),
joinedload(Room.room_function), joinedload(Room.room_function),
joinedload(Room.inventory), selectinload(Room.inventory),
joinedload(Room.users) selectinload(Room.users)
) )
def eager_load_worklog_relationships(query): def eager_load_worklog_relationships(query):