diff --git a/__pycache__/routes.cpython-313.pyc b/__pycache__/routes.cpython-313.pyc index efdc1ab..3f71c2b 100644 Binary files a/__pycache__/routes.cpython-313.pyc and b/__pycache__/routes.cpython-313.pyc differ diff --git a/__pycache__/utils.cpython-313.pyc b/__pycache__/utils.cpython-313.pyc index 5c2e3fb..a73e036 100644 Binary files a/__pycache__/utils.cpython-313.pyc and b/__pycache__/utils.cpython-313.pyc differ diff --git a/routes.py b/routes.py index 889d8ac..f7a6434 100644 --- a/routes.py +++ b/routes.py @@ -4,7 +4,7 @@ import html from sqlalchemy.orm import joinedload 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 +from .utils import eager_load_user_relationships, eager_load_inventory_relationships, eager_load_room_relationships, eager_load_worklog_relationships, chunk_list main = Blueprint('main', __name__) @@ -106,7 +106,8 @@ def render_paginated_table( entry_route: str, row_fn: Callable[[Any], List[dict]], endpoint: str, - per_page=15 + per_page=15, + extra_args={} ): data = make_paginated_data(query, page, per_page) return render_template( @@ -120,7 +121,8 @@ def render_paginated_table( endpoint=endpoint, total_pages=data['total_pages'], headers=headers, - entry_route=entry_route + entry_route=entry_route, + extra_args=extra_args ) @main.route("/") @@ -130,24 +132,56 @@ def index(): def link(text, endpoint, **values): return {"text": text, "url": url_for(endpoint, **values)} +FILTER_MAP = { + 'user': Inventory.owner_id, + 'room': Inventory.location_id, + 'brand': Inventory.brand_id, +} + @main.route("/inventory") def list_inventory(): page = request.args.get('page', default=1, type=int) - query = eager_load_inventory_relationships(db.session.query(Inventory)).order_by(Inventory.inventory_name, Inventory.barcode, Inventory.serial) + filter_by = request.args.get('filter_by', type=str) + id = request.args.get('id', type=int) + + query = db.session.query(Inventory) + query = eager_load_inventory_relationships(query) + query = query.order_by(Inventory.inventory_name, Inventory.barcode, Inventory.serial) + + if filter_by and id: + column = FILTER_MAP.get(filter_by) + if column is not None: + query = query.filter(column == id) + else: + return "Invalid filter_by parameter", 400 + return render_paginated_table( query=query, page=page, - title="Inventory", + title="Inventory (Filtered)" if filter_by else "Inventory", headers=inventory_headers, row_fn=lambda i: [fn(i) for fn in inventory_headers.values()], endpoint="main.list_inventory", - entry_route="inventory_item" + entry_route="inventory_item", + extra_args={'filter_by': filter_by, 'id': id} ) @main.route("/inventory/index") def inventory_index(): category = request.args.get('category') - return render_template('inventory_index.html', title="Inventory Index", category=category) + listing = None + + if category == 'user': + users = db.session.query(User.id, User.first_name, User.last_name).order_by(User.first_name, User.last_name).all() + listing = chunk_list([(user.id, f"{user.first_name or ''} {user.last_name or ''}".strip()) for user in users], 12) + elif category == 'location': + pass + elif category == 'type': + pass + elif category: + return f"Dude, why {category}?" + + return render_template('inventory_index.html', title="Inventory Index", category=category, listing=listing) @main.route("/inventory_item/") def inventory_item(id): diff --git a/templates/_table_fragment.html b/templates/_table_fragment.html index 7b400a8..79a30bb 100644 --- a/templates/_table_fragment.html +++ b/templates/_table_fragment.html @@ -1,4 +1,5 @@ {% macro render_table(headers, rows, entry_route=None, title=None) %} +{% if rows %}
@@ -32,6 +33,9 @@
+{% else %} +
No data.
+{% endif %} {% endmacro %} {% macro render_pagination(endpoint, page, has_prev, has_next, total_pages, page_variable='page', extra_args={}) %} @@ -43,6 +47,7 @@ {% set _ = next_args.update({page_variable: page + 1}) %} {% set _ = first_args.update({page_variable: 1}) %} {% set _ = last_args.update({page_variable: total_pages}) %} +{% if total_pages > 1 %}
@@ -72,4 +77,5 @@ class="btn btn-primary{% if not has_next %} disabled{% endif %}">Last »
+{% endif %} {% endmacro %} \ No newline at end of file diff --git a/templates/inventory.html b/templates/inventory.html index 898a3ef..c4e6865 100644 --- a/templates/inventory.html +++ b/templates/inventory.html @@ -132,7 +132,7 @@ submit_button=True) }} total_pages=worklog_pagination['total_pages'], endpoint='main.inventory_item', page_variable='worklog_page', - extra_args={'id': item.id, 'worklog_page': worklog_page} + extra_args={'id': item.id, 'worklog_page': worklog_page, 'filter_by': filter_by, 'id': id} ) }} {% endif %} diff --git a/templates/inventory_index.html b/templates/inventory_index.html index b7d0d5d..cb21e4e 100644 --- a/templates/inventory_index.html +++ b/templates/inventory_index.html @@ -77,6 +77,18 @@ title=title By Type + {% else %} +
+ {% for line in listing %} +
+ {% for id, name in line %} + + {% endfor %} +
+ {% endfor %} +
{% endif %} {% endblock %} \ No newline at end of file diff --git a/templates/table.html b/templates/table.html index 3dc7569..472245b 100644 --- a/templates/table.html +++ b/templates/table.html @@ -13,5 +13,5 @@ ) }} {{ tables.render_table(header, rows, entry_route) }} -{{ tables.render_pagination(endpoint, page, has_prev, has_next, total_pages) }} +{{ tables.render_pagination(endpoint, page, has_prev, has_next, total_pages, extra_args=extra_args) }} {% endblock %} \ No newline at end of file diff --git a/utils.py b/utils.py index 91f5720..344e4a6 100644 --- a/utils.py +++ b/utils.py @@ -28,3 +28,6 @@ def eager_load_worklog_relationships(query): joinedload(WorkLog.contact), joinedload(WorkLog.work_item) ) + +def chunk_list(lst, chunk_size): + return [lst[i:i + chunk_size] for i in range(0, len(lst), chunk_size)]