Redo breadcrumb logic to something less painful.

This commit is contained in:
Yaro Kasear 2025-07-29 10:18:34 -05:00
parent 3ae6f85dc7
commit 2a7a72f31e
11 changed files with 88 additions and 57 deletions

View file

@ -4,12 +4,37 @@ import hashlib
import io
import os
from flask import url_for, jsonify
from flask import url_for, jsonify, request
from flask import current_app as app
from ..models import Inventory
from ..models import User, Inventory, WorkLog
from ..models.image import ImageAttachable
ROUTE_BREADCRUMBS = {
'main.user': {
'trail': [('Users', 'main.list_users')],
'model': User,
'arg': 'id',
'label_attr': 'identifier',
'url_func': lambda i: url_for('main.user', id=i.id)
},
'main.inventory_item': {
'trail': [('Inventory', 'main.list_inventory')],
'model': Inventory,
'arg': 'id',
'label_attr': 'identifier',
'url_func': lambda i: url_for('main.inventory_item', id=i.id)
},
'main.worklog': {
'trail': [('Work Log', 'main.list_worklog')],
'model': WorkLog,
'arg': 'id',
'label_attr': 'identifier',
'url_func': lambda i: url_for('main.worklog', id=i.id)
}
}
inventory_headers = {
"Date Entered": lambda i: {"text": i.timestamp.strftime("%Y-%m-%d") if i.timestamp else None},
"Identifier": lambda i: {"text": i.identifier},
@ -104,4 +129,35 @@ def make_csv(export_func, columns, rows):
"success": True,
"csv": base64.b64encode(csv_string.encode()).decode(),
"count": len(rows)
})
})
def generate_breadcrumbs():
crumbs = []
endpoint = request.endpoint
view_args = request.view_args or {}
if endpoint in ROUTE_BREADCRUMBS:
print(endpoint, view_args)
config = ROUTE_BREADCRUMBS[endpoint]
for label, ep in config.get('trail', []):
crumbs.append({'label': label, 'url': url_for(ep)})
obj_id = view_args.get(config['arg'])
if obj_id:
obj = config['model'].query.get(obj_id)
if obj:
crumbs.append({
'label': getattr(obj, config['label_attr'], str(obj)),
'url': config['url_func'](obj)
})
else:
# fallback to ugly slashes
path = request.path.strip('/').split('/')
accumulated = ''
for segment in path:
accumulated += '/' + segment
crumbs.append({'label': segment.title(), 'url': accumulated})
return crumbs