Redo breadcrumb logic to something less painful.
This commit is contained in:
parent
3ae6f85dc7
commit
2a7a72f31e
11 changed files with 88 additions and 57 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue