diff --git a/inventory/routes/reports.py b/inventory/routes/reports.py index cb9a3c0..b51486f 100644 --- a/inventory/routes/reports.py +++ b/inventory/routes/reports.py @@ -127,7 +127,51 @@ def init_reports_routes(app): {"field": "condition"}, ], opts={"object_class": "inventory"}) - return render_template("problems.html", orphans=orphans) + rows = inventory_svc.list({ + "fields": ["id", "name", "serial", "barcode", "brand.name", "model", "device_type.description", "owner.label", "location.label"], + "limit": 0, + "$or": [ + {"name__ne": None}, + {"serial__ne": None}, + {"barcode__ne": None}, + ], + }) + duplicates = pd.DataFrame([r.as_dict() for r in rows]).set_index("id", drop=True) + subset = ["name", "serial", "barcode"] + + mask = ( + (duplicates["name"].notna() & duplicates.duplicated("name", keep=False)) | + (duplicates["serial"].notna() & duplicates.duplicated("serial", keep=False)) | + (duplicates["barcode"].notna() & duplicates.duplicated("barcode", keep=False)) + ) + + duplicates = duplicates.loc[mask].sort_values(subset) + # you already have this + cols = [ + {"name": "name", "label": "Name"}, + {"name": "serial", "label": "Serial #"}, + {"name": "barcode", "label": "Bar Code"}, + {"name": "brand.name", "label": "Brand"}, + {"name": "model", "label": "Model"}, + {"name": "device_type.description", "label": "Device Type"}, + {"name": "owner.label", "label": "Owner"}, + {"name": "location.label", "label": "Location"}, + ] + + col_names = [c["name"] for c in cols if c["name"] in duplicates.columns] + col_labels = [c["label"] for c in cols if c["name"] in duplicates.columns] + + out = duplicates[col_names].fillna("") + + # Best for Jinja: list of dicts (each row keyed by column name) + duplicates = ( + out.reset_index() + .rename(columns={"index": "id"}) + .to_dict(orient="records") + ) + headers_for_template = ["ID"] + col_labels + + return render_template("problems.html", orphans=orphans, duplicates=duplicates, duplicate_columns=headers_for_template) app.register_blueprint(bp_reports) diff --git a/inventory/templates/problems.html b/inventory/templates/problems.html index cb9a0e7..d06b784 100644 --- a/inventory/templates/problems.html +++ b/inventory/templates/problems.html @@ -6,5 +6,31 @@

Equipment Without Active Owner

{{ orphans | safe }} +

Duplicate Inventory Entries

+
+ + + + {% for col in duplicate_columns %} + + {% endfor %} + + + + {% for record in duplicates %} + + {% for cell in record.values() %} + + {% endfor %} + + {% endfor %} + +
+ {{ col }} +
+ {{ cell }} +
+
{% endblock %} \ No newline at end of file