From 58754c71bdb4b027fd750e370c25ed0183f19579 Mon Sep 17 00:00:00 2001 From: Yaro Kasear Date: Mon, 16 Jun 2025 10:26:30 -0500 Subject: [PATCH] Enhance inventory management by updating timestamp type to DateTime, adding stale worklog display on the index page, and improving template styles and scripts for better user experience. --- models/__pycache__/inventory.cpython-313.pyc | Bin 5028 -> 5053 bytes models/inventory.py | 4 +-- routes.py | 32 ++++++++++++++++--- templates/fragments/_table_fragment.html | 2 +- templates/index.html | 26 +++++++++++++++ templates/layout.html | 15 ++++----- templates/search.html | 10 ++++++ 7 files changed, 73 insertions(+), 16 deletions(-) diff --git a/models/__pycache__/inventory.cpython-313.pyc b/models/__pycache__/inventory.cpython-313.pyc index 9805a68218c4d22d4d03ac5bd59eb5edbbfc5301..8d133d82009ef2a1ac5d49512b211703b51f7375 100644 GIT binary patch delta 693 zcmZ3YzE_?1GcPX}0|NttlX^hL@rk^WjDIGoPtEX>Dw0xQ2xbW8^p^ILDU$J$Es_QE zxxD4PL-P85kIfbQl;IZm}g66r|>*++rz8 zEhs9o1_^Peq!uR^WfqiV=I0d|fJ9jH%kxr;ZgHlS=H$fZCFZ6US#Fl)p3kHNGNQ-? zWSB0902!;vSmesUz);M{z`&qTBEZh(1+m0Igc-JO3uMM#l5h$RmuCg0}w6O*{C9n|32 zQ8pptx|sS!G4+f58kbpuHrorlV&n#E0IAhfpKKyDi>XL_@@XM?HVKe!$;lstM7%(O zR0Iw^u*)Jqb~6;of+$ws{FKz3B9QhXRO@eX*yQG?l;)(`6=gCoFo2??IApS)u!?XH V({~02Mi}`K#GYI)tjGd#2mqoKn)?6% delta 713 zcmdn1zC@k(GcPX}0|Ns?TfRrezKOh&j6Wu-PpwyA2xbW8^p^6HE|T_=DUt#6xx8h) z(PX*B?3h=1i^V6ixa1axe?iG)dqy`#uE}kTxtsqozTt3EVPIe=(q>>_ zxW$%OP>`CJa*L%XwVZL$Rgg}G< zhyW=rk^~vgoS9d0i$6X-F)uH_BoSn7aeRD{I7pEyNS-4lu_U!5GdHzJ6eOk&5@Rkd zDJs$garr@n7Ki}5h84sDyG9qp0=u6B^C>I=HMc|MGyD}W4hM`CXM6vqjr=;c-fs86bb;>Oco80`A m(wtPgq6`KG22j)#`%O+1R^jzv`p&?>2qh=a5LRRXIR^l%{iGTI diff --git a/models/inventory.py b/models/inventory.py index ffca1d5..38a64e4 100644 --- a/models/inventory.py +++ b/models/inventory.py @@ -6,7 +6,7 @@ if TYPE_CHECKING: from .work_log import WorkLog from .rooms import Room -from sqlalchemy import Boolean, ForeignKeyConstraint, ForeignKey, Identity, Index, Integer, PrimaryKeyConstraint, String, Unicode, text +from sqlalchemy import Boolean, ForeignKeyConstraint, ForeignKey, Identity, Index, Integer, PrimaryKeyConstraint, String, Unicode, DateTime, text from sqlalchemy.dialects.mssql import DATETIME2, MONEY from sqlalchemy.orm import Mapped, mapped_column, relationship import datetime @@ -20,7 +20,7 @@ class Inventory(db.Model): ) id: Mapped[int] = mapped_column("ID", Integer, Identity(start=1, increment=1), primary_key=True) - timestamp: Mapped[datetime.datetime] = mapped_column('Date Entered', DATETIME2) + timestamp: Mapped[datetime.datetime] = mapped_column('Date Entered', DateTime) condition: Mapped[str] = mapped_column('Working Condition', Unicode(255)) needed: Mapped[str] = mapped_column("Needed", Unicode(255)) type_id: Mapped[int] = mapped_column('Item Type', Integer, ForeignKey("Items.ID")) diff --git a/routes.py b/routes.py index baacb98..9119d32 100644 --- a/routes.py +++ b/routes.py @@ -1,11 +1,11 @@ from flask import Blueprint, render_template, url_for, request, redirect -from .models import Area, Brand, Item, Inventory, RoomFunction, User, WorkLog, Room -import html +from .models import Brand, Item, Inventory, RoomFunction, User, WorkLog, Room 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 +from datetime import datetime, timedelta main = Blueprint('main', __name__) @@ -130,7 +130,27 @@ def render_paginated_table( @main.route("/") def index(): - return render_template("index.html", title="Inventory Manager") + stale_worklog_page = request.args.get('stale_worklog_page', 1, int) + cutoff = datetime.utcnow() - timedelta(days=14) + + worklog_query = eager_load_worklog_relationships( + db.session.query(WorkLog) + ).filter( + (WorkLog.start_time < cutoff) & (WorkLog.complete == False) + ) + + stale_pagination = make_paginated_data(worklog_query, stale_worklog_page, 3) + stale_count = len(worklog_query.all()) + stale_worklog_headers = {k: v for k, v in worklog_headers.items() if k not in ['End Time', 'Quick Analysis?', 'Complete?', 'Follow Up?']} + + return render_template( + "index.html", + title="Inventory Manager", + stale_pagination=stale_pagination, + stale_count=stale_count, + stale_worklog_headers=stale_worklog_headers, + stale_worklog_rows=[{"id": log.id, "cells": [fn(log) for fn in stale_worklog_headers.values()]} for log in stale_pagination['items']], + ) def link(text, endpoint, **values): return {"text": text, "url": url_for(endpoint, **values)} @@ -338,10 +358,12 @@ def search(): 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( + user_query = eager_load_user_relationships(db.session.query(User).join(UserAlias, User.supervisor)).filter( or_( User.first_name.ilike(f"%{query}%"), - User.last_name.ilike(f"%{query}%") + User.last_name.ilike(f"%{query}%"), + UserAlias.first_name.ilike(f"%{query}%"), + UserAlias.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).join(InventoryAlias, WorkLog.work_item)).filter( diff --git a/templates/fragments/_table_fragment.html b/templates/fragments/_table_fragment.html index 79a30bb..1d63d6f 100644 --- a/templates/fragments/_table_fragment.html +++ b/templates/fragments/_table_fragment.html @@ -22,7 +22,7 @@ {% if cell.type == 'bool' %} {{ cell.html | safe }} {% elif cell.url %} - {{ cell.text }} + {{ cell.text }} {% else %} {{ cell.text or '-' }} {% endif %} diff --git a/templates/index.html b/templates/index.html index 1c979c2..4d386e7 100644 --- a/templates/index.html +++ b/templates/index.html @@ -7,5 +7,31 @@

Welcome to Inventory Manager

Find out about all of your assets.

+
+ {% if stale_pagination['items'] %} +
+
+
+
Stale Worklogs
+
You have {{ stale_count }} worklogs + that need attention!
+ {{ tables.render_table( + stale_worklog_headers, + stale_worklog_rows, + 'index' + )}} + {{ tables.render_pagination( + 'index', + stale_pagination['page'], + stale_pagination['has_prev'], + stale_pagination['has_next'], + stale_pagination['total_pages'], + page_variable='stale_worklog_page' + )}} +
+
+
+ {% endif %} +
{% endblock %} \ No newline at end of file diff --git a/templates/layout.html b/templates/layout.html index d58f9cc..94fb02d 100644 --- a/templates/layout.html +++ b/templates/layout.html @@ -14,9 +14,7 @@