diff --git a/models/__pycache__/inventory.cpython-313.pyc b/models/__pycache__/inventory.cpython-313.pyc index 9805a68..8d133d8 100644 Binary files a/models/__pycache__/inventory.cpython-313.pyc and b/models/__pycache__/inventory.cpython-313.pyc differ 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 @@