diff --git a/.gitignore b/.gitignore index 22ca0cb..c96f862 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ inventory/static/uploads/* !inventory/static/uploads/.gitkeep .venv/ +.vscode/ .env *.db* *.db-journal diff --git a/inventory/models/work_log.py b/inventory/models/work_log.py index 7368472..04c3aa3 100644 --- a/inventory/models/work_log.py +++ b/inventory/models/work_log.py @@ -17,7 +17,8 @@ class WorkLog(Base, CRUDMixin): contact: Mapped[Optional['User']] = relationship('User', back_populates='work_logs') contact_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("users.id"), nullable=True, index=True) - updates: Mapped[List['WorkNote']] = relationship('WorkNote', back_populates='work_log', cascade='all, delete-orphan', order_by='WorkNote.timestamp.desc()') + updates: Mapped[List['WorkNote']] = relationship('WorkNote', back_populates='work_log', cascade='all, delete-orphan', + order_by="desc(WorkNote.timestamp), desc(WorkNote.id)", lazy="selectin") work_item: Mapped[Optional['Inventory']] = relationship('Inventory', back_populates='work_logs') work_item_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey('inventory.id'), nullable=True, index=True) diff --git a/inventory/routes/reports.py b/inventory/routes/reports.py index 2d69cba..cb9a3c0 100644 --- a/inventory/routes/reports.py +++ b/inventory/routes/reports.py @@ -3,6 +3,8 @@ from urllib.parse import urlencode import pandas as pd +from crudkit.ui.fragments import render_table + import crudkit bp_reports = Blueprint("reports", __name__) @@ -92,4 +94,40 @@ def init_reports_routes(app): table_rows=table_rows, ) + + @bp_reports.get("/problems") + def problems(): + inventory_model = crudkit.crud.get_model('inventory') + inventory_svc = crudkit.crud.get_service(inventory_model) + + rows = inventory_svc.list({ + "limit": 0, + "$or": [ + {"owner.active__eq": False}, + {"owner_id": None} + ], + "fields": [ + "owner.label", + "label", + "brand.name", + "model", + "device_type.description", + "location.label", + "condition" + ], + }) + + orphans = render_table(rows, [ + {"field": "owner.label", "label": "Owner", "link": {"endpoint": "entry.entry", "params": {"id": "{owner.id}", "model": "user"}}}, + {"field": "label", "label": "Device"}, + {"field": "brand.name", "label": "Brand"}, + {"field": "model"}, + {"field": "device_type.description", "label": "Device Type"}, + {"field": "location.label", "label": "Location"}, + {"field": "condition"}, + ], opts={"object_class": "inventory"}) + + return render_template("problems.html", orphans=orphans) + app.register_blueprint(bp_reports) + diff --git a/inventory/templates/base.html b/inventory/templates/base.html index dfbc595..454b44a 100644 --- a/inventory/templates/base.html +++ b/inventory/templates/base.html @@ -40,6 +40,7 @@ Reports
diff --git a/inventory/templates/problems.html b/inventory/templates/problems.html new file mode 100644 index 0000000..cb9a0e7 --- /dev/null +++ b/inventory/templates/problems.html @@ -0,0 +1,10 @@ +{% extends 'base.html' %} + +{% block main %} +Equipment Without Active Owner
+ {{ orphans | safe }} +